lib: add precond. check for begin <= end on pkt./ev. disc. msg. creation
authorSimon Marchi <simon.marchi@efficios.com>
Thu, 9 Apr 2020 21:33:55 +0000 (17:33 -0400)
committerPhilippe Proulx <eeppeliteloop@gmail.com>
Tue, 14 Apr 2020 14:20:50 +0000 (10:20 -0400)
Add a precondition check in:

- bt_message_discarded_events_create_with_default_clock_snapshots
- bt_message_discarded_packets_create_with_default_clock_snapshots

Verify that the beginning clock snapshot value is less-than or equal-to
the end clock snapshot.

A failure looks like this:

    04-12 00:01:37.519 653088 653088 F LIB/MSG-DISCARDED-ITEMS bt_message_discarded_events_create_with_default_clock_snapshots@discarded-items.c:221 Babeltrace 2 library precondition not satisfied; error is:
    04-12 00:01:37.519 653088 653088 F LIB/MSG-DISCARDED-ITEMS bt_message_discarded_events_create_with_default_clock_snapshots@discarded-items.c:221 Beginning default clock snapshot value is greater than end default clock snapshot value: cs-begin-val=20, cs-end-val=10, msg-iter-addr=0x611000001bc0, msg-iter-upstream-comp-name="ze source", msg-iter-upstream-comp-log-level=NONE, msg-iter-upstream-comp-class-type=SOURCE, msg-iter-upstream-comp-class-name="MySrc", msg-iter-upstream-comp-class-partial-descr=""
    04-12 00:01:37.519 653088 653088 F LIB/MSG-DISCARDED-ITEMS bt_message_discarded_events_create_with_default_clock_snapshots@discarded-items.c:221 Aborting...

Change-Id: I1d4cc820d9daeff0fd3a80262c36609fe10a1958
Signed-off-by: Simon Marchi <simon.marchi@efficios.com>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/3389
Tested-by: jenkins <jenkins@lttng.org>
Reviewed-by: Philippe Proulx <eeppeliteloop@gmail.com>
include/babeltrace2/graph/message.h
src/bindings/python/bt2/bt2/message_iterator.py
src/lib/graph/message/discarded-items.c
src/lib/graph/message/message.h
tests/bindings/python/bt2/test_message.py

index 61470bf809d4d22d02f625125c82f4ef34c89389..bc977238c8cb7a0a904ad59f9104fc743be3d504 100644 (file)
@@ -2420,6 +2420,7 @@ property values:
 @pre
     <code>bt_stream_class_discarded_events_have_default_clock_snapshots(bt_stream_borrow_class_const(stream))</code>
     returns #BT_TRUE.
 @pre
     <code>bt_stream_class_discarded_events_have_default_clock_snapshots(bt_stream_borrow_class_const(stream))</code>
     returns #BT_TRUE.
+    \bt_p{beginning_clock_snapshot_value} ⩽ \bt_p{end_clock_snapshot_value}
 
 @bt_post_success_frozen{stream}
 */
 
 @bt_post_success_frozen{stream}
 */
@@ -2738,6 +2739,7 @@ property values:
 @pre
     <code>bt_stream_class_discarded_packets_have_default_clock_snapshots(bt_stream_borrow_class_const(stream))</code>
     returns #BT_TRUE.
 @pre
     <code>bt_stream_class_discarded_packets_have_default_clock_snapshots(bt_stream_borrow_class_const(stream))</code>
     returns #BT_TRUE.
+    \bt_p{beginning_clock_snapshot_value} ⩽ \bt_p{end_clock_snapshot_value}
 
 @bt_post_success_frozen{stream}
 */
 
 @bt_post_success_frozen{stream}
 */
