bt2: add bt2.get_{greatest_operative,maximal}_mip_version()
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Sun, 11 Aug 2019 02:38:39 +0000 (22:38 -0400)
committerPhilippe Proulx <eeppeliteloop@gmail.com>
Tue, 13 Aug 2019 00:28:02 +0000 (20:28 -0400)
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 <eeppeliteloop@gmail.com>
Change-Id: Iaeb36b976f3c651fa82a86de2e835f782d682299
Reviewed-on: https://review.lttng.org/c/babeltrace/+/1877
Tested-by: jenkins <jenkins@lttng.org>
Reviewed-by: Simon Marchi <simon.marchi@efficios.com>
src/bindings/python/bt2/Makefile.am
src/bindings/python/bt2/bt2/__init__.py
src/bindings/python/bt2/bt2/mip.py [new file with mode: 0644]
src/bindings/python/bt2/bt2/native_bt.i
src/bindings/python/bt2/bt2/native_bt_mip.i [new file with mode: 0644]
src/bindings/python/bt2/bt2/native_bt_mip.i.h [new file with mode: 0644]
tests/bindings/python/bt2/test_mip.py [new file with mode: 0644]

index 75a656897caa474c157efe84f57e8ac027db2507..c74988b14819dc8dd3497deed0ab21aa0c5e551c 100644 (file)
@@ -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                                   \
index 9dd9f2e1957e7ffd9e50872c806eedad94a960e9..abe119a1e9f2c0916c533bed2ae43e48c46dc1a2 100644 (file)
@@ -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 (file)
index 0000000..43e1b7b
--- /dev/null
@@ -0,0 +1,71 @@
+# The MIT License (MIT)
+#
+# Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
+#
+# 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()
index de9ff3c32bb5269ce36382ea5918e217fcfec395..8146e8ff4299d85ca3cea46dfb7f5b5fc1046654 100644 (file)
@@ -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 (file)
index 0000000..72087fe
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
+ *
+ * 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 <babeltrace2/graph/component-descriptor-set.h>
+%include <babeltrace2/graph/component-descriptor-set-const.h>
+%include <babeltrace2/graph/mip.h>
+
+%{
+#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 (file)
index 0000000..b0b55dc
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
+ *
+ * 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 (file)
index 0000000..642539e
--- /dev/null
@@ -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)
This page took 0.031212 seconds and 4 git commands to generate.