summaryrefslogtreecommitdiff
path: root/subversion/tests/cmdline/svnfsfs_tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'subversion/tests/cmdline/svnfsfs_tests.py')
-rwxr-xr-xsubversion/tests/cmdline/svnfsfs_tests.py200
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.