lib: add precondition checks that count of discarded events/packets is greater than 0
authorSimon Marchi <simon.marchi@efficios.com>
Thu, 9 Apr 2020 20:44:07 +0000 (16:44 -0400)
committerPhilippe Proulx <eeppeliteloop@gmail.com>
Tue, 14 Apr 2020 20:03:17 +0000 (16:03 -0400)
It does not make sense to send a discarded packet or discarded event
message with the count 0.  That would mean that there is no discarded
event or packet, so the message must simply not be sent.  If the number
of packets or events that were discarded is unknown, the count must not
be set, in which case it will stay "unavailable".

A precondition failure looks like:

    04-12 00:17:25.171 680020 680020 F LIB/MSG-DISCARDED-ITEMS bt_message_discarded_packets_set_count@discarded-items.c:317 Babeltrace 2 library precondition not satisfied; error is:
    04-12 00:17:25.171 680020 680020 F LIB/MSG-DISCARDED-ITEMS bt_message_discarded_packets_set_count@discarded-items.c:317 Discarded packet count is 0.
    04-12 00:17:25.171 680020 680020 F LIB/MSG-DISCARDED-ITEMS bt_message_discarded_packets_set_count@discarded-items.c:317 Aborting...

The equivalent checks are added to the Python bindings, as well as
tests.

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

index bc977238c8cb7a0a904ad59f9104fc743be3d504..27730f69549dfc9aafe9ddee603049bffae46c98 100644 (file)
@@ -2568,6 +2568,8 @@ property.
 @bt_pre_not_null{message}
 @bt_pre_hot{message}
 @bt_pre_is_disc_ev_msg{message}
+@pre
+    \bt_p{count} > 0
 
 @sa bt_message_discarded_events_get_count() &mdash;
     Returns the number of discarded events of a discarded events
@@ -2886,6 +2888,8 @@ property.
 @bt_pre_not_null{message}
 @bt_pre_hot{message}
 @bt_pre_is_disc_pkt_msg{message}
+@pre
+    \bt_p{count} > 0
 
 @sa bt_message_discarded_packets_get_count() &mdash;
     Returns the number of discarded packets of a discarded packets
index 95522736c490a980ea922a75db5cf9ded6bcd54d..5f5b8656b38b5f424f55a6ae52cf514b1c7d51d3 100644 (file)
@@ -233,6 +233,10 @@ class _DiscardedMessage(_DiscardedMessageConst, _Message):
 
     def _set_count(self, count):
         utils._check_uint64(count)
+
+        if count == 0:
+            raise ValueError('discarded {} count is 0'.format(self._item_name))
+
         self._set_count(self._ptr, count)
 
     _count = property(fget=_DiscardedMessageConst.count.fget, fset=_set_count)
@@ -258,6 +262,7 @@ class _DiscardedEventsMessageConst(_DiscardedMessageConst):
 class _DiscardedEventsMessage(_DiscardedEventsMessageConst, _DiscardedMessage):
     _borrow_stream_ptr = staticmethod(native_bt.message_discarded_events_borrow_stream)
     _set_count = staticmethod(native_bt.message_discarded_events_set_count)
+    _item_name = 'event'
 
 
 class _DiscardedPacketsMessageConst(_DiscardedMessageConst):
@@ -280,6 +285,7 @@ class _DiscardedPacketsMessageConst(_DiscardedMessageConst):
 class _DiscardedPacketsMessage(_DiscardedPacketsMessageConst, _DiscardedMessage):
     _borrow_stream_ptr = staticmethod(native_bt.message_discarded_packets_borrow_stream)
     _set_count = staticmethod(native_bt.message_discarded_packets_set_count)
+    _item_name = 'packet'
 
 
 _MESSAGE_TYPE_TO_CLS = {
index b3709cce0471dff941d769ba63c407b2c122b730..10c02160d7d590201af318ad2269fd2fc3d13fc6 100644 (file)
@@ -238,6 +238,7 @@ void bt_message_discarded_events_set_count(struct bt_message *message,
 {
        BT_ASSERT_PRE_NON_NULL(message, "Message");
        BT_ASSERT_PRE_MSG_IS_TYPE(message, BT_MESSAGE_TYPE_DISCARDED_EVENTS);
+       BT_ASSERT_PRE(count > 0, "Discarded event count is 0.");
        set_discarded_items_message_count(message, count);
 }
 
@@ -315,6 +316,7 @@ void bt_message_discarded_packets_set_count(struct bt_message *message,
 {
        BT_ASSERT_PRE_NON_NULL(message, "Message");
        BT_ASSERT_PRE_MSG_IS_TYPE(message, BT_MESSAGE_TYPE_DISCARDED_PACKETS);
+       BT_ASSERT_PRE(count > 0, "Discarded packet count is 0.");
        set_discarded_items_message_count(message, count);
 }
 
index a99972aadc7d54f226f9de639e34f602a9c58bb2..d9e2fdbc186d5243edbfd7d6545efeae7ef8d962 100644 (file)
@@ -418,6 +418,22 @@ class CreateDiscardedEventMessageTestCase(unittest.TestCase):
         self.assertIs(type(msg), bt2._DiscardedEventsMessage)
         self.assertEqual(msg.count, 242)
 
+    # With event count == 0.
+    def test_create_with_count_zero_raises(self):
+        def create_stream_class(tc, cc):
+            return tc.create_stream_class(supports_discarded_events=True)
+
+        def msg_iter_next(msg_iter, stream):
+            with self.assertRaisesRegex(
+                ValueError, 'discarded event count is 0',
+            ):
+                msg_iter._create_discarded_events_message(stream, count=0)
+
+            return 123
+
+        res = utils.run_in_message_iterator_next(create_stream_class, msg_iter_next)
+        self.assertEqual(res, 123)
+
     # With clock snapshots.
     def test_create_with_clock_snapshots(self):
         def create_stream_class(tc, cc):
@@ -547,6 +563,24 @@ class CreateDiscardedPacketMessageTestCase(unittest.TestCase):
         self.assertIs(type(msg), bt2._DiscardedPacketsMessage)
         self.assertEqual(msg.count, 242)
 
+    # With packet count == 0.
+    def test_create_with_count_zero_raises(self):
+        def create_stream_class(tc, cc):
+            return tc.create_stream_class(
+                supports_packets=True, supports_discarded_packets=True
+            )
+
+        def msg_iter_next(msg_iter, stream):
+            with self.assertRaisesRegex(
+                ValueError, 'discarded packet count is 0',
+            ):
+                msg_iter._create_discarded_packets_message(stream, count=0)
+
+            return 123
+
+        res = utils.run_in_message_iterator_next(create_stream_class, msg_iter_next)
+        self.assertEqual(res, 123)
+
     # With clock snapshots.
     def test_create_with_clock_snapshots(self):
         def create_stream_class(tc, cc):
This page took 0.028175 seconds and 4 git commands to generate.