X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=tests%2Fbindings%2Fpython%2Fbt2%2Ftest_message_iterator.py;h=0f9182f26b8ea9fb95e4758c8395f64c6913fcb3;hb=694c792bc8f078c02acde68a3390acafbb36b2f4;hp=84912983cb3db7ed133dd0f8f0762e3fc64e971a;hpb=45c51519900e100d9acda4acb9516ef69bc2d045;p=babeltrace.git diff --git a/tests/bindings/python/bt2/test_message_iterator.py b/tests/bindings/python/bt2/test_message_iterator.py index 84912983..0f9182f2 100644 --- a/tests/bindings/python/bt2/test_message_iterator.py +++ b/tests/bindings/python/bt2/test_message_iterator.py @@ -1,4 +1,3 @@ - # # Copyright (C) 2019 EfficiOS Inc. # @@ -40,8 +39,7 @@ class UserMessageIteratorTestCase(unittest.TestCase): graph = bt2.Graph() src_comp = graph.add_component(src_comp_cls, 'src') sink_comp = graph.add_component(MySink, 'sink') - graph.connect_ports(src_comp.output_ports['out'], - sink_comp.input_ports['in']) + graph.connect_ports(src_comp.output_ports['out'], sink_comp.input_ports['in']) return graph def test_init(self): @@ -55,8 +53,7 @@ class UserMessageIteratorTestCase(unittest.TestCase): initialized = True the_output_port_from_iter = self_port_output - class MySource(bt2._UserSourceComponent, - message_iterator_class=MyIter): + class MySource(bt2._UserSourceComponent, message_iterator_class=MyIter): def __init__(self, params): nonlocal the_output_port_from_source the_output_port_from_source = self._add_output_port('out', 'user data') @@ -65,7 +62,9 @@ class UserMessageIteratorTestCase(unittest.TestCase): graph = self._create_graph(MySource) graph.run() self.assertTrue(initialized) - self.assertEqual(the_output_port_from_source.addr, the_output_port_from_iter.addr) + self.assertEqual( + the_output_port_from_source.addr, the_output_port_from_iter.addr + ) self.assertEqual(the_output_port_from_iter.user_data, 'user data') def test_finalize(self): @@ -74,8 +73,7 @@ class UserMessageIteratorTestCase(unittest.TestCase): nonlocal finalized finalized = True - class MySource(bt2._UserSourceComponent, - message_iterator_class=MyIter): + class MySource(bt2._UserSourceComponent, message_iterator_class=MyIter): def __init__(self, params): self._add_output_port('out') @@ -91,8 +89,7 @@ class UserMessageIteratorTestCase(unittest.TestCase): nonlocal salut salut = self._component._salut - class MySource(bt2._UserSourceComponent, - message_iterator_class=MyIter): + class MySource(bt2._UserSourceComponent, message_iterator_class=MyIter): def __init__(self, params): self._add_output_port('out') self._salut = 23 @@ -108,8 +105,7 @@ class UserMessageIteratorTestCase(unittest.TestCase): nonlocal addr addr = self.addr - class MySource(bt2._UserSourceComponent, - message_iterator_class=MyIter): + class MySource(bt2._UserSourceComponent, message_iterator_class=MyIter): def __init__(self, params): self._add_output_port('out') @@ -201,8 +197,7 @@ class UserMessageIteratorTestCase(unittest.TestCase): else: raise StopIteration - class MySource(bt2._UserSourceComponent, - message_iterator_class=MySourceIter): + class MySource(bt2._UserSourceComponent, message_iterator_class=MySourceIter): def __init__(self, params): tc = self._create_trace_class() sc = tc.create_stream_class(supports_packets=True) @@ -230,7 +225,6 @@ class UserMessageIteratorTestCase(unittest.TestCase): input_port = self._add_input_port('in') self._add_output_port('out', input_port) - graph = bt2.Graph() src = graph.add_component(MySource, 'src') flt = graph.add_component(MyFilter, 'flt') @@ -299,13 +293,35 @@ class UserMessageIteratorTestCase(unittest.TestCase): it, MySourceIter = self._setup_seek_beginning_test() def _seek_beginning_error(self): - raise ValueError('ouch') + raise ValueError('ouch') MySourceIter._seek_beginning = _seek_beginning_error - with self.assertRaises(bt2.Error): + with self.assertRaises(bt2._Error): it.seek_beginning() + # Try consuming many times from an iterator that always returns TryAgain. + # This verifies that we are not missing an incref of Py_None, making the + # refcount of Py_None reach 0. + def test_try_again_many_times(self): + class MyIter(bt2._UserMessageIterator): + def __next__(self): + raise bt2.TryAgain + + class MySource(bt2._UserSourceComponent, message_iterator_class=MyIter): + def __init__(self, params): + self._add_output_port('out') + + graph = bt2.Graph() + src = graph.add_component(MySource, 'src') + it = graph.create_output_port_message_iterator(src.output_ports['out']) + + # The initial refcount of Py_None was in the 7000, so 100000 iterations + # should be enough to catch the bug even if there are small differences + # between configurations. + for i in range(100000): + with self.assertRaises(bt2.TryAgain): + next(it) class OutputPortMessageIteratorTestCase(unittest.TestCase): @@ -327,14 +343,15 @@ class OutputPortMessageIteratorTestCase(unittest.TestCase): elif self._at == 6: msg = self._create_stream_end_message(test_obj._stream) else: - msg = self._create_event_message(test_obj._event_class, test_obj._packet) + msg = self._create_event_message( + test_obj._event_class, test_obj._packet + ) msg.event.payload_field['my_int'] = self._at * 3 self._at += 1 return msg - class MySource(bt2._UserSourceComponent, - message_iterator_class=MyIter): + class MySource(bt2._UserSourceComponent, message_iterator_class=MyIter): def __init__(self, params): self._add_output_port('out') @@ -344,11 +361,11 @@ class OutputPortMessageIteratorTestCase(unittest.TestCase): # Create payload field class my_int_ft = trace_class.create_signed_integer_field_class(32) payload_ft = trace_class.create_structure_field_class() - payload_ft += [ - ('my_int', my_int_ft), - ] + payload_ft += [('my_int', my_int_ft)] - event_class = stream_class.create_event_class(name='salut', payload_field_class=payload_ft) + event_class = stream_class.create_event_class( + name='salut', payload_field_class=payload_ft + ) trace = trace_class() stream = trace.create_stream(stream_class) @@ -378,5 +395,6 @@ class OutputPortMessageIteratorTestCase(unittest.TestCase): field = msg.event.payload_field['my_int'] self.assertEqual(field, at * 3) + if __name__ == '__main__': unittest.main()