@@ -86,24 +86,68 @@ def test_iteration_w_raw_w_resume_tken(self):
86
86
self .assertNoSpans ()
87
87
88
88
def test_iteration_w_raw_raising_unavailable_no_token (self ):
89
+ from google .api_core .exceptions import ServiceUnavailable
90
+
91
+ ITEMS = (
92
+ self ._make_item (0 ),
93
+ self ._make_item (1 , resume_token = RESUME_TOKEN ),
94
+ self ._make_item (2 ),
95
+ )
96
+ before = _MockIterator (fail_after = True , error = ServiceUnavailable ("testing" ))
97
+ after = _MockIterator (* ITEMS )
98
+ restart = mock .Mock (spec = [], side_effect = [before , after ])
99
+ resumable = self ._call_fut (restart )
100
+ self .assertEqual (list (resumable ), list (ITEMS ))
101
+ self .assertEqual (restart .mock_calls , [mock .call (), mock .call (resume_token = b"" )])
102
+ self .assertNoSpans ()
103
+
104
+ def test_iteration_w_raw_raising_retryable_internal_error_no_token (self ):
105
+ from google .api_core .exceptions import InternalServerError
106
+
89
107
ITEMS = (
90
108
self ._make_item (0 ),
91
109
self ._make_item (1 , resume_token = RESUME_TOKEN ),
92
110
self ._make_item (2 ),
93
111
)
94
- before = _MockIterator (fail_after = True )
112
+ before = _MockIterator (
113
+ fail_after = True ,
114
+ error = InternalServerError (
115
+ "Received unexpected EOS on DATA frame from server"
116
+ ),
117
+ )
95
118
after = _MockIterator (* ITEMS )
96
119
restart = mock .Mock (spec = [], side_effect = [before , after ])
97
120
resumable = self ._call_fut (restart )
98
121
self .assertEqual (list (resumable ), list (ITEMS ))
99
122
self .assertEqual (restart .mock_calls , [mock .call (), mock .call (resume_token = b"" )])
100
123
self .assertNoSpans ()
101
124
125
+ def test_iteration_w_raw_raising_non_retryable_internal_error_no_token (self ):
126
+ from google .api_core .exceptions import InternalServerError
127
+
128
+ ITEMS = (
129
+ self ._make_item (0 ),
130
+ self ._make_item (1 , resume_token = RESUME_TOKEN ),
131
+ self ._make_item (2 ),
132
+ )
133
+ before = _MockIterator (fail_after = True , error = InternalServerError ("testing" ))
134
+ after = _MockIterator (* ITEMS )
135
+ restart = mock .Mock (spec = [], side_effect = [before , after ])
136
+ resumable = self ._call_fut (restart )
137
+ with self .assertRaises (InternalServerError ):
138
+ list (resumable )
139
+ self .assertEqual (restart .mock_calls , [mock .call ()])
140
+ self .assertNoSpans ()
141
+
102
142
def test_iteration_w_raw_raising_unavailable (self ):
143
+ from google .api_core .exceptions import ServiceUnavailable
144
+
103
145
FIRST = (self ._make_item (0 ), self ._make_item (1 , resume_token = RESUME_TOKEN ))
104
146
SECOND = (self ._make_item (2 ),) # discarded after 503
105
147
LAST = (self ._make_item (3 ),)
106
- before = _MockIterator (* (FIRST + SECOND ), fail_after = True )
148
+ before = _MockIterator (
149
+ * (FIRST + SECOND ), fail_after = True , error = ServiceUnavailable ("testing" )
150
+ )
107
151
after = _MockIterator (* LAST )
108
152
restart = mock .Mock (spec = [], side_effect = [before , after ])
109
153
resumable = self ._call_fut (restart )
@@ -113,10 +157,53 @@ def test_iteration_w_raw_raising_unavailable(self):
113
157
)
114
158
self .assertNoSpans ()
115
159
160
+ def test_iteration_w_raw_raising_retryable_internal_error (self ):
161
+ from google .api_core .exceptions import InternalServerError
162
+
163
+ FIRST = (self ._make_item (0 ), self ._make_item (1 , resume_token = RESUME_TOKEN ))
164
+ SECOND = (self ._make_item (2 ),) # discarded after 503
165
+ LAST = (self ._make_item (3 ),)
166
+ before = _MockIterator (
167
+ * (FIRST + SECOND ),
168
+ fail_after = True ,
169
+ error = InternalServerError (
170
+ "Received unexpected EOS on DATA frame from server"
171
+ )
172
+ )
173
+ after = _MockIterator (* LAST )
174
+ restart = mock .Mock (spec = [], side_effect = [before , after ])
175
+ resumable = self ._call_fut (restart )
176
+ self .assertEqual (list (resumable ), list (FIRST + LAST ))
177
+ self .assertEqual (
178
+ restart .mock_calls , [mock .call (), mock .call (resume_token = RESUME_TOKEN )]
179
+ )
180
+ self .assertNoSpans ()
181
+
182
+ def test_iteration_w_raw_raising_non_retryable_internal_error (self ):
183
+ from google .api_core .exceptions import InternalServerError
184
+
185
+ FIRST = (self ._make_item (0 ), self ._make_item (1 , resume_token = RESUME_TOKEN ))
186
+ SECOND = (self ._make_item (2 ),) # discarded after 503
187
+ LAST = (self ._make_item (3 ),)
188
+ before = _MockIterator (
189
+ * (FIRST + SECOND ), fail_after = True , error = InternalServerError ("testing" )
190
+ )
191
+ after = _MockIterator (* LAST )
192
+ restart = mock .Mock (spec = [], side_effect = [before , after ])
193
+ resumable = self ._call_fut (restart )
194
+ with self .assertRaises (InternalServerError ):
195
+ list (resumable )
196
+ self .assertEqual (restart .mock_calls , [mock .call ()])
197
+ self .assertNoSpans ()
198
+
116
199
def test_iteration_w_raw_raising_unavailable_after_token (self ):
200
+ from google .api_core .exceptions import ServiceUnavailable
201
+
117
202
FIRST = (self ._make_item (0 ), self ._make_item (1 , resume_token = RESUME_TOKEN ))
118
203
SECOND = (self ._make_item (2 ), self ._make_item (3 ))
119
- before = _MockIterator (* FIRST , fail_after = True )
204
+ before = _MockIterator (
205
+ * FIRST , fail_after = True , error = ServiceUnavailable ("testing" )
206
+ )
120
207
after = _MockIterator (* SECOND )
121
208
restart = mock .Mock (spec = [], side_effect = [before , after ])
122
209
resumable = self ._call_fut (restart )
@@ -126,6 +213,43 @@ def test_iteration_w_raw_raising_unavailable_after_token(self):
126
213
)
127
214
self .assertNoSpans ()
128
215
216
+ def test_iteration_w_raw_raising_retryable_internal_error_after_token (self ):
217
+ from google .api_core .exceptions import InternalServerError
218
+
219
+ FIRST = (self ._make_item (0 ), self ._make_item (1 , resume_token = RESUME_TOKEN ))
220
+ SECOND = (self ._make_item (2 ), self ._make_item (3 ))
221
+ before = _MockIterator (
222
+ * FIRST ,
223
+ fail_after = True ,
224
+ error = InternalServerError (
225
+ "Received unexpected EOS on DATA frame from server"
226
+ )
227
+ )
228
+ after = _MockIterator (* SECOND )
229
+ restart = mock .Mock (spec = [], side_effect = [before , after ])
230
+ resumable = self ._call_fut (restart )
231
+ self .assertEqual (list (resumable ), list (FIRST + SECOND ))
232
+ self .assertEqual (
233
+ restart .mock_calls , [mock .call (), mock .call (resume_token = RESUME_TOKEN )]
234
+ )
235
+ self .assertNoSpans ()
236
+
237
+ def test_iteration_w_raw_raising_non_retryable_internal_error_after_token (self ):
238
+ from google .api_core .exceptions import InternalServerError
239
+
240
+ FIRST = (self ._make_item (0 ), self ._make_item (1 , resume_token = RESUME_TOKEN ))
241
+ SECOND = (self ._make_item (2 ), self ._make_item (3 ))
<
10000
/td>
242
+ before = _MockIterator (
243
+ * FIRST , fail_after = True , error = InternalServerError ("testing" )
244
+ )
245
+ after = _MockIterator (* SECOND )
246
+ restart = mock .Mock (spec = [], side_effect = [before , after ])
247
+ resumable = self ._call_fut (restart )
248
+ with self .assertRaises (InternalServerError ):
249
+ list (resumable )
250
+ self .assertEqual (restart .mock_calls , [mock .call ()])
251
+ self .assertNoSpans ()
252
+
129
253
def test_iteration_w_span_creation (self ):
130
254
name = "TestSpan"
131
255
extra_atts = {"test_att" : 1 }
@@ -136,11 +260,15 @@ def test_iteration_w_span_creation(self):
136
260
self .assertSpanAttributes (name , attributes = dict (BASE_ATTRIBUTES , test_att = 1 ))
137
261
138
262
def test_iteration_w_multiple_span_creation (self ):
263
+ from google .api_core .exceptions import ServiceUnavailable
264
+
139
265
if HAS_OPENTELEMETRY_INSTALLED :
140
266
FIRST = (self ._make_item (0 ), self ._make_item (1 , resume_token = RESUME_TOKEN ))
141
267
SECOND = (self ._make_item (2 ),) # discarded after 503
142
268
LAST = (self ._make_item (3 ),)
143
- before = _MockIterator (* (FIRST + SECOND ), fail_after = True )
269
+ before = _MockIterator (
270
+ * (FIRST + SECOND ), fail_after = True , error = ServiceUnavailable ("testing" )
271
+ )
144
272
after = _MockIterator (* LAST )
145
273
restart = mock .Mock (spec = [], side_effect = [before , after ])
146
274
name = "TestSpan"
@@ -1153,18 +1281,17 @@ class _MockIterator(object):
1153
1281
def __init__ (self , * values , ** kw ):
1154
1282
self ._iter_values = iter (values )
1155
1283
self ._fail_after = kw .pop ("fail_after" , False )
1284
+ self ._error = kw .pop ("error" , Exception )
1156
1285
1157
1286
def __iter__ (self ):
1158
1287
return self
1159
1288
1160
1289
def __next__ (self ):
1161
- from google .api_core .exceptions import ServiceUnavailable
1162
-
1163
1290
try :
1164
1291
return next (self ._iter_values )
1165
1292
except StopIteration :
1166
1293
if self ._fail_after :
1167
- raise ServiceUnavailable ( "testing" )
1294
+ raise self . _error
1168
1295
raise
1169
1296
1170
1297
next = __next__
0 commit comments