Skip to content

Commit 72b8d92

Browse files
committed
tests: add test for labgrid-client subcommands
Mock out the connection to the coordinator and ressource updates, because they are handled inside the testcase. Check that the right ressources get created and used during execution and that an error is raised, if no resources are available. Signed-off-by: Fabian Pflug <fabian.pflug@gumulka.eu>
1 parent 9ec9974 commit 72b8d92

1 file changed

Lines changed: 176 additions & 0 deletions

File tree

tests/test_client_commands.py

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
import pytest
2+
3+
from labgrid.exceptions import NoSupplierFoundError
4+
from labgrid.remote.client import ensure_event_loop, ClientSession, UserError
5+
from labgrid.driver import PyOCDDriver, NetworkPowerDriver, LXAIOBusPIODriver
6+
from labgrid.resource.remote import NetworkUSBDebugger, NetworkLXAIOBusPIO
7+
from labgrid.resource.power import NetworkPowerPort
8+
9+
10+
class PseudoArgs:
11+
def __getattr__(self, attr):
12+
if attr == "action":
13+
return "get"
14+
if attr == "bootstrap_args":
15+
return ""
16+
return None
17+
18+
19+
class PseudePlace:
20+
def __getattr__(self, attr):
21+
if attr == "name":
22+
return "PseudoPlace"
23+
return None
24+
25+
26+
@pytest.fixture(scope="function")
27+
def client(mocker, target):
28+
loop = ensure_event_loop()
29+
client = ClientSession(address="", loop=loop)
30+
client.args = PseudoArgs()
31+
place = PseudePlace()
32+
33+
def get_acquired_place():
34+
return place
35+
place_mock = mocker.patch("labgrid.remote.client.ClientSession.get_acquired_place")
36+
place_mock.side_effect = get_acquired_place
37+
38+
def _get_target(_):
39+
return target
40+
target_mock = mocker.patch("labgrid.remote.client.ClientSession._get_target")
41+
target_mock.side_effect = _get_target
42+
43+
# disable resource updating
44+
target_resource_update_mock = mocker.patch("labgrid.target.Target.update_resources")
45+
return client
46+
47+
48+
@pytest.mark.parametrize(
49+
"command",
50+
[
51+
"bootstrap",
52+
"digital_io",
53+
"power",
54+
"reset",
55+
"sd_mux",
56+
"usb_mux",
57+
"video",
58+
],
59+
)
60+
def test_command_without_resources(client, command):
61+
with pytest.raises(UserError, match="target has no compatible resource available"):
62+
c = getattr(client, command)
63+
c()
64+
65+
66+
@pytest.mark.parametrize(
67+
"command",
68+
[
69+
"dfu",
70+
"fastboot",
71+
"flashscript",
72+
"audio",
73+
"write_files",
74+
"write_image",
75+
"ssh",
76+
"scp",
77+
"rsync",
78+
"sshfs",
79+
"telnet",
80+
],
81+
)
82+
def test_command_without_suplierers(client, command):
83+
with pytest.raises(NoSupplierFoundError):
84+
c = getattr(client, command)
85+
c()
86+
87+
88+
def network_usb_ressource(target):
89+
network_args = {
90+
"name": "network_usb_ressource",
91+
"host": "None",
92+
"busnum": 0,
93+
"devnum": 0,
94+
"path": "1-12",
95+
"vendor_id": 0,
96+
"model_id": 0,
97+
}
98+
r = NetworkUSBDebugger(target, **network_args)
99+
r.avail = True
100+
101+
102+
def pyocd_driver(target):
103+
network_usb_ressource(target)
104+
PyOCDDriver(target, "pyocd")
105+
106+
107+
def network_power_port(target):
108+
network_args = {
109+
"name": "network_power_port",
110+
"host": "None",
111+
"model": "rest",
112+
"index": "0",
113+
}
114+
r = NetworkPowerPort(target, **network_args)
115+
r.avail = True
116+
117+
118+
def network_power_driver(target):
119+
network_power_port(target)
120+
NetworkPowerDriver(target, "fake_power")
121+
122+
123+
def network_LXA_gpio(target):
124+
network_args = {
125+
"name": "network_lxa_io_bus_name",
126+
"node": "network_lxa_io_bus_node",
127+
"host": "None",
128+
"pin": "0",
129+
"invert": False,
130+
}
131+
r = NetworkLXAIOBusPIO(target, **network_args)
132+
r.avail = True
133+
134+
135+
def lxaio_bus_driver(target):
136+
network_LXA_gpio(target)
137+
LXAIOBusPIODriver(target, "lxa_pio_driver")
138+
139+
140+
def power_and_gpio_ressource(target):
141+
network_LXA_gpio(target)
142+
network_power_port(target)
143+
144+
145+
def power_gpio_and_debug_ressource(target):
146+
network_LXA_gpio(target)
147+
network_power_port(target)
148+
network_usb_ressource(target)
149+
150+
151+
@pytest.mark.parametrize(
152+
"command,setup,patch",
153+
[
154+
("reset", network_usb_ressource, "labgrid.driver.pyocddriver.PyOCDDriver.reset"),
155+
("reset", pyocd_driver, "labgrid.driver.pyocddriver.PyOCDDriver.reset"),
156+
("power", network_power_port, "labgrid.driver.power.rest.power_get"),
157+
("power", network_power_driver, "labgrid.driver.power.rest.power_get"),
158+
("digital_io", network_LXA_gpio, "labgrid.driver.lxaiobusdriver.LXAIOBusPIODriver.get"),
159+
("digital_io", lxaio_bus_driver, "labgrid.driver.lxaiobusdriver.LXAIOBusPIODriver.get"),
160+
("reset", network_power_port, "labgrid.driver.powerdriver.PowerResetMixin.reset"),
161+
("reset", network_LXA_gpio, "labgrid.driver.resetdriver.DigitalOutputResetDriver.reset"),
162+
("reset", power_and_gpio_ressource, "labgrid.driver.resetdriver.DigitalOutputResetDriver.reset"),
163+
("reset", power_gpio_and_debug_ressource, "labgrid.driver.pyocddriver.PyOCDDriver.reset"),
164+
("bootstrap", network_usb_ressource, "labgrid.driver.pyocddriver.PyOCDDriver.load"),
165+
("bootstrap", pyocd_driver, "labgrid.driver.pyocddriver.PyOCDDriver.load"),
166+
],
167+
)
168+
def test_reset_command_with_remote_resource(target, client, mocker, command, setup, patch):
169+
setup(target)
170+
171+
driver_mock = mocker.patch(patch)
172+
173+
c = getattr(client, command)
174+
c()
175+
176+
driver_mock.assert_called_once()

0 commit comments

Comments
 (0)