diff --git a/testrunner/.gitignore b/testrunner/.gitignore new file mode 100644 index 000000000..0d20b6487 --- /dev/null +++ b/testrunner/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/testrunner/run_command.py b/testrunner/run_command.py index a98a943a2..ead80f1bd 100755 --- a/testrunner/run_command.py +++ b/testrunner/run_command.py @@ -145,7 +145,20 @@ def RunHostCommand(binary, valgrind=False): print subproc.communicate()[0] return subproc.returncode else: + # Need the full path to valgrind to avoid other versions on the system. subproc = subprocess.Popen(["/usr/bin/valgrind", "-q", full_path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) subproc.wait() return subproc.returncode + + +def HasValgrind(): + """Check that /usr/bin/valgrind exists. + + We look for the fullpath to avoid picking up 'alternative' valgrind + on the system. + + Returns: + True if a system valgrind was found. + """ + return os.path.exists("/usr/bin/valgrind") diff --git a/testrunner/runtest.py b/testrunner/runtest.py index a87f9b5b6..05d29ec34 100755 --- a/testrunner/runtest.py +++ b/testrunner/runtest.py @@ -369,10 +369,13 @@ class TestRunner(object): if run_command.RunHostCommand(f) != 0: logger.Log("%s... failed" % f) else: - if run_command.RunHostCommand(f, valgrind=True) == 0: - logger.Log("%s... ok\t\t[valgrind: ok]" % f) + if run_command.HasValgrind(): + if run_command.RunHostCommand(f, valgrind=True) == 0: + logger.Log("%s... ok\t\t[valgrind: ok]" % f) + else: + logger.Log("%s... ok\t\t[valgrind: failed]" % f) else: - logger.Log("%s... ok\t\t[valgrind: failed]" % f) + logger.Log("%s... ok\t\t[valgrind: missing]" % f) # Run on the device logger.Log("\nRunning on target") @@ -380,9 +383,15 @@ class TestRunner(object): full_path = os.path.join(os.sep, "system", "bin", f) # Single quotes are needed to prevent the shell splitting it. - status = self._adb.SendShellCommand("'%s >/dev/null 2>&1;echo -n $?'" % + output = self._adb.SendShellCommand("'%s 2>&1;echo -n exit code:$?'" % full_path) - logger.Log("%s... %s" % (f, status == "0" and "ok" or "failed")) + success = output.endswith("exit code:0") + logger.Log("%s... %s" % (f, success and "ok" or "failed")) + # Print the captured output when the test failed. + if not success or self._options.verbose: + pos = output.rfind("exit code") + output = output[0:pos] + logger.Log(output) # Cleanup self._adb.SendShellCommand("rm %s" % full_path)