Add stream class's single clock class tests
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Wed, 7 Feb 2018 20:05:27 +0000 (15:05 -0500)
committerPhilippe Proulx <eeppeliteloop@gmail.com>
Thu, 2 May 2019 03:32:03 +0000 (23:32 -0400)
Those new tests verify that:

* You cannot have a clock class in one of the stream class's field types
  and a different one in one of its event classes.
* You cannot have two different clock classes in two different event
  classes of the same event class.
* You cannot set a stream class's CTF writer clock and have a clock
  class within this stream class which is not the stream class's clock's
  class.

The tests check those conditions when calling specific API functions and
in the expected order:

* bt_trace_add_stream_class()
* bt_event_create()
* bt_stream_class_add_event_class()

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
tests/lib/ctf-ir/Makefile.am
tests/lib/ctf-ir/test_stream_class.py [new file with mode: 0644]

index 6d8c8792400fac329d47db8acc0c1efa9ddb443a..0c4adbe785854de5bec858b43ef33e202c9b9183 100644 (file)
@@ -2,4 +2,4 @@ if ENABLE_PYTHON_BINDINGS
 check_SCRIPTS = test_ctf_ir
 endif
 
-EXTRA_DIST = test_trace.py
+EXTRA_DIST = test_trace.py test_stream_class.py
diff --git a/tests/lib/ctf-ir/test_stream_class.py b/tests/lib/ctf-ir/test_stream_class.py
new file mode 100644 (file)
index 0000000..0841848
--- /dev/null
@@ -0,0 +1,197 @@
+import unittest
+import bt2
+
+
+class StreamClassSingleClockClassTestCase(unittest.TestCase):
+    def setUp(self):
+        self._sc = bt2.StreamClass()
+
+    def tearDown(self):
+        del self._sc
+
+    def _test_add_sc_ft_vs_event_class(self, set_ft_func):
+        cc = bt2.ClockClass('first_cc', 1000)
+        scft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32, mapped_clock_class=cc)
+        scft.append_field('salut', ft)
+        set_ft_func(scft)
+        cc = bt2.ClockClass('second_cc', 1000)
+        payloadft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32, mapped_clock_class=cc)
+        payloadft.append_field('zorg', ft)
+        ec = bt2.EventClass('ec', payload_field_type=payloadft)
+        self._sc.add_event_class(ec)
+        trace = bt2.Trace()
+
+        with self.assertRaises(bt2.Error):
+            trace.add_stream_class(self._sc)
+
+    def test_add_sc_packet_context_vs_event_class(self):
+        def func(ft):
+            self._sc.packet_context_field_type = ft
+
+        self._test_add_sc_ft_vs_event_class(func)
+
+    def test_add_sc_event_context_vs_event_class(self):
+        def func(ft):
+            self._sc.event_context_field_type = ft
+
+        self._test_add_sc_ft_vs_event_class(func)
+
+    def test_add_sc_event_header_vs_event_class(self):
+        def func(ft):
+            self._sc.event_header_field_type = ft
+
+        self._test_add_sc_ft_vs_event_class(func)
+
+    def test_add_sc_event_class_vs_event_class(self):
+        ehft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32)
+        ehft.append_field('id', ft)
+        self._sc.event_header_field_type = ehft
+        cc = bt2.ClockClass('first_cc', 1000)
+        payloadft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32, mapped_clock_class=cc)
+        payloadft.append_field('zorg', ft)
+        ec1 = bt2.EventClass('ec', payload_field_type=payloadft)
+        cc = bt2.ClockClass('second_cc', 1000)
+        payloadft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32, mapped_clock_class=cc)
+        payloadft.append_field('logi', ft)
+        ec2 = bt2.EventClass('ec', payload_field_type=payloadft)
+        self._sc.add_event_class(ec1)
+        self._sc.add_event_class(ec2)
+        trace = bt2.Trace()
+
+        with self.assertRaises(bt2.Error):
+            trace.add_stream_class(self._sc)
+
+    def _test_create_event_ft_vs_event_class(self, set_ft_func):
+        cc = bt2.ClockClass('first_cc', 1000)
+        scft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32, mapped_clock_class=cc)
+        scft.append_field('salut', ft)
+        set_ft_func(scft)
+        cc = bt2.ClockClass('second_cc', 1000)
+        payloadft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32, mapped_clock_class=cc)
+        payloadft.append_field('zorg', ft)
+        ec = bt2.EventClass('ec', payload_field_type=payloadft)
+        self._sc.add_event_class(ec)
+
+        with self.assertRaises(bt2.Error):
+            ev = ec()
+
+    def test_create_event_packet_context_vs_event_class(self):
+        def func(ft):
+            self._sc.packet_context_field_type = ft
+
+        self._test_create_event_ft_vs_event_class(func)
+
+    def test_create_event_event_context_vs_event_class(self):
+        def func(ft):
+            self._sc.event_context_field_type = ft
+
+        self._test_create_event_ft_vs_event_class(func)
+
+    def test_create_event_event_header_vs_event_class(self):
+        def func(ft):
+            self._sc.event_header_field_type = ft
+
+        self._test_create_event_ft_vs_event_class(func)
+
+    def test_create_event_event_class_vs_event_class(self):
+        ehft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32)
+        ehft.append_field('id', ft)
+        self._sc.event_header_field_type = ehft
+        cc = bt2.ClockClass('first_cc', 1000)
+        payloadft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32, mapped_clock_class=cc)
+        payloadft.append_field('zorg', ft)
+        ec1 = bt2.EventClass('ec', payload_field_type=payloadft)
+        cc = bt2.ClockClass('second_cc', 1000)
+        payloadft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32, mapped_clock_class=cc)
+        payloadft.append_field('logi', ft)
+        ec2 = bt2.EventClass('ec', payload_field_type=payloadft)
+        self._sc.add_event_class(ec1)
+        self._sc.add_event_class(ec2)
+
+        with self.assertRaises(bt2.Error):
+            ev = ec1()
+
+    def test_add_ec_after_add_sc(self):
+        cc = bt2.ClockClass('first_cc', 1000)
+        scft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32, mapped_clock_class=cc)
+        scft.append_field('salut', ft)
+        self._sc.packet_context_field_type = scft
+        trace = bt2.Trace()
+        trace.add_stream_class(self._sc)
+        cc = bt2.ClockClass('second_cc', 1000)
+        payloadft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32, mapped_clock_class=cc)
+        payloadft.append_field('zorg', ft)
+        ec = bt2.EventClass('ec', payload_field_type=payloadft)
+
+        with self.assertRaises(bt2.Error):
+            self._sc.add_event_class(ec)
+
+    def test_add_ec_after_add_sc_single_cc(self):
+        ehft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32)
+        ehft.append_field('id', ft)
+        self._sc.event_header_field_type = ehft
+        trace = bt2.Trace()
+        trace.add_stream_class(self._sc)
+        cc = bt2.ClockClass('first_cc', 1000)
+        payloadft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32, mapped_clock_class=cc)
+        payloadft.append_field('zorg', ft)
+        ec = bt2.EventClass('ec', payload_field_type=payloadft)
+        self._sc.add_event_class(ec)
+        cc = bt2.ClockClass('second_cc', 1000)
+        payloadft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32, mapped_clock_class=cc)
+        payloadft.append_field('lel', ft)
+        ec = bt2.EventClass('ec', payload_field_type=payloadft)
+
+        with self.assertRaises(bt2.Error):
+            self._sc.add_event_class(ec)
+
+    def test_add_ec_after_create_event(self):
+        ehft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32)
+        ehft.append_field('id', ft)
+        self._sc.event_header_field_type = ehft
+        cc = bt2.ClockClass('first_cc', 1000)
+        payloadft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32, mapped_clock_class=cc)
+        payloadft.append_field('zorg', ft)
+        ec1 = bt2.EventClass('ec', payload_field_type=payloadft)
+        self._sc.add_event_class(ec1)
+        ev = ec1()
+        cc = bt2.ClockClass('second_cc', 1000)
+        payloadft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32, mapped_clock_class=cc)
+        payloadft.append_field('logi', ft)
+        ec2 = bt2.EventClass('ec', payload_field_type=payloadft)
+
+        with self.assertRaises(bt2.Error):
+            self._sc.add_event_class(ec2)
+
+    def test_sc_clock_matches_expected_clock_class(self):
+        clock = bt2.CtfWriterClock('sc_clock')
+        self._sc.clock = clock
+        writer = bt2.CtfWriter('/tmp')
+        writer.add_clock(clock)
+        writer.trace.add_stream_class(self._sc)
+        cc = bt2.ClockClass('other_cc', 1000)
+        payloadft = bt2.StructureFieldType()
+        ft = bt2.IntegerFieldType(32, mapped_clock_class=cc)
+        payloadft.append_field('zorg', ft)
+        ec = bt2.EventClass('ec', payload_field_type=payloadft)
+
+        with self.assertRaises(bt2.Error):
+            self._sc.add_event_class(ec)
This page took 0.028682 seconds and 4 git commands to generate.