From 3e03e5e334d6a995f4fc63f52b6d6745688f640f Mon Sep 17 00:00:00 2001 From: Francis Deslauriers Date: Mon, 21 Oct 2019 12:22:30 -0400 Subject: [PATCH] bt2: Force usage of MapValue object on component init Signed-off-by: Francis Deslauriers Change-Id: I95c7402a28020467d06083d231f3b5bd6eb1fe70 Reviewed-on: https://review.lttng.org/c/babeltrace/+/2226 Reviewed-by: Simon Marchi --- src/bindings/python/bt2/bt2/graph.py | 4 +++ tests/bindings/python/bt2/test_graph.py | 42 +++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/bindings/python/bt2/bt2/graph.py b/src/bindings/python/bt2/bt2/graph.py index 82708025..ef40014b 100644 --- a/src/bindings/python/bt2/bt2/graph.py +++ b/src/bindings/python/bt2/bt2/graph.py @@ -129,7 +129,11 @@ class Graph(object._SharedObject): if obj is not None and not native_bt.bt2_is_python_component_class(base_cc_ptr): raise ValueError('cannot pass a Python object to a non-Python component') + if params is not None and not isinstance(params, (dict, bt2.MapValue)): + raise TypeError("'params' parameter is not a 'dict' or a 'bt2.MapValue'.") + params = bt2.create_value(params) + params_ptr = params._ptr if params is not None else None status, comp_ptr = add_fn( diff --git a/tests/bindings/python/bt2/test_graph.py b/tests/bindings/python/bt2/test_graph.py index 744f6429..8c2a0621 100644 --- a/tests/bindings/python/bt2/test_graph.py +++ b/tests/bindings/python/bt2/test_graph.py @@ -159,6 +159,48 @@ class GraphTestCase(unittest.TestCase): with self.assertRaises(ValueError): self._graph.add_component(MySink, 'salut', logging_level=12345) + def test_add_component_invalid_params_type(self): + class MySink(bt2._UserSinkComponent): + def _user_consume(self): + pass + + with self.assertRaises(TypeError): + self._graph.add_component(MySink, 'salut', params=12) + + def test_add_component_params_dict(self): + params_obj = None + + class MySink(bt2._UserSinkComponent): + def __init__(self, config, params, obj): + nonlocal params_obj + params_obj = params + + def _user_consume(self): + pass + + params = {'plage': 12312} + self._graph.add_component(MySink, 'salut', params=params) + + # Check equality and not identity because `add_component()` method + # converts the Python `dict` to a `bt2.MapValue`. + self.assertEqual(params, params_obj) + + def test_add_component_params_mapvalue(self): + params_obj = None + + class MySink(bt2._UserSinkComponent): + def __init__(self, config, params, obj): + nonlocal params_obj + params_obj = params + + def _user_consume(self): + pass + + params = bt2.MapValue({'beachclub': '121'}) + self._graph.add_component(MySink, 'salut', params=params) + + self.assertEqual(params, params_obj) + def test_add_component_logging_level(self): class MySink(bt2._UserSinkComponent): def _user_consume(self): -- 2.34.1