shepherd-core 2023.12.1__py3-none-any.whl → 2024.4.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- shepherd_core/__init__.py +3 -2
- shepherd_core/data_models/base/calibration.py +3 -1
- shepherd_core/data_models/base/content.py +11 -4
- shepherd_core/data_models/base/shepherd.py +2 -0
- shepherd_core/data_models/content/energy_environment.py +1 -1
- shepherd_core/data_models/content/virtual_harvester.py +1 -1
- shepherd_core/data_models/content/virtual_source.py +18 -13
- shepherd_core/data_models/experiment/experiment.py +10 -10
- shepherd_core/data_models/experiment/observer_features.py +5 -6
- shepherd_core/data_models/task/observer_tasks.py +1 -1
- shepherd_core/data_models/task/testbed_tasks.py +7 -3
- shepherd_core/data_models/testbed/cape.py +1 -1
- shepherd_core/data_models/testbed/gpio.py +1 -1
- shepherd_core/data_models/testbed/mcu.py +1 -1
- shepherd_core/data_models/testbed/observer.py +1 -1
- shepherd_core/data_models/testbed/target.py +1 -1
- shepherd_core/data_models/testbed/testbed.py +1 -1
- shepherd_core/decoder_waveform/uart.py +1 -0
- shepherd_core/fw_tools/validation.py +1 -2
- shepherd_core/inventory/__init__.py +51 -1
- shepherd_core/inventory/system.py +8 -0
- shepherd_core/reader.py +19 -16
- shepherd_core/testbed_client/cache_path.py +15 -0
- shepherd_core/testbed_client/client.py +2 -3
- shepherd_core/testbed_client/fixtures.py +4 -1
- shepherd_core/testbed_client/user_model.py +6 -4
- shepherd_core/vsource/virtual_converter_model.py +1 -1
- shepherd_core/vsource/virtual_harvester_model.py +1 -0
- shepherd_core/vsource/virtual_source_model.py +1 -0
- shepherd_core/writer.py +5 -2
- {shepherd_core-2023.12.1.dist-info → shepherd_core-2024.4.1.dist-info}/METADATA +49 -34
- shepherd_core-2024.4.1.dist-info/RECORD +64 -0
- {shepherd_core-2023.12.1.dist-info → shepherd_core-2024.4.1.dist-info}/WHEEL +1 -1
- {shepherd_core-2023.12.1.dist-info → shepherd_core-2024.4.1.dist-info}/top_level.txt +0 -1
- shepherd_core/data_models/content/_external_fixtures.yaml +0 -394
- shepherd_core/data_models/content/energy_environment_fixture.yaml +0 -50
- shepherd_core/data_models/content/virtual_harvester_fixture.yaml +0 -159
- shepherd_core/data_models/content/virtual_source_fixture.yaml +0 -229
- shepherd_core/data_models/testbed/cape_fixture.yaml +0 -94
- shepherd_core/data_models/testbed/gpio_fixture.yaml +0 -166
- shepherd_core/data_models/testbed/mcu_fixture.yaml +0 -19
- shepherd_core/data_models/testbed/observer_fixture.yaml +0 -220
- shepherd_core/data_models/testbed/target_fixture.yaml +0 -137
- shepherd_core/data_models/testbed/testbed_fixture.yaml +0 -25
- shepherd_core-2023.12.1.dist-info/RECORD +0 -117
- tests/__init__.py +0 -0
- tests/conftest.py +0 -64
- tests/data_models/__init__.py +0 -0
- tests/data_models/conftest.py +0 -14
- tests/data_models/example_cal_data.yaml +0 -31
- tests/data_models/example_cal_data_faulty.yaml +0 -29
- tests/data_models/example_cal_meas.yaml +0 -178
- tests/data_models/example_cal_meas_faulty1.yaml +0 -142
- tests/data_models/example_cal_meas_faulty2.yaml +0 -136
- tests/data_models/example_config_emulator.yaml +0 -41
- tests/data_models/example_config_experiment.yaml +0 -16
- tests/data_models/example_config_experiment_alternative.yaml +0 -14
- tests/data_models/example_config_harvester.yaml +0 -15
- tests/data_models/example_config_testbed.yaml +0 -26
- tests/data_models/example_config_virtsource.yaml +0 -78
- tests/data_models/test_base_models.py +0 -205
- tests/data_models/test_content_fixtures.py +0 -41
- tests/data_models/test_content_models.py +0 -282
- tests/data_models/test_examples.py +0 -48
- tests/data_models/test_experiment_models.py +0 -277
- tests/data_models/test_task_generation.py +0 -52
- tests/data_models/test_task_models.py +0 -131
- tests/data_models/test_testbed_fixtures.py +0 -47
- tests/data_models/test_testbed_models.py +0 -187
- tests/decoder_waveform/__init__.py +0 -0
- tests/decoder_waveform/test_decoder.py +0 -34
- tests/fw_tools/__init__.py +0 -0
- tests/fw_tools/conftest.py +0 -5
- tests/fw_tools/test_converter.py +0 -76
- tests/fw_tools/test_patcher.py +0 -66
- tests/fw_tools/test_validation.py +0 -56
- tests/inventory/__init__.py +0 -0
- tests/inventory/test_inventory.py +0 -20
- tests/test_cal_hw.py +0 -34
- tests/test_examples.py +0 -40
- tests/test_logger.py +0 -15
- tests/test_reader.py +0 -283
- tests/test_writer.py +0 -169
- tests/testbed_client/__init__.py +0 -0
- tests/vsource/__init__.py +0 -0
- tests/vsource/conftest.py +0 -49
- tests/vsource/test_converter.py +0 -161
- tests/vsource/test_harvester.py +0 -73
- tests/vsource/test_z.py +0 -5
- {shepherd_core-2023.12.1.dist-info → shepherd_core-2024.4.1.dist-info}/zip-safe +0 -0
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
from datetime import timedelta
|
|
2
|
-
|
|
3
|
-
import pytest
|
|
4
|
-
from pydantic import ValidationError
|
|
5
|
-
|
|
6
|
-
from shepherd_core import local_now
|
|
7
|
-
from shepherd_core.data_models import VirtualHarvesterConfig
|
|
8
|
-
from shepherd_core.data_models import VirtualSourceConfig
|
|
9
|
-
from shepherd_core.data_models.content import EnergyEnvironment
|
|
10
|
-
from shepherd_core.data_models.content import Firmware
|
|
11
|
-
from shepherd_core.data_models.experiment import Experiment
|
|
12
|
-
from shepherd_core.data_models.experiment import GpioActuation
|
|
13
|
-
from shepherd_core.data_models.experiment import GpioEvent
|
|
14
|
-
from shepherd_core.data_models.experiment import GpioLevel
|
|
15
|
-
from shepherd_core.data_models.experiment import GpioTracing
|
|
16
|
-
from shepherd_core.data_models.experiment import PowerTracing
|
|
17
|
-
from shepherd_core.data_models.experiment import SystemLogging
|
|
18
|
-
from shepherd_core.data_models.experiment import TargetConfig
|
|
19
|
-
from shepherd_core.data_models.testbed import GPIO
|
|
20
|
-
from shepherd_core.data_models.testbed import Target
|
|
21
|
-
|
|
22
|
-
from .conftest import load_yaml
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def test_experiment_model_exp_min() -> None:
|
|
26
|
-
Experiment(
|
|
27
|
-
name="mex per",
|
|
28
|
-
target_configs=[
|
|
29
|
-
TargetConfig(
|
|
30
|
-
target_IDs=[1],
|
|
31
|
-
energy_env=EnergyEnvironment(name="SolarSunny"),
|
|
32
|
-
firmware1=Firmware(name="nrf52_demo_rf"),
|
|
33
|
-
)
|
|
34
|
-
],
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def test_experiment_model_exp_yaml_load() -> None:
|
|
39
|
-
exp1_data = load_yaml("example_config_experiment_alternative.yaml")
|
|
40
|
-
Experiment(**exp1_data)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def test_experiment_model_exp_yaml_comparison() -> None:
|
|
44
|
-
exp1_data = load_yaml("example_config_experiment_alternative.yaml")
|
|
45
|
-
exp1 = Experiment(**exp1_data)
|
|
46
|
-
|
|
47
|
-
target_cfgs = TargetConfig(
|
|
48
|
-
target_IDs=list(range(1, 5)),
|
|
49
|
-
custom_IDs=list(range(4)),
|
|
50
|
-
energy_env={"name": "SolarSunny"},
|
|
51
|
-
virtual_source={"name": "diode+capacitor"},
|
|
52
|
-
firmware1={"name": "nrf52_demo_rf"},
|
|
53
|
-
)
|
|
54
|
-
exp2 = Experiment(
|
|
55
|
-
id=4567,
|
|
56
|
-
name="meaningful Test-Name",
|
|
57
|
-
created="2023-11-11 11:11:11",
|
|
58
|
-
time_start="2023-12-12 12:12:12",
|
|
59
|
-
target_configs=[target_cfgs],
|
|
60
|
-
)
|
|
61
|
-
assert exp1.get_hash() == exp2.get_hash()
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
def test_experiment_model_exp_collision_target_id() -> None:
|
|
65
|
-
hrv = VirtualHarvesterConfig(name="mppt_bq_thermoelectric")
|
|
66
|
-
target_cfgs = [
|
|
67
|
-
TargetConfig(
|
|
68
|
-
target_IDs=[1, 2, 3], # <- collision
|
|
69
|
-
custom_IDs=[0, 1, 2, 3],
|
|
70
|
-
energy_env={"name": "SolarSunny"},
|
|
71
|
-
virtual_source={"name": "diode+capacitor"},
|
|
72
|
-
firmware1={"name": "nrf52_demo_rf"},
|
|
73
|
-
),
|
|
74
|
-
TargetConfig(
|
|
75
|
-
target_IDs=list(range(1, 5)), # <- collision
|
|
76
|
-
custom_IDs=list(range(7, 18)), # note: longer list is OK
|
|
77
|
-
energy_env=EnergyEnvironment(name="ThermoelectricWashingMachine"),
|
|
78
|
-
virtual_source=VirtualSourceConfig(name="BQ25570-Schmitt", harvester=hrv),
|
|
79
|
-
firmware1=Firmware(name="nrf52_demo_rf"),
|
|
80
|
-
firmware2=Firmware(name="msp430_deep_sleep"),
|
|
81
|
-
),
|
|
82
|
-
]
|
|
83
|
-
with pytest.raises(ValueError):
|
|
84
|
-
_ = Experiment(
|
|
85
|
-
id="4567",
|
|
86
|
-
name="meaningful Test-Name",
|
|
87
|
-
time_start=local_now() + timedelta(minutes=30),
|
|
88
|
-
target_configs=target_cfgs,
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
def test_experiment_model_exp_collision_custom_id() -> None:
|
|
93
|
-
hrv = VirtualHarvesterConfig(name="mppt_bq_thermoelectric")
|
|
94
|
-
target_cfgs = [
|
|
95
|
-
TargetConfig(
|
|
96
|
-
target_IDs=[1, 2, 3],
|
|
97
|
-
custom_IDs=[0, 1, 7], # <- collision
|
|
98
|
-
energy_env={"name": "SolarSunny"},
|
|
99
|
-
virtual_source={"name": "diode+capacitor"},
|
|
100
|
-
firmware1={"name": "nrf52_demo_rf"},
|
|
101
|
-
),
|
|
102
|
-
TargetConfig(
|
|
103
|
-
target_IDs=list(range(1, 5)),
|
|
104
|
-
custom_IDs=list(range(7, 18)), # <- collision
|
|
105
|
-
energy_env=EnergyEnvironment(name="ThermoelectricWashingMachine"),
|
|
106
|
-
virtual_source=VirtualSourceConfig(name="BQ25570-Schmitt", harvester=hrv),
|
|
107
|
-
firmware1=Firmware(name="nrf52_demo_rf"),
|
|
108
|
-
firmware2=Firmware(name="msp430_deep_sleep"),
|
|
109
|
-
),
|
|
110
|
-
]
|
|
111
|
-
with pytest.raises(ValueError):
|
|
112
|
-
_ = Experiment(
|
|
113
|
-
id="4567",
|
|
114
|
-
name="meaningful Test-Name",
|
|
115
|
-
time_start=local_now() + timedelta(minutes=30),
|
|
116
|
-
target_configs=target_cfgs,
|
|
117
|
-
)
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
def test_experiment_model_exp_collision_observer() -> None:
|
|
121
|
-
hrv = VirtualHarvesterConfig(name="mppt_bq_thermoelectric")
|
|
122
|
-
target_cfgs = [
|
|
123
|
-
TargetConfig(
|
|
124
|
-
target_IDs=[1, 1001], # <- both on same observer
|
|
125
|
-
custom_IDs=list(range(7, 18)),
|
|
126
|
-
energy_env=EnergyEnvironment(name="ThermoelectricWashingMachine"),
|
|
127
|
-
virtual_source=VirtualSourceConfig(name="BQ25570-Schmitt", harvester=hrv),
|
|
128
|
-
firmware1=Firmware(name="nrf52_demo_rf"),
|
|
129
|
-
firmware2=Firmware(name="msp430_deep_sleep"),
|
|
130
|
-
),
|
|
131
|
-
]
|
|
132
|
-
with pytest.raises(ValueError):
|
|
133
|
-
_ = Experiment(
|
|
134
|
-
id="4567",
|
|
135
|
-
name="meaningful Test-Name",
|
|
136
|
-
time_start=local_now() + timedelta(minutes=30),
|
|
137
|
-
target_configs=target_cfgs,
|
|
138
|
-
)
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
def test_experiment_model_exp_missing_target() -> None:
|
|
142
|
-
hrv = VirtualHarvesterConfig(name="mppt_bq_thermoelectric")
|
|
143
|
-
with pytest.raises(ValidationError):
|
|
144
|
-
# should raise ValueError in Experiment
|
|
145
|
-
# buts gets already caught in target_config
|
|
146
|
-
_ = [
|
|
147
|
-
TargetConfig(
|
|
148
|
-
target_IDs=[1234567], # <- not existent
|
|
149
|
-
custom_IDs=list(range(7, 18)),
|
|
150
|
-
energy_env=EnergyEnvironment(name="ThermoelectricWashingMachine"),
|
|
151
|
-
virtual_source=VirtualSourceConfig(name="BQ25570-Schmitt", harvester=hrv),
|
|
152
|
-
firmware1=Firmware(name="nrf52_demo_rf"),
|
|
153
|
-
firmware2=Firmware(name="msp430_deep_sleep"),
|
|
154
|
-
),
|
|
155
|
-
]
|
|
156
|
-
# experiment (like above) removed
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
def test_experiment_model_pwrtracing_min() -> None:
|
|
160
|
-
PowerTracing()
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
def test_experiment_model_pwrtracing_fault_post() -> None:
|
|
164
|
-
with pytest.raises(ValueError):
|
|
165
|
-
PowerTracing(calculate_power=True)
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
def test_experiment_model_pwrtracing_fault_discard_all() -> None:
|
|
169
|
-
with pytest.raises(ValueError):
|
|
170
|
-
PowerTracing(calculate_power=False, discard_current=True, discard_voltage=True)
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
def test_experiment_model_gpiotracing_min() -> None:
|
|
174
|
-
GpioTracing()
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
def test_experiment_model_gpiotracing_fault_mask() -> None:
|
|
178
|
-
with pytest.raises(ValueError):
|
|
179
|
-
GpioTracing(mask=0)
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
def test_experiment_model_gpioevent_min() -> None:
|
|
183
|
-
gevt = GpioEvent(
|
|
184
|
-
delay=300,
|
|
185
|
-
gpio=GPIO(name="GPIO3"),
|
|
186
|
-
level=GpioLevel.high,
|
|
187
|
-
)
|
|
188
|
-
gevt.get_events()
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
def test_experiment_model_gpioevent_fault_readonly() -> None:
|
|
192
|
-
with pytest.raises(ValueError):
|
|
193
|
-
GpioEvent(
|
|
194
|
-
delay=300,
|
|
195
|
-
gpio=GPIO(name="BAT_OK"),
|
|
196
|
-
level=GpioLevel.high,
|
|
197
|
-
)
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
def test_experiment_model_gpioactuation_min() -> None:
|
|
201
|
-
gact = GpioActuation(
|
|
202
|
-
events=[
|
|
203
|
-
GpioEvent(
|
|
204
|
-
delay=300,
|
|
205
|
-
gpio=GPIO(name="GPIO2"),
|
|
206
|
-
level=GpioLevel.high,
|
|
207
|
-
)
|
|
208
|
-
]
|
|
209
|
-
)
|
|
210
|
-
gact.get_gpios()
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
def test_experiment_model_syslogging_min() -> None:
|
|
214
|
-
SystemLogging()
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
def test_experiment_model_tgt_cfg_min1() -> None:
|
|
218
|
-
cfg = TargetConfig(
|
|
219
|
-
target_IDs=[1],
|
|
220
|
-
energy_env=EnergyEnvironment(name="SolarSunny"),
|
|
221
|
-
firmware1=Firmware(name="nrf52_demo_rf"),
|
|
222
|
-
)
|
|
223
|
-
for _id in cfg.target_IDs:
|
|
224
|
-
Target(id=_id)
|
|
225
|
-
assert cfg.get_custom_id(1) is None
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
def test_experiment_model_tgt_cfg_min2() -> None:
|
|
229
|
-
cfg = TargetConfig(
|
|
230
|
-
target_IDs=[1, 2],
|
|
231
|
-
custom_IDs=[7, 9],
|
|
232
|
-
energy_env=EnergyEnvironment(name="SolarSunny"),
|
|
233
|
-
firmware1=Firmware(name="nrf52_demo_rf"),
|
|
234
|
-
)
|
|
235
|
-
for _id in cfg.target_IDs:
|
|
236
|
-
Target(id=_id)
|
|
237
|
-
assert cfg.get_custom_id(1) == 7
|
|
238
|
-
assert cfg.get_custom_id(2) == 9
|
|
239
|
-
assert cfg.get_custom_id(3) is None
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
def test_experiment_model_tgt_cfg_fault_valid_ee() -> None:
|
|
243
|
-
with pytest.raises(ValueError):
|
|
244
|
-
_ = TargetConfig(
|
|
245
|
-
target_IDs=[1],
|
|
246
|
-
energy_env=EnergyEnvironment(name="nuclear"),
|
|
247
|
-
firmware1=Firmware(name="nrf52_demo_rf"),
|
|
248
|
-
)
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
def test_experiment_model_tgt_cfg_fault_firmware1() -> None:
|
|
252
|
-
with pytest.raises(ValueError):
|
|
253
|
-
_ = TargetConfig(
|
|
254
|
-
target_IDs=[1], # is nRF
|
|
255
|
-
energy_env=EnergyEnvironment(name="SolarSunny"),
|
|
256
|
-
firmware1=Firmware(name="msp430_spi_fram"),
|
|
257
|
-
)
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
def test_experiment_model_tgt_cfg_fault_firmware2() -> None:
|
|
261
|
-
with pytest.raises(ValueError):
|
|
262
|
-
_ = TargetConfig(
|
|
263
|
-
target_IDs=[1], # is nRF
|
|
264
|
-
energy_env=EnergyEnvironment(name="SolarSunny"),
|
|
265
|
-
firmware1=Firmware(name="nrf52_demo_rf"),
|
|
266
|
-
firmware2=Firmware(name="nrf52_demo_rf"),
|
|
267
|
-
)
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
def test_experiment_model_tgt_cfg_fault_custom_ids() -> None:
|
|
271
|
-
with pytest.raises(ValueError):
|
|
272
|
-
_ = TargetConfig(
|
|
273
|
-
target_IDs=[1, 2, 3],
|
|
274
|
-
custom_IDs=[0, 1], # not enough
|
|
275
|
-
energy_env=EnergyEnvironment(name="SolarSunny"),
|
|
276
|
-
firmware1=Firmware(name="nrf52_demo_rf"),
|
|
277
|
-
)
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
from datetime import timedelta
|
|
2
|
-
from pathlib import Path
|
|
3
|
-
|
|
4
|
-
from shepherd_core import local_now
|
|
5
|
-
from shepherd_core.data_models import EnergyEnvironment
|
|
6
|
-
from shepherd_core.data_models import Experiment
|
|
7
|
-
from shepherd_core.data_models import Firmware
|
|
8
|
-
from shepherd_core.data_models import TargetConfig
|
|
9
|
-
from shepherd_core.data_models import VirtualHarvesterConfig
|
|
10
|
-
from shepherd_core.data_models import VirtualSourceConfig
|
|
11
|
-
from shepherd_core.data_models.task import TestbedTasks as TasteBadTasks
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def test_task_generation_file(tmp_path: Path) -> None:
|
|
15
|
-
path = Path(__file__).with_name("example_config_experiment.yaml")
|
|
16
|
-
xp1 = Experiment.from_file(path)
|
|
17
|
-
tb_tasks = TasteBadTasks.from_xp(xp1)
|
|
18
|
-
tb_tasks.to_file(tmp_path / "tbt1.yaml")
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def test_task_generation_script(tmp_path: Path) -> None:
|
|
22
|
-
hrv = VirtualHarvesterConfig(name="mppt_bq_thermoelectric")
|
|
23
|
-
|
|
24
|
-
target_cfgs = [
|
|
25
|
-
# first init similar to yaml
|
|
26
|
-
TargetConfig(
|
|
27
|
-
target_IDs=list(range(1, 4)),
|
|
28
|
-
custom_IDs=list(range(3)),
|
|
29
|
-
energy_env={"name": "SolarSunny"},
|
|
30
|
-
virtual_source={"name": "diode+capacitor"},
|
|
31
|
-
firmware1={"name": "nrf52_demo_rf"},
|
|
32
|
-
),
|
|
33
|
-
# second Instance fully object-oriented
|
|
34
|
-
TargetConfig(
|
|
35
|
-
target_IDs=list(range(6, 9)),
|
|
36
|
-
custom_IDs=list(range(7, 18)),
|
|
37
|
-
energy_env=EnergyEnvironment(name="ThermoelectricWashingMachine"),
|
|
38
|
-
virtual_source=VirtualSourceConfig(name="BQ25570-Schmitt", harvester=hrv),
|
|
39
|
-
firmware1=Firmware(name="nrf52_demo_rf"),
|
|
40
|
-
firmware2=Firmware(name="msp430_deep_sleep"),
|
|
41
|
-
),
|
|
42
|
-
]
|
|
43
|
-
|
|
44
|
-
xperi = Experiment(
|
|
45
|
-
id="4567",
|
|
46
|
-
name="meaningful Test-Name",
|
|
47
|
-
time_start=local_now() + timedelta(minutes=30),
|
|
48
|
-
target_configs=target_cfgs,
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
tb_tasks = TasteBadTasks.from_xp(xperi)
|
|
52
|
-
tb_tasks.to_file(tmp_path / "tbt2.yaml")
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import Union
|
|
3
|
-
|
|
4
|
-
import pytest
|
|
5
|
-
|
|
6
|
-
from shepherd_core.data_models import Experiment
|
|
7
|
-
from shepherd_core.data_models import FirmwareDType
|
|
8
|
-
from shepherd_core.data_models import GpioActuation
|
|
9
|
-
from shepherd_core.data_models import GpioEvent
|
|
10
|
-
from shepherd_core.data_models.task import ObserverTasks
|
|
11
|
-
from shepherd_core.data_models.task.emulation import EmulationTask
|
|
12
|
-
from shepherd_core.data_models.task.firmware_mod import FirmwareModTask
|
|
13
|
-
from shepherd_core.data_models.task.harvest import HarvestTask
|
|
14
|
-
from shepherd_core.data_models.task.programming import ProgrammingTask
|
|
15
|
-
from shepherd_core.data_models.testbed import GPIO
|
|
16
|
-
from shepherd_core.data_models.testbed import ProgrammerProtocol
|
|
17
|
-
from shepherd_core.data_models.testbed import Testbed as TasteBad
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def test_task_model_emu_min() -> None:
|
|
21
|
-
EmulationTask(
|
|
22
|
-
input_path="./here",
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def test_task_model_emu_fault_in_past() -> None:
|
|
27
|
-
with pytest.raises(ValueError):
|
|
28
|
-
EmulationTask(
|
|
29
|
-
input_path="./here",
|
|
30
|
-
time_start="1984-01-01 11:12:13",
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
@pytest.mark.parametrize("value", [0, 1, 2, 3, 4, 4.5, "buffer", "main"])
|
|
35
|
-
def test_task_model_emu_custom_aux(value: Union[float, str]) -> None:
|
|
36
|
-
EmulationTask(
|
|
37
|
-
input_path="./here",
|
|
38
|
-
voltage_aux=value,
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
@pytest.mark.parametrize("value", [-1.0, 5, "max", "something"])
|
|
43
|
-
def test_task_model_emu_fault_aux(value: Union[float, str]) -> None:
|
|
44
|
-
with pytest.raises(ValueError):
|
|
45
|
-
EmulationTask(
|
|
46
|
-
input_path="./here",
|
|
47
|
-
voltage_aux=value,
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def test_task_model_emu_fault_gpio_actuation() -> None:
|
|
52
|
-
with pytest.raises(ValueError):
|
|
53
|
-
EmulationTask(
|
|
54
|
-
input_path="./here",
|
|
55
|
-
gpio_actuation=GpioActuation(
|
|
56
|
-
events=[GpioEvent(delay=5, gpio=GPIO(name="GPIO5"))],
|
|
57
|
-
),
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def test_task_model_fw_min() -> None:
|
|
62
|
-
FirmwareModTask(
|
|
63
|
-
data=Path("/"),
|
|
64
|
-
data_type=FirmwareDType.path_elf,
|
|
65
|
-
custom_id=42,
|
|
66
|
-
firmware_file=Path("fw_to_be.elf"),
|
|
67
|
-
)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def test_task_model_fw_fault_hex() -> None:
|
|
71
|
-
# just a warning for now
|
|
72
|
-
FirmwareModTask(
|
|
73
|
-
data=Path("/"),
|
|
74
|
-
data_type=FirmwareDType.path_hex,
|
|
75
|
-
custom_id=42,
|
|
76
|
-
firmware_file=Path("fw_to_be.hex"),
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def test_task_model_hrv_min() -> None:
|
|
81
|
-
HarvestTask(
|
|
82
|
-
output_path="./here",
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def test_task_model_hrv_duration() -> None:
|
|
87
|
-
hrv = HarvestTask(
|
|
88
|
-
output_path="./here",
|
|
89
|
-
duration=42,
|
|
90
|
-
)
|
|
91
|
-
assert hrv.duration.total_seconds() == 42
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def test_task_model_hrv_too_late() -> None:
|
|
95
|
-
with pytest.raises(ValueError):
|
|
96
|
-
HarvestTask(
|
|
97
|
-
output_path="./here",
|
|
98
|
-
time_start="1984-01-01 11:12:13",
|
|
99
|
-
)
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
def test_task_model_observer_min1() -> None:
|
|
103
|
-
ObserverTasks(
|
|
104
|
-
observer="peeping tom",
|
|
105
|
-
owner_id=666,
|
|
106
|
-
time_prep="2044-01-01 12:13:14",
|
|
107
|
-
root_path="/usr",
|
|
108
|
-
abort_on_error=False,
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
def test_task_model_observer_min2() -> None:
|
|
113
|
-
path = Path(__file__).with_name("example_config_experiment.yaml")
|
|
114
|
-
xp = Experiment.from_file(path)
|
|
115
|
-
ObserverTasks.from_xp(xp=xp, tb=TasteBad(name="shepherd_tud_nes"), tgt_id=1)
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
def test_task_model_prog_min() -> None:
|
|
119
|
-
ProgrammingTask(
|
|
120
|
-
firmware_file=Path("fw_to_load.hex"),
|
|
121
|
-
protocol=ProgrammerProtocol.SWD,
|
|
122
|
-
mcu_type="nrf52",
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
def test_task_model_prog_fault_elf() -> None:
|
|
127
|
-
ProgrammingTask(
|
|
128
|
-
firmware_file=Path("fw_to_load.elf"),
|
|
129
|
-
protocol=ProgrammerProtocol.SWD,
|
|
130
|
-
mcu_type="nrf52",
|
|
131
|
-
)
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
from shepherd_core.data_models.content.firmware import Firmware
|
|
2
|
-
from shepherd_core.data_models.testbed.cape import Cape
|
|
3
|
-
from shepherd_core.data_models.testbed.gpio import GPIO
|
|
4
|
-
from shepherd_core.data_models.testbed.mcu import MCU
|
|
5
|
-
from shepherd_core.data_models.testbed.observer import Observer
|
|
6
|
-
from shepherd_core.data_models.testbed.target import Target
|
|
7
|
-
from shepherd_core.data_models.testbed.testbed import Testbed as TasteBad
|
|
8
|
-
from shepherd_core.testbed_client.fixtures import Fixtures
|
|
9
|
-
|
|
10
|
-
# ⤷ TasteBad avoids pytest-warning
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def test_testbed_fixture_cape() -> None:
|
|
14
|
-
for fix in Fixtures()["Cape"]:
|
|
15
|
-
Cape(name=fix["name"])
|
|
16
|
-
Cape(id=fix["id"])
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
def test_testbed_fixture_gpio() -> None:
|
|
20
|
-
for fix in Fixtures()["GPIO"]:
|
|
21
|
-
GPIO(name=fix["name"])
|
|
22
|
-
GPIO(id=fix["id"])
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def test_testbed_fixture_mcu() -> None:
|
|
26
|
-
for fix in Fixtures()["MCU"]:
|
|
27
|
-
MCU(name=fix["name"])
|
|
28
|
-
mcu = MCU(id=fix["id"])
|
|
29
|
-
Firmware(name=mcu.fw_name_default)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def test_testbed_fixture_observer() -> None:
|
|
33
|
-
for fix in Fixtures()["Observer"]:
|
|
34
|
-
Observer(name=fix["name"])
|
|
35
|
-
Observer(id=fix["id"])
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def test_testbed_fixture_target() -> None:
|
|
39
|
-
for fix in Fixtures()["Target"]:
|
|
40
|
-
Target(name=fix["name"])
|
|
41
|
-
Target(id=fix["id"])
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def test_testbed_fixture_tb() -> None:
|
|
45
|
-
for fix in Fixtures()["Testbed"]:
|
|
46
|
-
TasteBad(name=fix["name"])
|
|
47
|
-
TasteBad(id=fix["id"])
|
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
import pytest
|
|
2
|
-
|
|
3
|
-
from shepherd_core.data_models.testbed import GPIO
|
|
4
|
-
from shepherd_core.data_models.testbed import MCU
|
|
5
|
-
from shepherd_core.data_models.testbed import Cape
|
|
6
|
-
from shepherd_core.data_models.testbed import Direction
|
|
7
|
-
from shepherd_core.data_models.testbed import Observer
|
|
8
|
-
from shepherd_core.data_models.testbed import ProgrammerProtocol
|
|
9
|
-
from shepherd_core.data_models.testbed import Target
|
|
10
|
-
from shepherd_core.data_models.testbed import Testbed as TasteBad
|
|
11
|
-
|
|
12
|
-
# ⤷ TasteBad avoids pytest-warning
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def test_testbed_model_cape_min() -> None:
|
|
16
|
-
cape = Cape(
|
|
17
|
-
id=9999,
|
|
18
|
-
name="cappi",
|
|
19
|
-
version="1.0.0",
|
|
20
|
-
description="lorem",
|
|
21
|
-
)
|
|
22
|
-
print(cape)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def test_testbed_model_gpio_min() -> None:
|
|
26
|
-
gpio = GPIO(
|
|
27
|
-
id=9999,
|
|
28
|
-
name="gippi",
|
|
29
|
-
reg_pru="ABCD",
|
|
30
|
-
pin_pru="EFGH",
|
|
31
|
-
)
|
|
32
|
-
print(gpio)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def test_testbed_model_gpio_fault() -> None:
|
|
36
|
-
with pytest.raises(ValueError):
|
|
37
|
-
GPIO(
|
|
38
|
-
id=9999,
|
|
39
|
-
name="gippi",
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def test_testbed_model_gpio_var() -> None:
|
|
44
|
-
GPIO(
|
|
45
|
-
id=9999,
|
|
46
|
-
name="gippi",
|
|
47
|
-
direction=Direction.Bidirectional,
|
|
48
|
-
reg_pru="ABCD",
|
|
49
|
-
pin_pru="EFGH",
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def test_testbed_model_mcu_min() -> None:
|
|
54
|
-
mcu = MCU(
|
|
55
|
-
id=9922,
|
|
56
|
-
name="controller2",
|
|
57
|
-
description="lorem",
|
|
58
|
-
platform="arm32",
|
|
59
|
-
core="STM32F7",
|
|
60
|
-
prog_protocol=ProgrammerProtocol.SWD,
|
|
61
|
-
fw_name_default="nananana",
|
|
62
|
-
)
|
|
63
|
-
print(mcu)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def test_testbed_model_observer_min() -> None:
|
|
67
|
-
obs = Observer(
|
|
68
|
-
id=9933,
|
|
69
|
-
name="sheep120",
|
|
70
|
-
description="not existing",
|
|
71
|
-
ip="127.0.0.1",
|
|
72
|
-
mac="FF:FF:FF:FF:FF:FF",
|
|
73
|
-
room="IIE72",
|
|
74
|
-
eth_port="375b2",
|
|
75
|
-
cape=Cape(name="cape53"),
|
|
76
|
-
)
|
|
77
|
-
print(obs)
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def test_testbed_model_observer_fault_cape_a() -> None:
|
|
81
|
-
with pytest.raises(ValueError):
|
|
82
|
-
Observer(
|
|
83
|
-
id=9933,
|
|
84
|
-
name="sheep120",
|
|
85
|
-
description="not existing",
|
|
86
|
-
ip="127.0.0.1",
|
|
87
|
-
mac="FF:FF:FF:FF:FF:FF",
|
|
88
|
-
room="IIE72",
|
|
89
|
-
eth_port="375b2",
|
|
90
|
-
target_a=Target(id=3),
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def test_testbed_model_observer_fault_cape_b() -> None:
|
|
95
|
-
with pytest.raises(ValueError):
|
|
96
|
-
Observer(
|
|
97
|
-
id=9933,
|
|
98
|
-
name="sheep120",
|
|
99
|
-
description="not existing",
|
|
100
|
-
ip="127.0.0.1",
|
|
101
|
-
mac="FF:FF:FF:FF:FF:FF",
|
|
102
|
-
room="IIE72",
|
|
103
|
-
eth_port="375b2",
|
|
104
|
-
target_b=Target(id=3),
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
def test_testbed_model_observer_fault_target() -> None:
|
|
109
|
-
obs = Observer(
|
|
110
|
-
id=9933,
|
|
111
|
-
name="sheep120",
|
|
112
|
-
description="not existing",
|
|
113
|
-
ip="127.0.0.1",
|
|
114
|
-
mac="FF:FF:FF:FF:FF:FF",
|
|
115
|
-
room="IIE72",
|
|
116
|
-
eth_port="375b2",
|
|
117
|
-
cape=Cape(name="cape53"),
|
|
118
|
-
target_a=Target(id=3),
|
|
119
|
-
target_b=Target(id=2),
|
|
120
|
-
)
|
|
121
|
-
obs.get_target(2)
|
|
122
|
-
obs.get_target(3)
|
|
123
|
-
obs.get_target_port(2)
|
|
124
|
-
obs.get_target_port(3)
|
|
125
|
-
with pytest.raises(ValueError):
|
|
126
|
-
obs.get_target_port(123456)
|
|
127
|
-
with pytest.raises(ValueError):
|
|
128
|
-
obs.get_target(123456)
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
def test_testbed_model_target_min1() -> None:
|
|
132
|
-
tgt = Target(
|
|
133
|
-
id=9944,
|
|
134
|
-
name="TerraTarget",
|
|
135
|
-
version="v1.00",
|
|
136
|
-
description="lorem",
|
|
137
|
-
mcu1=MCU(name="MSP430FR"),
|
|
138
|
-
)
|
|
139
|
-
print(tgt)
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
def test_testbed_model_target_min2() -> None:
|
|
143
|
-
Target(
|
|
144
|
-
id=9944,
|
|
145
|
-
name="TerraTarget",
|
|
146
|
-
version="v1.00",
|
|
147
|
-
description="lorem",
|
|
148
|
-
mcu1="MSP430FR",
|
|
149
|
-
mcu2="MSP430FR",
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
def test_testbed_model_tb_min() -> None:
|
|
154
|
-
tb = TasteBad(
|
|
155
|
-
name="shepherd",
|
|
156
|
-
id="9955",
|
|
157
|
-
description="lorem",
|
|
158
|
-
observers=[Observer(name="sheep02")],
|
|
159
|
-
data_on_server="/mnt/driveA",
|
|
160
|
-
data_on_observer="/mnt/driveB",
|
|
161
|
-
)
|
|
162
|
-
print(tb)
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
def test_testbed_model_tb_fault_observer() -> None:
|
|
166
|
-
with pytest.raises(ValueError):
|
|
167
|
-
TasteBad(
|
|
168
|
-
name="shepherd",
|
|
169
|
-
id="9955",
|
|
170
|
-
description="lorem",
|
|
171
|
-
observers=[Observer(name="sheep02"), Observer(name="sheep02")],
|
|
172
|
-
data_on_server="/mnt/driveA",
|
|
173
|
-
data_on_observer="/mnt/driveB",
|
|
174
|
-
)
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
def test_testbed_model_tb_fault_shared() -> None:
|
|
178
|
-
with pytest.raises(ValueError):
|
|
179
|
-
TasteBad(
|
|
180
|
-
name="shepherd",
|
|
181
|
-
id="9955",
|
|
182
|
-
description="lorem",
|
|
183
|
-
observers=[Observer(name="sheep02")],
|
|
184
|
-
data_on_server="/mnt/driveA",
|
|
185
|
-
data_on_observer="/mnt/driveB",
|
|
186
|
-
shared_storage=False,
|
|
187
|
-
)
|
|
File without changes
|