Skip to content

Commit 1bf9d19

Browse files
authored
Merge pull request #276 from Apolo151/ram_tests_fix
fix: ram tests structure
2 parents 50ccd81 + ec24bc2 commit 1bf9d19

8 files changed

Lines changed: 46 additions & 29 deletions

.github/workflows/pytest_transitions_tests_coverage.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@ jobs:
2626
2727
- name: Run tests with coverage
2828
run: |
29-
PYTHONPATH=. pytest --cov=manager/manager --cov-report=term
29+
PYTHONPATH=. pytest --cov=robotics_application_manager --cov-report=term

test/conftest.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""Utility functions to transition the Manager to a specific state for testing."""
22

33
import pytest
4-
from manager.manager.manager import Manager
4+
from robotics_application_manager.manager.manager import Manager
55

66

77
class DummyServer:
@@ -76,8 +76,8 @@ def stop(self):
7676
def manager(monkeypatch):
7777
"""Fixture to provide a Manager instance with patched dependencies for testing."""
7878

79-
monkeypatch.setattr("manager.comms.websocket_server.WebsocketServer", DummyServer)
80-
monkeypatch.setattr("manager.manager.manager.ManagerConsumer", DummyConsumer)
79+
monkeypatch.setattr("robotics_application_manager.comms.websocket_server.WebsocketServer", DummyServer)
80+
monkeypatch.setattr("robotics_application_manager.manager.manager.ManagerConsumer", DummyConsumer)
8181

8282
# Patch subprocess.check_output for ROS_DISTRO and IMAGE_TAG
8383
def fake_check_output(cmd, *a, **k):
@@ -91,14 +91,14 @@ def fake_check_output(cmd, *a, **k):
9191

9292
# Patch check_gpu_acceleration where it is used
9393
monkeypatch.setattr(
94-
"manager.manager.manager.check_gpu_acceleration", lambda x=None: "OFF"
94+
"robotics_application_manager.manager.manager.check_gpu_acceleration", lambda x=None: "OFF"
9595
)
9696

9797
def dummy_run(self, start_pose=None):
9898
print("run around")
9999

100100
monkeypatch.setattr(
101-
"manager.manager.launcher.launcher_robot.LauncherRobot.run", dummy_run
101+
"robotics_application_manager.manager.launcher.launcher_robot.LauncherRobot.run", dummy_run
102102
)
103103

104104
# Patch os.makedirs and os.path.isdir to avoid real FS operations
@@ -121,7 +121,7 @@ def run(self):
121121
def terminate(self):
122122
pass
123123

124-
monkeypatch.setattr("manager.manager.manager.LauncherWorld", DummyLauncherWorld)
124+
monkeypatch.setattr("robotics_application_manager.manager.manager.LauncherWorld", DummyLauncherWorld)
125125

126126
class DummyFileWatchdog:
127127
def __init__(self, path, update_callback):
@@ -146,10 +146,10 @@ def run(self, consumer):
146146
def terminate(self):
147147
pass
148148

149-
monkeypatch.setattr("manager.manager.manager.LauncherTools", DummyToolsLauncher)
149+
monkeypatch.setattr("robotics_application_manager.manager.manager.LauncherTools", DummyToolsLauncher)
150150
# Deprecated
151-
# monkeypatch.setattr("manager.manager.manager.Server", DummyServer)
152-
# monkeypatch.setattr("manager.manager.manager.FileWatchdog", DummyFileWatchdog)
151+
# monkeypatch.setattr("robotics_application_manager.manager.manager.Server", DummyServer)
152+
# monkeypatch.setattr("robotics_application_manager.manager.manager.FileWatchdog", DummyFileWatchdog)
153153

154154
# Setup Manager with dummy consumer
155155
m = Manager(host="localhost", port=12345)

test/test_connect_disconnect_transitions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def test_disconnect_invalid_process(manager, monkeypatch):
8484
# Mock needed methods and attributes
8585
monkeypatch.setattr("os.execl", lambda *args: None)
8686
monkeypatch.setattr(
87-
"manager.manager.manager.stop_process_and_children",
87+
"robotics_application_manager.manager.manager.stop_process_and_children",
8888
lambda proc: (_ for _ in ()).throw(Exception("Process cannot be stopped")),
8989
)
9090
manager.application_process = DummyProc()

test/test_connected_to_world_ready.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
"""Tests for transitioning Manager from 'connected' to 'world_ready' state."""
22

33
import pytest
4-
from manager.libs.launch_world_model import ConfigurationModel
4+
from robotics_application_manager.libs.launch_world_model import ConfigurationModel
55
from test_utils import setup_manager_to_connected
6-
from manager.manager.launcher.launcher_robot import worlds
6+
from robotics_application_manager.manager.launcher.launcher_robot import worlds
77

88
valid_world_cfg = ConfigurationModel(
99
type=next(iter(worlds)), launch_file_path="/path/to/launch_file.launch"
@@ -62,7 +62,8 @@ def fake_prepare_custom_universe(cfg):
6262
raise ValueError("Invalid world configuration")
6363

6464
monkeypatch.setattr(
65-
"manager.libs.launch_world_model.ConfigurationManager.validate", fake_validate
65+
"robotics_application_manager.libs.launch_world_model.ConfigurationManager.validate",
66+
fake_validate,
6667
)
6768
manager.prepare_custom_universe = fake_prepare_custom_universe
6869

@@ -94,7 +95,8 @@ def fake_validate(cfg):
9495
return DummyConfig()
9596

9697
monkeypatch.setattr(
97-
"manager.libs.launch_world_model.ConfigurationManager.validate", fake_validate
98+
"robotics_application_manager.libs.launch_world_model.ConfigurationManager.validate",
99+
fake_validate,
98100
)
99101

100102
invalid_robot_cfg = {"name": "", "type": ""} # Invalid robot config

test/test_resume_and_pause_transitions.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
class DummyProc:
1010
"""Dummy process class for testing suspend and resume methods."""
1111

12+
def children(self, recursive=True):
13+
"""Simulate psutil child-process lookup."""
14+
return []
15+
1216
def suspend(self):
1317
"""Simulate suspending the process."""
1418
pass

test/test_terminate_transitions.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def dummy_stop_process_and_children(proc):
4646
pass
4747

4848
monkeypatch.setattr(
49-
"manager.manager.manager.stop_process_and_children",
49+
"robotics_application_manager.manager.manager.stop_process_and_children",
5050
dummy_stop_process_and_children,
5151
)
5252
manager.pause_sim = lambda: None
@@ -72,7 +72,7 @@ def dummy_stop_process_and_children(proc):
7272
pass
7373

7474
monkeypatch.setattr(
75-
"manager.manager.manager.stop_process_and_children",
75+
"robotics_application_manager.manager.manager.stop_process_and_children",
7676
dummy_stop_process_and_children,
7777
)
7878
manager.pause_sim = lambda: None
@@ -106,7 +106,7 @@ def test_terminate_tools_invalid_machine_error(manager, monkeypatch):
106106
Ensure that the transition raises an error when executed from an invalid state.
107107
"""
108108
monkeypatch.setattr(
109-
"manager.libs.applications.compatibility.server.Server", DummyServer
109+
"robotics_application_manager.libs.server.Server", DummyServer
110110
)
111111
# Ensure the manager is in a state where it can stop
112112
setup_manager_to_application_running(manager, monkeypatch)

