Skip to content

Commit 9b8bb3d

Browse files
committed
scripts: twister: changed bsim test options layout
Changed bsim test options in a way that allows explicit configuration of simulated devices, including names (test ids), options and exe names, while still retaining common options and exe name. Removed random seed generation for devices. Minor review updates. Signed-off-by: Artur Dobrynin <[email protected]>
1 parent 2a46561 commit 9b8bb3d

File tree

2 files changed

+50
-43
lines changed

2 files changed

+50
-43
lines changed

scripts/pylib/twister/twisterlib/harness.py

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import logging
88
import os
99
import platform
10-
import random
1110
import re
1211
import shlex
1312
import shutil
@@ -981,15 +980,15 @@ def __init__(self):
981980
self._bsim_out_path = os.getenv('BSIM_OUT_PATH', '')
982981
if self._bsim_out_path:
983982
self._bsim_out_path = os.path.join(self._bsim_out_path, 'bin')
984-
self._exe_paths = []
983+
self._exe_paths = {}
985984
self._tc_output = []
986985
self._start_time = 0
987986

988987
def _set_start_time(self):
989988
self._start_time = time.time()
990989

991-
def _get_exe_path(self, index):
992-
return self._exe_paths[index if index < len(self._exe_paths) else 0]
990+
def _get_exe_path(self, name=None):
991+
return self._exe_paths[name]
993992

994993
def configure(self, instance):
995994
def replacer(exe_name):
@@ -1000,22 +999,27 @@ def replacer(exe_name):
1000999
if not self._bsim_out_path:
10011000
raise Exception('Cannot copy bsim exe - BSIM_OUT_PATH not provided.')
10021001

1003-
exe_names = []
1004-
for exe_name in self.instance.testsuite.harness_config.get('bsim_exe_name', []):
1005-
new_exe_name = f'bs_{self.instance.platform.name}_{exe_name}'
1006-
exe_names.append(replacer(new_exe_name))
1002+
exe_names = {}
1003+
cfg = self.instance.testsuite.harness_config
1004+
1005+
build_exe_name = cfg.get('bsim_exe_name', None)
1006+
if build_exe_name:
1007+
exe_names[None] = replacer(f'bs_{self.instance.platform.name}_{build_exe_name}')
1008+
else:
1009+
for exe_name in [dev['exe'] for dev in cfg.get('bsim_devices', [])]:
1010+
exe_names[exe_name] = replacer(f'bs_{self.instance.platform.name}_{exe_name}')
10071011

10081012
if not exe_names:
1009-
exe_names = [f'bs_{replacer(self.instance.name)}']
1013+
exe_names[None] = [f'bs_{replacer(self.instance.name)}']
10101014

10111015
self._exe_paths = \
1012-
[os.path.join(self._bsim_out_path, exe_name) for exe_name in exe_names]
1016+
{name_id: os.path.join(self._bsim_out_path, exe) for name_id, exe in exe_names.items()}
10131017

10141018
def clean_exes(self):
10151019
self._set_start_time()
10161020

10171021
try:
1018-
for exe_path in [self._get_exe_path(i) for i in range(len(self._exe_paths))]:
1022+
for exe_path in self._exe_paths.values():
10191023
if os.path.exists(exe_path):
10201024
os.remove(exe_path)
10211025
except Exception as e:
@@ -1024,7 +1028,7 @@ def clean_exes(self):
10241028
def wait_bsim_ready(self):
10251029
start_time = time.time()
10261030
while time.time() - start_time < Bsim.BSIM_READY_TIMEOUT_S:
1027-
if all([os.path.exists(self._get_exe_path(i)) for i in range(len(self._exe_paths))]):
1031+
if all([os.path.exists(f_path) for f_path in self._exe_paths.values()]):
10281032
return True
10291033
time.sleep(0.1)
10301034

@@ -1044,7 +1048,7 @@ def build(self):
10441048
return
10451049

10461050
try:
1047-
new_exe_path = self._get_exe_path(0)
1051+
new_exe_path = self._get_exe_path()
10481052
logger.debug(f'Copying executable from {original_exe_path} to {new_exe_path}')
10491053
shutil.copy(original_exe_path, new_exe_path)
10501054
self.status = TwisterStatus.PASS
@@ -1088,17 +1092,6 @@ def _output_reader(self, proc):
10881092
proc.communicate()
10891093

