terraform/terraform/util_test.go

142 lines
2.7 KiB
Go

package terraform
import (
"fmt"
"reflect"
"testing"
"time"
)
func TestSemaphore(t *testing.T) {
s := NewSemaphore(2)
timer := time.AfterFunc(time.Second, func() {
panic("deadlock")
})
defer timer.Stop()
s.Acquire()
if !s.TryAcquire() {
t.Fatalf("should acquire")
}
if s.TryAcquire() {
t.Fatalf("should not acquire")
}
s.Release()
s.Release()
// This release should panic
defer func() {
r := recover()
if r == nil {
t.Fatalf("should panic")
}
}()
s.Release()
}
func TestStrSliceContains(t *testing.T) {
if strSliceContains(nil, "foo") {
t.Fatalf("Bad")
}
if strSliceContains([]string{}, "foo") {
t.Fatalf("Bad")
}
if strSliceContains([]string{"bar"}, "foo") {
t.Fatalf("Bad")
}
if !strSliceContains([]string{"bar", "foo"}, "foo") {
t.Fatalf("Bad")
}
}
func TestUtilResourceProvider(t *testing.T) {
type testCase struct {
ResourceName string
Alias string
Expected string
}
tests := []testCase{
{
// If no alias is provided, the first underscore-separated segment
// is assumed to be the provider name.
ResourceName: "aws_thing",
Alias: "",
Expected: "aws",
},
{
// If we have more than one underscore then it's the first one that we'll use.
ResourceName: "aws_thingy_thing",
Alias: "",
Expected: "aws",
},
{
// A provider can export a resource whose name is just the bare provider name,
// e.g. because the provider only has one resource and so any additional
// parts would be redundant.
ResourceName: "external",
Alias: "",
Expected: "external",
},
{
// Alias always overrides the default extraction of the name
ResourceName: "aws_thing",
Alias: "tls.baz",
Expected: "tls.baz",
},
}
for _, test := range tests {
got := resourceProvider(test.ResourceName, test.Alias)
if got != test.Expected {
t.Errorf(
"(%q, %q) produced %q; want %q",
test.ResourceName, test.Alias,
got,
test.Expected,
)
}
}
}
func TestUniqueStrings(t *testing.T) {
cases := []struct {
Input []string
Expected []string
}{
{
[]string{},
[]string{},
},
{
[]string{"x"},
[]string{"x"},
},
{
[]string{"a", "b", "c"},
[]string{"a", "b", "c"},
},
{
[]string{"a", "a", "a"},
[]string{"a"},
},
{
[]string{"a", "b", "a", "b", "a", "a"},
[]string{"a", "b"},
},
{
[]string{"c", "b", "a", "c", "b"},
[]string{"a", "b", "c"},
},
}
for i, tc := range cases {
t.Run(fmt.Sprintf("unique-%d", i), func(t *testing.T) {
actual := uniqueStrings(tc.Input)
if !reflect.DeepEqual(tc.Expected, actual) {
t.Fatalf("Expected: %q\nGot: %q", tc.Expected, actual)
}
})
}
}