test/test_tools_ready_to_application_running.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ def fake_open(file, mode="r", *args, **kwargs):
3838
return io.BytesIO()
3939
elif "r" in mode:
4040
return io.BytesIO(b"fake zip content")
41+
if isinstance(file, str) and file.startswith("/dev/pts/"):
42+
return io.BytesIO() if "b" in mode else io.StringIO()
4143
return original_open(file, mode, *args, **kwargs)
4244

4345
# Mock file system and subprocess operations
@@ -47,7 +49,7 @@ def fake_open(file, mode="r", *args, **kwargs):
4749
monkeypatch.setattr("subprocess.Popen", lambda *a, **k: DummyProc())
4850
monkeypatch.setattr("os.mkdir", lambda path: None)
4951
monkeypatch.setattr("os.path.exists", lambda path: True)
50-
monkeypatch.setattr("shutil.rmtree", lambda path: None)
52+
monkeypatch.setattr("shutil.rmtree", lambda path, ignore_errors=False: None)
5153
monkeypatch.setattr(
5254
"zipfile.ZipFile",
5355
lambda *a, **k: type(
@@ -58,7 +60,8 @@ def fake_open(file, mode="r", *args, **kwargs):
5860
)
5961
monkeypatch.setattr("base64.b64decode", lambda s: b"print('hello')")
6062
monkeypatch.setattr(
61-
"manager.manager.manager.Manager.unpause_sim", lambda self: None
63+
"robotics_application_manager.manager.manager.Manager.unpause_sim",
64+
lambda self: None,
6265
)
6366
# Mock linter to return no errors
6467
manager.linter.evaluate_code = lambda code, ros_version: ""
@@ -85,6 +88,8 @@ def fake_open(file, mode="r", *args, **kwargs):
8588
import io
8689

8790
return io.BytesIO()
91+
if isinstance(file, str) and file.startswith("/dev/pts/"):
92+
return io.BytesIO() if "b" in mode else io.StringIO()
8893
return original_open(file, mode, *args, **kwargs)
8994

9095
monkeypatch.setattr("builtins.open", fake_open)
@@ -93,7 +98,7 @@ def fake_open(file, mode="r", *args, **kwargs):
9398
monkeypatch.setattr("subprocess.Popen", lambda *a, **k: None)
9499
monkeypatch.setattr("os.mkdir", lambda path: None)
95100
monkeypatch.setattr("os.path.exists", lambda path: True)
96-
monkeypatch.setattr("shutil.rmtree", lambda path: None)
101+
monkeypatch.setattr("shutil.rmtree", lambda path, ignore_errors=False: None)
97102
monkeypatch.setattr(
98103
"zipfile.ZipFile",
99104
lambda *a, **k: type(
@@ -104,7 +109,8 @@ def fake_open(file, mode="r", *args, **kwargs):
104109
)
105110
monkeypatch.setattr("base64.b64decode", lambda s: b"print('hello')")
106111
monkeypatch.setattr(
107-
"manager.manager.manager.Manager.unpause_sim", lambda self: None
112+
"robotics_application_manager.manager.manager.Manager.unpause_sim",
113+
lambda self: None,
108114
)
109115
# Mock linter to return no errors
110116
manager.linter.evaluate_code = lambda code, ros_version: ""
@@ -127,7 +133,7 @@ def test_on_run_application_corrupt_zip(manager, monkeypatch):
127133
monkeypatch.setattr("os.path.exists", lambda path: True)
128134
monkeypatch.setattr("os.mkdir", lambda path: None)
129135
monkeypatch.setattr("os.listdir", lambda path: ["0", "1", "2"])
130-
monkeypatch.setattr("shutil.rmtree", lambda path: None)
136+
monkeypatch.setattr("shutil.rmtree", lambda path, ignore_errors=False: None)
131137
# Mock open for app.zip to avoid FileNotFoundError
132138
original_open = builtins.open
133139

@@ -136,6 +142,8 @@ def fake_open(file, mode="r", *args, **kwargs):
136142
import io
137143

138144
return io.BytesIO()
145+
if isinstance(file, str) and file.startswith("/dev/pts/"):
146+
return io.BytesIO() if "b" in mode else io.StringIO()
139147
return original_open(file, mode, *args, **kwargs)
140148

141149
monkeypatch.setattr("builtins.open", fake_open)
@@ -153,7 +161,8 @@ def fake_open(file, mode="r", *args, **kwargs):
153161
)(),
154162
)
155163
monkeypatch.setattr(
156-
"manager.manager.manager.Manager.unpause_sim", lambda self: None
164+
"robotics_application_manager.manager.manager.Manager.unpause_sim",
165+
lambda self: None,
157166
)
158167
manager.linter.evaluate_code = lambda code, ros_version: ""
159168
data = valid_app_data

