blob: f4e6398f9a9975df3e2323dbaa0263a1e1d351f3 [file] [log] [blame]
#!/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.