Jon Foster wrote on Mon, Sep 20, 2010 at 12:39:31 +0100:
> Hi,
>  
> Daniel Shahaf wrote:
> > Jon Foster wrote on Mon, Sep 20, 2010 at 10:48:44 +0100:
> > > Hi,
> > > 
> > > This patch changes the tests for the atomic-revprop feature, so that
> > > they test the error number rather than parsing the error text.
> > > This doesn't work with Serf or Neon yet - they're still TODO.  This
> > > gives you a way to test Serf & Neon patches.  (You might like to
> > > hold off on committing this until Serf and Neon are done).
> > > 
> > > The patch is against the atomic-revprop branch, and requires
> > > Patch 1 to be applied first.  It doesn't apply to trunk (I don't
> > > think the tests have been merged to trunk?)
> > > 
> > 
> > On trunk there are only the libsvn_fs and libsvn_repos parts.  The
> > libsvn_ra parts, and the associated Python tests, are only on the
> > branch.
> > 
> > > [[[
> > > Change atomic-revprop tests to look at the error number rather
> > > than parsing the error text.
> > > 
> > > * subversion/tests/cmdline/atomic-ra-revprop-change.c:
> > >   (main): When printing an error, check if it's
> SVN_ERR_BAD_OLD_VALUE
> > >           and print a special message if it is.
> > > 
> > > * subversion/tests/cmdline/prop_tests.py:
> > >   (FAILS_WITH_BPV): Look for the special message.
> > > 
> > > Patch by: Jon Foster <jon.fos...@cabot.co.uk>
> > > ]]]
> > > 
> > 
> > So, this is trying to capture the current ra_dav situation, where the
> > err->message is correct but err->apr_err isn't?
> 
> Correct.
> 

Okay.  Perhaps this could have been called out more explicitly in the
log message --- i.e., have it say not only *what* the patch does, but
also *why* it does that.

> > (and will make the test fail over ra_neon/ra_serf)
> 
> Correct.
> 
> > In other news, I've been thinking about moving the entire validation
> > logic to the C helper; that is, to have it get an extra argv argument
> > saying whether the revpropchange should pass or fail, and test by
> itself
> > that it passed/failed as expected; and the Python tests would always
> > expect it to exit(0).  What do you think?
> 
> Sounds like a good idea.
> 

Okay.  I started a patch in that way at a time; I've touched it up now 
a tiny bit and I'm attaching it.  Let me know what you think...

(I've tested it when applied on top of your patch 3/3.)

> > > Index: subversion/tests/cmdline/atomic-ra-revprop-change.c
> > > ===================================================================
> > > --- subversion/tests/cmdline/atomic-ra-revprop-change.c
> (revision 998620)
> > > +++ subversion/tests/cmdline/atomic-ra-revprop-change.c   (working
> copy)
> > > @@ -226,6 +226,8 @@
> > >                          http_library, pool);
> > >    if (err)
> > >      {
> > > +      if (svn_error_has_cause(err, SVN_ERR_BAD_OLD_VALUE))
> > > +        fprintf(stderr, "atomic-ra-revprop-change failed due to
> incorrect
> > 
> > Or even more directly:
> > 
> > - if (err)
> > + if (err && err->apr_err == SVN_ERR_BAD_OLD_VALUE)
> > 
> 
> Wouldn't that leak an error if the error isn't SVN_ERR_BAD_OLD_VALUE?
> 

Yes, it would.

> Also, the current* design requires us to use svn_error_has_cause()
> because the error is wrapped inside an error with a different code.

Yup, I've noticed this in the verbose test output I've pasted
elsethread, but you beat me to replying with the correction :)

> (FWIW, I think the RA layer shouldn't do that - I think we should
> change svn_ra_change_rev_prop() so that the simple test of
> err->apr_err works.  But that's not urgent, and could even be
> postponed to 1.8).

First of all, agreed that this is small change; I think it's more
important to be able to promise that the error situation will be
/recognizable/ then whether the recognition will be with or without
svn_error_has_cause().

For reference, this is the error chain currently (with your patch 3/3):

[[[
subversion/tests/cmdline/atomic-ra-revprop-change.c:156: (apr_err=175002)
subversion/libsvn_ra_neon/fetch.c:1210: (apr_err=175002)
atomic-ra-revprop-change: DAV request failed; it's possible that the 
repository's pre-revprop-change hook either failed or is
+non-existent
subversion/libsvn_ra_neon/props.c:1231: (apr_err=175008)
atomic-ra-revprop-change: At least one property change failed; repository is 
unchanged
subversion/libsvn_ra_neon/util.c:1550: (apr_err=125014)
subversion/libsvn_ra_neon/util.c:236: (apr_err=125014)
atomic-ra-revprop-change: Error setting property 'flower':
revprop 'flower' has unexpected value in filesystem
]]]


> 
> Kind regards,
> 
> Jon
> 
> (* Unless I missed something and the design's been changed?)
Index: subversion/tests/cmdline/svntest/actions.py
===================================================================
--- subversion/tests/cmdline/svntest/actions.py	(revision 998887)
+++ subversion/tests/cmdline/svntest/actions.py	(working copy)
@@ -152,7 +152,8 @@
                                             expected_stderr,
                                             expected_exit, 
                                             url, revision, propname,
-                                            old_propval, propval):
+                                            old_propval, propval,
+                                            want_error):
   """Run atomic-ra-revprop-change helper and check its output and exit code.
   Transforms OLD_PROPVAL and PROPVAL into a skel.
   For HTTP, the default HTTP library is used."""
