From 5d9ef4cb64e5bd7793d443cbfcc0248bb8804580 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Thu, 9 Apr 2020 17:33:55 -0400 Subject: [PATCH] lib: add precond. check for begin <= end on pkt./ev. disc. msg. creation 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 Reviewed-on: https://review.lttng.org/c/babeltrace/+/3389 Tested-by: jenkins Reviewed-by: Philippe Proulx --- include/babeltrace2/graph/message.h | 2 + .../python/bt2/bt2/message_iterator.py | 16 +++++++ src/lib/graph/message/discarded-items.c | 2 + src/lib/graph/message/message.h | 9 ++++ tests/bindings/python/bt2/test_message.py | 47 +++++++++++++++++++ 5 files changed, 76 insertions(+) diff --git a/include/babeltrace2/graph/message.h b/include/babeltrace2/graph/message.h index 61470bf8..bc977238 100644 --- a/include/babeltrace2/graph/message.h +++ b/include/babeltrace2/graph/message.h @@ -2420,6 +2420,7 @@ property values: @pre bt_stream_class_discarded_events_have_default_clock_snapshots(bt_stream_borrow_class_const(stream)) returns #BT_TRUE. + \bt_p{beginning_clock_snapshot_value} ⩽ \bt_p{end_clock_snapshot_value} @bt_post_success_frozen{stream} */ @@ -2738,6 +2739,7 @@ property values: @pre bt_stream_class_discarded_packets_have_default_clock_snapshots(bt_stream_borrow_class_const(stream)) returns #BT_TRUE. + \bt_p{beginning_clock_snapshot_value} ⩽ \bt_p{end_clock_snapshot_value} @bt_post_success_frozen{stream} */ diff --git a/src/bindings/python/bt2/bt2/message_iterator.py b/src/bindings/python/bt2/bt2/message_iterator.py index 5b4cc1bd..ed5b8e58 100644 --- a/src/bindings/python/bt2/bt2/message_iterator.py +++ b/src/bindings/python/bt2/bt2/message_iterator.py @@ -380,6 +380,14 @@ class _UserMessageIterator(_MessageIterator): 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 ) @@ -417,6 +425,14 @@ class _UserMessageIterator(_MessageIterator): 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 ) diff --git a/src/lib/graph/message/discarded-items.c b/src/lib/graph/message/discarded-items.c index a76a094d..b3709cce 100644 --- a/src/lib/graph/message/discarded-items.c +++ b/src/lib/graph/message/discarded-items.c @@ -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(); + 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, @@ -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(); + 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, diff --git a/src/lib/graph/message/message.h b/src/lib/graph/message/message.h index 87fd49a6..efd21129 100644 --- a/src/lib/graph/message/message.h +++ b/src/lib/graph/message/message.h @@ -57,6 +57,15 @@ struct bt_message { _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, diff --git a/tests/bindings/python/bt2/test_message.py b/tests/bindings/python/bt2/test_message.py index f2089508..a99972aa 100644 --- a/tests/bindings/python/bt2/test_message.py +++ b/tests/bindings/python/bt2/test_message.py @@ -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) + # 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. @@ -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) + # 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() -- 2.34.1