@@ -30,6 +30,11 @@ type keyResponse struct {
3030 err error
3131}
3232
33+ type keyRingResponse struct {
34+ keyRing * kms.KeyRing
35+ err error
36+ }
37+
3338type versionResponse struct {
3439 version * kms.Version
3540 err error
@@ -42,9 +47,11 @@ type wrappingKeyResponse struct {
4247
4348type apiKmsMocked struct {
4449 idxKeyResponse int
50+ idxKeyRingResponse int
4551 idxVersionResponse int
4652 idxWrappingKeyResponse int
4753 keyResponses []keyResponse
54+ keyRingResponses []keyRingResponse
4855 versionResponses []versionResponse
4956 wrappingKeyResponses []wrappingKeyResponse
5057}
@@ -73,6 +80,14 @@ func (a *apiKmsMocked) GetKeyExecute(_ context.Context, _, _, _, _ string) (*kms
7380 return resp .key , resp .err
7481}
7582
83+ // GetKeyRingExecute implements ApiKmsClient.
84+ func (a * apiKmsMocked ) GetKeyRingExecute (_ context.Context , _ , _ , _ string ) (* kms.KeyRing , error ) {
85+ resp := a .keyRingResponses [a .idxKeyRingResponse ]
86+ a .idxKeyRingResponse ++
87+ a .idxKeyRingResponse %= len (a .keyRingResponses )
88+ return resp .keyRing , resp .err
89+ }
90+
7691func fixtureKey (state kms.KeyState ) * kms.Key {
7792 return & kms.Key {
7893 Algorithm : kms .ALGORITHM_AES_256_GCM .Ptr (),
@@ -89,6 +104,16 @@ func fixtureKey(state kms.KeyState) *kms.Key {
89104 }
90105}
91106
107+ func fixtureKeyRing (state kms.KeyRingState ) * kms.KeyRing {
108+ return & kms.KeyRing {
109+ CreatedAt : & testDate ,
110+ Description : utils .Ptr ("test-description" ),
111+ DisplayName : utils .Ptr ("test-displayname" ),
112+ Id : & testKeyRingId ,
113+ State : & state ,
114+ }
115+ }
116+
92117func fixtureWrappingKey (state kms.WrappingKeyState ) * kms.WrappingKey {
93118 return & kms.WrappingKey {
94119 Algorithm : kms .WRAPPINGALGORITHM__2048_OAEP_SHA256 .Ptr (),
@@ -118,6 +143,83 @@ func fixtureVersion(version int, disabled bool, state kms.VersionState) *kms.Ver
118143 }
119144}
120145
146+ func TestCreateKeyRingWaitHandler (t * testing.T ) {
147+ tests := []struct {
148+ name string
149+ responses []keyRingResponse
150+ want * kms.KeyRing
151+ wantErr bool
152+ }{
153+ {
154+ name : "create succeeded immediately" ,
155+ responses : []keyRingResponse {
156+ {fixtureKeyRing (kms .KEYRINGSTATE_ACTIVE ), nil },
157+ },
158+ want : fixtureKeyRing (kms .KEYRINGSTATE_ACTIVE ),
159+ wantErr : false ,
160+ },
161+ {
162+ name : "create succeeded delayed" ,
163+ responses : []keyRingResponse {
164+ {fixtureKeyRing (kms .KEYRINGSTATE_CREATING ), nil },
165+ {fixtureKeyRing (kms .KEYRINGSTATE_CREATING ), nil },
166+ {fixtureKeyRing (kms .KEYRINGSTATE_CREATING ), nil },
167+ {fixtureKeyRing (kms .KEYRINGSTATE_ACTIVE ), nil },
168+ },
169+ want : fixtureKeyRing (kms .KEYRINGSTATE_ACTIVE ),
170+ wantErr : false ,
171+ },
172+ {
173+ name : "create failed delayed" ,
174+ responses : []keyRingResponse {
175+ {fixtureKeyRing (kms .KEYRINGSTATE_CREATING ), nil },
176+ {fixtureKeyRing (kms .KEYRINGSTATE_CREATING ), nil },
177+ {fixtureKeyRing (kms .KEYRINGSTATE_CREATING ), nil },
178+ {fixtureKeyRing (kms .KEYRINGSTATE_DELETED ), nil },
179+ },
180+ want : fixtureKeyRing (kms .KEYRINGSTATE_DELETED ),
181+ wantErr : false ,
182+ },
183+ {
184+ name : "timeout" ,
185+ responses : []keyRingResponse {
186+ {fixtureKeyRing (kms .KEYRINGSTATE_CREATING ), nil },
187+ },
188+ want : nil ,
189+ wantErr : true ,
190+ },
191+ {
192+ name : "broken state" ,
193+ responses : []keyRingResponse {
194+ {fixtureKeyRing ("bogus" ), nil },
195+ },
196+ want : fixtureKeyRing ("bogus" ),
197+ wantErr : false ,
198+ },
199+ }
200+ for _ , tt := range tests {
201+ t .Run (tt .name , func (t * testing.T ) {
202+ ctx := context .Background ()
203+ client := & apiKmsMocked {
204+ keyRingResponses : tt .responses ,
205+ }
206+
207+ handler := CreateKeyRingWaitHandler (ctx , client , testProject , testRegion , testKeyRingId )
208+ got , err := handler .SetTimeout (1 * time .Second ).
209+ SetThrottle (250 * time .Millisecond ).
210+ WaitWithContext (ctx )
211+
212+ if (err != nil ) != tt .wantErr {
213+ t .Fatalf ("unexpected error response. want %v but got %v " , tt .wantErr , err )
214+ }
215+
216+ if diff := cmp .Diff (tt .want , got ); diff != "" {
217+ t .Errorf ("differing key %s" , diff )
218+ }
219+ })
220+ }
221+ }
222+
121223func TestCreateOrUpdateKeyWaitHandler (t * testing.T ) {
122224 tests := []struct {
123225 name string
0 commit comments