@@ -173,7 +174,8 @@
                         make_proplist_skel_part(KEY_NEW_PROPVAL, propval))
 
   exit_code, out, err = main.run_atomic_ra_revprop_change(url, revision,
-                                                          propname, skel)
+                                                          propname, skel,
+                                                          want_error)
   verify.verify_outputs("Unexpected output", out, err,
                         expected_stdout, expected_stderr)
   verify.verify_exit_code(message, exit_code, expected_exit)
Index: subversion/tests/cmdline/svntest/main.py
===================================================================
--- subversion/tests/cmdline/svntest/main.py	(revision 998887)
+++ subversion/tests/cmdline/svntest/main.py	(working copy)
@@ -641,7 +641,7 @@
                                                         0, 0, None, '--subdirs', path)
   return [line.strip() for line in stdout_lines if not line.startswith("DBG:")]
 
-def run_atomic_ra_revprop_change(url, revision, propname, skel):
+def run_atomic_ra_revprop_change(url, revision, propname, skel, want_error):
   """Run the atomic-ra-revprop-change helper, returning its exit code, stdout, 
   and stderr.  For HTTP, default HTTP library is used."""
   # use spawn_process rather than run_command to avoid copying all the data
@@ -652,7 +652,7 @@
   # This passes HTTP_LIBRARY in addition to our params.
   return run_command(atomic_ra_revprop_change_binary, True, False, 
                      url, revision, propname, skel,
-                     options.http_library)
+                     options.http_library, want_error and 1 or 0)
 
 
 # Chmod recursively on a whole subtree
Index: subversion/tests/cmdline/atomic-ra-revprop-change.c
===================================================================
--- subversion/tests/cmdline/atomic-ra-revprop-change.c	(revision 998887)
+++ subversion/tests/cmdline/atomic-ra-revprop-change.c	(working copy)
@@ -41,13 +41,18 @@
 #define KEY_NEW_PROPVAL "value"
 
 #define USAGE_MSG \
-  "Usage: %s URL REVISION PROPNAME VALUES_SKEL HTTP_LIBRARY\n" \
+  "Usage: %s URL REVISION PROPNAME VALUES_SKEL HTTP_LIBRARY WANT_ERROR\n" \
   "\n" \
   "VALUES_SKEL is a proplist skel containing pseudo-properties '%s' \n" \
   "and '%s'.  A pseudo-property missing from the skel is interpreted \n" \
-  "as unset.\n"
+  "as unset.\n" \
+  "\n" \
+  "WANT_ERROR is 1 if the propchange is expected to fail due to the atomicity,"\
+  "and 0 if it is expected to succeed.  If the expectation matches reality," \
+  "the exit code shall be zero.\n"
 
 
+
 /* implements svn_auth_simple_prompt_func_t */
 static svn_error_t *
 aborting_simple_prompt_func(svn_auth_cred_simple_t **cred,
@@ -117,6 +122,8 @@
   SVN_ERR(svn_config_create(&servers, pool));
   svn_config_set(servers, SVN_CONFIG_SECTION_GLOBAL,
                  SVN_CONFIG_OPTION_HTTP_LIBRARY, http_library);
+  svn_config_set(servers, SVN_CONFIG_SECTION_GLOBAL,
+                 SVN_CONFIG_OPTION_NEON_DEBUG_MASK, getenv("SVN_NEON_DEBUG_MASK") /* "131" */);
 
   /* Populate CONFIG. */
   config = apr_hash_make(pool);
@@ -134,12 +141,14 @@
                 const svn_string_t *propval,
                 const svn_string_t *old_value,
                 const char *http_library,
+                svn_boolean_t want_error,
                 apr_pool_t *pool)
 {
   svn_ra_callbacks2_t *callbacks;
   svn_ra_session_t *sess;
   apr_hash_t *config;
   svn_boolean_t capable;
+  svn_error_t *err;
 
   SVN_ERR(svn_ra_create_callbacks(&callbacks, pool));
   SVN_ERR(construct_auth_baton(&callbacks->auth_baton, pool));
@@ -152,15 +161,34 @@
                                 SVN_RA_CAPABILITY_ATOMIC_REVPROPS,
                                 pool));
   if (capable)
