I am hoping to take a crack at issue 3097 (exit non-zero when running
`svn pg` on an unset property) in the near future. And there are a
few similar exit-code issues in there. So I thought a good place to
start is with the ability to test this sort of thing.
I don't know if exit codes are as interesting for the other binaries,
so this patch only deals with the client. And since I am still trying
to familiarize myself with the conventions, and I'm no Python expert,
please let me know what I can do to make this better.
[[[
Allow testing of svn client exit codes.
* subversion/tests/cmdline/svntest/actions.py
(run_and_verify_svn_with_exit): New function like run_and_verify_svn, but
with an expected exit code parameter which is checked against the actual
exit code.
* subversion/tests/cmdline/svntest/main.py
(run_command_2): New, like run_command but also returns the exit code.
(run_command_stdin_2): New, like run_command_stdin, but also returns
the exit code.
(run_command_stdin): Reimplemented as a wrapper around run_command_stdin_2.
(run_svn_2): New, invokes svn client using run_command_2.
* subversion/tests/cmdline/svntest/verify.py
(SVNUnexpectedExitCode): New exception raised when the exit code was not
what was expected.
(verify_exit_code): New, compares expected and actual exit code and fails
the test if they are different.
Patch By: Jeremy Hinds
]]]
Index: subversion/tests/cmdline/svntest/actions.py
===================================================================
--- subversion/tests/cmdline/svntest/actions.py (revision 29576)
+++ subversion/tests/cmdline/svntest/actions.py (working copy)
@@ -193,7 +193,21 @@
False)
return out, err
+def run_and_verify_svn_with_exit(message, expected_stdout, expected_stderr,
+ expected_exit, *varargs):
+ """Like run_and_verify_svn, except that it also checks the exit code."""
+ if expected_stderr is None:
+ raise verify.SVNIncorrectDatatype("expected_stderr must not be None")
+ want_err = None
+ if expected_stderr is not None and expected_stderr is not []:
+ want_err = True
+
+ actual_exit, out, err = main.run_svn_2(want_err, *varargs)
+ verify.verify_outputs(message, out, err, expected_stdout, expected_stderr)
+ verify.verify_exit_code(message, actual_exit, expected_exit)
+ return actual_exit, out, err
+
def run_and_verify_load(repo_dir, dump_file_content):
"Runs 'svnadmin load' and reports any errors."
expected_stderr = []
Index: subversion/tests/cmdline/svntest/main.py
===================================================================
--- subversion/tests/cmdline/svntest/main.py (revision 29576)
+++ subversion/tests/cmdline/svntest/main.py (working copy)
@@ -304,7 +304,7 @@
return os.path.join(repo_dir, "conf", "svnserve.conf")
-# Run any binary, logging the command line (TODO: and return code)
+# Run any binary, logging the command line and return code
def run_command(command, error_expected, binary_mode=0, *varargs):
"""Run COMMAND with VARARGS; return stdout, stderr as lists of lines.
If ERROR_EXPECTED is None, any stderr also will be printed."""
@@ -312,6 +312,13 @@
return run_command_stdin(command, error_expected, binary_mode,
None, *varargs)
+def run_command_2(command, error_expected, binary_mode=0, *varargs):
+ """Like run_command, but returning exit code, stdout, and stderr"""
+
+ return run_command_stdin_2(command, error_expected, binary_mode,
+ None, *varargs)
+
+
# A regular expression that matches arguments that are trivially safe
# to pass on a command line without quoting on any supported operating
# system:
@@ -418,6 +425,18 @@
Return stdout, stderr as lists of lines.
If ERROR_EXPECTED is None, any stderr also will be printed."""
+ exit_code, stdout_lines, stderr_lines = run_command_stdin_2(command,
+ error_expected,
+ binary_mode,
+ stdin_lines,
+ *varargs);
+ return stdout_lines, stderr_lines
+
+def run_command_stdin_2(command, error_expected, binary_mode=0,
+ stdin_lines=None, *varargs):
+ """Like run_command_stdin, except returing exit code as int, stdout
+ and stderr as lists of lines."""
+
if verbose_mode:
start = time.time()
@@ -434,7 +453,7 @@
map(sys.stdout.write, stderr_lines)
raise Failure
- return stdout_lines, stderr_lines
+ return exit_code, stdout_lines, stderr_lines
def create_config_dir(cfgdir, config_contents=None, server_contents=None):
"Create config directories and files"
@@ -493,6 +512,11 @@
return run_command(svn_binary, error_expected, 0,
*(_with_auth(_with_config_dir(varargs))))
+def run_svn_2(error_expected, *varargs):
+ """Like run_svn, but also returns exit code."""
+ return run_command_2(svn_binary, error_expected, 0,
+ *(_with_auth(_with_config_dir(varargs))))
+
# For running svnadmin. Ignores the output.
def run_svnadmin(*varargs):
"Run svnadmin with VARARGS, returns stdout, stderr as list of lines."
Index: subversion/tests/cmdline/svntest/verify.py
===================================================================
--- subversion/tests/cmdline/svntest/verify.py (revision 29576)
+++ subversion/tests/cmdline/svntest/verify.py (working copy)
@@ -49,6 +49,11 @@
STDERR when output was expected."""
pass
+class SVNUnexpectedExitCode(SVNUnexpectedOutput):
+ """Exception raised if an invocation of svn exits with a value other
+ than what was expected."""
+ pass
+
class SVNIncorrectDatatype(SVNUnexpectedOutput):
"""Exception raised if invalid input is passed to the
run_and_verify_* API"""
@@ -324,3 +329,13 @@
raisable = main.SVNLineUnequal
compare_and_display_lines(message, label, expected, actual, raisable)
+
+def verify_exit_code(message, actual, expected,
+ raisable=SVNUnexpectedExitCode):
+ """Compare and display expected vs. actual exit codes:
+ if they don't match, print the difference (preceded by MESSAGE iff
+ not None) and raise an exception."""
+
+ if expected != actual:
+ display_lines(message, "Exit Code", str(expected) + '\n',
str(actual) + '\n')
+ raise raisable
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe_at_subversion.tigris.org
For additional commands, e-mail: dev-help_at_subversion.tigris.org
Received on 2008-02-24 07:24:26 CET