test/test_utils.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import builtins
44
import io
55

6-
from manager.manager.launcher.launcher_robot import worlds
6+
from robotics_application_manager.manager.launcher.launcher_robot import worlds
77

88

99
def setup_manager_to_connected(manager, monkeypatch):
@@ -18,7 +18,7 @@ def setup_manager_to_world_ready(manager, monkeypatch):
1818
setup_manager_to_connected(manager, monkeypatch)
1919

2020
# Use ConfigurationModel for valid world config
21-
from manager.libs.launch_world_model import ConfigurationModel
21+
from robotics_application_manager.libs.launch_world_model import ConfigurationModel
2222

2323
valid_world_cfg = ConfigurationModel(
2424
type=next(iter(worlds)), # Use the first world type
@@ -70,7 +70,7 @@ def run(self, consumer=None):
7070
def terminate(self):
7171
pass
7272

73-
monkeypatch.setattr("manager.manager.manager.LauncherTools", DummyToolsLauncher)
73+
monkeypatch.setattr("robotics_application_manager.manager.manager.LauncherTools", DummyToolsLauncher)
7474

7575
# Trigger visualization ready state
7676
manager.trigger(
@@ -107,6 +107,8 @@ def fake_open(file, mode="r", *args, **kwargs):
107107
return io.BytesIO()
108108
elif "r" in mode:
109109
return io.BytesIO(b"fake zip content")
110+
if isinstance(file, str) and file.startswith("/dev/pts/"):
111+
return io.BytesIO() if "b" in mode else io.StringIO()
110112
return original_open(file, mode, *args, **kwargs)
111113

112114
# Mock file system and subprocess operations
@@ -116,7 +118,7 @@ def fake_open(file, mode="r", *args, **kwargs):
116118
monkeypatch.setattr("subprocess.Popen", lambda *a, **k: DummyProc())
117119
monkeypatch.setattr("os.mkdir", lambda path: None)
118120
monkeypatch.setattr("os.path.exists", lambda path: True)
119-
monkeypatch.setattr("shutil.rmtree", lambda path: None)
121+
monkeypatch.setattr("shutil.rmtree", lambda path, ignore_errors=False: None)
120122
monkeypatch.setattr(
121123
"zipfile.ZipFile",
122124
lambda *a, **k: type(
@@ -127,7 +129,7 @@ def fake_open(file, mode="r", *args, **kwargs):
127129
)
128130
monkeypatch.setattr("base64.b64decode", lambda s: b"print('hello')")
129131
monkeypatch.setattr(
130-
"manager.manager.manager.Manager.unpause_sim", lambda self: None
132+
"robotics_application_manager.manager.manager.Manager.unpause_sim", lambda self: None
131133
)
132134
# Mock linter to return no errors
133135
manager.linter.evaluate_code = lambda code, ros_version: ""

0 commit comments

Comments
 (0)