mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-31 10:26:52 +08:00
mavsdk_tests: update to be able to fetch rtps builds as well
This commit is contained in:
@@ -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],
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
Reference in New Issue
Block a user