From 742e47472d24b6d4a6ebc2bdba0a87e0bc88a744 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Thu, 14 Sep 2017 11:44:51 -0400 Subject: [PATCH] Python bt2: add reset and is_set to fields MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérémie Galarneau --- bindings/python/bt2/bt2/fields.py | 9 ++ bindings/python/bt2/bt2/native_btfields.i | 2 + tests/bindings/python/bt2/test_fields.py | 108 ++++++++++++++++++++++ 3 files changed, 119 insertions(+) diff --git a/bindings/python/bt2/bt2/fields.py b/bindings/python/bt2/bt2/fields.py index 13c6a683..e40a86c6 100644 --- a/bindings/python/bt2/bt2/fields.py +++ b/bindings/python/bt2/bt2/fields.py @@ -58,6 +58,15 @@ class _Field(object._Object, metaclass=abc.ABCMeta): def field_type(self): return self._field_type + @property + def is_set(self): + is_set = native_bt.ctf_field_value_is_set(self._ptr) + return is_set > 0 + + def reset(self): + ret = native_bt.ctf_field_reset_value(self._ptr) + utils._handle_ret(ret, "cannot reset field object's value") + @functools.total_ordering class _NumericField(_Field): diff --git a/bindings/python/bt2/bt2/native_btfields.i b/bindings/python/bt2/bt2/native_btfields.i index 883bec3b..c651122d 100644 --- a/bindings/python/bt2/bt2/native_btfields.i +++ b/bindings/python/bt2/bt2/native_btfields.i @@ -31,6 +31,8 @@ struct bt_ctf_field *bt_ctf_field_create( struct bt_ctf_field_type *bt_ctf_field_get_type( struct bt_ctf_field *field); struct bt_ctf_field *bt_ctf_field_copy(struct bt_ctf_field *field); +bt_bool bt_ctf_field_value_is_set(struct bt_ctf_field *field); +int bt_ctf_field_reset_value(struct bt_ctf_field *field); /* Integer field functions */ int bt_ctf_field_signed_integer_get_value(struct bt_ctf_field *integer, diff --git a/tests/bindings/python/bt2/test_fields.py b/tests/bindings/python/bt2/test_fields.py index b60ed44d..5a776ea7 100644 --- a/tests/bindings/python/bt2/test_fields.py +++ b/tests/bindings/python/bt2/test_fields.py @@ -516,6 +516,23 @@ class _TestNumericField(_TestCopySimple): def test_ne_none(self): self.assertTrue(self._def != None) + def test_is_set(self): + raw = self._def_value + field = self._ft() + self.assertFalse(field.is_set) + field.value = raw + self.assertTrue(field.is_set) + + def test_reset(self): + raw = self._def_value + field = self._ft() + field.value = raw + self.assertTrue(field.is_set) + field.reset() + self.assertFalse(field.is_set) + other = self._ft() + self.assertEqual(other, field) + _BINOPS = ( ('lt', operator.lt), @@ -1003,6 +1020,23 @@ class StringFieldTestCase(_TestCopySimple, unittest.TestCase): self._def_value += to_append self.assertEqual(self._def, self._def_value) + def test_is_set(self): + raw = self._def_value + field = self._ft() + self.assertFalse(field.is_set) + field.value = raw + self.assertTrue(field.is_set) + + def test_reset(self): + raw = self._def_value + field = self._ft() + field.value = raw + self.assertTrue(field.is_set) + field.reset() + self.assertFalse(field.is_set) + other = self._ft() + self.assertEqual(other, field) + class _TestArraySequenceFieldCommon(_TestCopySimple): def _modify_def(self): @@ -1144,6 +1178,24 @@ class _TestArraySequenceFieldCommon(_TestCopySimple): with self.assertRaises(TypeError): array.value = values + def test_is_set(self): + raw = self._def_value + field = self._ft() + self.assertFalse(field.is_set) + field.value = raw + self.assertTrue(field.is_set) + + def test_reset(self): + raw = self._def_value + field = self._ft() + field.value = raw + self.assertTrue(field.is_set) + field.reset() + self.assertFalse(field.is_set) + other = self._ft() + self.assertEqual(other, field) + + class ArrayFieldTestCase(_TestArraySequenceFieldCommon, unittest.TestCase): def setUp(self): self._elem_ft = bt2.IntegerFieldType(32) @@ -1397,6 +1449,48 @@ class StructureFieldTestCase(_TestCopySimple, unittest.TestCase): 'another_int': 66 } + def test_is_set(self): + values = { + 'an_int': 42, + 'a_string': 'hello', + 'another_int': 66 + } + + int_ft = bt2.IntegerFieldType(32) + str_ft = bt2.StringFieldType() + struct_ft = bt2.StructureFieldType() + struct_ft.append_field(field_type=int_ft, name='an_int') + struct_ft.append_field(field_type=str_ft, name='a_string') + struct_ft.append_field(field_type=int_ft, name='another_int') + + struct = struct_ft() + self.assertFalse(struct.is_set) + struct.value = values + self.assertTrue(struct.is_set) + + struct = struct_ft() + struct['an_int'].value = 42 + self.assertFalse(struct.is_set) + + def test_reset(self): + values = { + 'an_int': 42, + 'a_string': 'hello', + 'another_int': 66 + } + + int_ft = bt2.IntegerFieldType(32) + str_ft = bt2.StringFieldType() + struct_ft = bt2.StructureFieldType() + struct_ft.append_field(field_type=int_ft, name='an_int') + struct_ft.append_field(field_type=str_ft, name='a_string') + struct_ft.append_field(field_type=int_ft, name='another_int') + + struct = struct_ft() + struct.value = values + self.assertTrue(struct.is_set) + struct.reset() + self.assertEqual(struct_ft(), struct) class VariantFieldTestCase(_TestCopySimple, unittest.TestCase): @@ -1482,3 +1576,17 @@ class VariantFieldTestCase(_TestCopySimple, unittest.TestCase): def test_eq_invalid_type(self): self.assertNotEqual(self._def, 23) + + def test_is_set(self): + self.assertFalse(self._def.is_set) + tag_field = self._tag_ft(2800) + self._def.field(tag_field).value = 684 + self.assertTrue(self._def.is_set) + + def test_reset(self): + tag_field = self._tag_ft(2800) + self._def.field(tag_field).value = 684 + self._def.reset() + self.assertFalse(self._def.is_set) + self.assertIsNone(self._def.selected_field) + self.assertIsNone(self._def.tag_field) -- 2.34.1