10901094
def _generate_commands(self):
1091-
def rs():
1092-
return f'-rs={random.randint(0, 2**10 - 1)}'
1093-
1094-
def expand_args(dev_id):
1095-
try:
1096-
args = [str(eval(v)[dev_id]) if v.startswith('[') else v for v in extra_args]
1097-
return [arg for arg in args if args if arg]
1098-
except Exception as e:
1099-
logger.warning(f'Unable to expand extra arguments set {extra_args}: {e}')
1100-
return extra_args
1101-
11021095
bsim_phy_path = os.path.join(self._bsim_out_path, 'bs_2G4_phy_v1')
11031096
suite_id = f'-s={self.instance.name.split(os.path.sep)[-1].replace(".", "_")}'
11041097

@@ -1107,28 +1100,32 @@ def expand_args(dev_id):
11071100
sim_length = f'-sim_length={cfg.get("bsim_sim_length", self.DEFAULT_SIM_LENGTH)}'
11081101
extra_args = cfg.get('bsim_options', [])
11091102
phy_extra_args = cfg.get('bsim_phy_options', [])
1110-
test_ids = cfg.get('bsim_test_ids', [])
1111-
if not test_ids:
1112-
logger.error('No test ids specified for bsim test')
1103+
devices = cfg.get('bsim_devices', [])
1104+
if not devices:
1105+
logger.error(f'No devices specified for bsim test {self.instance.name}')
11131106
self.status = TwisterStatus.ERROR
11141107
return []
11151108

1116-
cmds = [[self._get_exe_path(i), verbosity, suite_id, f'-d={i}', f'-testid={t_id}', rs()]
1117-
+ expand_args(i) for i, t_id in enumerate(test_ids)]
1118-
cmds.append([bsim_phy_path, verbosity, suite_id, f'-D={len(test_ids)}', sim_length]
1109+
cmds = []
1110+
for i, dev in enumerate(devices):
1111+
exe = self._get_exe_path(dev.get('exe', None))
1112+
cmds.append([exe, verbosity, suite_id, f'-d={i}', f'-testid={dev["test_id"]}']
1113+
+ extra_args + dev.get('options', []))
1114+
1115+
cmds.append([bsim_phy_path, verbosity, suite_id, f'-D={len(devices)}', sim_length]
11191116
+ phy_extra_args)
11201117

11211118
return cmds
11221119

11231120
def _clean_up_files(self):
11241121
# Clean-up any log files that the test may have generated
11251122
files = glob.glob(os.path.join(self._bsim_out_path, '*.log'))
1126-
# files += glob.glob(os.path.join(self._bsim_out_path, '*.bin'))
1127-
try:
1128-
for file in [f for f in files if os.path.getctime(f) > self._start_time]:
1123+
recent_files = [f for f in files if os.path.getctime(f) > self._start_time]
1124+
for file in recent_files:
1125+
try:
11291126
os.remove(file)
1130-
except Exception as e:
1131-
logger.warning(f'Failed to clean up bsim log files: {e}')
1127+
except Exception as e:
1128+
logger.warning(f'Failed to clean up bsim log file {file}: {e}')
11321129

11331130
def bsim_run(self, timeout):
11341131
try:

scripts/schemas/twister/testsuite-schema.yaml

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -181,21 +181,31 @@ schema;scenario-schema:
181181
sequence:
182182
- type: str
183183
"bsim_exe_name":
184-
type: seq
185-
required: false
186-
sequence:
187-
- type: str
188-
"bsim_test_ids":
189-
type: seq
184+
type: str
190185
required: false
191-
sequence:
192-
- type: str
193186
"bsim_verbosity":
194187
type: int
195188
required: false
196189
"bsim_sim_length":
197190
type: float
198191
required: false
192+
"bsim_devices":
193+
type: seq
194+
required: false
195+
sequence:
196+
- type: map
197+
mapping:
198+
"test_id":
199+
type: str
200+
required: true
201+
"exe":
202+
type: str
203+
required: false
204+
"options":
205+
type: seq
206+
required: false
207+
sequence:
208+
- type: str
199209
"bsim_options":
200210
type: seq
201211
required: false

0 commit comments

Comments
 (0)