12
12
# See the License for the specific language governing permissions and
13
13
# limitations under the License.
14
14
15
+ import abc
16
+ import time
17
+ import typing
15
18
import unittest
16
19
from threading import Event
17
20
from unittest import mock
18
21
22
+ from opentelemetry import trace as trace_api
19
23
from opentelemetry .sdk import trace
20
24
21
25
@@ -134,33 +138,50 @@ def test_add_span_processor_after_span_creation(self):
134
138
self .assertListEqual (spans_calls_list , expected_list )
135
139
136
140
137
- class TestSynchronousMultiSpanProcessor (unittest .TestCase ):
141
+ class MultiSpanProcessorTestBase (abc .ABC ):
142
+ @abc .abstractmethod
143
+ def create_multi_span_processor (
144
+ self ,
145
+ ) -> typing .Union [
146
+ trace .SynchronousMultiSpanProcessor , trace .ConcurrentMultiSpanProcessor
147
+ ]:
148
+ pass
149
+
150
+ @staticmethod
151
+ def create_default_span () -> trace_api .Span :
152
+ span_context = trace_api .SpanContext (37 , 73 , is_remote = False )
153
+ return trace_api .DefaultSpan (span_context )
154
+
138
155
def test_on_start (self ):
139
- multi_processor = trace . SynchronousMultiSpanProcessor ()
156
+ multi_processor = self . create_multi_span_processor ()
140
157
141
158
mocks = [mock .Mock (spec = trace .SpanProcessor ) for _ in range (0 , 5 )]
142
159
for mock_processor in mocks :
143
160
multi_processor .add_span_processor (mock_processor )
144
161
145
- multi_processor .on_start (mock .Mock (spec = trace .Span ))
162
+ span = self .create_default_span ()
163
+ multi_processor .on_start (span )
146
164
147
165
for mock_processor in mocks :
148
- self .assertEqual (1 , mock_processor .on_start .call_count )
166
+ mock_processor .on_start .assert_called_once_with (span )
167
+ multi_processor .shutdown ()
149
168
150
169
def test_on_end (self ):
151
- multi_processor = trace . SynchronousMultiSpanProcessor ()
170
+ multi_processor = self . create_multi_span_processor ()
152
171
153
172
mocks = [mock .Mock (spec = trace .SpanProcessor ) for _ in range (0 , 5 )]
154
173
for mock_processor in mocks :
155
174
multi_processor .add_span_processor (mock_processor )
156
175
157
- multi_processor .on_end (mock .Mock (spec = trace .Span ))
176
+ span = self .create_default_span ()
177
+ multi_processor .on_end (span )
158
178
159
179
for mock_processor in mocks :
160
- self .assertEqual (1 , mock_processor .on_end .call_count )
180
+ mock_processor .on_end .assert_called_once_with (span )
181
+ multi_processor .shutdown ()
161
182
162
183
def test_on_shutdown (self ):
163
- multi_processor = trace . SynchronousMultiSpanProcessor ()
184
+ multi_processor = self . create_multi_span_processor ()
164
185
165
186
mocks = [mock .Mock (spec = trace .SpanProcessor ) for _ in range (0 , 5 )]
166
187
for mock_processor in mocks :
@@ -169,10 +190,10 @@ def test_on_shutdown(self):
169
190
multi_processor .shutdown ()
170
191
171
192
for mock_processor in mocks :
172
- self . assertEqual ( 1 , mock_processor .shutdown .call_count )
193
+ mock_processor .shutdown .assert_called_once_with ( )
173
194
174
195
def test_force_flush (self ):
175
- multi_processor = trace . SynchronousMultiSpanProcessor ()
196
+ multi_processor = self . create_multi_span_processor ()
176
197
177
198
mocks = [mock .Mock (spec = trace .SpanProcessor ) for _ in range (0 , 5 )]
178
199
for mock_processor in mocks :
@@ -181,22 +202,35 @@ def test_force_flush(self):
181
202
182
203
flushed = multi_processor .force_flush (timeout_millis )
183
204
205
+ # pylint: disable=no-member
184
206
self .assertTrue (flushed )
185
207
for mock_processor in mocks :
208
+ # pylint: disable=no-member
186
209
self .assertEqual (1 , mock_processor .force_flush .call_count )
210
+ multi_processor .shutdown ()
211
+
212
+
213
+ class TestSynchronousMultiSpanProcessor (
214
+ MultiSpanProcessorTestBase , unittest .TestCase
215
+ ):
216
+ def create_multi_span_processor (
217
+ self ,
218
+ ) -> trace .SynchronousMultiSpanProcessor :
219
+ return trace .SynchronousMultiSpanProcessor ()
187
220
188
221
def test_force_flush_late_by_timeout (self ):
189
222
multi_processor = trace .SynchronousMultiSpanProcessor ()
190
223
224
+ def delayed_flush (_ ):
225
+ time .sleep (0.055 )
226
+
191
227
mock_processor1 = mock .Mock (spec = trace .SpanProcessor )
228
+ mock_processor1 .force_flush = mock .Mock (side_effect = delayed_flush )
192
229
multi_processor .add_span_processor (mock_processor1 )
193
230
mock_processor2 = mock .Mock (spec = trace .SpanProcessor )
194
231
multi_processor .add_span_processor (mock_processor2 )
195
232
196
- with (
197
- mock .patch .object (trace , "time_ns" , side_effect = (0 , 0 , 100000000 ))
198
- ):
199
- flushed = multi_processor .force_flush (50 )
233
+ flushed = multi_processor .force_flush (50 )
200
234
201
235
self .assertFalse (flushed )
202
236
self .assertEqual (1 , mock_processor1 .force_flush .call_count )
@@ -217,59 +251,13 @@ def test_force_flush_late_by_span_processor(self):
217
251
self .assertEqual (0 , mock_processor2 .force_flush .call_count )
218
252
219
253
220
- class TestConcurrentMultiSpanProcessor (unittest .TestCase ):
221
- def test_on_start (self ):
222
- multi_processor = trace .ConcurrentMultiSpanProcessor (3 )
223
-
224
- mocks = [mock .Mock (spec = trace .SpanProcessor ) for _ in range (0 , 5 )]
225
- for mock_processor in mocks :
226
- multi_processor .add_span_processor (mock_processor )
227
-
228
- multi_processor .on_start (mock .Mock (spec = trace .Span ))
229
-
230
- for mock_processor in mocks :
231
- self .assertEqual (1 , mock_processor .on_start .call_count )
232
- multi_processor .shutdown ()
233
-
234
- def test_on_end (self ):
235
- multi_processor = trace .ConcurrentMultiSpanProcessor (3 )
236
-
237
- mocks = [mock .Mock (spec = trace .SpanProcessor ) for _ in range (0 , 5 )]
238
- for mock_processor in mocks :
239
- multi_processor .add_span_processor (mock_processor )
240
- mock_span = mock .Mock (spec = trace .Span )
241
-
242
- multi_processor .on_end (mock_span )
243
-
244
- for mock_processor in mocks :
245
- self .assertEqual (1 , mock_processor .on_end .call_count )
246
- multi_processor .shutdown ()
247
-
248
- def test_on_shutdown (self ):
249
- multi_processor = trace .ConcurrentMultiSpanProcessor (3 )
250
-
251
- mocks = [mock .Mock (spec = trace .SpanProcessor ) for _ in range (0 , 5 )]
252
- for mock_processor in mocks :
253
- multi_processor .add_span_processor (mock_processor )
254
-
255
- multi_processor .shutdown ()
256
-
257
- for mock_processor in mocks :
258
- self .assertEqual (1 , mock_processor .shutdown .call_count )
259
-
260
- def test_force_flush (self ):
261
- multi_processor = trace .ConcurrentMultiSpanProcessor (3 )
262
-
263
- mocks = [mock .Mock (spec = trace .SpanProcessor ) for _ in range (0 , 5 )]
264
- for mock_processor in mocks :
265
- multi_processor .add_span_processor (mock_processor )
266
-
267
- flushed = multi_processor .force_flush (100 )
268
-
269
- self .assertTrue (flushed )
270
- for mock_processor in mocks :
271
- self .assertEqual (1 , mock_processor .force_flush .call_count )
272
- multi_processor .shutdown ()
254
+ class TestConcurrentMultiSpanProcessor (
255
+ MultiSpanProcessorTestBase , unittest .TestCase
256
+ ):
257
+ def create_multi_span_processor (
258
+ self ,
259
+ ) -> trace .ConcurrentMultiSpanProcessor :
260
+ return trace .ConcurrentMultiSpanProcessor (3 )
273
261
274
262
def test_force_flush_late_by_timeout (self ):
275
263
multi_processor = trace .ConcurrentMultiSpanProcessor (5 )
0 commit comments