index 5b4cc1bdb3df458691f6b03b29993bb03b811529..ed5b8e58614cebf7d01f3313f50c267d84936a3e 100644 (file)
@@ -380,6 +380,14 @@ class _UserMessageIterator(_MessageIterator):
 
             utils._check_uint64(beg_clock_snapshot)
             utils._check_uint64(end_clock_snapshot)
 
             utils._check_uint64(beg_clock_snapshot)
             utils._check_uint64(end_clock_snapshot)
+
+            if beg_clock_snapshot > end_clock_snapshot:
+                raise ValueError(
+                    'beginning default clock snapshot value ({}) is greater than end default clock snapshot value ({})'.format(
+                        beg_clock_snapshot, end_clock_snapshot
+                    )
+                )
+
             ptr = native_bt.message_discarded_events_create_with_default_clock_snapshots(
                 self._bt_ptr, stream._ptr, beg_clock_snapshot, end_clock_snapshot
             )
             ptr = native_bt.message_discarded_events_create_with_default_clock_snapshots(
                 self._bt_ptr, stream._ptr, beg_clock_snapshot, end_clock_snapshot
             )
@@ -417,6 +425,14 @@ class _UserMessageIterator(_MessageIterator):
 
             utils._check_uint64(beg_clock_snapshot)
             utils._check_uint64(end_clock_snapshot)
 
             utils._check_uint64(beg_clock_snapshot)
             utils._check_uint64(end_clock_snapshot)
+
+            if beg_clock_snapshot > end_clock_snapshot:
+                raise ValueError(
+                    'beginning default clock snapshot value ({}) is greater than end default clock snapshot value ({})'.format(
+                        beg_clock_snapshot, end_clock_snapshot
+                    )
+                )
+
             ptr = native_bt.message_discarded_packets_create_with_default_clock_snapshots(
                 self._bt_ptr, stream._ptr, beg_clock_snapshot, end_clock_snapshot
             )
             ptr = native_bt.message_discarded_packets_create_with_default_clock_snapshots(
                 self._bt_ptr, stream._ptr, beg_clock_snapshot, end_clock_snapshot
             )