-    SVN_ERR(svn_ra_change_rev_prop2(sess, revision, propname,
-                                    &old_value, propval, pool));
+    {
+      err = svn_ra_change_rev_prop2(sess, revision, propname,
+                                    &old_value, propval, pool);
+
+      if (want_error && err
+          /* ### change the error code */
+          && svn_error_has_cause(err, SVN_ERR_BAD_OLD_VALUE))
+        {
+          /* Expectation was matched.  Get out. */
+          fputs("<<<revprop 'flower' has unexpected value>>>", stderr);
+          svn_error_clear(err);
+          return SVN_NO_ERROR;
+        }
+      else if (! want_error && ! err)
+        /* Expectation was matched.  Get out. */
+      	return SVN_NO_ERROR;
+      else if (want_error && ! err)
+        return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
+                                "An error was expected but not seen");
+      else
+      	/* A real (non-SVN_ERR_BAD_PROPERY_VALUE) error. */
+      	return svn_error_return(err);
+    }
   else
     /* Running under --server-minor-version? */
     return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
                             "Server doesn't advertise "
                             "SVN_RA_CAPABILITY_ATOMIC_REVPROPS");
-
-  return SVN_NO_ERROR;
 }
 
 /* Parse SKEL_CSTR according to the description in USAGE_MSG. */
@@ -194,8 +222,9 @@
   svn_string_t *old_propval;
   const char *http_library;
   char *digits_end = NULL;
+  svn_boolean_t want_error;
 
-  if (argc != 6)
+  if (argc != 7)
     {
       fprintf(stderr, USAGE_MSG, argv[0], KEY_OLD_PROPVAL, KEY_NEW_PROPVAL);
       exit(1);
@@ -216,6 +245,7 @@
   propname = argv[3];
   SVN_INT_ERR(extract_values_from_skel(&old_propval, &propval, argv[4], pool));
   http_library = argv[5];
+  want_error = !strcmp(argv[6], "1");
 
   if ((! SVN_IS_VALID_REVNUM(revision)) || (! digits_end) || *digits_end)
     SVN_INT_ERR(svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
@@ -223,7 +253,7 @@
 
   /* Do something. */
   err = change_rev_prop(url, revision, propname, propval, old_propval,
-                        http_library, pool);
+                        http_library, want_error, pool);
   if (err)
     {
       svn_handle_error2(err, stderr, FALSE, "atomic-ra-revprop-change: ");
Index: subversion/tests/cmdline/prop_tests.py
===================================================================
--- subversion/tests/cmdline/prop_tests.py	(revision 998887)
+++ subversion/tests/cmdline/prop_tests.py	(working copy)
@@ -2010,8 +2010,8 @@
     if svntest.main.server_has_atomic_revprop():
       expected_stderr = ".*revprop 'flower' has unexpected value.*"
       svntest.actions.run_and_verify_atomic_ra_revprop_change(
-         None, None, expected_stderr, 1, repo_url, 0, 'flower',
-         not_the_old_value, proposed_value)
+         None, None, expected_stderr, 0, repo_url, 0, 'flower',
+         not_the_old_value, proposed_value, True)
     else:
       expect_old_server_fail(not_the_old_value, proposed_value)
 
@@ -2019,7 +2019,7 @@
     if svntest.main.server_has_atomic_revprop():
       svntest.actions.run_and_verify_atomic_ra_revprop_change(
          None, None, [], 0, repo_url, 0, 'flower',
-         yes_the_old_value, proposed_value)
+         yes_the_old_value, proposed_value, False)
     else:
       expect_old_server_fail(yes_the_old_value, proposed_value)
 

Reply via email to