Browse Source

mavsdk_tests: update to be able to fetch rtps builds as well

master
TSC21 4 years ago committed by Daniel Agar
parent
commit
9894598b63
  1. 92
      test/mavsdk_tests/mavsdk_test_runner.py
  2. 60
      test/mavsdk_tests/process_helper.py

92
test/mavsdk_tests/mavsdk_test_runner.py

@ -52,6 +52,9 @@ def main() -> NoReturn:
parser.add_argument("--verbose", default=False, action='store_true', parser.add_argument("--verbose", default=False, action='store_true',
help="enable more verbose output") help="enable more verbose output")
parser.add_argument("config_file", help="JSON config file to use") parser.add_argument("config_file", help="JSON config file to use")
parser.add_argument("--build-dir", type=str,
default='build/px4_sitl_default/',
help="relative path where the built files are stored")
args = parser.parse_args() args = parser.parse_args()
with open(args.config_file) as json_file: with open(args.config_file) as json_file:
@ -62,7 +65,7 @@ def main() -> NoReturn:
.format(config["mode"])) .format(config["mode"]))
sys.exit(1) sys.exit(1)
if not is_everything_ready(config): if not is_everything_ready(config, args.build_dir):
sys.exit(1) sys.exit(1)
if args.verbose: if args.verbose:
@ -80,7 +83,8 @@ def main() -> NoReturn:
args.log_dir, args.log_dir,
args.gui, args.gui,
args.verbose, args.verbose,
args.upload args.upload,
args.build_dir
) )
signal.signal(signal.SIGINT, tester.sigint_handler) signal.signal(signal.SIGINT, tester.sigint_handler)
@ -94,7 +98,7 @@ def is_running(process_name: str) -> bool:
return False return False
def is_everything_ready(config: Dict[str, str]) -> bool: def is_everything_ready(config: Dict[str, str], build_dir: str) -> bool:
result = True result = True
if config['mode'] == 'sitl': if config['mode'] == 'sitl':
@ -102,10 +106,11 @@ def is_everything_ready(config: Dict[str, str]) -> bool:
print("px4 process already running\n" print("px4 process already running\n"
"run `killall px4` and try again") "run `killall px4` and try again")
result = False result = False
if not os.path.isfile('build/px4_sitl_default/bin/px4'): if not os.path.isfile(os.path.join(build_dir, 'bin/px4')):
print("PX4 SITL is not built\n" print("PX4 SITL is not built\n"
"run `DONT_RUN=1 " "run `DONT_RUN=1 "
"make px4_sitl gazebo mavsdk_tests`") "make px4_sitl gazebo mavsdk_tests` or "
"`DONT_RUN=1 make px4_sitl_rtps gazebo mavsdk_tests`")
result = False result = False
if config['simulator'] == 'gazebo': if config['simulator'] == 'gazebo':
if is_running('gzserver'): if is_running('gzserver'):
@ -117,10 +122,12 @@ def is_everything_ready(config: Dict[str, str]) -> bool:
"run `killall gzclient` and try again") "run `killall gzclient` and try again")
result = False result = False
if not os.path.isfile('build/px4_sitl_default/mavsdk_tests/mavsdk_tests'): if not os.path.isfile(os.path.join(build_dir,
'mavsdk_tests/mavsdk_tests')):
print("Test runner is not built\n" print("Test runner is not built\n"
"run `DONT_RUN=1 " "run `DONT_RUN=1 "
"make px4_sitl gazebo mavsdk_tests`") "make px4_sitl gazebo mavsdk_tests` or "
"`DONT_RUN=1 make px4_sitl_rtps gazebo mavsdk_tests`")
result = False result = False
return result return result
@ -138,8 +145,10 @@ class Tester:
log_dir: str, log_dir: str,
gui: bool, gui: bool,
verbose: bool, verbose: bool,
upload: bool): upload: bool,
build_dir: str):
self.config = config self.config = config
self.build_dir = build_dir
self.active_runners: List[ph.Runner] self.active_runners: List[ph.Runner]
self.iterations = iterations self.iterations = iterations
self.abort_early = abort_early self.abort_early = abort_early
@ -153,30 +162,20 @@ class Tester:
self.start_time = datetime.datetime.now() self.start_time = datetime.datetime.now()
self.log_fd: Any[TextIO] = None self.log_fd: Any[TextIO] = None
@classmethod
def determine_tests(cls,
tests: List[Dict[str, Any]],
model: str,
case: str) -> List[Dict[str, Any]]:
for test in tests:
test['selected'] = (model == 'all' or model == test['model'])
test['cases'] = dict.fromkeys(
cls.query_test_cases(test['test_filter']))
for key in test['cases'].keys():
test['cases'][key] = {
'selected': (test['selected'] and
(case == 'all' or
cls.wildcard_match(case, key)))}
return tests
@staticmethod @staticmethod
def wildcard_match(pattern: str, potential_match: str) -> bool: def wildcard_match(pattern: str, potential_match: str) -> bool:
return fnmatch.fnmatchcase(potential_match, pattern) return fnmatch.fnmatchcase(potential_match, pattern)
@staticmethod @staticmethod
def query_test_cases(filter: str) -> List[str]: def plural_s(n_items: int) -> str:
cmd = os.getcwd() + "/build/px4_sitl_default/mavsdk_tests/mavsdk_tests" if n_items > 1:
return "s"
else:
return ""
@staticmethod
def query_test_cases(build_dir: str, filter: str) -> List[str]:
cmd = os.path.join(build_dir, 'mavsdk_tests/mavsdk_tests')
args = ["--list-test-names-only", filter] args = ["--list-test-names-only", filter]
p = subprocess.Popen( p = subprocess.Popen(
[cmd] + args, [cmd] + args,
@ -187,12 +186,20 @@ class Tester:
cases = str(p.stdout.read().decode("utf-8")).strip().split('\n') cases = str(p.stdout.read().decode("utf-8")).strip().split('\n')
return cases return cases
@staticmethod def determine_tests(self,
def plural_s(n_items: int) -> str: tests: List[Dict[str, Any]],
if n_items > 1: model: str,
return "s" case: str) -> List[Dict[str, Any]]:
else: for test in tests:
return "" test['selected'] = (model == 'all' or model == test['model'])
test['cases'] = dict.fromkeys(
self.query_test_cases(self.build_dir, test['test_filter']))
for key in test['cases'].keys():
test['cases'][key] = {
'selected': (test['selected'] and
(case == 'all' or
self.wildcard_match(case, key)))}
return tests
def run(self) -> bool: def run(self) -> bool:
self.show_plans() self.show_plans()
@ -392,6 +399,7 @@ class Tester:
test: Dict[str, Any], test: Dict[str, Any],
case: str) -> None: case: str) -> None:
self.active_runners = [] self.active_runners = []
if self.config['mode'] == 'sitl': if self.config['mode'] == 'sitl':
px4_runner = ph.Px4Runner( px4_runner = ph.Px4Runner(
os.getcwd(), os.getcwd(),
@ -400,7 +408,8 @@ class Tester:
case, case,
self.get_max_speed_factor(test), self.get_max_speed_factor(test),
self.debugger, self.debugger,
self.verbose) self.verbose,
self.build_dir)
self.active_runners.append(px4_runner) self.active_runners.append(px4_runner)
if self.config['simulator'] == 'gazebo': if self.config['simulator'] == 'gazebo':
@ -410,7 +419,8 @@ class Tester:
test['vehicle'], test['vehicle'],
case, case,
self.get_max_speed_factor(test), self.get_max_speed_factor(test),
self.verbose) self.verbose,
self.build_dir)
self.active_runners.append(gzserver_runner) self.active_runners.append(gzserver_runner)
gzmodelspawn_runner = ph.GzmodelspawnRunner( gzmodelspawn_runner = ph.GzmodelspawnRunner(
@ -418,7 +428,8 @@ class Tester:
log_dir, log_dir,
test['vehicle'], test['vehicle'],
case, case,
self.verbose) self.verbose,
self.build_dir)
self.active_runners.append(gzmodelspawn_runner) self.active_runners.append(gzmodelspawn_runner)
if self.gui: if self.gui:
@ -437,7 +448,8 @@ class Tester:
case, case,
self.config['mavlink_connection'], self.config['mavlink_connection'],
self.speed_factor, self.speed_factor,
self.verbose) self.verbose,
self.build_dir)
self.active_runners.append(mavsdk_tests_runner) self.active_runners.append(mavsdk_tests_runner)
abort = False abort = False
@ -490,9 +502,9 @@ class Tester:
for line in log.splitlines(): for line in log.splitlines():
found = line.find(match) found = line.find(match)
if found != -1: if found != -1:
return os.getcwd() \ return os.path.join(os.getcwd(), self.build_dir,
+ "/build/px4_sitl_default/tmp_mavsdk_tests/rootfs/" \ "tmp_mavsdk_tests/rootfs",
+ line[found+len(match):] line[found+len(match):])
return None return None
def upload_log(self, ulog_path: Optional[str], def upload_log(self, ulog_path: Optional[str],

60
test/mavsdk_tests/process_helper.py

@ -146,18 +146,18 @@ class Runner:
class Px4Runner(Runner): class Px4Runner(Runner):
def __init__(self, workspace_dir: str, log_dir: str, def __init__(self, workspace_dir: str, log_dir: str,
model: str, case: str, speed_factor: float, model: str, case: str, speed_factor: float,
debugger: str, verbose: bool): debugger: str, verbose: bool, build_dir: str):
super().__init__(log_dir, model, case, verbose) super().__init__(log_dir, model, case, verbose)
self.name = "px4" self.name = "px4"
self.cmd = workspace_dir + "/build/px4_sitl_default/bin/px4" self.cmd = os.path.join(workspace_dir, build_dir, "bin/px4")
self.cwd = workspace_dir + \ self.cwd = os.path.join(workspace_dir, build_dir,
"/build/px4_sitl_default/tmp_mavsdk_tests/rootfs" "tmp_mavsdk_tests/rootfs")
self.args = [ self.args = [
workspace_dir + "/build/px4_sitl_default/etc", os.path.join(workspace_dir, build_dir, "etc"),
"-s", "-s",
"etc/init.d-posix/rcS", "etc/init.d-posix/rcS",
"-t", "-t",
workspace_dir + "/test_data", os.path.join(workspace_dir, "test_data"),
"-d" "-d"
] ]
self.env["PX4_SIM_MODEL"] = self.model self.env["PX4_SIM_MODEL"] = self.model
@ -214,14 +214,15 @@ class GzserverRunner(Runner):
model: str, model: str,
case: str, case: str,
speed_factor: float, speed_factor: float,
verbose: bool): verbose: bool,
build_dir: str):
super().__init__(log_dir, model, case, verbose) super().__init__(log_dir, model, case, verbose)
self.name = "gzserver" self.name = "gzserver"
self.cwd = workspace_dir self.cwd = workspace_dir
self.env["GAZEBO_PLUGIN_PATH"] = \ self.env["GAZEBO_PLUGIN_PATH"] = \
workspace_dir + "/build/px4_sitl_default/build_gazebo" os.path.join(workspace_dir, build_dir, "build_gazebo")
self.env["GAZEBO_MODEL_PATH"] = \ self.env["GAZEBO_MODEL_PATH"] = \
workspace_dir + "/Tools/sitl_gazebo/models" os.path.join(workspace_dir, "Tools/sitl_gazebo/models")
self.env["PX4_SIM_SPEED_FACTOR"] = str(speed_factor) self.env["PX4_SIM_SPEED_FACTOR"] = str(speed_factor)
self.cmd = "stdbuf" self.cmd = "stdbuf"
self.args = ["-o0", "-e0", "gzserver", "--verbose", self.args = ["-o0", "-e0", "gzserver", "--verbose",
@ -251,28 +252,29 @@ class GzmodelspawnRunner(Runner):
log_dir: str, log_dir: str,
model: str, model: str,
case: str, case: str,
verbose: bool): verbose: bool,
build_dir: str):
super().__init__(log_dir, model, case, verbose) super().__init__(log_dir, model, case, verbose)
self.name = "gzmodelspawn" self.name = "gzmodelspawn"
self.cwd = workspace_dir self.cwd = workspace_dir
self.env["GAZEBO_PLUGIN_PATH"] = \ self.env["GAZEBO_PLUGIN_PATH"] = \
workspace_dir + "/build/px4_sitl_default/build_gazebo" os.path.join(workspace_dir, build_dir, "build_gazebo")
self.env["GAZEBO_MODEL_PATH"] = \ self.env["GAZEBO_MODEL_PATH"] = \
workspace_dir + "/Tools/sitl_gazebo/models" os.path.join(workspace_dir, "Tools/sitl_gazebo/models")
self.cmd = "gz" self.cmd = "gz"
if os.path.isfile(workspace_dir + if os.path.isfile(os.path.join(workspace_dir,
"/Tools/sitl_gazebo/models/" + "Tools/sitl_gazebo/models",
self.model + "/" + self.model + ".sdf"): self.model, self.model + ".sdf")):
model_path = workspace_dir + \ model_path = os.path.join(workspace_dir,
"/Tools/sitl_gazebo/models/" + \ "Tools/sitl_gazebo/models",
self.model + "/" + self.model + ".sdf" self.model, self.model + ".sdf")
elif os.path.isfile(workspace_dir + elif os.path.isfile(os.path.join(workspace_dir,
"/Tools/sitl_gazebo/models/" + "Tools/sitl_gazebo/models",
self.model + "/" + self.model + "-gen.sdf"): self.model, self.model + "-gen.sdf")):
model_path = workspace_dir + \ model_path = os.path.join(workspace_dir,
"/Tools/sitl_gazebo/models/" + \ "Tools/sitl_gazebo/models",
self.model + "/" + self.model + "-gen.sdf" self.model, self.model + "-gen.sdf")
else: else:
raise Exception("Model not found") raise Exception("Model not found")
@ -322,7 +324,8 @@ class GzclientRunner(Runner):
self.name = "gzclient" self.name = "gzclient"
self.cwd = workspace_dir self.cwd = workspace_dir
self.env = dict(os.environ, **{ self.env = dict(os.environ, **{
"GAZEBO_MODEL_PATH": workspace_dir + "/Tools/sitl_gazebo/models"}) "GAZEBO_MODEL_PATH": os.path.join(workspace_dir,
"Tools/sitl_gazebo/models")})
self.cmd = "gzclient" self.cmd = "gzclient"
self.args = ["--verbose"] self.args = ["--verbose"]
@ -335,12 +338,13 @@ class TestRunner(Runner):
case: str, case: str,
mavlink_connection: str, mavlink_connection: str,
speed_factor: float, speed_factor: float,
verbose: bool): verbose: bool,
build_dir: str):
super().__init__(log_dir, model, case, verbose) super().__init__(log_dir, model, case, verbose)
self.name = "mavsdk_tests" self.name = "mavsdk_tests"
self.cwd = workspace_dir self.cwd = workspace_dir
self.cmd = workspace_dir + \ self.cmd = os.path.join(workspace_dir, build_dir,
"/build/px4_sitl_default/mavsdk_tests/mavsdk_tests" "mavsdk_tests/mavsdk_tests")
self.args = ["--url", mavlink_connection, self.args = ["--url", mavlink_connection,
"--speed-factor", str(speed_factor), "--speed-factor", str(speed_factor),
case] case]

Loading…
Cancel
Save