Skip to content

Commit 02f42bb

Browse files
Fixed tests and increased coverage
1 parent f0cdd36 commit 02f42bb

File tree

5 files changed

+56
-52
lines changed

5 files changed

+56
-52
lines changed

.coveragerc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ exclude_lines =
77
if __name__ == '__main__':
88
self.fail\(.*\)
99
except KeyboardInterrupt:
10-
except ImportError:
10+
except ImportError.*
1111
skip coverage
1212
include =
1313
./*

scripts/discos-simulator

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -22,35 +22,36 @@ AVAILABLE_SIMULATORS = list_simulators()
2222

2323
def system_from_arg(system_name):
2424
try:
25-
return importlib.import_module('simulators.%s' % system_name)
25+
return importlib.import_module(f"simulators.{system_name}")
2626
except ImportError as e:
2727
error = e.args[0]
28-
if 'No module named' in error:
29-
error = 'System "%s" unavailable.' % system_name
28+
if "No module named" in error:
29+
error = f"System '{system_name}' unavailable."
3030
else:
3131
error = error % system_name
32-
raise ArgumentTypeError(error)
32+
raise ArgumentTypeError(error) from e
33+
3334

3435
parser = ArgumentParser()
3536
parser.add_argument(
36-
'action',
37-
choices=['start', 'stop', 'list']
37+
"action",
38+
choices=["start", "stop", "list"]
3839
)
3940
parser.add_argument(
40-
'-s', '--system',
41+
"-s", "--system",
4142
type=system_from_arg,
4243
required=False,
43-
help='System name: active_surface, acu, ...',
44+
help="System name: active_surface, acu, ...",
4445
)
4546
parser.add_argument(
46-
'-t', '--type',
47+
"-t", "--type",
4748
type=str,
4849
required=False,
49-
help='System configuration type: IFD_14_channels for if_distributor, ...',
50+
help="System configuration type: IFD_14_channels for if_distributor, ...",
5051
)
5152
args = parser.parse_args()
5253

53-
if args.action == 'list':
54+
if args.action == "list":
5455
print(
5556
"Available simulators: '"
5657
+ "', '".join(AVAILABLE_SIMULATORS)
@@ -60,55 +61,50 @@ if args.action == 'list':
6061
kwargs = {}
6162

6263
if args.type:
64+
name = args.system.__name__.rsplit(".", 1)[1]
6365
if not args.system:
6466
parser.error(
6567
"The '--type' argument only has to be used "
6668
+ "in conjunction with the '--system' argument."
6769
)
6870
try:
69-
systems = getattr(args.system, 'systems')
71+
systems = getattr(args.system, "systems")
7072
except AttributeError:
7173
parser.error(
72-
('System %s has no configurations other than the default one. '
73-
% args.system.__name__.rsplit('.', 1)[1])
74-
+ "Omit the '--type' argument to start the simulator properly."
74+
f"System '{name}' has no configurations other than the default one"
75+
+ ". Omit the '--type' argument to start the simulator properly."
7576
)
7677
if args.type not in systems:
7778
err_string = (
78-
'Configuration %s for system %s not found.\n' %
79-
(args.type, args.system.__name__.rsplit('.', 1)[1])
79+
f"Configuration '{args.type}' for system '{name}' not found.\n"
8080
)
81-
err_string += 'Available configurations for chosen simulator:\n'
81+
err_string += "Available configurations for desired simulator:\n"
8282
err_string += "'" + "', ".join(systems) + "'."
8383
parser.error(err_string)
84-
kwargs['system_type'] = args.type
84+
kwargs["system_type"] = args.type
8585

86-
if args.action == 'start':
86+
if args.action == "start":
8787
if args.system:
8888
try:
8989
simulator = Simulator(args.system, **kwargs)
9090
simulator.start()
9191
except socket.error:
92+
name = args.system.__name__.rsplit(".", 1)[1]
9293
print(
93-
"Cannot start simulator '%s', address already in use." %
94-
args.system.__name__.rsplit('.', 1)[1]
94+
f"Cannot start simulator '{name}', address already in use."
9595
)
9696
sys.exit(1)
9797
else:
9898
for sim in AVAILABLE_SIMULATORS:
99-
subprocess.Popen([
100-
sys.argv[0],
101-
'start',
102-
'-s',
103-
sim
104-
])
99+
with subprocess.Popen([sys.argv[0], "start", "-s", sim]) as _:
100+
pass
105101
time.sleep(3)
106-
elif args.action == 'stop':
102+
elif args.action == "stop":
107103
if args.system:
108104
simulator = Simulator(args.system, **kwargs)
109105
simulator.stop()
110106
else:
111107
for sim in AVAILABLE_SIMULATORS:
112-
sim = importlib.import_module('simulators.%s' % sim)
108+
sim = importlib.import_module(f"simulators.{sim}")
113109
simulator = Simulator(sim, **kwargs)
114110
simulator.stop()

simulators/acu/pointing_status.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
from datetime import datetime, timedelta
77
try:
88
import numpy as np
9-
except ImportError as ex: # skip coverage
9+
except ImportError as ex:
1010
raise ImportError('The `numpy` package, required for the simulator'
1111
+ ' to run, is missing!') from ex
1212
try:
1313
from scipy import interpolate
14-
except ImportError as ex: # skip coverage
14+
except ImportError as ex:
1515
raise ImportError('The `scipy` package, required for the simulator'
1616
+ ' to run, is missing!') from ex
1717
from simulators import utils

simulators/minor_servos/__init__.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import time
22
import re
33
import random
4+
import threading
45
try:
56
from numpy import sign
6-
except ImportError as ex: # skip coverage
7+
except ImportError as ex:
78
raise ImportError('The `numpy` package, required for the simulator'
89
+ ' to run, is missing!') from ex
910
try:
1011
from scipy.interpolate import splrep, splev
11-
except ImportError as ex: # skip coverage
12+
except ImportError as ex:
1213
raise ImportError('The `scipy` package, required for the simulator'
1314
+ ' to run, is missing!') from ex
1415
from ctypes import c_bool, c_int
15-
from threading import Lock, Thread, Timer
1616
from multiprocessing import Value
1717
from bisect import bisect_left
1818
from socketserver import ThreadingTCPServer
@@ -104,7 +104,7 @@ def __init__(self, timer_value=DEFAULT_TIMER_VALUE, rest_api=True):
104104
self.configurations
105105
)
106106
self.stop = Value(c_bool, False)
107-
self.update_thread = Thread(
107+
self.update_thread = threading.Thread(
108108
target=self._update,
109109
args=(self.stop, self.servos)
110110
)
@@ -116,11 +116,11 @@ def __init__(self, timer_value=DEFAULT_TIMER_VALUE, rest_api=True):
116116
httpserver_address,
117117
VBrainRequestHandler
118118
)
119-
self.server_thread = Thread(
119+
self.server_thread = threading.Thread(
120120
target=self.httpserver.serve_forever
121121
)
122122
self.server_thread.start()
123-
self.cover_timer = Timer(1, lambda: None)
123+
self.cover_timer = threading.Timer(1, lambda: None)
124124

125125
def __del__(self):
126126
self.system_stop()
@@ -218,7 +218,7 @@ def _setup(self, args):
218218
and self.gregorian_cap.value != gregorian_cap_position):
219219
self.cover_timer.cancel()
220220
_change_atomic_value(self.gregorian_cap, 0)
221-
self.cover_timer = Timer(
221+
self.cover_timer = threading.Timer(
222222
self.timer_value,
223223
_change_atomic_value,
224224
args=(self.gregorian_cap, gregorian_cap_position)
@@ -245,7 +245,7 @@ def _stow(self, args):
245245
self.cover_timer.cancel()
246246
if self.gregorian_cap.value <= 1 or stow_pos == 1:
247247
_change_atomic_value(self.gregorian_cap, 0)
248-
self.cover_timer = Timer(
248+
self.cover_timer = threading.Timer(
249249
self.timer_value,
250250
_change_atomic_value,
251251
args=(self.gregorian_cap, stow_pos)
@@ -261,7 +261,7 @@ def _stow(self, args):
261261
servo = self.servos.get(servo_id)
262262
servo.operative_mode_timer.cancel()
263263
_change_atomic_value(servo.operative_mode, 0)
264-
servo.operative_mode_timer = Timer(
264+
servo.operative_mode_timer = threading.Timer(
265265
self.timer_value,
266266
_change_atomic_value,
267267
args=(servo.operative_mode, 20) # STOW
@@ -451,9 +451,9 @@ def __init__(self, name, dof=1):
451451
self.cmd_coords = self.coords.copy()
452452
self.offsets = [0] * self.DOF
453453
self.last_status_read = 0
454-
self.operative_mode_timer = Timer(1, lambda: None)
454+
self.operative_mode_timer = threading.Timer(1, lambda: None)
455455
if self.program_track_capable:
456-
self.trajectory_lock = Lock()
456+
self.trajectory_lock = threading.Lock()
457457
self.trajectory_id = None
458458
self.trajectory_start_time = None
459459
self.trajectory_point_id = None

tests/test_minor_servos.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import time
44
import requests
55
from simulators.minor_servos import System, httpserver_address
6+
from simulators.minor_servos import DEFAULT_TIMER_VALUE
67
from simulators.minor_servos.helpers import VBrainRequestHandler
78
from simulators.utils import FastTimeMock
89

9-
TIMER_VALUE = 0.01
1010
tail = '\r\n'
1111
good = r'^OUTPUT:GOOD,[0-9]+\.[0-9]{6}'
1212
bad = f'^OUTPUT:BAD{tail}$'
@@ -16,7 +16,6 @@ class TestMinorServos(unittest.TestCase):
1616

1717
def setUp(self):
1818
self.system = System(
19-
timer_value=TIMER_VALUE,
2019
rest_api=False
2120
)
2221

@@ -220,35 +219,44 @@ def test_setup_unknown_configuration(self):
220219
self.assertRegex(self.system.parse(cmd[-1]), bad)
221220

222221
def test_stow(self):
222+
fast_time = FastTimeMock(100)
223+
fast_time.start()
223224
for servo_id, servo in self.system.servos.items():
224225
cmd = f'STOW={servo_id},1{tail}'
225226
for byte in cmd[:-1]:
226227
self.assertTrue(self.system.parse(byte))
227228
self.assertRegex(self.system.parse(cmd[-1]), f'{good}{tail}$')
228-
time.sleep(TIMER_VALUE + 0.1)
229+
time.sleep(DEFAULT_TIMER_VALUE + 1)
229230
self.assertEqual(servo.operative_mode.value, 20) # STOW mode
231+
fast_time.stop()
230232

231233
def test_stow_gregorian_cap(self):
234+
fast_time = FastTimeMock(100)
235+
fast_time.start()
232236
for stow_pos in [1, 2]:
233237
cmd = f'STOW=GREGORIAN_CAP,{stow_pos}{tail}'
234238
for byte in cmd[:-1]:
235239
self.assertTrue(self.system.parse(byte))
236240
self.assertRegex(self.system.parse(cmd[-1]), f'{good}{tail}$')
237-
time.sleep(TIMER_VALUE + 0.1)
241+
time.sleep(DEFAULT_TIMER_VALUE + 1)
238242
self.assertEqual(self.system.gregorian_cap.value, stow_pos)
243+
fast_time.stop()
239244

240245
def test_stow_gregorian_air_blade(self):
246+
fast_time = FastTimeMock(100)
247+
fast_time.start()
241248
cmd = f'STOW=GREGORIAN_CAP,2{tail}'
242249
for byte in cmd[:-1]:
243250
self.assertTrue(self.system.parse(byte))
244251
self.assertRegex(self.system.parse(cmd[-1]), f'{good}{tail}$')
245-
time.sleep(TIMER_VALUE + 0.1)
252+
time.sleep(DEFAULT_TIMER_VALUE + 1)
246253
self.assertEqual(self.system.gregorian_cap.value, 2)
247254
cmd = f'STOW=GREGORIAN_CAP,3{tail}'
248255
for byte in cmd[:-1]:
249256
self.assertTrue(self.system.parse(byte))
250257
self.assertRegex(self.system.parse(cmd[-1]), f'{good}{tail}$')
251258
self.assertEqual(self.system.gregorian_cap.value, 3)
259+
fast_time.stop()
252260

253261
def test_stow_gregorian_cap_wrong_pos(self):
254262
cmd = f'STOW=GREGORIAN_CAP,5{tail}'
@@ -288,7 +296,7 @@ def test_stop(self):
288296
for byte in cmd[:-1]:
289297
self.assertTrue(self.system.parse(byte))
290298
self.assertRegex(self.system.parse(cmd[-1]), f'{good}{tail}$')
291-
time.sleep(TIMER_VALUE + 0.1)
299+
time.sleep(0.2)
292300
self.assertEqual(servo.operative_mode.value, 30) # STOP mode
293301

294302
def test_stop_no_arguments(self):
@@ -601,7 +609,7 @@ def test_rest_GET(self):
601609
baseurl = f'http://{httpserver_address[0]}:{httpserver_address[1]}'
602610
url = baseurl + url
603611
try:
604-
response = requests.get(url, timeout=TIMER_VALUE)
612+
response = requests.get(url, timeout=0.2)
605613
self.assertEqual(response.status_code, 200)
606614
self.assertEqual(response.json(), VBrainRequestHandler.answer)
607615
except requests.exceptions.ReadTimeout:
@@ -611,7 +619,7 @@ def test_rest_GET_wrong_address(self):
611619
baseurl = f'http://{httpserver_address[0]}:{httpserver_address[1]}'
612620
url = baseurl + '/wrong'
613621
try:
614-
response = requests.get(url, timeout=TIMER_VALUE)
622+
response = requests.get(url, timeout=0.2)
615623
self.assertEqual(response.status_code, 404)
616624
except requests.exceptions.ReadTimeout:
617625
self.fail('Request is taking too long to be answered')

0 commit comments

Comments
 (0)