11
11
# See the License for the specific language governing permissions and
12
12
# limitations under the License.
13
13
14
- import time
15
-
16
14
from gcloud import datastore
15
+ from gcp .testing import eventually_consistent
17
16
from gcp .testing .flaky import flaky
18
17
import pytest
19
18
import snippets
@@ -28,17 +27,8 @@ def __init__(self, *args, **kwargs):
28
27
def cleanup (self ):
29
28
with self .batch ():
30
29
self .delete_multi (
31
- [x .key for x in self .entities_to_delete ] +
32
- self .keys_to_delete )
33
-
34
-
35
- # This is pretty hacky, but make datastore wait 1s after any
36
- # put operation to in order to account for eventual consistency.
37
- class WaitingClient (CleanupClient ):
38
- def put_multi (self , * args , ** kwargs ):
39
- result = super (WaitingClient , self ).put_multi (* args , ** kwargs )
40
- time .sleep (1 )
41
- return result
30
+ list (set ([x .key for x in self .entities_to_delete ])) +
31
+ list (set (self .keys_to_delete )))
42
32
43
33
44
34
@pytest .yield_fixture
@@ -48,13 +38,6 @@ def client(cloud_config):
48
38
client .cleanup ()
49
39
50
40
51
- @pytest .yield_fixture
52
- def waiting_client (cloud_config ):
53
- client = WaitingClient (cloud_config .project )
54
- yield client
55
- client .cleanup ()
56
-
57
-
58
41
@flaky
59
42
class TestDatastoreSnippets :
60
43
# These tests mostly just test the absence of exceptions.
@@ -118,20 +101,23 @@ def test_batch_lookup(self, client):
118
101
def test_batch_delete (self , client ):
119
102
snippets .batch_delete (client )
120
103
121
- def test_unindexed_property_query (self , waiting_client ):
122
- tasks = snippets .unindexed_property_query (waiting_client )
123
- waiting_client .entities_to_delete .extend (tasks )
104
+ @eventually_consistent .mark
105
+ def test_unindexed_property_query (self , client ):
106
+ tasks = snippets .unindexed_property_query (client )
107
+ client .entities_to_delete .extend (tasks )
124
108
assert tasks
125
109
126
- def test_basic_query (self , waiting_client ):
127
- tasks = snippets .basic_query (waiting_client )
128
- waiting_client .entities_to_delete .extend (tasks )
110
+ @eventually_consistent .mark
111
+ def test_basic_query (self , client ):
112
+ tasks = snippets .basic_query (client )
113
+ client .entities_to_delete .extend (tasks )
129
114
assert tasks
130
115
131
- def test_projection_query (self , waiting_client ):
132
- priorities , percents = snippets .projection_query (waiting_client )
133
- waiting_client .entities_to_delete .extend (
134
- waiting_client .query (kind = 'Task' ).fetch ())
116
+ @eventually_consistent .mark
117
+ def test_projection_query (self , client ):
118
+ priorities , percents = snippets .projection_query (client )
119
+ client .entities_to_delete .extend (
120
+ client .query (kind = 'Task' ).fetch ())
135
121
assert priorities
136
122
assert percents
137
123
@@ -143,63 +129,74 @@ def test_ancestor_query(self, client):
143
129
def test_run_query (self , client ):
144
130
snippets .run_query (client )
145
131
146
- def test_cursor_paging (self , waiting_client ):
132
+ def test_cursor_paging (self , client ):
147
133
for n in range (6 ):
148
- waiting_client .entities_to_delete .append (
149
- snippets .insert (waiting_client ))
150
-
151
- page_one , cursor_one , page_two , cursor_two = snippets .cursor_paging (
152
- waiting_client )
153
-
154
- assert len (page_one ) == 5
155
- assert len (page_two ) == 1
156
- assert cursor_one
157
- assert cursor_two
158
-
159
- def test_property_filter (self , waiting_client ):
160
- tasks = snippets .property_filter (waiting_client )
161
- waiting_client .entities_to_delete .extend (tasks )
134
+ client .entities_to_delete .append (
135
+ snippets .insert (client ))
136
+
137
+ @eventually_consistent .call
138
+ def _ ():
139
+ results = snippets .cursor_paging (client )
140
+ page_one , cursor_one , page_two , cursor_two = results
141
+
142
+ assert len (page_one ) == 5
143
+ assert len (page_two ) == 1
144
+ assert cursor_one
145
+ assert cursor_two
146
+
147
+ @eventually_consistent .mark
148
+ def test_property_filter (self , client ):
149
+ tasks = snippets .property_filter (client )
150
+ client .entities_to_delete .extend (tasks )
162
151
assert tasks
163
152
164
- def test_composite_filter (self , waiting_client ):
165
- tasks = snippets .composite_filter (waiting_client )
166
- waiting_client .entities_to_delete .extend (tasks )
153
+ @eventually_consistent .mark
154
+ def test_composite_filter (self , client ):
155
+ tasks = snippets .composite_filter (client )
156
+ client .entities_to_delete .extend (tasks )
167
157
assert tasks
168
158
169
- def test_key_filter (self , waiting_client ):
170
- tasks = snippets .key_filter (waiting_client )
171
- waiting_client .entities_to_delete .extend (tasks )
159
+ @eventually_consistent .mark
160
+ def test_key_filter (self , client ):
161
+ tasks = snippets .key_filter (client )
162
+ client .entities_to_delete .extend (tasks )
172
163
assert tasks
173
164
174
- def test_ascending_sort (self , waiting_client ):
175
- tasks = snippets .ascending_sort (waiting_client )
176
- waiting_client .entities_to_delete .extend (tasks )
165
+ @eventually_consistent .mark
166
+ def test_ascending_sort (self , client ):
167
+ tasks = snippets .ascending_sort (client )
168
+ client .entities_to_delete .extend (tasks )
177
169
assert tasks
178
170
179
- def test_descending_sort (self , waiting_client ):
180
- tasks = snippets .descending_sort (waiting_client )
181
- waiting_client .entities_to_delete .extend (tasks )
171
+ @eventually_consistent .mark
172
+ def test_descending_sort (self , client ):
173
+ tasks = snippets .descending_sort (client )
174
+ client .entities_to_delete .extend (tasks )
182
175
assert tasks
183
176
184
- def test_multi_sort (self , waiting_client ):
185
- tasks = snippets .multi_sort (waiting_client )
186
- waiting_client .entities_to_delete .extend (tasks )
177
+ @eventually_consistent .mark
178
+ def test_multi_sort (self , client ):
179
+ tasks = snippets .multi_sort (client )
180
+ client .entities_to_delete .extend (tasks )
187
181
assert tasks
188
182
189
- def test_keys_only_query (self , waiting_client ):
190
- keys = snippets .keys_only_query (waiting_client )
191
- waiting_client .entities_to_delete .extend (
192
- waiting_client .query (kind = 'Task' ).fetch ())
183
+ @eventually_consistent .mark
184
+ def test_keys_only_query (self , client ):
185
+ keys = snippets .keys_only_query (client )
186
+ client .entities_to_delete .extend (
187
+ client .query (kind = 'Task' ).fetch ())
193
188
assert keys
194
189
195
- def test_distinct_query (self , waiting_client ):
196
- tasks = snippets .distinct_query (waiting_client )
197
- waiting_client .entities_to_delete .extend (tasks )
190
+ @eventually_consistent .mark
191
+ def test_distinct_query (self , client ):
192
+ tasks = snippets .distinct_query (client )
193
+ client .entities_to_delete .extend (tasks )
198
194
assert tasks
199
195
200
- def test_distinct_on_query (self , waiting_client ):
201
- tasks = snippets .distinct_on_query (waiting_client )
202
- waiting_client .entities_to_delete .extend (tasks )
196
+ @eventually_consistent .mark
197
+ def test_distinct_on_query (self , client ):
198
+ tasks = snippets .distinct_on_query (client )
199
+ client .entities_to_delete .extend (tasks )
203
200
assert tasks
204
201
205
202
def test_kindless_query (self , client ):
@@ -251,29 +248,33 @@ def transactional_single_entity_group_read_only(self, client):
251
248
assert task_list
252
249
assert tasks_in_list
253
250
254
- def test_namespace_run_query (self , waiting_client ):
251
+ @eventually_consistent .mark
252
+ def test_namespace_run_query (self , client ):
255
253
all_namespaces , filtered_namespaces = snippets .namespace_run_query (
256
- waiting_client )
254
+ client )
257
255
assert all_namespaces
258
256
assert filtered_namespaces
259
257
assert 'google' in filtered_namespaces
260
258
261
- def test_kind_run_query (self , waiting_client ):
262
- kinds = snippets .kind_run_query (waiting_client )
263
- waiting_client .entities_to_delete .extend (
264
- waiting_client .query (kind = 'Task' ).fetch ())
259
+ @eventually_consistent .mark
260
+ def test_kind_run_query (self , client ):
261
+ kinds = snippets .kind_run_query (client )
262
+ client .entities_to_delete .extend (
263
+ client .query (kind = 'Task' ).fetch ())
265
264
assert kinds
266
265
assert 'Task' in kinds
267
266
268
- def test_property_run_query (self , waiting_client ):
269
- kinds = snippets .property_run_query (waiting_client )
270
- waiting_client .entities_to_delete .extend (
271
- waiting_client .query (kind = 'Task' ).fetch ())
267
+ @eventually_consistent .mark
268
+ def test_property_run_query (self , client ):
269
+ kinds = snippets .property_run_query (client )
270
+ client .entities_to_delete .extend (
271
+ client .query (kind = 'Task' ).fetch ())
272
272
assert kinds
273
273
assert 'Task' in kinds
274
274
275
- def test_property_by_kind_run_query (self , waiting_client ):
276
- reprs = snippets .property_by_kind_run_query (waiting_client )
277
- waiting_client .entities_to_delete .extend (
278
- waiting_client .query (kind = 'Task' ).fetch ())
275
+ @eventually_consistent .mark
276
+ def test_property_by_kind_run_query (self , client ):
277
+ reprs = snippets .property_by_kind_run_query (client )
278
+ client .entities_to_delete .extend (
279
+ client .query (kind = 'Task' ).fetch ())
279
280
assert reprs
0 commit comments