From 064b98e27f9a960f44bc2b342d9c751c059074b2 Mon Sep 17 00:00:00 2001 From: James Prestwood Date: Wed, 16 Mar 2022 15:29:35 -0700 Subject: [PATCH] test-runner: add option to write final status to file Running the tests inside a VM makes it difficult for the host to figure out if the test actually failed or succeeded. For a human its easy to read the results table, but for an automated system parsing this would be fragile. This adds a new option --result which writes PASS/FAIL to the provided file once all tests are completed. Any failures results in 'FAIL' being written to the file. --- tools/test-runner | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/tools/test-runner b/tools/test-runner index 0b749238..b0ec87a2 100755 --- a/tools/test-runner +++ b/tools/test-runner @@ -62,7 +62,14 @@ def exit_vm(): p.kill() if config.ctx and config.ctx.results: - print_results(config.ctx.results) + success = print_results(config.ctx.results) + else: + success = False + + if config.ctx.args.result: + result = 'PASS' if success else 'FAIL' + with open(config.ctx.args.result, 'w') as f: + f.write(result) os.sync() @@ -1434,6 +1441,8 @@ def print_results(results): dbg(table) + return total_fail == 0 + def run_auto_tests(ctx, args): tests = build_test_list(args) @@ -1528,6 +1537,7 @@ def run_tests(): parser.add_argument('--hw') parser.add_argument('--monitor') parser.add_argument('--sub_tests') + parser.add_argument('--result') args = parser.parse_args(options) @@ -1580,6 +1590,10 @@ def run_tests(): parent = os.path.abspath(os.path.join(args.monitor, os.pardir)) mount('mondir', parent, '9p', 0, 'trans=virtio,version=9p2000.L,msize=10240') + if args.result: + parent = os.path.abspath(os.path.join(args.result, os.pardir)) + mount('resultdir', parent, '9p', 0, 'trans=virtio,version=9p2000.L,msize=10240') + if config.ctx.args.unit_tests is None: run_auto_tests(config.ctx, args) else: @@ -1620,6 +1634,8 @@ class Main: self.parser.add_argument('--sub-tests', '-S', metavar='', type=str, nargs=1, help='List of subtests to run', default=None, dest='sub_tests') + self.parser.add_argument('--result', '-r', type=str, + help='Writes PASS/FAIL to results file') # Prevent --autotest/--unittest from being used together auto_unit_group = self.parser.add_mutually_exclusive_group() @@ -1767,6 +1783,20 @@ class Main: options += ' --log-gid %u' % int(os.environ['SUDO_GID']) options += ' --log-uid %u' % int(os.environ['SUDO_UID']) + if self.args.result: + if os.environ.get('SUDO_GID', None) is None: + print("--result can only be used as root user") + quit() + + self.args.result = os.path.abspath(self.args.result) + result_parent_dir = os.path.abspath(os.path.join(self.args.result, os.pardir)) + + if '--log-gid' not in options: + options += ' --log-gid %u' % int(os.environ['SUDO_GID']) + + if '--log-uid' not in options: + options += ' --log-uid %u' % int(os.environ['SUDO_UID']) + denylist = [ 'auto_tests', 'sub_tests', @@ -1873,6 +1903,13 @@ class Main: % mon_parent_dir ]) + if self.args.result: + qemu_cmdline.extend([ + '-virtfs', + 'local,path=%s,mount_tag=resultdir,security_model=passthrough,id=resultdir' \ + % result_parent_dir + ]) + os.execlp(qemu_cmdline[0], *qemu_cmdline) if __name__ == '__main__':