You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ar...@apache.org on 2010/09/19 14:38:36 UTC

svn commit: r998644 - in /subversion/trunk/subversion/tests/cmdline: svnrdump_tests.py svntest/verify.py

Author: artagnon
Date: Sun Sep 19 12:38:36 2010
New Revision: 998644

URL: http://svn.apache.org/viewvc?rev=998644&view=rev
Log:
Add some testing infrastructure to exclude comparison of certain lines
specified by a regular expression so that svnrdump dump tests can
report actual failures. Exercise this infrastructure in
svnrdump_tests.py. This is necessary because there is some mismatch
between the headers that `svnadmin dump` and `svnrdump dump` are able
to provide.

* subversion/tests/cmdline/svntest/verify.py

  (ExpectedOutput.matches_except): Write new function that resembling
  ExpectedOutput.display_lines with an extra except_re argument. It
  compares EXPECTED and ACTUAL on an exact line-by-line basis,
  excluding lines that match the regular expression specified in
  except_re.

  (ExceptedOutput.matches): Modify function to accept one more
  optional argument: except_re. Call matches_except if except_re is
  not None.

  (compare_and_display_lines): Take an extra argument except_re that
  defaults to None, and call ExcpectedOutput.matches with this
  argument.

* subversion/tests/cmdline/svnrdump_tests.py

  (mismatched_headers_re): Declare a new global string that specifies
  the headers in which a mismatch is expected during a dumping
  operation.

  (run_dump_test): Pass the above regular expression string to
  svntest.verify.compare_and_display_lines).

  (test_list): Mark copy_and_modify_dump as a passing test.

Modified:
    subversion/trunk/subversion/tests/cmdline/svnrdump_tests.py
    subversion/trunk/subversion/tests/cmdline/svntest/verify.py

Modified: subversion/trunk/subversion/tests/cmdline/svnrdump_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/svnrdump_tests.py?rev=998644&r1=998643&r2=998644&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/svnrdump_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/svnrdump_tests.py Sun Sep 19 12:38:36 2010
@@ -41,6 +41,11 @@ XFail = svntest.testcase.XFail
 Item = svntest.wc.StateItem
 Wimp = svntest.testcase.Wimp
 
+# Mismatched headers during dumping operation
+mismatched_headers_re = \
+    "Prop-delta: |Text-content-sha1: |Text-copy-source-md5: |" \
+    "Text-copy-source-sha1: |Text-delta-base-sha1: .*"
+
 ######################################################################
 # Helper routines
 
@@ -80,7 +85,8 @@ def run_dump_test(sbox, dumpfile_name):
 
   # Compare the output from stdout
   svntest.verify.compare_and_display_lines(
-    "Dump files", "DUMP", svnadmin_dumpfile, svnrdump_dumpfile)
+    "Dump files", "DUMP", svnadmin_dumpfile, svnrdump_dumpfile,
+    None, mismatched_headers_re)
 
 def run_load_test(sbox, dumpfile_name):
   """Load a dumpfile using 'svnrdump load', dump it with 'svnadmin
@@ -177,7 +183,7 @@ test_list = [ None,
               revision_0_load,
               skeleton_load,
               copy_and_modify_load,
-              Wimp("Need to fix headers in RA layer", copy_and_modify_dump),
+              copy_and_modify_dump,
              ]
 
 if __name__ == '__main__':

Modified: subversion/trunk/subversion/tests/cmdline/svntest/verify.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/svntest/verify.py?rev=998644&r1=998643&r2=998644&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/svntest/verify.py (original)
+++ subversion/trunk/subversion/tests/cmdline/svntest/verify.py Sun Sep 19 12:38:36 2010
@@ -108,7 +108,7 @@ class ExpectedOutput:
   def __cmp__(self, other):
     raise 'badness'
 
-  def matches(self, other):
+  def matches(self, other, except_re=None):
     """Return whether SELF.output matches OTHER (which may be a list
     of newline-terminated lines, or a single string).  Either value
     may be None."""
@@ -126,7 +126,31 @@ class ExpectedOutput:
     if not isinstance(expected, list):
       expected = [expected]
 
-    return self.is_equivalent_list(expected, actual)
+    if except_re:
+      return self.matches_except(expected, actual, except_re)
+    else:
+      return self.is_equivalent_list(expected, actual)
+
+  def matches_except(self, expected, actual, except_re):
+    "Return whether EXPECTED and ACTUAL match except for except_re."
+    if not self.is_regex:
+      i_expected = 0
+      i_actual = 0
+      while i_expected < len(expected) and i_actual < len(actual):
+        if re.match(except_re, actual[i_actual]):
+          i_actual += 1
+        elif re.match(except_re, expected[i_expected]):
+          i_expected += 1
+        elif expected[i_expected] == actual[i_actual]:
+          i_expected += 1
+          i_actual += 1
+        else:
+          return False
+      if i_expected == len(expected) and i_actual == len(actual):
+            return True
+      return False
+    else:
+      raise "is_regex and except_re are mutually exclusive"
 
   def is_equivalent_list(self, expected, actual):
     "Return whether EXPECTED and ACTUAL are equivalent."
@@ -308,7 +332,7 @@ def display_lines(message, label, expect
       sys.stdout.write(x)
 
 def compare_and_display_lines(message, label, expected, actual,
-                              raisable=None):
+                              raisable=None, except_re=None):
   """Compare two sets of output lines, and print them if they differ,
   preceded by MESSAGE iff not None.  EXPECTED may be an instance of
   ExpectedOutput (and if not, it is wrapped as such).  RAISABLE is an
@@ -325,7 +349,7 @@ def compare_and_display_lines(message, l
     actual = [actual]
   actual = [line for line in actual if not line.startswith('DBG:')]
 
-  if not expected.matches(actual):
+  if not expected.matches(actual, except_re):
     expected.display_differences(message, label, actual)
     raise raisable