labath created this revision. labath added reviewers: tfiala, zturner. labath added a subscriber: lldb-commits.
We've run into this problem when the test errored out so early (because it could not connect to the remote device), that the code in D20193 did not catch the error. This resulted in the test suite reporting success with 0 tests being run. This patch makes sure that any non-zero exit code from the inferior process gets reported as an error. Basically I expand the concept of "exceptional exits", which was previously being used for signals to cover these cases as well. https://reviews.llvm.org/D22404 Files: packages/Python/lldbsuite/test/dosep.py packages/Python/lldbsuite/test/test_runner/process_control.py Index: packages/Python/lldbsuite/test/test_runner/process_control.py =================================================================== --- packages/Python/lldbsuite/test/test_runner/process_control.py +++ packages/Python/lldbsuite/test/test_runner/process_control.py @@ -246,33 +246,25 @@ def is_exceptional_exit(self, popen_status): """Returns whether the program exit status is exceptional. - Returns whether the return code from a Popen process is exceptional - (e.g. signals on POSIX systems). - - Derived classes should override this if they can detect exceptional - program exit. + Returns whether the return code from a Popen process is exceptional. @return True if the given popen_status represents an exceptional program exit; False otherwise. """ - return False + return popen_status != 0 def exceptional_exit_details(self, popen_status): """Returns the normalized exceptional exit code and a description. Given an exceptional exit code, returns the integral value of the - exception (e.g. signal number for POSIX) and a description (e.g. - signal name on POSIX) for the result. - - Derived classes should override this if they can detect exceptional - program exit. + exception and a description for the result. - It is fine to not implement this so long as is_exceptional_exit() - always returns False. + Derived classes can override this if they want to want custom + exceptional exit code handling. @return (normalized exception code, symbolic exception description) """ - raise Exception("exception_exit_details() called on unsupported class") + return (popen_status, "exit") class UnixProcessHelper(ProcessHelper): @@ -397,16 +389,15 @@ def soft_terminate_signals(self): return [signal.SIGQUIT, signal.SIGTERM] - def is_exceptional_exit(self, popen_status): - return popen_status < 0 - @classmethod def _signal_names_by_number(cls): return dict( (k, v) for v, k in reversed(sorted(signal.__dict__.items())) if v.startswith('SIG') and not v.startswith('SIG_')) def exceptional_exit_details(self, popen_status): + if popen_status >= 0: + return (popen_status, "exit") signo = -popen_status signal_names_by_number = self._signal_names_by_number() signal_name = signal_names_by_number.get(signo, "") Index: packages/Python/lldbsuite/test/dosep.py =================================================================== --- packages/Python/lldbsuite/test/dosep.py +++ packages/Python/lldbsuite/test/dosep.py @@ -109,13 +109,14 @@ with output_lock: if not (RESULTS_FORMATTER and RESULTS_FORMATTER.is_using_terminal()): print(file=sys.stderr) - print(output, file=sys.stderr) if timeout: timeout_str = " (TIMEOUT)" else: timeout_str = "" print("[%s FAILED]%s" % (name, timeout_str), file=sys.stderr) print("Command invoked: %s" % ' '.join(command), file=sys.stderr) + print("Command stderr:\n", output[1], file=sys.stderr) + print("Command stdout:\n", output[0], file=sys.stderr) update_progress(name) @@ -210,7 +211,7 @@ # only stderr does. report_test_pass(self.file_name, output[1]) else: - report_test_failure(self.file_name, command, output[1], was_timeout) + report_test_failure(self.file_name, command, output, was_timeout) # Save off the results for the caller. self.results = (
Index: packages/Python/lldbsuite/test/test_runner/process_control.py =================================================================== --- packages/Python/lldbsuite/test/test_runner/process_control.py +++ packages/Python/lldbsuite/test/test_runner/process_control.py @@ -246,33 +246,25 @@ def is_exceptional_exit(self, popen_status): """Returns whether the program exit status is exceptional. - Returns whether the return code from a Popen process is exceptional - (e.g. signals on POSIX systems). - - Derived classes should override this if they can detect exceptional - program exit. + Returns whether the return code from a Popen process is exceptional. @return True if the given popen_status represents an exceptional program exit; False otherwise. """ - return False + return popen_status != 0 def exceptional_exit_details(self, popen_status): """Returns the normalized exceptional exit code and a description. Given an exceptional exit code, returns the integral value of the - exception (e.g. signal number for POSIX) and a description (e.g. - signal name on POSIX) for the result. - - Derived classes should override this if they can detect exceptional - program exit. + exception and a description for the result. - It is fine to not implement this so long as is_exceptional_exit() - always returns False. + Derived classes can override this if they want to want custom + exceptional exit code handling. @return (normalized exception code, symbolic exception description) """ - raise Exception("exception_exit_details() called on unsupported class") + return (popen_status, "exit") class UnixProcessHelper(ProcessHelper): @@ -397,16 +389,15 @@ def soft_terminate_signals(self): return [signal.SIGQUIT, signal.SIGTERM] - def is_exceptional_exit(self, popen_status): - return popen_status < 0 - @classmethod def _signal_names_by_number(cls): return dict( (k, v) for v, k in reversed(sorted(signal.__dict__.items())) if v.startswith('SIG') and not v.startswith('SIG_')) def exceptional_exit_details(self, popen_status): + if popen_status >= 0: + return (popen_status, "exit") signo = -popen_status signal_names_by_number = self._signal_names_by_number() signal_name = signal_names_by_number.get(signo, "") Index: packages/Python/lldbsuite/test/dosep.py =================================================================== --- packages/Python/lldbsuite/test/dosep.py +++ packages/Python/lldbsuite/test/dosep.py @@ -109,13 +109,14 @@ with output_lock: if not (RESULTS_FORMATTER and RESULTS_FORMATTER.is_using_terminal()): print(file=sys.stderr) - print(output, file=sys.stderr) if timeout: timeout_str = " (TIMEOUT)" else: timeout_str = "" print("[%s FAILED]%s" % (name, timeout_str), file=sys.stderr) print("Command invoked: %s" % ' '.join(command), file=sys.stderr) + print("Command stderr:\n", output[1], file=sys.stderr) + print("Command stdout:\n", output[0], file=sys.stderr) update_progress(name) @@ -210,7 +211,7 @@ # only stderr does. report_test_pass(self.file_name, output[1]) else: - report_test_failure(self.file_name, command, output[1], was_timeout) + report_test_failure(self.file_name, command, output, was_timeout) # Save off the results for the caller. self.results = (
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits