diff --git a/test/mavsdk_tests/mavsdk_test_runner.py b/test/mavsdk_tests/mavsdk_test_runner.py index f876ec2af8..e802c1bbf7 100755 --- a/test/mavsdk_tests/mavsdk_test_runner.py +++ b/test/mavsdk_tests/mavsdk_test_runner.py @@ -340,11 +340,11 @@ class Tester: def run_test_case(self, test: Dict[str, Any], case: str, log_dir: str) -> bool: - self.start_runners(log_dir, test, case) - logfile_path = self.determine_logfile_path(log_dir, 'combined') self.start_combined_log(logfile_path) + self.start_runners(log_dir, test, case) + test_timeout_s = test['timeout_min']*60 while self.active_runners[-1].time_elapsed_s() < test_timeout_s: returncode = self.active_runners[-1].poll() @@ -445,29 +445,24 @@ class Tester: runner.set_log_filename( self.determine_logfile_path(log_dir, runner.name)) - # Some runners need to be started a couple of times - # until they succeed. - for _ in range(10): - try: - runner.start() - except TimeoutError: - abort = True - print("A timeout happened for runner: {}" - .format(runner.name)) - break - - if runner.has_started_ok(): - break + runner.start() - runner.stop - time.sleep(1) + if runner.has_started_ok(): + continue else: abort = True - print("Could not start runner: {}".format(runner.name)) + print("A timeout happened for runner: {}" + .format(runner.name)) break + runner.stop + time.sleep(1) + if abort: + print("Could not start runner: {}".format(runner.name)) + self.collect_runner_output() + self.stop_combined_log() self.stop_runners() sys.exit(1) diff --git a/test/mavsdk_tests/process_helper.py b/test/mavsdk_tests/process_helper.py index 282ee861f3..6fc385ab92 100644 --- a/test/mavsdk_tests/process_helper.py +++ b/test/mavsdk_tests/process_helper.py @@ -115,7 +115,7 @@ class Runner: if returncode is None: if self.verbose: - print("Terminating {}".format(self.cmd)) + print("Terminating {}".format(self.name)) self.process.terminate() try: @@ -125,13 +125,13 @@ class Runner: if returncode is None: if self.verbose: - print("Killing {}".format(self.cmd)) + print("Killing {}".format(self.name)) self.process.kill() returncode = self.process.poll() if self.verbose: print("{} exited with {}".format( - self.cmd, self.process.returncode)) + self.name, self.process.returncode)) self.stop_thread.set() self.thread.join() @@ -223,11 +223,26 @@ class GzserverRunner(Runner): self.env["GAZEBO_MODEL_PATH"] = \ workspace_dir + "/Tools/sitl_gazebo/models" self.env["PX4_SIM_SPEED_FACTOR"] = str(speed_factor) - self.cmd = "nice" - self.args = ["-n 1", - "gzserver", "--verbose", - workspace_dir + "/Tools/sitl_gazebo/worlds/" + - "empty.world"] + self.cmd = "stdbuf" + self.args = ["-o0", "-e0", "gzserver", "--verbose", + os.path.join(workspace_dir, + "Tools/sitl_gazebo/worlds", + "empty.world")] + + def has_started_ok(self) -> bool: + # Wait until gzerver has started and connected to gazebo master. + timeout_s = 20 + steps = 10 + for step in range(steps): + with open(self.log_filename, 'r') as f: + for line in f.readlines(): + if 'Connected to gazebo master' in line: + return True + time.sleep(float(timeout_s)/float(steps)) + + print("gzserver did not connect within {}s" + .format(timeout_s)) + return False class GzmodelspawnRunner(Runner): @@ -261,7 +276,11 @@ class GzmodelspawnRunner(Runner): else: raise Exception("Model not found") - self.args = ["model", "--spawn-file", model_path, + self.cmd = "stdbuf" + self.args = ["-o0", "-e0", + "gz", "model", + "--verbose", + "--spawn-file", model_path, "--model-name", self.model, "-x", "1.01", "-y", "0.98", "-z", "0.83"] @@ -271,21 +290,15 @@ class GzmodelspawnRunner(Runner): # "An instance of Gazebo is not running." but still returns 0 # as a result. # We work around this by trying to start and then check whether - # using has_started_ok() whether it was succesful or not. - timeout_s = 3 + # using has_started_ok() whether it was successful or not. + timeout_s = 20 steps = 10 - for _ in range(steps*timeout_s): - if self.verbose: - print("Checking if gz model spawn is done...") + for _ in range(steps): returncode = self.process.poll() if returncode is None: - if self.verbose: - print("not done yet") time.sleep(float(timeout_s)/float(steps)) continue - if self.verbose: - print("gz model spawn is done") with open(self.log_filename, 'r') as f: for line in f.readlines(): if 'An instance of Gazebo is not running' in line: @@ -293,9 +306,8 @@ class GzmodelspawnRunner(Runner): else: return True - if self.verbose: - print("gzmodelspawn did not return within {}s". - format(timeout_s)) + print("gzmodelspawn did not return within {}s" + .format(timeout_s)) return False