@@ -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