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 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) } }) } }