From f1f741737f03892d781ed00de554606eeea84c15 Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Sat, 10 Aug 2019 22:38:39 -0400 Subject: [PATCH] bt2: add bt2.get_{greatest_operative,maximal}_mip_version() Those new functions wrap bt_get_greatest_operative_mip_version() and bt_get_maximal_mip_version(). bt2.get_greatest_operative_mip_version() excepts a list of `bt2.ComponentDescriptor` objects. The function builds a component descriptor set (bt_component_descriptor_set_create()) and adds the corresponding component descriptors to it and then calls bt_get_greatest_operative_mip_version(). bt_get_greatest_operative_mip_version() translates `BT_GET_OPERATIVE_MIP_VERSION_STATUS_NO_MATCH` into `None`. Signed-off-by: Philippe Proulx Change-Id: Iaeb36b976f3c651fa82a86de2e835f782d682299 Reviewed-on: https://review.lttng.org/c/babeltrace/+/1877 Tested-by: jenkins Reviewed-by: Simon Marchi --- src/bindings/python/bt2/Makefile.am | 3 + src/bindings/python/bt2/bt2/__init__.py | 2 + src/bindings/python/bt2/bt2/mip.py | 71 +++++++++++ src/bindings/python/bt2/bt2/native_bt.i | 1 + src/bindings/python/bt2/bt2/native_bt_mip.i | 37 ++++++ src/bindings/python/bt2/bt2/native_bt_mip.i.h | 34 +++++ tests/bindings/python/bt2/test_mip.py | 116 ++++++++++++++++++ 7 files changed, 264 insertions(+) create mode 100644 src/bindings/python/bt2/bt2/mip.py create mode 100644 src/bindings/python/bt2/bt2/native_bt_mip.i create mode 100644 src/bindings/python/bt2/bt2/native_bt_mip.i.h create mode 100644 tests/bindings/python/bt2/test_mip.py diff --git a/src/bindings/python/bt2/Makefile.am b/src/bindings/python/bt2/Makefile.am index 75a65689..c74988b1 100644 --- a/src/bindings/python/bt2/Makefile.am +++ b/src/bindings/python/bt2/Makefile.am @@ -31,6 +31,8 @@ SWIG_INTERFACE_FILES = \ bt2/native_bt_message.i \ bt2/native_bt_message_iterator.i \ bt2/native_bt_message_iterator.i.h \ + bt2/native_bt_mip.i \ + bt2/native_bt_mip.i.h \ bt2/native_bt_packet.i \ bt2/native_bt_plugin.i \ bt2/native_bt_plugin.i.h \ @@ -71,6 +73,7 @@ STATIC_BINDINGS_DEPS = \ bt2/logging.py \ bt2/message.py \ bt2/message_iterator.py \ + bt2/mip.py \ bt2/object.py \ bt2/packet.py \ bt2/plugin.py \ diff --git a/src/bindings/python/bt2/bt2/__init__.py b/src/bindings/python/bt2/bt2/__init__.py index 9dd9f2e1..abe119a1 100644 --- a/src/bindings/python/bt2/bt2/__init__.py +++ b/src/bindings/python/bt2/bt2/__init__.py @@ -94,6 +94,8 @@ from bt2.message import _MessageIteratorInactivityMessage from bt2.message import _DiscardedEventsMessage from bt2.message import _DiscardedPacketsMessage from bt2.message_iterator import _UserMessageIterator +from bt2.mip import get_greatest_operative_mip_version +from bt2.mip import get_maximal_mip_version from bt2.plugin import find_plugins_in_path from bt2.plugin import find_plugins from bt2.plugin import find_plugin diff --git a/src/bindings/python/bt2/bt2/mip.py b/src/bindings/python/bt2/bt2/mip.py new file mode 100644 index 00000000..43e1b7b8 --- /dev/null +++ b/src/bindings/python/bt2/bt2/mip.py @@ -0,0 +1,71 @@ +# The MIT License (MIT) +# +# Copyright (c) 2017 Philippe Proulx +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +from bt2 import native_bt, object, utils +import bt2 + + +def get_greatest_operative_mip_version( + component_descriptors, log_level=bt2.LoggingLevel.NONE +): + utils._check_log_level(log_level) + comp_descr_set_ptr = native_bt.component_descriptor_set_create() + + if comp_descr_set_ptr is None: + raise bt2._MemoryError('cannot create component descriptor set object') + + if len(component_descriptors) == 0: + raise ValueError('no component descriptors') + + try: + for descr in component_descriptors: + if type(descr) is not bt2.ComponentDescriptor: + raise TypeError("'{}' is not a component descriptor".format(descr)) + + base_cc_ptr = descr.component_class._bt_component_class_ptr() + params_ptr = None + + if descr.params is not None: + params_ptr = descr.params._ptr + + status = native_bt.bt2_component_descriptor_set_add_descriptor_with_init_method_data( + comp_descr_set_ptr, base_cc_ptr, params_ptr, descr.obj + ) + utils._handle_func_status( + status, 'cannot add descriptor to component descriptor set' + ) + + status, version = native_bt.get_greatest_operative_mip_version( + comp_descr_set_ptr, log_level + ) + + if status == native_bt.__BT_FUNC_STATUS_NO_MATCH: + return None + + utils._handle_func_status(status, 'cannot get greatest operative MIP version') + return version + finally: + native_bt.component_descriptor_set_put_ref(comp_descr_set_ptr) + + +def get_maximal_mip_version(): + return native_bt.get_maximal_mip_version() diff --git a/src/bindings/python/bt2/bt2/native_bt.i b/src/bindings/python/bt2/bt2/native_bt.i index de9ff3c3..8146e8ff 100644 --- a/src/bindings/python/bt2/bt2/native_bt.i +++ b/src/bindings/python/bt2/bt2/native_bt.i @@ -222,6 +222,7 @@ void bt_bt2_exit_handler(void); %include "native_bt_logging.i" %include "native_bt_message.i" %include "native_bt_message_iterator.i" +%include "native_bt_mip.i" %include "native_bt_packet.i" %include "native_bt_plugin.i" %include "native_bt_port.i" diff --git a/src/bindings/python/bt2/bt2/native_bt_mip.i b/src/bindings/python/bt2/bt2/native_bt_mip.i new file mode 100644 index 00000000..72087fe1 --- /dev/null +++ b/src/bindings/python/bt2/bt2/native_bt_mip.i @@ -0,0 +1,37 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Philippe Proulx + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +%include +%include +%include + +%{ +#include "native_bt_mip.i.h" +%} + +bt_component_descriptor_set_add_descriptor_status +bt_bt2_component_descriptor_set_add_descriptor_with_init_method_data( + bt_component_descriptor_set *comp_descr_set, + const bt_component_class *comp_cls, + const bt_value *params, PyObject *init_method_data); diff --git a/src/bindings/python/bt2/bt2/native_bt_mip.i.h b/src/bindings/python/bt2/bt2/native_bt_mip.i.h new file mode 100644 index 00000000..b0b55dc2 --- /dev/null +++ b/src/bindings/python/bt2/bt2/native_bt_mip.i.h @@ -0,0 +1,34 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Philippe Proulx + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +static +bt_component_descriptor_set_add_descriptor_status +bt_bt2_component_descriptor_set_add_descriptor_with_init_method_data( + bt_component_descriptor_set *comp_descr_set, + const bt_component_class *comp_cls, + const bt_value *params, PyObject *obj) +{ + return bt_component_descriptor_set_add_descriptor_with_init_method_data( + comp_descr_set, comp_cls, params, obj == Py_None ? NULL : obj); +} diff --git a/tests/bindings/python/bt2/test_mip.py b/tests/bindings/python/bt2/test_mip.py new file mode 100644 index 00000000..642539e9 --- /dev/null +++ b/tests/bindings/python/bt2/test_mip.py @@ -0,0 +1,116 @@ +# +# Copyright (C) 2019 EfficiOS Inc. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; only version 2 +# of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# + +import unittest +import copy +import bt2 + + +class MipTestCase(unittest.TestCase): + def test_get_greatest_operative_mip_version(self): + class Source1( + bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator + ): + @classmethod + def _user_get_supported_mip_versions(cls, params, obj, log_level): + return [0, 1] + + class Source2( + bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator + ): + @classmethod + def _user_get_supported_mip_versions(cls, params, obj, log_level): + return [0, 2] + + class Source3( + bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator + ): + pass + + descriptors = [ + bt2.ComponentDescriptor(Source1), + bt2.ComponentDescriptor(Source2), + bt2.ComponentDescriptor(Source3), + ] + version = bt2.get_greatest_operative_mip_version(descriptors) + self.assertEqual(version, 0) + + def test_get_greatest_operative_mip_version_no_match(self): + class Source1( + bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator + ): + @classmethod + def _user_get_supported_mip_versions(cls, params, obj, log_level): + return [0] + + class Source2( + bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator + ): + @classmethod + def _user_get_supported_mip_versions(cls, params, obj, log_level): + return [1] + + descriptors = [ + bt2.ComponentDescriptor(Source1), + bt2.ComponentDescriptor(Source2), + ] + + version = bt2.get_greatest_operative_mip_version(descriptors) + self.assertIsNone(version) + + def test_get_greatest_operative_mip_version_empty_descriptors(self): + with self.assertRaises(ValueError): + bt2.get_greatest_operative_mip_version([]) + + def test_get_greatest_operative_mip_version_wrong_descriptor_type(self): + class Source1( + bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator + ): + @classmethod + def _user_get_supported_mip_versions(cls, params, obj, log_level): + return [0, 1] + + descriptors = [bt2.ComponentDescriptor(Source1), object()] + + with self.assertRaises(TypeError): + bt2.get_greatest_operative_mip_version(descriptors) + + def test_get_greatest_operative_mip_version_wrong_log_level_type(self): + class Source1( + bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator + ): + pass + + descriptors = [bt2.ComponentDescriptor(Source1)] + + with self.assertRaises(TypeError): + bt2.get_greatest_operative_mip_version(descriptors, 'lel') + + def test_get_greatest_operative_mip_version_wrong_log_level_value(self): + class Source1( + bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator + ): + pass + + descriptors = [bt2.ComponentDescriptor(Source1)] + + with self.assertRaises(ValueError): + bt2.get_greatest_operative_mip_version(descriptors, 12345) + + def test_get_maximal_mip_version(self): + self.assertEqual(bt2.get_maximal_mip_version(), 0) -- 2.34.1