Skip to content

Commit 5b5599f

Browse files
[kms] fix flaky test (#3268)
1 parent ce121d4 commit 5b5599f

File tree

2 files changed

+59
-42
lines changed

2 files changed

+59
-42
lines changed

kms/api-client/requirements-test.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
pytest==5.3.2
2+
gcp-devrel-py-tools==0.0.15
3+
google-cloud-core

kms/api-client/snippets_test.py

Lines changed: 57 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import time
1717
from os import environ
1818

19-
from google.api_core.exceptions import GoogleAPICallError
19+
from google.api_core.exceptions import Aborted, GoogleAPICallError
2020
from google.cloud import kms_v1
2121
from google.cloud.kms_v1 import enums
2222
from google.iam.v1.policy_pb2 import Policy
@@ -25,6 +25,8 @@
2525

2626
import snippets
2727

28+
from gcp_devrel.testing import eventually_consistent
29+
2830

2931
def create_key_helper(key_id, purpose, algorithm, t):
3032
try:
@@ -51,7 +53,7 @@ def setup_module(module):
5153
except GoogleAPICallError:
5254
# keyring already exists
5355
pass
54-
s = create_key_helper(t.symId,
56+
s = create_key_helper(t.sym_id,
5557
enums.CryptoKey.CryptoKeyPurpose.ENCRYPT_DECRYPT,
5658
enums.CryptoKeyVersion.CryptoKeyVersionAlgorithm.
5759
GOOGLE_SYMMETRIC_ENCRYPTION,
@@ -69,9 +71,9 @@ class TestKMSSnippets:
6971
keyring_path = '{}/keyRings/{}'.format(parent, keyring_id)
7072
version = '1'
7173

72-
symId = 'symmetric'
74+
sym_id = 'symmetric'
7375

74-
sym = '{}/cryptoKeys/{}'.format(keyring_path, symId)
76+
sym = '{}/cryptoKeys/{}'.format(keyring_path, sym_id)
7577
sym_version = '{}/cryptoKeyVersions/{}'.format(sym, version)
7678

7779
message = 'test message 123'
@@ -94,7 +96,7 @@ def test_create_key_ring(self):
9496
@pytest.mark.skip(reason="Deleting keys isn't instant, so we should avoid \
9597
creating a large number of them in our tests")
9698
def test_create_crypto_key(self):
97-
key_id = self.symId + '-test' + str(int(time.time()))
99+
key_id = self.sym_id + '-test' + str(int(time.time()))
98100
snippets.create_crypto_key(self.project_id, self.location,
99101
self.keyring_id, key_id)
100102
c = kms_v1.KeyManagementServiceClient()
@@ -108,30 +110,30 @@ def test_create_crypto_key(self):
108110
def test_key_change_version_state(self):
109111
client = kms_v1.KeyManagementServiceClient()
110112
name = client.crypto_key_version_path(self.project_id, self.location,
111-
self.keyring_id, self.symId,
113+
self.keyring_id, self.sym_id,
112114
self.version)
113115
state_enum = enums.CryptoKeyVersion.CryptoKeyVersionState
114116
# test disable
115117
snippets.disable_crypto_key_version(self.project_id, self.location,
116-
self.keyring_id, self.symId,
118+
self.keyring_id, self.sym_id,
117119
self.version)
118120
response = client.get_crypto_key_version(name)
119121
assert response.state == state_enum.DISABLED
120122
# test destroy
121123
snippets.destroy_crypto_key_version(self.project_id, self.location,
122-
self.keyring_id, self.symId,
124+
self.keyring_id, self.sym_id,
123125
self.version)
124126
response = client.get_crypto_key_version(name)
125127
assert response.state == state_enum.DESTROY_SCHEDULED
126128
# test restore
127129
snippets.restore_crypto_key_version(self.project_id, self.location,
128-
self.keyring_id, self.symId,
130+
self.keyring_id, self.sym_id,
129131
self.version)
130132
response = client.get_crypto_key_version(name)
131133
assert response.state == state_enum.DISABLED
132134
# test re-enable
133135
snippets.enable_crypto_key_version(self.project_id, self.location,
134-
self.keyring_id, self.symId,
136+
self.keyring_id, self.sym_id,
135137
self.version)
136138
response = client.get_crypto_key_version(name)
137139
assert response.state == state_enum.ENABLED
@@ -171,48 +173,61 @@ def test_ring_policy(self):
171173
# tests get/add/remove policy members
172174
def test_key_policy(self):
173175
# add member
174-
snippets.add_member_to_crypto_key_policy(self.project_id,
175-
self.location,
176-
self.keyring_id,
177-
self.symId,
178-
self.member,
179-
self.role)
180-
policy = snippets.get_crypto_key_policy(self.project_id,
181-
self.location,
182-
self.keyring_id,
183-
self.symId)
184-
found = False
185-
for b in list(policy.bindings):
186-
if b.role == self.role and self.member in b.members:
187-
found = True
188-
assert found
176+
snippets.add_member_to_crypto_key_policy(
177+
self.project_id,
178+
self.location,
179+
self.keyring_id,
180+
self.sym_id,
181+
self.member,
182+
self.role)
183+
184+
def check_policy():
185+
policy = snippets.get_crypto_key_policy(
186+
self.project_id,
187+
self.location,
188+
self.keyring_id,
189+
self.sym_id)
190+
found = False
191+
for b in list(policy.bindings):
192+
if b.role == self.role and self.member in b.members:
193+
found = True
194+
assert found
195+
eventually_consistent.call(check_policy,
196+
exceptions=(Aborted, AssertionError))
189197
# remove member
190-
snippets.remove_member_from_crypto_key_policy(self.project_id,
191-
self.location,
192-
self.keyring_id,
193-
self.symId,
194-
self.member,
195-
self.role)
196-
policy = snippets.get_crypto_key_policy(self.project_id,
197-
self.location,
198-
self.keyring_id,
199-
self.symId)
200-
found = False
201-
for b in list(policy.bindings):
202-
if b.role == self.role and self.member in b.members:
203-
found = True
204-
assert not found
198+
snippets.remove_member_from_crypto_key_policy(
199+
self.project_id,
200+
self.location,
201+
self.keyring_id,
202+
self.sym_id,
203+
self.member,
204+
self.role)
205+
206+
def check_policy():
207+
policy = snippets.get_crypto_key_policy(
208+
self.project_id,
209+
self.location,
210+
self.keyring_id,
211+
self.sym_id)
212+
found = False
213+
for b in list(policy.bindings):
214+
if b.role == self.role and self.member in b.members:
215+
found = True
216+
assert not found
217+
eventually_consistent.call(
218+
check_policy,
219+
exceptions=(Aborted, AssertionError))
205220

206221
def test_symmetric_encrypt_decrypt(self):
207222
cipher_bytes = snippets.encrypt_symmetric(self.project_id,
208223
self.location,
209224
self.keyring_id,
210-
self.symId,
225+
self.sym_id,
211226
self.message_bytes)
212227
plain_bytes = snippets.decrypt_symmetric(self.project_id,
213228
self.location,
214229
self.keyring_id,
215-
self.symId,
230+
self.sym_id,
216231
cipher_bytes)
217232
assert plain_bytes == self.message_bytes
218233
assert cipher_bytes != self.message_bytes

0 commit comments

Comments
 (0)