bt2: Adapt test_stream_class.py and make it pass
authorSimon Marchi <simon.marchi@efficios.com>
Wed, 29 May 2019 14:28:55 +0000 (10:28 -0400)
committerPhilippe Proulx <eeppeliteloop@gmail.com>
Wed, 5 Jun 2019 17:47:34 +0000 (13:47 -0400)
This patch updates test_stream_class.py quite a bit.  In particular, it
removes everything related to equality, copy and deep copy.  Since we
don't support (at least, for the moment) assigning stream class
properties after it has been created, most "assign" tests have become
"create" tests.

Stream class objects in Python are created using
TraceClass.create_stream_class.  This method has been introduced
previously to support TraceClass tests, but this patch now adds the
missing options.  Some field class creation methods are added to
TraceClass, just enough to support test_stream_class.

Changes in stream_class.py are mostly to adjust to past API changes.
The assigns_automatic_event_class_id property is new, everything related
to "header" field classes is removed.  Everything related to equality,
copy and deep copy is also removed.  The __call__ function is removed,
as it's not how create streams anymore (we use Trace.create_stream).

A new concept in the lib is that packet beginning/end messages may or
may not have a default clock snapshot, even if the stream has a default
clock class.  An option to TraceClass.create_stream_class is added for
this.

Changes to other files are there to support the tests, and not meant to
be complete.

Change-Id: Idd182d3f512f4f5772816fee0c04e2b39fd163f2
Signed-off-by: Simon Marchi <simon.marchi@efficios.com>
Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/1291
Tested-by: jenkins
Reviewed-by: Philippe Proulx <eeppeliteloop@gmail.com>
bindings/python/bt2/bt2/clock_class.py
bindings/python/bt2/bt2/component.py
bindings/python/bt2/bt2/event_class.py
bindings/python/bt2/bt2/field_class.py
bindings/python/bt2/bt2/native_bt_stream_class.i
bindings/python/bt2/bt2/stream_class.py
bindings/python/bt2/bt2/trace_class.py
tests/bindings/python/bt2/test_stream_class.py

index 41c9863f6267d24d91a65ae16e230930a565cc8e..8eb25385d53560ec71be47cb602943ada5c17aad 100644 (file)
@@ -54,6 +54,9 @@ class ClockClassOffset:
 
 
 class ClockClass(object._SharedObject):
+    _get_ref = staticmethod(native_bt.clock_class_get_ref)
+    _put_ref = staticmethod(native_bt.clock_class_put_ref)
+
     def __init__(self, name, frequency, description=None, precision=None,
                  offset=None, is_absolute=None, uuid=None):
         utils._check_str(name)
index fcd50785dcfef57f6ebcb950aed0c9c673c47b58..ec8eb65a47609672d652a87dc48bc7b798339900 100644 (file)
@@ -641,6 +641,15 @@ class _UserComponent(metaclass=_UserComponentType):
 
         return tc
 
+    def _create_clock_class(self):
+        ptr = self._as_self_component_ptr(self._ptr)
+        cc_ptr = native_bt.clock_class_create(ptr)
+
+        if cc_ptr is None:
+            raise bt2.CreationError('could not create clock class')
+
+        return bt2.ClockClass._create_from_ptr(cc_ptr)
+
 
 class _UserSourceComponent(_UserComponent, _SourceComponent):
     _as_not_self_specific_component_ptr = staticmethod(native_bt.self_component_source_as_component_source)
index 057dbea436856d1295c7f607ecb88c830ea62125..72d63ecb6ea606a4bf3e2e68b848c2b05f27265f 100644 (file)
@@ -48,6 +48,9 @@ class EventClassLogLevel:
 
 
 class EventClass(object._SharedObject):
+    _get_ref = staticmethod(native_bt.event_class_get_ref)
+    _put_ref = staticmethod(native_bt.event_class_put_ref)
+
     def __init__(self, name, id=None, log_level=None, emf_uri=None,
                  context_field_class=None, payload_field_class=None):
         utils._check_str(name)
index db36c373adc819317147042b60ffa82e80e279a3..61febcc7ed52542d118090f70eb9f8a0a6aa9cd7 100644 (file)
@@ -27,12 +27,15 @@ import abc
 import bt2
 
 
-def _create_from_ptr(ptr):
-    typeid = native_bt.field_class_get_type_id(ptr)
-    return _TYPE_ID_TO_OBJ[typeid]._create_from_ptr(ptr)
+def _create_field_class_from_ptr_and_get_ref(ptr):
+    typeid = native_bt.field_class_get_type(ptr)
+    return _FIELD_CLASS_TYPE_TO_OBJ[typeid]._create_from_ptr_and_get_ref(ptr)
 
 
 class _FieldClass(object._SharedObject, metaclass=abc.ABCMeta):
+    _get_ref = staticmethod(native_bt.field_class_get_ref)
+    _put_ref = staticmethod(native_bt.field_class_put_ref)
+
     def __init__(self, ptr):
         super().__init__(ptr)
 
@@ -514,7 +517,7 @@ class _StructureFieldClassFieldIterator(collections.abc.Iterator):
         return name
 
 
-class StructureFieldClass(_FieldClass, _FieldContainer, _AlignmentProp):
+class _StructureFieldClass(_FieldClass, _FieldContainer, _AlignmentProp):
     _NAME = 'Structure'
     _ITER_CLS = _StructureFieldClassFieldIterator
 
