From 8882c0050c11917a24b8ecd2a8113c70111f7bd7 Mon Sep 17 00:00:00 2001 From: Marco Melloni <98281551+marcomelloni@users.noreply.github.com> Date: Wed, 16 Jul 2025 12:38:23 +0200 Subject: [PATCH 1/2] Add in-memory protocol config support --- simulation_bridge/__init__.py | 4 ++++ .../protocol_adapters/inmemory_signal.json | 21 +++++++++++++++++++ simulation_bridge/src/utils/config_loader.py | 17 +++++++++++++-- .../test/unit/test_config_loader.py | 21 +++++++++++++++++-- 4 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 simulation_bridge/src/protocol_adapters/inmemory_signal.json diff --git a/simulation_bridge/__init__.py b/simulation_bridge/__init__.py index 8ae3c5fa..177c5382 100644 --- a/simulation_bridge/__init__.py +++ b/simulation_bridge/__init__.py @@ -1,4 +1,8 @@ """Convenience utilities for the Simulation Bridge package.""" +from .src.utils.config_loader import set_inmemory_mode + +set_inmemory_mode(True) + from .src.protocol_adapters.inmemory.inmemory_adapter import SimulationBridge __all__ = ["SimulationBridge"] diff --git a/simulation_bridge/src/protocol_adapters/inmemory_signal.json b/simulation_bridge/src/protocol_adapters/inmemory_signal.json new file mode 100644 index 00000000..d04380e3 --- /dev/null +++ b/simulation_bridge/src/protocol_adapters/inmemory_signal.json @@ -0,0 +1,21 @@ +{ + "protocols": { + "rabbitmq": { + "enabled": true, + "signals": { + "message_received_input_rabbitmq": "BridgeCore.handle_input_message", + "message_received_result_rabbitmq": "BridgeCore.handle_result_rabbitmq_message", + "message_received_result_unknown": "BridgeCore.handle_result_unknown_message" + }, + "class": ".rabbitmq.rabbitmq_adapter.RabbitMQAdapter" + }, + "inmemory": { + "enabled": true, + "signals": { + "message_received_input_inmemory": "BridgeCore.handle_input_message", + "message_received_result_inmemory": "InMemoryAdapter._handle_result" + }, + "class": ".inmemory.inmemory_adapter.InMemoryAdapter" + } + } +} diff --git a/simulation_bridge/src/utils/config_loader.py b/simulation_bridge/src/utils/config_loader.py index 6c11ec36..53ab86e9 100644 --- a/simulation_bridge/src/utils/config_loader.py +++ b/simulation_bridge/src/utils/config_loader.py @@ -16,6 +16,15 @@ # Configure logger logger = get_logger() +# In-memory mode flag +__inmemory_mode = False + + +def set_inmemory_mode(enabled: bool) -> None: + """Enable or disable in-memory protocol configuration mode.""" + global __inmemory_mode + __inmemory_mode = enabled + def load_config( config_path: Optional[Union[str, Path]] = None) -> Dict[str, Any]: @@ -92,7 +101,11 @@ def load_protocol_config() -> Dict[str, list]: """ Load the protocol configuration from a JSON file. """ - config_file = Path(__file__).parent.parent / \ - "protocol_adapters/adapters_signal.json" + base_path = Path(__file__).parent.parent / "protocol_adapters" + + if __inmemory_mode: + config_file = base_path / "inmemory_signal.json" + else: + config_file = base_path / "adapters_signal.json" with open(config_file, 'r', encoding='utf-8') as f: return json.load(f)["protocols"] diff --git a/simulation_bridge/test/unit/test_config_loader.py b/simulation_bridge/test/unit/test_config_loader.py index df98e258..0fd14d69 100644 --- a/simulation_bridge/test/unit/test_config_loader.py +++ b/simulation_bridge/test/unit/test_config_loader.py @@ -139,8 +139,8 @@ def test_substitute_env_vars_empty_default(self): class TestLoadProtocolConfig: # pylint: disable=too-few-public-methods """Test cases for load_protocol_config function.""" - def test_load_protocol_config_success(self, protocol_json): - """Test successful loading and parsing of protocol config JSON file.""" + def test_load_protocol_config_default(self, protocol_json): + """Load configuration in default (file) mode.""" json_str = json.dumps(protocol_json) mock_open = mock.mock_open(read_data=json_str) @@ -148,6 +148,23 @@ def test_load_protocol_config_success(self, protocol_json): "protocol_adapters/adapters_signal.json" with mock.patch("builtins.open", mock_open) as m_open: + config_loader.set_inmemory_mode(False) + protocols = config_loader.load_protocol_config() + + m_open.assert_called_once_with(config_file, 'r', encoding='utf-8') + assert isinstance(protocols, list) + assert protocols == protocol_json["protocols"] + + def test_load_protocol_config_inmemory(self, protocol_json): + """Load configuration when in-memory mode is enabled.""" + json_str = json.dumps(protocol_json) + mock_open = mock.mock_open(read_data=json_str) + + config_file = Path(config_loader.__file__).parent.parent / \ + "protocol_adapters/inmemory_signal.json" + + with mock.patch("builtins.open", mock_open) as m_open: + config_loader.set_inmemory_mode(True) protocols = config_loader.load_protocol_config() m_open.assert_called_once_with(config_file, 'r', encoding='utf-8') From 3189a7194c045126926d58b943e9b22e42380374 Mon Sep 17 00:00:00 2001 From: Marco Melloni <98281551+marcomelloni@users.noreply.github.com> Date: Wed, 16 Jul 2025 12:54:36 +0200 Subject: [PATCH 2/2] Make in-memory protocol configuration opt-in --- simulation_bridge/__init__.py | 3 --- .../src/protocol_adapters/adapters_signal.json | 8 -------- simulation_bridge/src/utils/config_loader.py | 6 +++++- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/simulation_bridge/__init__.py b/simulation_bridge/__init__.py index 177c5382..ad32ae58 100644 --- a/simulation_bridge/__init__.py +++ b/simulation_bridge/__init__.py @@ -1,7 +1,4 @@ """Convenience utilities for the Simulation Bridge package.""" -from .src.utils.config_loader import set_inmemory_mode - -set_inmemory_mode(True) from .src.protocol_adapters.inmemory.inmemory_adapter import SimulationBridge diff --git a/simulation_bridge/src/protocol_adapters/adapters_signal.json b/simulation_bridge/src/protocol_adapters/adapters_signal.json index b033624c..0493cbfc 100644 --- a/simulation_bridge/src/protocol_adapters/adapters_signal.json +++ b/simulation_bridge/src/protocol_adapters/adapters_signal.json @@ -24,14 +24,6 @@ "message_received_result_rest": "RESTAdapter.publish_result_message_rest" }, "class": ".rest.rest_adapter.RESTAdapter" - }, - "inmemory": { - "enabled": true, - "signals": { - "message_received_input_inmemory": "BridgeCore.handle_input_message", - "message_received_result_inmemory": "InMemoryAdapter._handle_result" - }, - "class": ".inmemory.inmemory_adapter.InMemoryAdapter" } } } diff --git a/simulation_bridge/src/utils/config_loader.py b/simulation_bridge/src/utils/config_loader.py index 53ab86e9..b93ad02d 100644 --- a/simulation_bridge/src/utils/config_loader.py +++ b/simulation_bridge/src/utils/config_loader.py @@ -21,7 +21,11 @@ def set_inmemory_mode(enabled: bool) -> None: - """Enable or disable in-memory protocol configuration mode.""" + """Enable or disable loading of the in-memory protocol configuration. + + The loader defaults to using the standard protocol configuration file. + Call this function with ``True`` only when running entirely in-memory. + """ global __inmemory_mode __inmemory_mode = enabled