index a76a094dd2feda5b84a430186e145c94e7cb0f51..b3709cce0471dff941d769ba63c407b2c122b730 100644 (file)
@@ -218,6 +218,7 @@ struct bt_message *bt_message_discarded_events_create_with_default_clock_snapsho
                uint64_t end_raw_value)
 {
        BT_ASSERT_PRE_DEV_NO_ERROR();
                uint64_t end_raw_value)
 {
        BT_ASSERT_PRE_DEV_NO_ERROR();
+       BT_ASSERT_PRE_BEGIN_LE_END(message_iterator, beginning_raw_value, end_raw_value);
 
        return create_discarded_items_message(message_iterator,
                BT_MESSAGE_TYPE_DISCARDED_EVENTS, (void *) stream,
 
        return create_discarded_items_message(message_iterator,
                BT_MESSAGE_TYPE_DISCARDED_EVENTS, (void *) stream,
@@ -293,6 +294,7 @@ struct bt_message *bt_message_discarded_packets_create_with_default_clock_snapsh
                uint64_t end_raw_value)
 {
        BT_ASSERT_PRE_DEV_NO_ERROR();
                uint64_t end_raw_value)
 {
        BT_ASSERT_PRE_DEV_NO_ERROR();
+       BT_ASSERT_PRE_BEGIN_LE_END(message_iterator, beginning_raw_value, end_raw_value);
 
        return create_discarded_items_message(message_iterator,
                BT_MESSAGE_TYPE_DISCARDED_PACKETS, (void *) stream,
 
        return create_discarded_items_message(message_iterator,
                BT_MESSAGE_TYPE_DISCARDED_PACKETS, (void *) stream,
index 87fd49a6b75aff5cce61dba27fe638d53bf0b912..efd211296f5098357c1c5e97319bf9dfc89ae3f2 100644 (file)
@@ -57,6 +57,15 @@ struct bt_message {
                _BT_ASSERT_PRE_MSG_IS_TYPE_FMT,                         \
                bt_message_type_string(_type), (_msg))
 
                _BT_ASSERT_PRE_MSG_IS_TYPE_FMT,                         \
                bt_message_type_string(_type), (_msg))
 
+#define BT_ASSERT_PRE_BEGIN_LE_END(_msg_iter, _begin, _end)            \
+       BT_ASSERT_PRE(                                                  \
+               _begin <= _end,                                         \
+               "Beginning default clock snapshot value is greater "    \
+               "than end default clock snapshot value: "               \
+               "cs-begin-val=%" PRIu64 ", cs-end-val=%" PRIu64 ", "    \
+               "%![msg-iter-]i",                                       \
+               _begin, _end, _msg_iter);
+
 BT_HIDDEN
 void bt_message_init(struct bt_message *message,
                enum bt_message_type type,
 BT_HIDDEN
 void bt_message_init(struct bt_message *message,
                enum bt_message_type type,
index f2089508d270524c4ccab859a30fa27fc0ff9940..a99972aadc7d54f226f9de639e34f602a9c58bb2 100644 (file)
@@ -494,6 +494,29 @@ class CreateDiscardedEventMessageTestCase(unittest.TestCase):
         res = utils.run_in_message_iterator_next(create_stream_class, msg_iter_next)
         self.assertEqual(res, 123)
 
         res = utils.run_in_message_iterator_next(create_stream_class, msg_iter_next)
         self.assertEqual(res, 123)
 
+    # End clock snapshot greater than beginning clock snapshot.
+    def test_create_clock_snapshots_end_gt_begin_raises(self):
+        def create_stream_class(tc, cc):
+            return tc.create_stream_class(
+                default_clock_class=cc,
+                supports_discarded_events=True,
+                discarded_events_have_default_clock_snapshots=True,
+            )
+
+        def msg_iter_next(msg_iter, stream):
+            with self.assertRaisesRegex(
+                ValueError,
+                r'beginning default clock snapshot value \(20\) is greater than end default clock snapshot value \(10\)',
+            ):
+                msg_iter._create_discarded_events_message(
+                    stream, beg_clock_snapshot=20, end_clock_snapshot=10
+                )
+
+            return 123
+
+        res = utils.run_in_message_iterator_next(create_stream_class, msg_iter_next)
+        self.assertEqual(res, 123)
+
 
 class CreateDiscardedPacketMessageTestCase(unittest.TestCase):
     # Most basic case.
 
 class CreateDiscardedPacketMessageTestCase(unittest.TestCase):
     # Most basic case.
@@ -604,6 +627,30 @@ class CreateDiscardedPacketMessageTestCase(unittest.TestCase):
         res = utils.run_in_message_iterator_next(create_stream_class, msg_iter_next)
         self.assertEqual(res, 123)
 
         res = utils.run_in_message_iterator_next(create_stream_class, msg_iter_next)
         self.assertEqual(res, 123)
 
+    # End clock snapshot greater than beginning clock snapshot.
+    def test_create_clock_snapshots_end_gt_begin_raises(self):
+        def create_stream_class(tc, cc):
+            return tc.create_stream_class(
+                default_clock_class=cc,
+                supports_packets=True,
+                supports_discarded_packets=True,
+                discarded_packets_have_default_clock_snapshots=True,
+            )
+
+        def msg_iter_next(msg_iter, stream):
+            with self.assertRaisesRegex(
+                ValueError,
+                r'beginning default clock snapshot value \(20\) is greater than end default clock snapshot value \(10\)',
+            ):
+                msg_iter._create_discarded_packets_message(
+                    stream, beg_clock_snapshot=20, end_clock_snapshot=10
+                )
+
+            return 123
+
+        res = utils.run_in_message_iterator_next(create_stream_class, msg_iter_next)
+        self.assertEqual(res, 123)
+
 
 if __name__ == '__main__':
     unittest.main()
 
 if __name__ == '__main__':
     unittest.main()
This page took 0.030998 seconds and 4 git commands to generate.