| #!/usr/bin/env python |
| # |
| # getopt_tests.py: testing the svn command line processing |
| # |
| # Subversion is a tool for revision control. |
| # See http://subversion.apache.org for more information. |
| # |
| # ==================================================================== |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| ###################################################################### |
| |
| # General modules |
| import sys, re, os.path, logging |
| |
| logger = logging.getLogger() |
| |
| # Our testing module |
| import svntest |
| |
| |
| ###################################################################### |
| # Tests |
| |
| #---------------------------------------------------------------------- |
| |
| # This directory contains all the expected output from svn. |
| getopt_output_dir = os.path.join(os.path.dirname(sys.argv[0]), |
| 'getopt_tests_data') |
| |
| # Naming convention for golden files: take the svn command line as a |
| # single string and apply the following sed transformations: |
| # echo svn option1 option2 ... | sed -e 's/ /_/g' -e 's/_--/--/g' |
| # Then append either _stdout or _stderr for the file descriptor to |
| # compare against. |
| |
| def load_expected_output(basename): |
| "load the expected standard output and standard error" |
| |
| stdout_filename = os.path.join(getopt_output_dir, basename + '_stdout') |
| stderr_filename = os.path.join(getopt_output_dir, basename + '_stderr') |
| |
| exp_stdout = open(stdout_filename, 'r').readlines() |
| exp_stderr = open(stderr_filename, 'r').readlines() |
| |
| return exp_stdout, exp_stderr |
| |
| # With plaintext password storage enabled, `svn --version' emits a warning: |
| warn_line_re = re.compile("WARNING: Plaintext password storage") |
| |
| # This is a list of lines to delete. |
| del_lines_res = [ |
| # In 'svn --version', the date line is variable, for example: |
| # "compiled Apr 5 2002, 10:08:45" |
| re.compile(r'\s+compiled\s+'), |
| |
| # Also for 'svn --version': |
| re.compile(r"\* ra_(neon|local|svn|serf) :"), |
| re.compile(r" - handles '(https?|file|svn)' scheme"), |
| re.compile(r" - with Cyrus SASL authentication"), |
| re.compile(r" - using serf \d+\.\d+\.\d+"), |
| re.compile(r"\* fs_(base|fs) :"), |
| |
| # Remove 'svn --version' list of platform-specific |
| # auth cache providers. |
| re.compile(r"\* Wincrypt cache.*"), |
| re.compile(r"\* Plaintext cache.*"), |
| re.compile(r"\* Gnome Keyring"), |
| re.compile(r"\* GPG-Agent"), |
| re.compile(r"\* Mac OS X Keychain"), |
| re.compile(r"\* KWallet \(KDE\)"), |
| ] |
| |
| # This is a list of lines to search and replace text on. |
| rep_lines_res = [ |
| # In 'svn --version', this line varies, for example: |
| # "Subversion Client, version 0.10.2-dev (under development)" |
| # "Subversion Client, version 0.10.2 (r1729)" |
| (re.compile(r'version \d+\.\d+\.\d+(-[^ ]*)? \(.*\)'), |
| 'version X.Y.Z '), |
| # The copyright end date keeps changing; fix forever. |
| (re.compile(r'Copyright \(C\) 20\d\d The Apache ' |
| 'Software Foundation\.'), |
| 'Copyright (C) YYYY The Apache Software Foundation'), |
| # In 'svn --version --quiet', we print only the version |
| # number in a single line. |
| (re.compile(r'^\d+\.\d+\.\d+(-[a-zA-Z0-9]+)?$'), 'X.Y.Z\n'), |
| ] |
| |
| # This is a trigger pattern that selects the secondary set of |
| # delete/replace patterns |
| switch_res_line = 'System information:' |
| |
| # This is a list of lines to delete after having seen switch_res_line. |
| switched_warn_line_re = None |
| switched_del_lines_res = [ |
| # In svn --version --verbose, dependent libs loaded |
| # shared libs are optional. |
| re.compile(r'^\* (loaded|linked)'), |
| # In svn --version --verbose, remove everything from |
| # the extended lists |
| re.compile(r'^ - '), |
| ] |
| |
| # This is a list of lines to search and replace text on after having |
| # seen switch_res_line. |
| switched_rep_lines_res = [ |
| # We don't care about the actual canonical host |
| (re.compile('^\* running on.*$'), '* running on'), |
| ] |
| |
| def process_lines(lines): |
| "delete lines that should not be compared and search and replace the rest" |
| output = [ ] |
| warn_re = warn_line_re |
| del_res = del_lines_res |
| rep_res = rep_lines_res |
| |
| skip_next_line = 0 |
| for line in lines: |
| if skip_next_line: |
| skip_next_line = 0 |
| continue |
| |
| if line.startswith(switch_res_line): |
| warn_re = switched_warn_line_re |
| del_res = switched_del_lines_res |
| rep_res = switched_rep_lines_res |
| |
| # Skip these lines from the output list. |
| delete_line = 0 |
| if warn_re and warn_re.match(line): |
| delete_line = 1 |
| skip_next_line = 1 # Ignore the empty line after the warning |
| else: |
| for delete_re in del_res: |
| if delete_re.match(line): |
| delete_line = 1 |
| break |
| if delete_line: |
| continue |
| |
| # Search and replace text on the rest. |
| for replace_re, replace_str in rep_res: |
| line = replace_re.sub(replace_str, line) |
| |
| output.append(line) |
| |
| return output |
| |
| def run_one_test(sbox, basename, *varargs): |
| "run svn with args and compare against the specified output files" |
| |
| ### no need to use sbox.build() -- we don't need a repos or working copy |
| ### for these tests. |
| |
| exp_stdout, exp_stderr = load_expected_output(basename) |
| |
| # special case the 'svn' test so that no extra arguments are added |
| if basename != 'svn': |
| exit_code, actual_stdout, actual_stderr = svntest.main.run_svn(1, *varargs) |
| else: |
| exit_code, actual_stdout, actual_stderr = svntest.main.run_command(svntest.main.svn_binary, |
| 1, False, *varargs) |
| |
| # Delete and perform search and replaces on the lines from the |
| # actual and expected output that may differ between build |
| # environments. |
| exp_stdout = process_lines(exp_stdout) |
| exp_stderr = process_lines(exp_stderr) |
| actual_stdout = process_lines(actual_stdout) |
| actual_stderr = process_lines(actual_stderr) |
| |
| svntest.verify.compare_and_display_lines("Standard output does not match.", |
| "STDOUT", exp_stdout, actual_stdout) |
| |
| svntest.verify.compare_and_display_lines("Standard error does not match.", |
| "STDERR", exp_stderr, actual_stderr) |
| |
| def getopt_no_args(sbox): |
| "run svn with no arguments" |
| run_one_test(sbox, 'svn') |
| |
| def getopt__version(sbox): |
| "run svn --version" |
| run_one_test(sbox, 'svn--version', '--version') |
| |
| def getopt__version__quiet(sbox): |
| "run svn --version --quiet" |
| run_one_test(sbox, 'svn--version--quiet', '--version', '--quiet') |
| |
| def getopt__version__verbose(sbox): |
| "run svn --version --verbose" |
| run_one_test(sbox, 'svn--version--verbose', '--version', '--verbose') |
| |
| def getopt__help(sbox): |
| "run svn --help" |
| run_one_test(sbox, 'svn--help', '--help') |
| |
| def getopt_help(sbox): |
| "run svn help" |
| run_one_test(sbox, 'svn_help', 'help') |
| |
| def getopt_help_log_switch(sbox): |
| "run svn help log switch" |
| run_one_test(sbox, 'svn_help_log_switch', 'help', 'log', 'switch') |
| |
| def getopt_help_bogus_cmd(sbox): |
| "run svn help bogus-cmd" |
| run_one_test(sbox, 'svn_help_bogus-cmd', 'help', 'bogus-cmd') |
| |
| def getopt_config_option(sbox): |
| "--config-option's spell checking" |
| sbox.build(create_wc=False, read_only=True) |
| expected_stderr = '.*W205000.*did you mean.*' |
| expected_stdout = svntest.verify.AnyOutput |
| svntest.actions.run_and_verify_svn2(expected_stdout, expected_stderr, 0, |
| 'info', |
| '--config-option', |
| 'config:miscellanous:diff-extensions=' + |
| '-u -p', |
| sbox.repo_url) |
| |
| ######################################################################## |
| # Run the tests |
| |
| |
| # list all tests here, starting with None: |
| test_list = [ None, |
| getopt_no_args, |
| getopt__version, |
| getopt__version__quiet, |
| getopt__version__verbose, |
| getopt__help, |
| getopt_help, |
| getopt_help_bogus_cmd, |
| getopt_help_log_switch, |
| getopt_config_option, |
| ] |
| |
| if __name__ == '__main__': |
| svntest.main.run_tests(test_list) |
| # NOTREACHED |
| |
| |
| ### End of file. |