1111# See the License for the specific language governing permissions and
1212# limitations under the License.
1313
14- import time
15-
1614from gcloud import datastore
15+ from gcp .testing import eventually_consistent
1716from gcp .testing .flaky import flaky
1817import pytest
1918import snippets
@@ -28,17 +27,8 @@ def __init__(self, *args, **kwargs):
2827 def cleanup (self ):
2928 with self .batch ():
3029 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 )))
4232
4333
4434@pytest .yield_fixture
@@ -48,13 +38,6 @@ def client(cloud_config):
4838 client .cleanup ()
4939
5040
51- @pytest .yield_fixture
52- def waiting_client (cloud_config ):
53- client = WaitingClient (cloud_config .project )
54- yield client
55- client .cleanup ()
56-
57-
5841@flaky
5942class TestDatastoreSnippets :
6043 # These tests mostly just test the absence of exceptions.
@@ -118,20 +101,23 @@ def test_batch_lookup(self, client):
118101 def test_batch_delete (self , client ):
119102 snippets .batch_delete (client )
120103
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 )
124108 assert tasks
125109
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 )
129114 assert tasks
130115
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 ())
135121 assert priorities
136122 assert percents
137123
@@ -143,63 +129,74 @@ def test_ancestor_query(self, client):
143129 def test_run_query (self , client ):
144130 snippets .run_query (client )
145131
146- def test_cursor_paging (self , waiting_client ):
132+ def test_cursor_paging (self , client ):
147133 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 )
162151 assert tasks
163152
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 )
167157 assert tasks
168158
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 )
172163 assert tasks
173164
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 )
177169 assert tasks
178170
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 )
182175 assert tasks
183176
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 )
187181 assert tasks
188182
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 ())
193188 assert keys
194189
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 )
198194 assert tasks
199195
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 )
203200 assert tasks
204201
205202 def test_kindless_query (self , client ):
@@ -251,29 +248,33 @@ def transactional_single_entity_group_read_only(self, client):
251248 assert task_list
252249 assert tasks_in_list
253250
254- def test_namespace_run_query (self , waiting_client ):
251+ @eventually_consistent .mark
252+ def test_namespace_run_query (self , client ):
255253 all_namespaces , filtered_namespaces = snippets .namespace_run_query (
256- waiting_client )
254+ client )
257255 assert all_namespaces
258256 assert filtered_namespaces
259257 assert 'google' in filtered_namespaces
260258
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 ())
265264 assert kinds
266265 assert 'Task' in kinds
267266
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 ())
272272 assert kinds
273273 assert 'Task' in kinds
274274
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 ())
279280 assert reprs
0 commit comments