@@ -545,8 +548,8 @@ class StructureFieldClass(_FieldClass, _FieldContainer, _AlignmentProp):
         return _create_from_ptr(field_class_ptr)
 
 
-StructureFieldClass.min_alignment = property(fset=StructureFieldClass.alignment.fset)
-StructureFieldClass.alignment = property(fget=StructureFieldClass.alignment.fget)
+_StructureFieldClass.min_alignment = property(fset=_StructureFieldClass.alignment.fset)
+_StructureFieldClass.alignment = property(fget=_StructureFieldClass.alignment.fget)
 
 
 class _VariantFieldClassFieldIterator(collections.abc.Iterator):
@@ -670,5 +673,6 @@ class SequenceFieldClass(_FieldClass):
         return _create_from_ptr(ptr)
 
 
-_TYPE_ID_TO_OBJ = {
+_FIELD_CLASS_TYPE_TO_OBJ = {
+    native_bt.FIELD_CLASS_TYPE_STRUCTURE: _StructureFieldClass,
 }
index b7c22c0cb329fe5821dbc2fd919bea209f1436c9..aba139bf3d951a2578ba77c7bb63defaeb9b7d8f 100644 (file)
@@ -41,6 +41,12 @@ extern bt_bool bt_stream_class_assigns_automatic_event_class_id(
 extern bt_bool bt_stream_class_assigns_automatic_stream_id(
                const bt_stream_class *stream_class);
 
+extern bt_bool bt_stream_class_packets_have_default_beginning_clock_snapshot(
+               const bt_stream_class *stream_class);
+
+extern bt_bool bt_stream_class_packets_have_default_end_clock_snapshot(
+               const bt_stream_class *stream_class);
+
 extern uint64_t bt_stream_class_get_id(
                const bt_stream_class *stream_class);
 
@@ -91,6 +97,12 @@ extern void bt_stream_class_set_assigns_automatic_event_class_id(
 extern void bt_stream_class_set_assigns_automatic_stream_id(
                bt_stream_class *stream_class, bt_bool value);
 
+extern void bt_stream_class_set_packets_have_default_beginning_clock_snapshot(
+               bt_stream_class *stream_class, bt_bool value);
+
+extern void bt_stream_class_set_packets_have_default_end_clock_snapshot(
+               bt_stream_class *stream_class, bt_bool value);
+
 extern bt_stream_class_status
 bt_stream_class_set_packet_context_field_class(
                bt_stream_class *stream_class,
index ccf3a84f8589fae3dc199aaff05922f02e50938f..0f9ac121aff58634fcfab42309c9f5009602f67b 100644 (file)
@@ -25,102 +25,80 @@ import bt2.field_class
 import collections.abc
 import bt2.ctf_writer
 import bt2.stream
-import copy
 import bt2
 
 
-class _EventClassIterator(collections.abc.Iterator):
-    def __init__(self, stream_class):
-        self._stream_class = stream_class
-        self._at = 0
-
-    def __next__(self):
-        if self._at == len(self._stream_class):
-            raise StopIteration
-
-        ec_ptr = native_bt.stream_class_get_event_class_by_index(self._stream_class._ptr,
-                                                                 self._at)
-        assert(ec_ptr)
-        ev_id = native_bt.event_class_get_id(ec_ptr)
-        native_bt.put(ec_ptr)
-        utils._handle_ret(ev_id, "cannot get event class object's ID")
-        self._at += 1
-        return ev_id
-
-
 class StreamClass(object._SharedObject, collections.abc.Mapping):
     _get_ref = staticmethod(native_bt.stream_class_get_ref)
     _put_ref = staticmethod(native_bt.stream_class_put_ref)
 
-    def __init__(self, name=None, id=None, packet_context_field_class=None,
-                 event_header_field_class=None, event_context_field_class=None,
-                 event_classes=None):
-        ptr = native_bt.stream_class_create_empty(None)
-
-        if ptr is None:
-            raise bt2.CreationError('cannot create stream class object')
-
-        super().__init__(ptr)
-
-        if name is not None:
-            self.name = name
-
-        if id is not None:
-            self.id = id
-
-        if packet_context_field_class is not None:
-            self.packet_context_field_class = packet_context_field_class
-
-        if event_header_field_class is not None:
-            self.event_header_field_class = event_header_field_class
-
-        if event_context_field_class is not None:
-            self.event_context_field_class = event_context_field_class
-
-        if event_classes is not None:
-            for event_class in event_classes:
-                self.add_event_class(event_class)
-
     def __getitem__(self, key):
         utils._check_int64(key)
-        ec_ptr = native_bt.stream_class_get_event_class_by_id(self._ptr,
-                                                              key)
+        ec_ptr = native_bt.stream_class_borrow_event_class_by_id(self._ptr, key)
 
         if ec_ptr is None:
             raise KeyError(key)
 
-        return bt2.EventClass._create_from_ptr(ec_ptr)
+        return bt2.EventClass._create_from_ptr_and_get_ref(ec_ptr)
 
     def __len__(self):
         count = native_bt.stream_class_get_event_class_count(self._ptr)
-        assert(count >= 0)
+        assert count >= 0
         return count
 
     def __iter__(self):
-        return _EventClassIterator(self)
+        for idx in range(len(self)):
+            ec_ptr = native_bt.stream_class_borrow_event_class_by_index_const(self._ptr, idx)
+            assert ec_ptr is not None
+
+            id = native_bt.event_class_get_id(ec_ptr)
+            assert id >= 0
+
+            yield id
 
-    def add_event_class(self, event_class):
-        utils._check_type(event_class, bt2.EventClass)
-        ret = native_bt.stream_class_add_event_class(self._ptr, event_class._ptr)
-        utils._handle_ret(ret, "cannot add event class object to stream class object's")
+    def create_event_class(self, id=None):
+        if self.assigns_automatic_event_class_id:
+            if id is not None:
+                raise bt2.CreationError('id provided, but stream class assigns automatic event class ids')
+
+            ec_ptr = native_bt.event_class_create(self._ptr)
+        else:
+            if id is None:
+                raise bt2.CreationError('id not provided, but stream class does not assign automatic event class ids')
+
+            utils._check_uint64(id)
+            ec_ptr = native_bt.event_class_create_with_id(self._ptr, id)
+
+        return bt2.event_class.EventClass._create_from_ptr(ec_ptr)
 
     @property
-    def trace(self):
-        tc_ptr = native_bt.stream_class_get_trace(self._ptr)
+    def trace_class(self):
+        tc_ptr = native_bt.stream_class_borrow_trace_class_const(self._ptr)
 
         if tc_ptr is not None:
-            return bt2.Trace._create_from_ptr(tc_ptr)
+            return bt2.TraceClass._create_from_ptr_and_get_ref(tc_ptr)
 
     @property
     def name(self):
         return native_bt.stream_class_get_name(self._ptr)
 
-    @name.setter
-    def name(self, name):
+    def _name(self, name):
         utils._check_str(name)
         ret = native_bt.stream_class_set_name(self._ptr, name)
         utils._handle_ret(ret, "cannot set stream class object's name")
 
+    _name = property(fset=_name)
+
+    @property
+    def assigns_automatic_event_class_id(self):
+        return native_bt.stream_class_assigns_automatic_event_class_id(self._ptr)
+
+    def _assigns_automatic_event_class_id(self, auto_id):
+        utils._check_bool(auto_id)
+        return native_bt.stream_class_set_assigns_automatic_event_class_id(self._ptr, auto_id)
+
+    _assigns_automatic_event_class_id = property(fset=_assigns_automatic_event_class_id)
+
     @property
     def assigns_automatic_stream_id(self):
         return native_bt.stream_class_assigns_automatic_stream_id(self._ptr)
@@ -131,6 +109,26 @@ class StreamClass(object._SharedObject, collections.abc.Mapping):
 
     _assigns_automatic_stream_id = property(fset=_assigns_automatic_stream_id)
 
+    @property
+    def packets_have_default_beginning_clock_snapshot(self):
+        return native_bt.stream_class_packets_have_default_beginning_clock_snapshot(self._ptr)
+
+    def _packets_have_default_beginning_clock_snapshot(self, value):
+        utils._check_bool(value)
+        native_bt.stream_class_set_packets_have_default_beginning_clock_snapshot(self._ptr, value)
+
+    _packets_have_default_beginning_clock_snapshot = property(fset=_packets_have_default_beginning_clock_snapshot)
+
+    @property
+    def packets_have_default_end_clock_snapshot(self):
+        return native_bt.stream_class_packets_have_default_end_clock_snapshot(self._ptr)
+
+    def _packets_have_default_end_clock_snapshot(self, value):
+        utils._check_bool(value)
+        native_bt.stream_class_set_packets_have_default_end_clock_snapshot(self._ptr, value)
+
+    _packets_have_default_end_clock_snapshot = property(fset=_packets_have_default_end_clock_snapshot)
+
     @property
     def id(self):
         id = native_bt.stream_class_get_id(self._ptr)
@@ -163,136 +161,55 @@ class StreamClass(object._SharedObject, collections.abc.Mapping):
 
     @property
     def packet_context_field_class(self):
-        fc_ptr = native_bt.stream_class_get_packet_context_type(self._ptr)
+        fc_ptr = native_bt.stream_class_borrow_packet_context_field_class_const(self._ptr)
 
         if fc_ptr is None:
             return
 
-        return bt2.field_class._create_from_ptr(fc_ptr)
-
-    @packet_context_field_class.setter
-    def packet_context_field_class(self, packet_context_field_class):
-        packet_context_field_class_ptr = None
+        return bt2.field_class._create_field_class_from_ptr_and_get_ref(fc_ptr)
 
+    def _packet_context_field_class(self, packet_context_field_class):
         if packet_context_field_class is not None:
-            utils._check_type(packet_context_field_class, bt2.field_class._FieldClass)
-            packet_context_field_class_ptr = packet_context_field_class._ptr
+            utils._check_type(packet_context_field_class,
+                              bt2.field_class._StructureFieldClass)
+            ret = native_bt.stream_class_set_packet_context_field_class(self._ptr,
+                                                                        packet_context_field_class._ptr)
+            utils._handle_ret(ret, "cannot set stream class' packet context field class")
 
-        ret = native_bt.stream_class_set_packet_context_type(self._ptr,
-                                                             packet_context_field_class_ptr)
-        utils._handle_ret(ret, "cannot set stream class object's packet context field class")
+    _packet_context_field_class = property(fset=_packet_context_field_class)
 
     @property
-    def event_header_field_class(self):
-        fc_ptr = native_bt.stream_class_get_event_header_type(self._ptr)
+    def event_common_context_field_class(self):
+        fc_ptr = native_bt.stream_class_borrow_event_common_context_field_class_const(self._ptr)
 
         if fc_ptr is None:
             return
 
-        return bt2.field_class._create_from_ptr(fc_ptr)
+        return bt2.field_class._create_field_class_from_ptr_and_get_ref(fc_ptr)
 
-    @event_header_field_class.setter
-    def event_header_field_class(self, event_header_field_class):
-        event_header_field_class_ptr = None
+    def _event_common_context_field_class(self, event_common_context_field_class):
+        if event_common_context_field_class is not None:
+            utils._check_type(event_common_context_field_class,
+                              bt2.field_class._StructureFieldClass)
 
-        if event_header_field_class is not None:
-            utils._check_type(event_header_field_class, bt2.field_class._FieldClass)
-            event_header_field_class_ptr = event_header_field_class._ptr
+            set_context_fn = native_bt.stream_class_set_event_common_context_field_class
+            ret = set_context_fn(self._ptr, event_common_context_field_class._ptr)
 
-        ret = native_bt.stream_class_set_event_header_type(self._ptr,
-                                                           event_header_field_class_ptr)
-        utils._handle_ret(ret, "cannot set stream class object's event header field class")
+            utils._handle_ret(ret, "cannot set stream class' event context field type")
 
-    @property
-    def event_context_field_class(self):
-        fc_ptr = native_bt.stream_class_get_event_context_type(self._ptr)
+    _event_common_context_field_class = property(fset=_event_common_context_field_class)
 
-        if fc_ptr is None:
+    @property
+    def default_clock_class(self):
+        cc_ptr = native_bt.stream_class_borrow_default_clock_class(self._ptr)
+        if cc_ptr is None:
             return
 
-        return bt2.field_class._create_from_ptr(fc_ptr)
-
-    @event_context_field_class.setter
-    def event_context_field_class(self, event_context_field_class):
-        event_context_field_class_ptr = None
-
-        if event_context_field_class is not None:
-            utils._check_type(event_context_field_class, bt2.field_class._FieldClass)
-            event_context_field_class_ptr = event_context_field_class._ptr
+        return bt2.clock_class.ClockClass._create_from_ptr_and_get_ref(cc_ptr)
 
-        ret = native_bt.stream_class_set_event_context_type(self._ptr,
-                                                            event_context_field_class_ptr)
-        utils._handle_ret(ret, "cannot set stream class object's event context field class")
+    def _default_clock_class(self, clock_class):
+        utils._check_type(clock_class, bt2.clock_class.ClockClass)
+        native_bt.stream_class_set_default_clock_class(
+            self._ptr, clock_class._ptr)
 
-    def __call__(self, name=None, id=None):
-        if name is not None:
-            utils._check_str(name)
-
-        if id is None:
-            stream_ptr = native_bt.stream_create(self._ptr, name)
-        else:
-            stream_ptr = native_bt.stream_create_with_id(self._ptr, name, id)
-
-        if stream_ptr is None:
-            raise bt2.CreationError('cannot create stream object')
-
-        return bt2.stream._create_from_ptr(stream_ptr)
-
-    def __eq__(self, other):
-        if type(other) is not type(self):
-            return False
-
-        if self.addr == other.addr:
-            return True
-
-        self_event_classes = list(self.values())
-        other_event_classes = list(other.values())
-        self_props = (
-            self_event_classes,
-            self.name,
-            self.id,
-            self.packet_context_field_class,
-            self.event_header_field_class,
-            self.event_context_field_class,
-            self.clock,
-        )
-        other_props = (
-            other_event_classes,
-            other.name,
-            other.id,
-            other.packet_context_field_class,
-            other.event_header_field_class,
-            other.event_context_field_class,
-            other.clock,
-        )
-
-        return self_props == other_props
-
-    def _copy(self, fc_copy_func, ev_copy_func):
-        cpy = StreamClass()
-
-        if self.id is not None:
-            cpy.id = self.id
-
-        if self.name is not None:
-            cpy.name = self.name
-
-        if self.clock is not None:
-            cpy.clock = self.clock
-
-        cpy.packet_context_field_class = fc_copy_func(self.packet_context_field_class)
-        cpy.event_header_field_class = fc_copy_func(self.event_header_field_class)
-        cpy.event_context_field_class = fc_copy_func(self.event_context_field_class)
-
-        for event_class in self.values():
-            cpy.add_event_class(ev_copy_func(event_class))
-
-        return cpy
-
-    def __copy__(self):
-        return self._copy(lambda fc: fc, copy.copy)
-
-    def __deepcopy__(self, memo):
-        cpy = self._copy(copy.deepcopy, copy.deepcopy)
-        memo[id(self)] = cpy
-        return cpy
+    _default_clock_class = property(fset=_default_clock_class)
index 4ee7702fba5d236a4f1d226a67c8f9dd78a2d01f..631334a7fa9b356e09347ca635f8f75a2a90e374 100644 (file)
@@ -165,7 +165,14 @@ class TraceClass(object._SharedObject, collections.abc.Mapping):
         return _TraceClassEnv(self)
 
     def create_stream_class(self, id=None,
-                            assigns_automatic_stream_id=True):
+                            name=None,
+                            packet_context_field_class=None,
+                            event_common_context_field_class=None,
+                            default_clock_class=None,
+                            assigns_automatic_event_class_id=True,
+                            assigns_automatic_stream_id=True,
+                            packets_have_default_beginning_clock_snapshot=False,
+                            packets_have_default_end_clock_snapshot=False):
 
         if self.assigns_automatic_stream_class_id:
             if id is not None:
@@ -181,7 +188,22 @@ class TraceClass(object._SharedObject, collections.abc.Mapping):
 
         sc = bt2.stream_class.StreamClass._create_from_ptr(sc_ptr)
 
+        if name is not None:
+            sc._name = name
+
+        if packet_context_field_class is not None:
+            sc._packet_context_field_class = packet_context_field_class
+
+        if event_common_context_field_class is not None:
+            sc._event_common_context_field_class = event_common_context_field_class
+
+        if default_clock_class is not None:
+            sc._default_clock_class = default_clock_class
+
+        sc._assigns_automatic_event_class_id = assigns_automatic_event_class_id
         sc._assigns_automatic_stream_id = assigns_automatic_stream_id
+        sc._packets_have_default_beginning_clock_snapshot = packets_have_default_beginning_clock_snapshot
+        sc._packets_have_default_end_clock_snapshot = packets_have_default_end_clock_snapshot
 
         return sc
 
@@ -195,6 +217,25 @@ class TraceClass(object._SharedObject, collections.abc.Mapping):
 
     _assigns_automatic_stream_class_id = property(fset=_assigns_automatic_stream_class_id)
 
+    # Field class creation methods.
+
+    def _check_create_status(self, ptr, type_name):
+        if ptr is None:
+            raise bt2.CreationError(
+                'cannot create {} field class'.format(type_name))
+
+    def create_structure_field_class(self):
+        field_class_ptr = native_bt.field_class_structure_create(self._ptr)
+        self._check_create_status(field_class_ptr, 'structure')
+
+        return bt2.field_class._StructureFieldClass._create_from_ptr(field_class_ptr)
+
+    def create_string_field_class(self):
+        field_class_ptr = native_bt.field_class_string_create(self._ptr)
+        self._check_create_status(field_class_ptr, 'string')
+
+        return bt2.field_class.StringFieldClass._create_from_ptr(field_class_ptr)
+
     # Add a listener to be called when the trace class is destroyed.
 
     def add_destruction_listener(self, listener):
index 3f5f4a8abd2e9b1fba9cf74593dfdff98699329d..3eb695b1c5f8f00aa875eec89a642abc7b33c58c 100644 (file)
-from bt2 import value
 import unittest
-import copy
 import bt2
+from utils import run_in_component_init
 
 
-@unittest.skip("this is broken")
 class StreamClassTestCase(unittest.TestCase):
     def setUp(self):
-        self._packet_context_fc = bt2.StructureFieldClass()
-        self._packet_context_fc.append_field('menu', bt2.FloatingPointNumberFieldClass())
-        self._packet_context_fc.append_field('sticker', bt2.StringFieldClass())
-        self._event_header_fc = bt2.StructureFieldClass()
-        self._event_header_fc.append_field('id', bt2.IntegerFieldClass(19))
-        self._event_context_fc = bt2.StructureFieldClass()
-        self._event_context_fc.append_field('msg', bt2.StringFieldClass())
-        self._ec1, self._ec2 = self._create_event_classes()
-        self._sc = bt2.StreamClass(name='my_stream_class', id=12,
-                                   packet_context_field_class=self._packet_context_fc,
-                                   event_header_field_class=self._event_header_fc,
-                                   event_context_field_class=self._event_context_fc,
-                                   event_classes=(self._ec1, self._ec2))
-
-    def tearDown(self):
-        del self._packet_context_fc
-        del self._event_header_fc
-        del self._event_context_fc
-        del self._ec1
-        del self._sc
-
-    def _create_event_classes(self):
-        context_fc = bt2.StructureFieldClass()
-        context_fc.append_field('allo', bt2.StringFieldClass())
-        context_fc.append_field('zola', bt2.IntegerFieldClass(18))
-        payload_fc = bt2.StructureFieldClass()
-        payload_fc.append_field('zoom', bt2.StringFieldClass())
-        ec1 = bt2.EventClass('event23', id=23, context_field_class=context_fc,
-                             payload_field_class=payload_fc)
-        ec2 = bt2.EventClass('event17', id=17, context_field_class=payload_fc,
-                             payload_field_class=context_fc)
-        return ec1, ec2
-
-    def test_create(self):
-        self.assertEqual(self._sc.name, 'my_stream_class')
-        self.assertEqual(self._sc.id, 12)
-        self.assertEqual(self._sc.packet_context_field_class, self._packet_context_fc)
-        self.assertEqual(self._sc.event_header_field_class, self._event_header_fc)
-        self.assertEqual(self._sc.event_context_field_class, self._event_context_fc)
-        self.assertEqual(self._sc[23], self._ec1)
-        self.assertEqual(self._sc[17], self._ec2)
-        self.assertEqual(len(self._sc), 2)
-
-    def test_assign_name(self):
-        self._sc.name = 'lel'
-        self.assertEqual(self._sc.name, 'lel')
-
-    def test_assign_invalid_name(self):
+        def f(comp_self):
+            tc = comp_self._create_trace_class(assigns_automatic_stream_class_id=True)
+            cc = comp_self._create_clock_class()
+            return tc, cc
+
+        self._tc, self._cc = run_in_component_init(f)
+        self._trace = self._tc()
+
+    def test_create_default(self):
+        sc = self._tc.create_stream_class()
+
+        self.assertIsNone(sc.name)
+        self.assertIsNone(sc.packet_context_field_class)
+        self.assertIsNone(sc.event_common_context_field_class)
+        self.assertIsNone(sc.default_clock_class)
+        self.assertTrue(sc.assigns_automatic_event_class_id)
+        self.assertTrue(sc.assigns_automatic_stream_id)
+        self.assertFalse(sc.packets_have_default_beginning_clock_snapshot)
+        self.assertFalse(sc.packets_have_default_end_clock_snapshot)
+
+    def test_create_name(self):
+        sc = self._tc.create_stream_class(name='bozo')
+        self.assertEqual(sc.name, 'bozo')
+
+    def test_create_invalid_name(self):
         with self.assertRaises(TypeError):
-            self._sc.name = 17
+            self._tc.create_stream_class(name=17)
 
-    def test_assign_id(self):
-        self._sc.id = 1717
-        self.assertEqual(self._sc.id, 1717)
+    def test_create_packet_context_field_class(self):
+        fc = self._tc.create_structure_field_class()
+        sc = self._tc.create_stream_class(packet_context_field_class=fc)
+        self.assertEqual(sc.packet_context_field_class, fc)
 
-    def test_assign_invalid_id(self):
+    def test_create_invalid_packet_context_field_class(self):
         with self.assertRaises(TypeError):
-            self._sc.id = 'lel'
+            self._tc.create_stream_class(packet_context_field_class=22)
 
-    def test_no_id(self):
-        sc = bt2.StreamClass()
-        self.assertIsNone(sc.id)
+    def test_create_event_common_context_field_class(self):
+        fc = self._tc.create_structure_field_class()
+        sc = self._tc.create_stream_class(event_common_context_field_class=fc)
+        self.assertEqual(sc.event_common_context_field_class, fc)
 
-    def test_assign_packet_context_field_class(self):
-        self._sc.packet_context_field_class = self._event_context_fc
-        self.assertEqual(self._sc.packet_context_field_class, self._event_context_fc)
+    def test_create_invalid_event_common_context_field_class(self):
+        with self.assertRaises(TypeError):
+            self._tc.create_stream_class(event_common_context_field_class=22)
 
-    def test_assign_no_packet_context_field_class(self):
-        self._sc.packet_context_field_class = None
-        self.assertIsNone(self._sc.packet_context_field_class)
+    def test_create_default_clock_class(self):
+        sc = self._tc.create_stream_class(default_clock_class=self._cc)
+        self.assertEqual(sc.default_clock_class.addr, self._cc.addr)
 
-    def test_assign_invalid_packet_context_field_class(self):
+    def test_create_invalid_default_clock_class(self):
         with self.assertRaises(TypeError):
-            self._sc.packet_context_field_class = 'lel'
+            self._tc.create_stream_class(default_clock_class=12)
 
-    def test_assign_event_header_field_class(self):
-        self._sc.event_header_field_class = self._event_header_fc
-        self.assertEqual(self._sc.event_header_field_class, self._event_header_fc)
+    def test_automatic_stream_ids(self):
+        sc = self._tc.create_stream_class(assigns_automatic_stream_id=True)
+        self.assertTrue(sc.assigns_automatic_stream_id)
 
-    def test_assign_no_event_header_field_class(self):
-        self._sc.event_header_field_class = None
-        self.assertIsNone(self._sc.event_header_field_class)
+        stream = self._trace.create_stream(sc)
+        self.assertIsNotNone(stream.id)
 
-    def test_assign_invalid_event_header_field_class(self):
-        with self.assertRaises(TypeError):
-            self._sc.event_header_field_class = 'lel'
+    def test_automatic_stream_ids_raises(self):
+        sc = self._tc.create_stream_class(assigns_automatic_stream_id=True)
+        self.assertTrue(sc.assigns_automatic_stream_id)
+
+        with self.assertRaises(bt2.CreationError):
+            self._trace.create_stream(sc, id=123)
+
+    def test_no_automatic_stream_ids(self):
+        sc = self._tc.create_stream_class(assigns_automatic_stream_id=False)
+        self.assertFalse(sc.assigns_automatic_stream_id)
+
+        stream = self._trace.create_stream(sc, id=333)
+        self.assertEqual(stream.id, 333)
+
+    def test_no_automatic_stream_ids_raises(self):
+        sc = self._tc.create_stream_class(assigns_automatic_stream_id=False)
+        self.assertFalse(sc.assigns_automatic_stream_id)
+
+        with self.assertRaises(bt2.CreationError):
+            self._trace.create_stream(sc)
+
+    def test_automatic_event_class_ids(self):
+        sc = self._tc.create_stream_class(assigns_automatic_event_class_id=True)
+        self.assertTrue(sc.assigns_automatic_event_class_id)
+
+        ec = sc.create_event_class()
+        self.assertIsNotNone(ec.id)
+
+    def test_automatic_event_class_ids_raises(self):
+        sc = self._tc.create_stream_class(assigns_automatic_event_class_id=True)
+        self.assertTrue(sc.assigns_automatic_event_class_id)
+
+        with self.assertRaises(bt2.CreationError):
+            sc.create_event_class(id=123)
+
+    def test_no_automatic_event_class_ids(self):
+        sc = self._tc.create_stream_class(assigns_automatic_event_class_id=False)
+        self.assertFalse(sc.assigns_automatic_event_class_id)
 
-    def test_assign_event_context_field_class(self):
-        self._sc.event_context_field_class = self._packet_context_fc
-        self.assertEqual(self._sc.event_context_field_class, self._packet_context_fc)
+        ec = sc.create_event_class(id=333)
+        self.assertEqual(ec.id, 333)
 
-    def test_assign_no_event_context_field_class(self):
-        self._sc.event_context_field_class = None
-        self.assertIsNone(self._sc.event_context_field_class)
+    def test_no_automatic_event_class_ids_raises(self):
+        sc = self._tc.create_stream_class(assigns_automatic_event_class_id=False)
+        self.assertFalse(sc.assigns_automatic_event_class_id)
 
-    def test_assign_invalid_event_context_field_class(self):
+        with self.assertRaises(bt2.CreationError):
+            sc.create_event_class()
+
+    def test_packets_have_default_beginning_clock_snapshot(self):
+        sc = self._tc.create_stream_class(default_clock_class=self._cc, packets_have_default_beginning_clock_snapshot=True)
+        self.assertTrue(sc.packets_have_default_beginning_clock_snapshot)
+
+    def test_packets_have_default_beginning_clock_snapshot_raises(self):
+        with self.assertRaises(TypeError):
+            sc = self._tc.create_stream_class(packets_have_default_beginning_clock_snapshot="something")
+
+    def test_packets_have_default_end_clock_snapshot(self):
+        sc = self._tc.create_stream_class(default_clock_class=self._cc, packets_have_default_end_clock_snapshot=True)
+        self.assertTrue(sc.packets_have_default_end_clock_snapshot)
+
+    def test_packets_have_default_end_clock_snapshot_raises(self):
         with self.assertRaises(TypeError):
-            self._sc.event_context_field_class = 'lel'
-
-    def test_trace_prop_no_tc(self):
-        self.assertIsNone(self._sc.trace)
-
-    def test_trace_prop(self):
-        tc = bt2.Trace()
-        tc.add_stream_class(self._sc)
-        self.assertEqual(self._sc.trace.addr, tc.addr)
-
-    def _test_copy(self, cpy):
-        self.assertIsNot(cpy, self._sc)
-        self.assertNotEqual(cpy.addr, self._sc.addr)
-        self.assertEqual(cpy, self._sc)
-
-    def test_copy(self):
-        cpy = copy.copy(self._sc)
-        self._test_copy(cpy)
-        self.assertEqual(self._sc.packet_context_field_class.addr, cpy.packet_context_field_class.addr)
-        self.assertEqual(self._sc.event_header_field_class.addr, cpy.event_header_field_class.addr)
-        self.assertEqual(self._sc.event_context_field_class.addr, cpy.event_context_field_class.addr)
-
-    def test_deepcopy(self):
-        cpy = copy.deepcopy(self._sc)
-        self._test_copy(cpy)
-        self.assertNotEqual(self._sc.packet_context_field_class.addr, cpy.packet_context_field_class.addr)
-        self.assertNotEqual(self._sc.event_header_field_class.addr, cpy.event_header_field_class.addr)
-        self.assertNotEqual(self._sc.event_context_field_class.addr, cpy.event_context_field_class.addr)
+            sc = self._tc.create_stream_class(packets_have_default_end_clock_snapshot="something")
+
+    def test_trace_class(self):
+        sc = self._tc.create_stream_class()
+        self.assertEqual(sc.trace_class.addr, self._tc.addr)
+
+    def _create_stream_class_with_event_classes(self):
+        sc = self._tc.create_stream_class(assigns_automatic_event_class_id=False)
+        ec1 = sc.create_event_class(id=23)
+        ec2 = sc.create_event_class(id=17)
+        return sc, ec1, ec2
 
     def test_getitem(self):
-        self.assertEqual(self._sc[23], self._ec1)
-        self.assertEqual(self._sc[17], self._ec2)
+        sc, ec1, ec2 = self._create_stream_class_with_event_classes()
+
+        self.assertEqual(sc[23].addr, ec1.addr)
+        self.assertEqual(sc[17].addr, ec2.addr)
 
     def test_getitem_wrong_key_type(self):
+        sc, _, _ = self._create_stream_class_with_event_classes()
+
         with self.assertRaises(TypeError):
-            self._sc['event23']
+            sc['event23']
 
     def test_getitem_wrong_key(self):
+        sc, _, _ = self._create_stream_class_with_event_classes()
+
         with self.assertRaises(KeyError):
-            self._sc[19]
+            sc[19]
 
     def test_len(self):
-        self.assertEqual(len(self._sc), 2)
+        sc, _, _ = self._create_stream_class_with_event_classes()
+
+        self.assertEqual(len(sc), 2)
 
     def test_iter(self):
-        for ec_id, event_class in self._sc.items():
-            self.assertIsInstance(event_class, bt2.EventClass)
-
-            if ec_id == 23:
-                self.assertEqual(event_class, self._ec1)
-            elif ec_id == 17:
-                self.assertEqual(event_class, self._ec2)
-
-    def test_eq(self):
-        ec1, ec2 = self._create_event_classes()
-        sc1 = bt2.StreamClass(name='my_stream_class', id=12,
-                              packet_context_field_class=self._packet_context_fc,
-                              event_header_field_class=self._event_header_fc,
-                              event_context_field_class=self._event_context_fc,
-                              event_classes=(ec1, ec2))
-        ec1, ec2 = self._create_event_classes()
-        sc2 = bt2.StreamClass(name='my_stream_class', id=12,
-                              packet_context_field_class=self._packet_context_fc,
-                              event_header_field_class=self._event_header_fc,
-                              event_context_field_class=self._event_context_fc,
-                              event_classes=(ec1, ec2))
-        self.assertEqual(sc1, sc2)
-
-    def test_ne_name(self):
-        ec1, ec2 = self._create_event_classes()
-        sc1 = bt2.StreamClass(name='my_stream_class1', id=12,
-                              packet_context_field_class=self._packet_context_fc,
-                              event_header_field_class=self._event_header_fc,
-                              event_context_field_class=self._event_context_fc,
-                              event_classes=(ec1, ec2))
-        ec1, ec2 = self._create_event_classes()
-        sc2 = bt2.StreamClass(name='my_stream_class', id=12,
-                              packet_context_field_class=self._packet_context_fc,
-                              event_header_field_class=self._event_header_fc,
-                              event_context_field_class=self._event_context_fc,
-                              event_classes=(ec1, ec2))
-        self.assertNotEqual(sc1, sc2)
-
-    def test_ne_id(self):
-        ec1, ec2 = self._create_event_classes()
-        sc1 = bt2.StreamClass(name='my_stream_class', id=13,
-                              packet_context_field_class=self._packet_context_fc,
-                              event_header_field_class=self._event_header_fc,
-                              event_context_field_class=self._event_context_fc,
-                              event_classes=(ec1, ec2))
-        ec1, ec2 = self._create_event_classes()
-        sc2 = bt2.StreamClass(name='my_stream_class', id=12,
-                              packet_context_field_class=self._packet_context_fc,
-                              event_header_field_class=self._event_header_fc,
-                              event_context_field_class=self._event_context_fc,
-                              event_classes=(ec1, ec2))
-        self.assertNotEqual(sc1, sc2)
-
-    def test_ne_packet_context_field_class(self):
-        ec1, ec2 = self._create_event_classes()
-        sc1 = bt2.StreamClass(name='my_stream_class', id=12,
-                              packet_context_field_class=self._event_context_fc,
-                              event_header_field_class=self._event_header_fc,
-                              event_context_field_class=self._event_context_fc,
-                              event_classes=(ec1, ec2))
-        ec1, ec2 = self._create_event_classes()
-        sc2 = bt2.StreamClass(name='my_stream_class', id=12,
-                              packet_context_field_class=self._packet_context_fc,
-                              event_header_field_class=self._event_header_fc,
-                              event_context_field_class=self._event_context_fc,
-                              event_classes=(ec1, ec2))
-        self.assertNotEqual(sc1, sc2)
-
-    def test_ne_event_header_field_class(self):
-        ec1, ec2 = self._create_event_classes()
-        sc1 = bt2.StreamClass(name='my_stream_class', id=12,
-                              packet_context_field_class=self._packet_context_fc,
-                              event_context_field_class=self._event_context_fc,
-                              event_classes=(ec1, ec2))
-        ec1, ec2 = self._create_event_classes()
-        sc2 = bt2.StreamClass(name='my_stream_class', id=12,
-                              packet_context_field_class=self._packet_context_fc,
-                              event_header_field_class=self._event_header_fc,
-                              event_context_field_class=self._event_context_fc,
-                              event_classes=(ec1, ec2))
-        self.assertNotEqual(sc1, sc2)
-
-    def test_ne_event_context_field_class(self):
-        ec1, ec2 = self._create_event_classes()
-        sc1 = bt2.StreamClass(name='my_stream_class', id=12,
-                              packet_context_field_class=self._packet_context_fc,
-                              event_header_field_class=self._event_header_fc,
-                              event_context_field_class=self._packet_context_fc,
-                              event_classes=(ec1, ec2))
-        ec1, ec2 = self._create_event_classes()
-        sc2 = bt2.StreamClass(name='my_stream_class', id=12,
-                              packet_context_field_class=self._packet_context_fc,
-                              event_header_field_class=self._event_header_fc,
-                              event_context_field_class=self._event_context_fc,
-                              event_classes=(ec1, ec2))
-        self.assertNotEqual(sc1, sc2)
-
-    def test_ne_event_class(self):
-        ec1, ec2 = self._create_event_classes()
-        sc1 = bt2.StreamClass(name='my_stream_class', id=12,
-                              packet_context_field_class=self._packet_context_fc,
-                              event_header_field_class=self._event_header_fc,
-                              event_context_field_class=self._event_context_fc,
-                              event_classes=(ec1,))
-        ec1, ec2 = self._create_event_classes()
-        sc2 = bt2.StreamClass(name='my_stream_class', id=12,
-                              packet_context_field_class=self._packet_context_fc,
-                              event_header_field_class=self._event_header_fc,
-                              event_context_field_class=self._event_context_fc,
-                              event_classes=(ec1, ec2))
-        self.assertNotEqual(sc1, sc2)
-
-    def test_eq_invalid(self):
-        self.assertFalse(self._sc == 23)
+        sc, _, _ = self._create_stream_class_with_event_classes()
+
+        ec_ids = sorted(sc)
+        self.assertEqual(ec_ids, [17, 23])
This page took 0.037691 seconds and 4 git commands to generate.