@@ -159,7 +159,7 @@ def test_can_send_unserializable_extra_data(self, MockWorker):
159
159
self .assertTrue (handler .pipe .empty ())
160
160
161
161
@mock .patch ('logtail.handler.FlushWorker' )
162
- def test_can_send_unserializable_extra_context (self , MockWorker ):
162
+ def test_can_send_unserializable_context (self , MockWorker ):
163
163
buffer_capacity = 1
164
164
handler = LogtailHandler (
165
165
source_token = self .source_token ,
@@ -178,6 +178,50 @@ def test_can_send_unserializable_extra_context(self, MockWorker):
178
178
self .assertRegex (log_entry ['context' ]['data' ]['unserializable' ], r'^<tests\.test_handler\.UnserializableObject object at 0x[0-f]+>$' )
179
179
self .assertTrue (handler .pipe .empty ())
180
180
181
+ @mock .patch ('logtail.handler.FlushWorker' )
182
+ def test_can_send_circular_dependency_in_extra_data (self , MockWorker ):
183
+ buffer_capacity = 1
184
+ handler = LogtailHandler (
185
+ source_token = self .source_token ,
186
+ buffer_capacity = buffer_capacity
187
+ )
188
+
189
+ logger = logging .getLogger (__name__ )
190
+ logger .handlers = []
191
+ logger .addHandler (handler )
192
+ circular_dependency = {'egg' : {}}
193
+ circular_dependency ['egg' ]['chicken' ] = circular_dependency
194
+ logger .info ('hello' , extra = {'data' : circular_dependency })
195
+
196
+ log_entry = handler .pipe .get ()
197
+
198
+ self .assertEqual (log_entry ['message' ], 'hello' )
199
+ self .assertEqual (log_entry ['data' ]['egg' ]['chicken' ], "<omitted circular reference>" )
200
+ self .assertTrue (handler .pipe .empty ())
201
+
202
+
203
+ @mock .patch ('logtail.handler.FlushWorker' )
204
+ def test_can_send_circular_dependency_in_context (self , MockWorker ):
205
+ buffer_capacity = 1
206
+ handler = LogtailHandler (
207
+ source_token = self .source_token ,
208
+ buffer_capacity = buffer_capacity
209
+ )
210
+
211
+ logger = logging .getLogger (__name__ )
212
+ logger .handlers = []
213
+ logger .addHandler (handler )
214
+ circular_dependency = {'egg' : {}}
215
+ circular_dependency ['egg' ]['chicken' ] = circular_dependency
216
+ with context (data = circular_dependency ):
217
+ logger .info ('hello' )
218
+
219
+ log_entry = handler .pipe .get ()
220
+
221
+ self .assertEqual (log_entry ['message' ], 'hello' )
222
+ self .assertEqual (log_entry ['context' ]['data' ]['egg' ]['chicken' ]['egg' ], "<omitted circular reference>" )
223
+ self .assertTrue (handler .pipe .empty ())
224
+
181
225
182
226
class UnserializableObject (object ):
183
227
""" Because this is a custom class, it cannot be serialized into JSON. """
0 commit comments