|
7 | 7 | "fmt" |
8 | 8 | "reflect" |
9 | 9 | "testing" |
| 10 | + "time" |
10 | 11 |
|
11 | 12 | "github.com/go-test/deep" |
12 | 13 | "github.com/google/go-cmp/cmp" |
@@ -337,6 +338,18 @@ func TestStateHasResourceInstanceObjects(t *testing.T) { |
337 | 338 | s := ss.Lock() |
338 | 339 | delete(s.Modules[""].Resources["test.foo"].Instances, addrs.NoKey) |
339 | 340 | ss.Unlock() |
| 341 | + done := make(chan struct{}) |
| 342 | + go func() { |
| 343 | + ss.Lock() |
| 344 | + ss.Unlock() |
| 345 | + close(done) |
| 346 | + }() |
| 347 | + select { |
| 348 | + case <-done: |
| 349 | + // OK: lock was released |
| 350 | + case <-time.After(500 * time.Millisecond): |
| 351 | + t.Fatalf("Unlock did not release SyncState lock (timed out acquiring lock again)") |
| 352 | + } |
340 | 353 | }, |
341 | 354 | false, |
342 | 355 | }, |
@@ -1009,6 +1022,70 @@ func TestState_MoveModule(t *testing.T) { |
1009 | 1022 | }) |
1010 | 1023 | } |
1011 | 1024 |
|
| 1025 | +func TestState_ProviderAddrs(t *testing.T) { |
| 1026 | + // 1) nil state |
| 1027 | + var nilState *State |
| 1028 | + if got := nilState.ProviderAddrs(); got != nil { |
| 1029 | + t.Fatalf("nil state: expected nil, got %#v", got) |
| 1030 | + } |
| 1031 | + |
| 1032 | + // 2) empty state |
| 1033 | + empty := NewState() |
| 1034 | + if got := empty.ProviderAddrs(); got != nil { |
| 1035 | + t.Fatalf("empty state: expected nil, got %#v", got) |
| 1036 | + } |
| 1037 | + |
| 1038 | + // 3) populated state |
| 1039 | + s := NewState() |
| 1040 | + |
| 1041 | + rootAWS := addrs.AbsProviderConfig{ |
| 1042 | + Module: addrs.RootModule, |
| 1043 | + Provider: addrs.NewDefaultProvider("aws"), |
| 1044 | + } |
| 1045 | + rootGoogle := addrs.AbsProviderConfig{ |
| 1046 | + Module: addrs.RootModule, |
| 1047 | + Provider: addrs.NewDefaultProvider("google"), |
| 1048 | + } |
| 1049 | + childAWS := addrs.AbsProviderConfig{ |
| 1050 | + Module: addrs.RootModule.Child("child"), |
| 1051 | + Provider: addrs.NewDefaultProvider("aws"), |
| 1052 | + } |
| 1053 | + |
| 1054 | + rm := s.RootModule() |
| 1055 | + rm.SetResourceInstanceCurrent( |
| 1056 | + addrs.Resource{Mode: addrs.ManagedResourceMode, Type: "test_thing", Name: "foo"}.Instance(addrs.NoKey), |
| 1057 | + &ResourceInstanceObjectSrc{Status: ObjectReady, SchemaVersion: 1, AttrsJSON: []byte(`{}`)}, |
| 1058 | + rootAWS, |
| 1059 | + ) |
| 1060 | + |
| 1061 | + rm.SetResourceInstanceCurrent( |
| 1062 | + addrs.Resource{Mode: addrs.ManagedResourceMode, Type: "test_thing", Name: "bar"}.Instance(addrs.NoKey), |
| 1063 | + &ResourceInstanceObjectSrc{Status: ObjectReady, SchemaVersion: 1, AttrsJSON: []byte(`{}`)}, |
| 1064 | + rootAWS, |
| 1065 | + ) |
| 1066 | + |
| 1067 | + rm.SetResourceInstanceCurrent( |
| 1068 | + addrs.Resource{Mode: addrs.ManagedResourceMode, Type: "test_thing", Name: "baz"}.Instance(addrs.NoKey), |
| 1069 | + &ResourceInstanceObjectSrc{Status: ObjectReady, SchemaVersion: 1, AttrsJSON: []byte(`{}`)}, |
| 1070 | + rootGoogle, |
| 1071 | + ) |
| 1072 | + |
| 1073 | + childMI := addrs.RootModuleInstance.Child("child", addrs.NoKey) |
| 1074 | + cm := s.EnsureModule(childMI) |
| 1075 | + cm.SetResourceInstanceCurrent( |
| 1076 | + addrs.Resource{Mode: addrs.ManagedResourceMode, Type: "test_thing", Name: "child"}.Instance(addrs.NoKey), |
| 1077 | + &ResourceInstanceObjectSrc{Status: ObjectReady, SchemaVersion: 1, AttrsJSON: []byte(`{}`)}, |
| 1078 | + childAWS, |
| 1079 | + ) |
| 1080 | + |
| 1081 | + got := s.ProviderAddrs() |
| 1082 | + expected := []addrs.AbsProviderConfig{childAWS, rootAWS, rootGoogle} |
| 1083 | + |
| 1084 | + if !reflect.DeepEqual(got, expected) { |
| 1085 | + t.Fatalf("unexpected provider addrs\nexpected: %#v\ngot: %#v", expected, got) |
| 1086 | + } |
| 1087 | +} |
| 1088 | + |
1012 | 1089 | func mustParseModuleInstanceStr(str string) addrs.ModuleInstance { |
1013 | 1090 | addr, diags := addrs.ParseModuleInstanceStr(str) |
1014 | 1091 | if diags.HasErrors() { |
|
0 commit comments