11package states
22
33import (
4+ "sync"
45 "testing"
56
67 "github.com/google/go-cmp/cmp"
@@ -24,27 +25,59 @@ func TestResourceInstanceObject_encode(t *testing.T) {
2425 addrs .RootModule .Resource (addrs .ManagedResourceMode , "test" , "boop" ),
2526 addrs .RootModule .Resource (addrs .ManagedResourceMode , "test" , "honk" ),
2627 }
27- rioOne := & ResourceInstanceObject {
28- Value : value ,
29- Status : ObjectPlanned ,
30- Dependencies : depsOne ,
31- }
32- rioTwo := & ResourceInstanceObject {
33- Value : value ,
34- Status : ObjectPlanned ,
35- Dependencies : depsTwo ,
36- }
37- riosOne , err := rioOne .Encode (value .Type (), 0 )
38- if err != nil {
39- t .Fatalf ("unexpected error: %s" , err )
28+
29+ // multiple instances may have been assigned the same deps slice
30+ objs := []* ResourceInstanceObject {
31+ & ResourceInstanceObject {
32+ Value : value ,
33+ Status : ObjectPlanned ,
34+ Dependencies : depsOne ,
35+ },
36+ & ResourceInstanceObject {
37+ Value : value ,
38+ Status : ObjectPlanned ,
39+ Dependencies : depsTwo ,
40+ },
41+ & ResourceInstanceObject {
42+ Value : value ,
43+ Status : ObjectPlanned ,
44+ Dependencies : depsOne ,
45+ },
46+ & ResourceInstanceObject {
47+ Value : value ,
48+ Status : ObjectPlanned ,
49+ Dependencies : depsOne ,
50+ },
4051 }
41- riosTwo , err := rioTwo .Encode (value .Type (), 0 )
42- if err != nil {
43- t .Fatalf ("unexpected error: %s" , err )
52+
53+ var encoded []* ResourceInstanceObjectSrc
54+
55+ // Encoding can happen concurrently, so we need to make sure the shared
56+ // Dependencies are safely handled
57+ var wg sync.WaitGroup
58+ var mu sync.Mutex
59+
60+ for _ , obj := range objs {
61+ obj := obj
62+ wg .Add (1 )
63+ go func () {
64+ defer wg .Done ()
65+ rios , err := obj .Encode (value .Type (), 0 )
66+ if err != nil {
67+ t .Errorf ("unexpected error: %s" , err )
68+ }
69+ mu .Lock ()
70+ encoded = append (encoded , rios )
71+ mu .Unlock ()
72+ }()
4473 }
74+ wg .Wait ()
75+
4576 // However, identical sets of dependencies should always be written to state
4677 // in an identical order, so we don't do meaningless state updates on refresh.
47- if diff := cmp .Diff (riosOne .Dependencies , riosTwo .Dependencies ); diff != "" {
48- t .Errorf ("identical dependencies got encoded in different orders:\n %s" , diff )
78+ for i := 0 ; i < len (encoded )- 1 ; i ++ {
79+ if diff := cmp .Diff (encoded [i ].Dependencies , encoded [i + 1 ].Dependencies ); diff != "" {
80+ t .Errorf ("identical dependencies got encoded in different orders:\n %s" , diff )
81+ }
4982 }
5083}
0 commit comments