diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-08-05 16:22:51 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-08-05 16:22:51 +0000 |
commit | cf46733632c7279a9fd0fe6ce26f9185a4ae82a9 (patch) | |
tree | da27775a2161723ef342e91af41a8b51fedef405 /subversion/tests/cmdline/svnfsfs_tests.py | |
parent | bb0ef45f7c46b0ae221b26265ef98a768c33f820 (diff) | |
download | subversion-tarball-master.tar.gz |
subversion-1.9.7HEADsubversion-1.9.7master
Diffstat (limited to 'subversion/tests/cmdline/svnfsfs_tests.py')
-rwxr-xr-x | subversion/tests/cmdline/svnfsfs_tests.py | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/subversion/tests/cmdline/svnfsfs_tests.py b/subversion/tests/cmdline/svnfsfs_tests.py new file mode 100755 index 0000000..fece34b --- /dev/null +++ b/subversion/tests/cmdline/svnfsfs_tests.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python +# +# svnfsfs_tests.py: testing the 'svnfsfs' tool. +# +# 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 os +import logging +import re +import shutil +import sys +import threading +import time +import gzip + +logger = logging.getLogger() + +# Our testing module +import svntest +from svntest.verify import SVNExpectedStdout, SVNExpectedStderr +from svntest.verify import SVNUnexpectedStderr +from svntest.verify import UnorderedOutput +from svntest.main import SVN_PROP_MERGEINFO + +# (abbreviation) +Skip = svntest.testcase.Skip_deco +SkipUnless = svntest.testcase.SkipUnless_deco +XFail = svntest.testcase.XFail_deco +Issues = svntest.testcase.Issues_deco +Issue = svntest.testcase.Issue_deco +Wimp = svntest.testcase.Wimp_deco +SkipDumpLoadCrossCheck = svntest.testcase.SkipDumpLoadCrossCheck_deco +Item = svntest.wc.StateItem + +#---------------------------------------------------------------------- + +# How we currently test 'svnfsfs' -- +# +# 'svnadmin create': Create an empty repository, test that the +# root node has a proper created-revision, +# because there was once a bug where it +# didn't. +# +# Note also that "svnadmin create" is tested +# implicitly every time we run a python test +# script. (An empty repository is always +# created and then imported into; if this +# subcommand failed catastrophically, every +# test would fail and we would know instantly.) +# +# 'svnadmin createtxn' +# 'svnadmin rmtxn': See below. +# +# 'svnadmin lstxns': We don't care about the contents of transactions; +# we only care that they exist or not. +# Therefore, we can simply parse transaction headers. +# +# 'svnadmin dump': A couple regression tests that ensure dump doesn't +# error out, and one to check that the --quiet option +# really does what it's meant to do. The actual +# contents of the dump aren't verified at all. +# +###################################################################### +# Helper routines + +def patch_format(repo_dir, shard_size): + """Rewrite the format of the FSFS repository REPO_DIR so + that it would use sharding with SHARDS revisions per shard.""" + + format_path = os.path.join(repo_dir, "db", "format") + contents = open(format_path, 'rb').read() + processed_lines = [] + + for line in contents.split("\n"): + if line.startswith("layout "): + processed_lines.append("layout sharded %d" % shard_size) + else: + processed_lines.append(line) + + new_contents = "\n".join(processed_lines) + os.chmod(format_path, 0666) + open(format_path, 'wb').write(new_contents) + +###################################################################### +# Tests + +#---------------------------------------------------------------------- + +@SkipUnless(svntest.main.is_fs_type_fsfs) +@SkipUnless(svntest.main.fs_has_pack) +@SkipUnless(svntest.main.is_fs_log_addressing) +def load_index_sharded(sbox): + "load-index in a packed repo" + + # Configure two files per shard to trigger packing. + sbox.build() + patch_format(sbox.repo_dir, shard_size=2) + + # With --fsfs-packing, everything is already packed and we + # can skip this part. + if not svntest.main.options.fsfs_packing: + expected_output = ["Packing revisions in shard 0...done.\n"] + svntest.actions.run_and_verify_svnadmin(expected_output, [], + "pack", sbox.repo_dir) + + # Read P2L index using svnfsfs. + exit_code, items, errput = \ + svntest.actions.run_and_verify_svnfsfs(None, [], "dump-index", "-r0", + sbox.repo_dir) + + # load-index promises to deal with input that + # + # * uses the same encoding as the dump-index output + # * is not in ascending item offset order + # * ignores lines with the full table header + # * ignores the checksum column and beyond + # * figures out the correct target revision even if the first item + # does not match the first revision in the pack file + # + # So, let's mess with the ITEMS list to call in on these promises. + + # not in ascending order + items.reverse() + + # multiple headers (there is already one now at the bottom) + items.insert(0, " Start Length Type Revision Item Checksum\n") + + # make columns have a variable size + # mess with the checksums + # add a junk column + # keep header lines as are + for i in range(0, len(items)): + if items[i].find("Start") == -1: + columns = items[i].split() + columns[5] = columns[5].replace('f','-').replace('0','9') + columns.append("junk") + items[i] = ' '.join(columns) + "\n" + + # first entry is for rev 1, pack starts at rev 0, though + assert(items[1].split()[3] == "1") + + # Reload the index + exit_code, output, errput = svntest.main.run_command_stdin( + svntest.main.svnfsfs_binary, [], 0, False, items, + "load-index", sbox.repo_dir) + + # Run verify to see whether we broke anything. + expected_output = ["* Verifying metadata at revision 0 ...\n", + "* Verifying repository metadata ...\n", + "* Verified revision 0.\n", + "* Verified revision 1.\n"] + svntest.actions.run_and_verify_svnadmin(expected_output, [], + "verify", sbox.repo_dir) + +@SkipUnless(svntest.main.is_fs_type_fsfs) +def test_stats_on_empty_repo(sbox): + "stats on empty repo shall not crash" + + sbox.build(create_wc=False, empty=True) + + exit_code, output, errput = \ + svntest.actions.run_and_verify_svnfsfs(None, [], 'stats', sbox.repo_dir) + +######################################################################## +# Run the tests + + +# list all tests here, starting with None: +test_list = [ None, + load_index_sharded, + test_stats_on_empty_repo, + ] + +if __name__ == '__main__': + svntest.main.run_tests(test_list) + # NOTREACHED + + +### End of file. |