Tests: flt.utils.muxer: add message ordering tests
[babeltrace.git] / tests / data / plugins / flt.utils.muxer / bt_plugin_muxer_test.py
diff --git a/tests/data/plugins/flt.utils.muxer/bt_plugin_muxer_test.py b/tests/data/plugins/flt.utils.muxer/bt_plugin_muxer_test.py
new file mode 100644 (file)
index 0000000..ac2ee59
--- /dev/null
@@ -0,0 +1,446 @@
+import bt2
+
+
+class TheIteratorOfConfusion(bt2._UserMessageIterator):
+    def __init__(self, port):
+        self._at = 0
+        test_name = port.user_data[0]
+        TEST_CASES[test_name].create_msgs(self, port.user_data[1:])
+
+    def __next__(self):
+        if self._at < len(self._msgs):
+            msg = self._msgs[self._at]
+            self._at += 1
+            return msg
+        raise StopIteration
+
+
+@bt2.plugin_component_class
+class TheSourceOfConfusion(
+    bt2._UserSourceComponent, message_iterator_class=TheIteratorOfConfusion
+):
+    def __init__(self, params, obj):
+        tc = self._create_trace_class()
+
+        test_name = str(params['test-name'])
+
+        TEST_CASES[test_name].source_setup(self, test_name)
+
+
+class DiffTraceName:
+    def source_setup(src, test_name):
+        tc1 = src._create_trace_class()
+        cc1 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+        tc2 = src._create_trace_class()
+        cc2 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+
+        trace_name1 = 'rouyn'
+        trace_name2 = 'noranda'
+
+        src._add_output_port('out1', (test_name, 1, tc1, cc1, trace_name1))
+        src._add_output_port('out2', (test_name, 2, tc2, cc2, trace_name2))
+
+    def create_msgs(msg_iter, params):
+        iter_id, tc, cc, trace_name = params
+        trace = tc(name=trace_name)
+        sc = tc.create_stream_class(
+            default_clock_class=cc, assigns_automatic_stream_id=False
+        )
+        stream = trace.create_stream(sc, 0)
+
+        sb_msg = msg_iter._create_stream_beginning_message(stream, 0)
+        se_msg = msg_iter._create_stream_end_message(stream, iter_id*193)
+
+        msg_iter._msgs = [sb_msg, se_msg]
+
+
+class DiffStreamName:
+    def source_setup(src, test_name):
+        tc1 = src._create_trace_class()
+        cc1 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+        tc2 = src._create_trace_class()
+        cc2 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+
+        stream_name1 = 'port-daniel'
+        stream_name2 = 'gascon'
+
+        src._add_output_port('out1', (test_name, 1, tc1, cc1, stream_name1))
+        src._add_output_port('out2', (test_name, 2, tc2, cc2, stream_name2))
+
+    def create_msgs(msg_iter, params):
+        iter_id, tc, cc, stream_name = params
+        trace = tc()
+        sc = tc.create_stream_class(
+            default_clock_class=cc, assigns_automatic_stream_id=False
+        )
+        stream = trace.create_stream(sc, 0, stream_name)
+
+        sb_msg = msg_iter._create_stream_beginning_message(stream, 0)
+        se_msg = msg_iter._create_stream_end_message(stream, iter_id*193)
+
+        msg_iter._msgs = [sb_msg, se_msg]
+
+
+class DiffStreamId:
+    def source_setup(src, test_name):
+        tc1 = src._create_trace_class()
+        cc1 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+        tc2 = src._create_trace_class()
+        cc2 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+
+        stream_id1 = 18
+        stream_id2 = 23
+
+        src._add_output_port('out1', (test_name, 1, tc1, cc1, stream_id1))
+        src._add_output_port('out2', (test_name, 2, tc2, cc2, stream_id2))
+
+    def create_msgs(msg_iter, params):
+        iter_id, tc, cc, stream_id = params
+        trace = tc()
+        sc = tc.create_stream_class(
+            default_clock_class=cc, assigns_automatic_stream_id=False
+        )
+        stream = trace.create_stream(sc, stream_id)
+
+        sb_msg = msg_iter._create_stream_beginning_message(stream, 0)
+        se_msg = msg_iter._create_stream_end_message(stream, iter_id*193)
+
+        msg_iter._msgs = [sb_msg, se_msg]
+
+
+class DiffStreamNoName:
+    def source_setup(src, test_name):
+        tc1 = src._create_trace_class()
+        cc1 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+        tc2 = src._create_trace_class()
+        cc2 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+
+        stream_name1 = "one"
+        stream_name2 = None
+
+        src._add_output_port('out1', (test_name, 1, tc1, cc1, stream_name1))
+        src._add_output_port('out2', (test_name, 2, tc2, cc2, stream_name2))
+
+    def create_msgs(msg_iter, params):
+        iter_id, tc, cc, stream_no_name = params
+        trace = tc()
+        sc = tc.create_stream_class(
+            default_clock_class=cc, assigns_automatic_stream_id=False
+        )
+        stream = trace.create_stream(sc, 0, name=stream_no_name)
+
+        sb_msg = msg_iter._create_stream_beginning_message(stream, 0)
+        se_msg = msg_iter._create_stream_end_message(stream, iter_id*193)
+
+        msg_iter._msgs = [sb_msg, se_msg]
+
+
+class DiffStreamClassId:
+    def source_setup(src, test_name):
+        tc1 = src._create_trace_class(assigns_automatic_stream_class_id=False)
+        cc1 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+        tc2 = src._create_trace_class(assigns_automatic_stream_class_id=False)
+        cc2 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+
+        stream_class_id1 = 18
+        stream_class_id2 = 23
+
+        src._add_output_port('out1', (test_name, 1, tc1, cc1, stream_class_id1))
+        src._add_output_port('out2', (test_name, 2, tc2, cc2, stream_class_id2))
+
+    def create_msgs(msg_iter, params):
+        iter_id, tc, cc, stream_class_id = params
+        trace = tc()
+        sc = tc.create_stream_class(
+            default_clock_class=cc,
+            id=stream_class_id,
+            assigns_automatic_stream_id=False,
+        )
+        stream = trace.create_stream(sc, 0)
+
+        sb_msg = msg_iter._create_stream_beginning_message(stream, 0)
+        se_msg = msg_iter._create_stream_end_message(stream, iter_id*193)
+
+        msg_iter._msgs = [sb_msg, se_msg]
+
+
+class DiffStreamClassName:
+    def source_setup(src, test_name):
+        tc1 = src._create_trace_class(assigns_automatic_stream_class_id=False)
+        cc1 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+        tc2 = src._create_trace_class(assigns_automatic_stream_class_id=False)
+        cc2 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+
+        stream_class_name1 = 'one'
+        stream_class_name2 = 'two'
+
+        src._add_output_port('out1', (test_name, 1, tc1, cc1, stream_class_name1))
+        src._add_output_port('out2', (test_name, 2, tc2, cc2, stream_class_name2))
+
+    def create_msgs(msg_iter, params):
+        iter_id, tc, cc, stream_class_name = params
+        trace = tc()
+        sc = tc.create_stream_class(
+            default_clock_class=cc,
+            id=0,
+            name=stream_class_name,
+            assigns_automatic_stream_id=False,
+        )
+        stream = trace.create_stream(sc, 0)
+
+        sb_msg = msg_iter._create_stream_beginning_message(stream, 0)
+        se_msg = msg_iter._create_stream_end_message(stream, iter_id*193)
+
+        msg_iter._msgs = [sb_msg, se_msg]
+
+
+class DiffStreamClassNoName:
+    def source_setup(src, test_name):
+        tc1 = src._create_trace_class(assigns_automatic_stream_class_id=False)
+        cc1 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+        tc2 = src._create_trace_class(assigns_automatic_stream_class_id=False)
+        cc2 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+
+        stream_class_name1 = 'one'
+        stream_class_name2 = None
+
+        src._add_output_port('out1', (test_name, 1, tc1, cc1, stream_class_name1))
+        src._add_output_port('out2', (test_name, 2, tc2, cc2, stream_class_name2))
+
+    def create_msgs(msg_iter, params):
+        iter_id, tc, cc, stream_class_name = params
+        trace = tc()
+        sc = tc.create_stream_class(
+            default_clock_class=cc,
+            id=0,
+            name=stream_class_name,
+            assigns_automatic_stream_id=False,
+        )
+        stream = trace.create_stream(sc, 0)
+
+        sb_msg = msg_iter._create_stream_beginning_message(stream, 0)
+        se_msg = msg_iter._create_stream_end_message(stream, iter_id*193)
+
+        msg_iter._msgs = [sb_msg, se_msg]
+
+
+class BasicTimestampOrdering:
+    def source_setup(src, test_name):
+        tc = src._create_trace_class()
+        cc = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+
+        timestamp1 = 0
+        timestamp2 = 120
+        timestamp3 = 4
+
+        src._add_output_port('out1', (test_name, 1, tc, cc, timestamp1))
+        src._add_output_port('out2', (test_name, 2, tc, cc, timestamp2))
+        src._add_output_port('out3', (test_name, 3, tc, cc, timestamp3))
+
+    def create_msgs(msg_iter, params):
+        iter_id, tc, cc, timestamp = params
+        trace = tc()
+        sc = tc.create_stream_class(default_clock_class=cc)
+        stream = trace.create_stream(sc)
+
+        sb_msg = msg_iter._create_stream_beginning_message(stream, timestamp)
+        se_msg = msg_iter._create_stream_end_message(stream, iter_id*193)
+
+        msg_iter._msgs = [sb_msg, se_msg]
+
+
+class MultiIterOrdering:
+    def source_setup(src, test_name):
+        tc1 = src._create_trace_class(assigns_automatic_stream_class_id=False)
+        tc2 = src._create_trace_class(assigns_automatic_stream_class_id=False)
+        tc3 = src._create_trace_class(assigns_automatic_stream_class_id=False)
+        tc4 = src._create_trace_class(assigns_automatic_stream_class_id=False)
+        cc = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+
+        src._add_output_port('out1', (test_name, 1, tc1, cc))
+        src._add_output_port('out2', (test_name, 2, tc2, cc))
+        src._add_output_port('out3', (test_name, 3, tc3, cc))
+        src._add_output_port('out4', (test_name, 4, tc4, cc))
+
+    def create_msgs(msg_iter, params):
+        iter_id, tc, cc = params
+        trace_hello = tc(name='hello')
+        trace_meow = tc(name='meow')
+
+        # Craft list of messages for each iterator so that the last messages of
+        # each iterator are all sharing the same timestamp.
+        clock_snapshot_value = 25
+
+        if iter_id == 1:
+            # Event, 2500 ns, trace "hello", stream class 0, stream 1
+            stream_class0 = tc.create_stream_class(
+                id=0, default_clock_class=cc, assigns_automatic_stream_id=False
+            )
+            sc_0_stream_1 = trace_hello.create_stream(stream_class0, id=1)
+            event_class = stream_class0.create_event_class(name='saumon atlantique')
+
+            msg_iter._msgs = [
+                msg_iter._create_stream_beginning_message(sc_0_stream_1, 0),
+                msg_iter._create_event_message(
+                    event_class, sc_0_stream_1, clock_snapshot_value
+                ),
+                msg_iter._create_stream_end_message(sc_0_stream_1, iter_id*193)
+            ]
+        elif iter_id == 2:
+            # Packet beginning, 2500 ns, trace "meow", stream class 0, stream 1
+            stream_class0 = tc.create_stream_class(
+                id=0,
+                default_clock_class=cc,
+                supports_packets=True,
+                packets_have_beginning_default_clock_snapshot=True,
+                packets_have_end_default_clock_snapshot=True,
+                assigns_automatic_stream_id=False,
+            )
+
+            sc_0_stream_1 = trace_meow.create_stream(stream_class0, id=1)
+            packet = sc_0_stream_1.create_packet()
+
+            msg_iter._msgs = [
+                msg_iter._create_stream_beginning_message(sc_0_stream_1, 1),
+                msg_iter._create_packet_beginning_message(packet, clock_snapshot_value),
+                msg_iter._create_packet_end_message(packet, iter_id*79),
+                msg_iter._create_stream_end_message(sc_0_stream_1, iter_id*193)
+            ]
+        elif iter_id == 3:
+            # Stream beginning, 2500 ns, trace "hello", stream class 0, stream 0
+            stream_class0 = tc.create_stream_class(
+                id=0, default_clock_class=cc, assigns_automatic_stream_id=False
+            )
+
+            sc_0_stream_0 = trace_hello.create_stream(stream_class0, id=0)
+
+            msg_iter._msgs = [
+                msg_iter._create_stream_beginning_message(
+                    sc_0_stream_0, clock_snapshot_value
+                ),
+                msg_iter._create_stream_end_message(sc_0_stream_0, iter_id*193)
+            ]
+        elif iter_id == 4:
+            # Event, 2500 ns, trace "meow", stream class 1, stream 1
+            stream_class1 = tc.create_stream_class(
+                id=1, default_clock_class=cc, assigns_automatic_stream_id=False
+            )
+
+            sc_1_stream_1 = trace_meow.create_stream(stream_class1, id=1)
+
+            event_class = stream_class1.create_event_class(name='bar rayĆ©')
+            msg_iter._msgs = [
+                msg_iter._create_stream_beginning_message(sc_1_stream_1, 3),
+                msg_iter._create_event_message(
+                    event_class, sc_1_stream_1, clock_snapshot_value
+                ),
+                msg_iter._create_stream_end_message(sc_1_stream_1, iter_id*193)
+            ]
+
+
+class DiffEventClassName:
+    def source_setup(src, test_name):
+        tc1 = src._create_trace_class(assigns_automatic_stream_class_id=False)
+        cc1 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+        tc2 = src._create_trace_class(assigns_automatic_stream_class_id=False)
+        cc2 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+
+        event_class_name1 = 'Hull'
+        event_class_name2 = 'Gatineau'
+
+        src._add_output_port('out1', (test_name, 1, tc1, cc1, event_class_name1))
+        src._add_output_port('out2', (test_name, 2, tc2, cc2, event_class_name2))
+
+    def create_msgs(msg_iter, params):
+        iter_id, tc, cc, event_class_name = params
+        trace = tc()
+        sc = tc.create_stream_class(
+            default_clock_class=cc,
+            id=0,
+            assigns_automatic_stream_id=False,
+            supports_packets=False,
+        )
+        ec = sc.create_event_class(name=event_class_name)
+
+        stream = trace.create_stream(sc, 0)
+
+        # Use event class name length as timestamp so that both stream
+        # beginning message are not at the same time. This test is targetting
+        # event message.
+        sb_msg = msg_iter._create_stream_beginning_message(stream, len(ec.name))
+        ev_msg = msg_iter._create_event_message(ec, stream, 50)
+        se_msg = msg_iter._create_stream_end_message(stream, iter_id*193)
+
+        msg_iter._msgs = [sb_msg, ev_msg, se_msg]
+
+
+class DiffEventClassId:
+    def source_setup(src, test_name):
+        tc1 = src._create_trace_class(assigns_automatic_stream_class_id=False)
+        cc1 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+        tc2 = src._create_trace_class(assigns_automatic_stream_class_id=False)
+        cc2 = src._create_clock_class(frequency=1, offset=bt2.ClockClassOffset(0))
+
+        event_class_id1 = 1
+        event_class_id2 = 2
+
+        src._add_output_port('out1', (test_name, 1, tc1, cc1, event_class_id1))
+        src._add_output_port('out2', (test_name, 2, tc2, cc2, event_class_id2))
+
+    def create_msgs(msg_iter, params):
+        iter_id, tc, cc, event_class_id = params
+        trace = tc()
+        sc = tc.create_stream_class(
+            default_clock_class=cc,
+            id=0,
+            assigns_automatic_stream_id=False,
+            assigns_automatic_event_class_id=False,
+            supports_packets=False,
+        )
+        ec = sc.create_event_class(id=event_class_id)
+
+        stream = trace.create_stream(sc, 0)
+
+        # Use event class id as timestamp so that both stream beginning message
+        # are not at the same time. This test is targetting event message.
+        sb_msg = msg_iter._create_stream_beginning_message(stream, ec.id)
+        ev_msg = msg_iter._create_event_message(ec, stream, 50)
+        se_msg = msg_iter._create_stream_end_message(stream, iter_id*193)
+
+        msg_iter._msgs = [sb_msg, ev_msg, se_msg]
+
+
+class DiffInactivityMsgCs:
+    def source_setup(src, test_name):
+        cc1 = src._create_clock_class(
+            frequency=1, name='La Baie', offset=bt2.ClockClassOffset(0)
+        )
+        cc2 = src._create_clock_class(
+            frequency=1, name='Chicoutimi', offset=bt2.ClockClassOffset(0)
+        )
+
+        src._add_output_port('out1', (test_name, cc1))
+        src._add_output_port('out2', (test_name, cc2))
+
+    def create_msgs(msg_iter, params):
+        cc, = params
+        sb_msg = msg_iter._create_message_iterator_inactivity_message(cc, 0)
+        msg_iter._msgs = [sb_msg]
+
+
+TEST_CASES = {
+    'diff_trace_name': DiffTraceName,
+    'diff_event_class_name': DiffEventClassName,
+    'diff_event_class_id': DiffEventClassId,
+    'diff_stream_name': DiffStreamName,
+    'diff_stream_no_name': DiffStreamNoName,
+    'diff_stream_id': DiffStreamId,
+    'diff_stream_class_id': DiffStreamClassId,
+    'diff_stream_class_name': DiffStreamClassName,
+    'diff_stream_class_no_name': DiffStreamClassNoName,
+    'diff_inactivity_msg_cs': DiffInactivityMsgCs,
+    'basic_timestamp_ordering': BasicTimestampOrdering,
+    'multi_iter_ordering': MultiIterOrdering,
+}
+
+bt2.register_plugin(__name__, 'test-muxer')
This page took 0.026477 seconds and 4 git commands to generate.