mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-29 00:13:34 +08:00
mavsdk_tests: add combined log
This commit is contained in:
@@ -11,7 +11,7 @@ import subprocess
|
|||||||
import sys
|
import sys
|
||||||
from logger_helper import color, colorize
|
from logger_helper import color, colorize
|
||||||
import process_helper as ph
|
import process_helper as ph
|
||||||
from typing import Any, Dict, List, NoReturn, Optional
|
from typing import Any, Dict, List, NoReturn, TextIO, Optional
|
||||||
from types import FrameType
|
from types import FrameType
|
||||||
|
|
||||||
|
|
||||||
@@ -129,6 +129,7 @@ class Tester:
|
|||||||
self.gui = gui
|
self.gui = gui
|
||||||
self.verbose = verbose
|
self.verbose = verbose
|
||||||
self.start_time = datetime.datetime.now()
|
self.start_time = datetime.datetime.now()
|
||||||
|
self.combined_log_fd = TextIO
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def determine_tests(cls, tests: List[Dict[str, Any]], model: str) \
|
def determine_tests(cls, tests: List[Dict[str, Any]], model: str) \
|
||||||
@@ -272,7 +273,7 @@ class Tester:
|
|||||||
return foldername
|
return foldername
|
||||||
|
|
||||||
def run_test_case(self, test: Dict[str, Any],
|
def run_test_case(self, test: Dict[str, Any],
|
||||||
case: str, logfile_path: str) -> bool:
|
case: str, log_dir: str) -> bool:
|
||||||
self.active_runners = []
|
self.active_runners = []
|
||||||
|
|
||||||
speed_factor = self.speed_factor
|
speed_factor = self.speed_factor
|
||||||
@@ -282,56 +283,68 @@ class Tester:
|
|||||||
if self.config['mode'] == 'sitl':
|
if self.config['mode'] == 'sitl':
|
||||||
px4_runner = ph.Px4Runner(
|
px4_runner = ph.Px4Runner(
|
||||||
os.getcwd(),
|
os.getcwd(),
|
||||||
logfile_path,
|
log_dir,
|
||||||
test['model'],
|
test['model'],
|
||||||
case,
|
case,
|
||||||
speed_factor,
|
speed_factor,
|
||||||
self.debugger,
|
self.debugger,
|
||||||
self.verbose)
|
self.verbose)
|
||||||
px4_runner.start()
|
|
||||||
self.active_runners.append(px4_runner)
|
self.active_runners.append(px4_runner)
|
||||||
|
|
||||||
if self.config['simulator'] == 'gazebo':
|
if self.config['simulator'] == 'gazebo':
|
||||||
gzserver_runner = ph.GzserverRunner(
|
gzserver_runner = ph.GzserverRunner(
|
||||||
os.getcwd(),
|
os.getcwd(),
|
||||||
logfile_path,
|
log_dir,
|
||||||
test['model'],
|
test['model'],
|
||||||
case,
|
case,
|
||||||
self.speed_factor,
|
self.speed_factor,
|
||||||
self.verbose)
|
self.verbose)
|
||||||
gzserver_runner.start()
|
|
||||||
self.active_runners.append(gzserver_runner)
|
self.active_runners.append(gzserver_runner)
|
||||||
|
|
||||||
if self.gui:
|
if self.gui:
|
||||||
gzclient_runner = ph.GzclientRunner(
|
gzclient_runner = ph.GzclientRunner(
|
||||||
os.getcwd(),
|
os.getcwd(),
|
||||||
logfile_path,
|
log_dir,
|
||||||
test['model'],
|
test['model'],
|
||||||
case,
|
case,
|
||||||
self.verbose)
|
self.verbose)
|
||||||
gzclient_runner.start()
|
|
||||||
self.active_runners.append(gzclient_runner)
|
self.active_runners.append(gzclient_runner)
|
||||||
|
|
||||||
test_runner = ph.TestRunner(
|
test_runner = ph.TestRunner(
|
||||||
os.getcwd(),
|
os.getcwd(),
|
||||||
logfile_path,
|
log_dir,
|
||||||
test['model'],
|
test['model'],
|
||||||
case,
|
case,
|
||||||
self.config['mavlink_connection'],
|
self.config['mavlink_connection'],
|
||||||
self.verbose)
|
self.verbose)
|
||||||
|
|
||||||
test_runner.start()
|
|
||||||
self.active_runners.append(test_runner)
|
self.active_runners.append(test_runner)
|
||||||
|
|
||||||
|
for runner in self.active_runners:
|
||||||
|
runner.set_log_filename(
|
||||||
|
self.determine_logfile_path(log_dir, runner.name))
|
||||||
|
runner.start()
|
||||||
|
|
||||||
|
max_name = max(len(runner.name) for runner in self.active_runners)
|
||||||
|
|
||||||
|
self.start_combined_log(
|
||||||
|
self.determine_logfile_path(log_dir, 'combined'))
|
||||||
|
|
||||||
while test_runner.time_elapsed_s() < test['timeout_min']*60:
|
while test_runner.time_elapsed_s() < test['timeout_min']*60:
|
||||||
returncode = test_runner.poll()
|
returncode = test_runner.poll()
|
||||||
if returncode is not None:
|
if returncode is not None:
|
||||||
is_success = (returncode == 0)
|
is_success = (returncode == 0)
|
||||||
break
|
break
|
||||||
|
|
||||||
if self.verbose:
|
for runner in self.active_runners:
|
||||||
for runner in self.active_runners:
|
output = runner.get_output()
|
||||||
runner.print_output()
|
if not output:
|
||||||
|
continue
|
||||||
|
|
||||||
|
output = self.add_name_prefix(max_name, runner.name, output)
|
||||||
|
self.add_to_combined_log(output)
|
||||||
|
if self.verbose:
|
||||||
|
print(output)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print(colorize(
|
print(colorize(
|
||||||
@@ -342,6 +355,7 @@ class Tester:
|
|||||||
|
|
||||||
for runner in self.active_runners:
|
for runner in self.active_runners:
|
||||||
runner.stop()
|
runner.stop()
|
||||||
|
self.stop_combined_log()
|
||||||
|
|
||||||
result = {'success': is_success,
|
result = {'success': is_success,
|
||||||
'logfiles': [runner.get_log_filename()
|
'logfiles': [runner.get_log_filename()
|
||||||
@@ -354,6 +368,23 @@ class Tester:
|
|||||||
|
|
||||||
return is_success
|
return is_success
|
||||||
|
|
||||||
|
def start_combined_log(self, filename: str) -> None:
|
||||||
|
self.log_fd = open(filename, 'w')
|
||||||
|
|
||||||
|
def stop_combined_log(self) -> None:
|
||||||
|
self.log_fd.close()
|
||||||
|
|
||||||
|
def add_to_combined_log(self, output: str) -> None:
|
||||||
|
self.log_fd.write(output)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def add_name_prefix(width: int, name: str, text: str) -> str:
|
||||||
|
return colorize("[" + name.ljust(width) + "] " + text, color.RESET)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def determine_logfile_path(log_dir: str, desc: str) -> str:
|
||||||
|
return os.path.join(log_dir, "log-{}.log".format(desc))
|
||||||
|
|
||||||
def show_detailed_results(self) -> None:
|
def show_detailed_results(self) -> None:
|
||||||
print()
|
print()
|
||||||
print(colorize("Results:", color.BOLD))
|
print(colorize("Results:", color.BOLD))
|
||||||
@@ -416,6 +447,7 @@ class Tester:
|
|||||||
print("Stopping all processes ...")
|
print("Stopping all processes ...")
|
||||||
for runner in self.active_runners:
|
for runner in self.active_runners:
|
||||||
runner.stop()
|
runner.stop()
|
||||||
|
self.stop_combined_log()
|
||||||
print("Stopping all processes done.")
|
print("Stopping all processes done.")
|
||||||
self.show_detailed_results()
|
self.show_detailed_results()
|
||||||
sys.exit(-sig)
|
sys.exit(-sig)
|
||||||
|
|||||||
@@ -32,9 +32,8 @@ class Runner:
|
|||||||
self.log_dir = log_dir
|
self.log_dir = log_dir
|
||||||
self.log_filename = ""
|
self.log_filename = ""
|
||||||
|
|
||||||
def set_log_filename(self) -> None:
|
def set_log_filename(self, log_filename: str) -> None:
|
||||||
self.log_filename = self.log_dir + os.path.sep + \
|
self.log_filename = log_filename
|
||||||
"log-{}.log".format(self.name)
|
|
||||||
|
|
||||||
def get_log_filename(self) -> str:
|
def get_log_filename(self) -> str:
|
||||||
return self.log_filename
|
return self.log_filename
|
||||||
@@ -45,7 +44,6 @@ class Runner:
|
|||||||
|
|
||||||
atexit.register(self.stop)
|
atexit.register(self.stop)
|
||||||
|
|
||||||
self.set_log_filename()
|
|
||||||
if self.verbose:
|
if self.verbose:
|
||||||
print("Logging to {}".format(self.log_filename))
|
print("Logging to {}".format(self.log_filename))
|
||||||
self.log_fd = open(self.log_filename, 'w')
|
self.log_fd = open(self.log_filename, 'w')
|
||||||
@@ -88,18 +86,10 @@ class Runner:
|
|||||||
|
|
||||||
def get_output(self) -> Optional[str]:
|
def get_output(self) -> Optional[str]:
|
||||||
try:
|
try:
|
||||||
output = self.output_queue.get(block=True, timeout=0.1)
|
return self.output_queue.get(block=True, timeout=0.1)
|
||||||
return maybe_strip_color(output)
|
|
||||||
except queue.Empty:
|
except queue.Empty:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def print_output(self) -> None:
|
|
||||||
output = self.get_output()
|
|
||||||
if not output:
|
|
||||||
return
|
|
||||||
print(colorize("[" + self.name.ljust(11) + "] " + output, color.RESET),
|
|
||||||
end="")
|
|
||||||
|
|
||||||
def stop(self) -> int:
|
def stop(self) -> int:
|
||||||
atexit.unregister(self.stop)
|
atexit.unregister(self.stop)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user