@@ -30,6 +30,11 @@ type keyResponse struct {
30
30
err error
31
31
}
32
32
33
+ type keyRingResponse struct {
34
+ keyRing * kms.KeyRing
35
+ err error
36
+ }
37
+
33
38
type versionResponse struct {
34
39
version * kms.Version
35
40
err error
@@ -42,9 +47,11 @@ type wrappingKeyResponse struct {
42
47
43
48
type apiKmsMocked struct {
44
49
idxKeyResponse int
50
+ idxKeyRingResponse int
45
51
idxVersionResponse int
46
52
idxWrappingKeyResponse int
47
53
keyResponses []keyResponse
54
+ keyRingResponses []keyRingResponse
48
55
versionResponses []versionResponse
49
56
wrappingKeyResponses []wrappingKeyResponse
50
57
}
@@ -73,6 +80,14 @@ func (a *apiKmsMocked) GetKeyExecute(_ context.Context, _, _, _, _ string) (*kms
73
80
return resp .key , resp .err
74
81
}
75
82
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
+
76
91
func fixtureKey (state kms.KeyState ) * kms.Key {
77
92
return & kms.Key {
78
93
Algorithm : kms .ALGORITHM_AES_256_GCM .Ptr (),
@@ -89,6 +104,16 @@ func fixtureKey(state kms.KeyState) *kms.Key {
89
104
}
90
105
}
91
106
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
+
92
117
func fixtureWrappingKey (state kms.WrappingKeyState ) * kms.WrappingKey {
93
118
return & kms.WrappingKey {
94
119
Algorithm : kms .WRAPPINGALGORITHM__2048_OAEP_SHA256 .Ptr (),
@@ -118,6 +143,83 @@ func fixtureVersion(version int, disabled bool, state kms.VersionState) *kms.Ver
118
143
}
119
144
}
120
145
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
+
121
223
func TestCreateOrUpdateKeyWaitHandler (t * testing.T ) {
122
224
tests := []struct {
123
225
name string
0 commit comments