You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ph...@apache.org on 2014/03/04 18:44:53 UTC
svn commit: r1574150 -
/subversion/branches/fsfs-lock-many/subversion/tests/libsvn_ra/ra-test.c
Author: philip
Date: Tue Mar 4 17:44:53 2014
New Revision: 1574150
URL: http://svn.apache.org/r1574150
Log:
* subversion/tests/libsvn_ra/ra-test.c
(lock_test): Extend to test force unlock.
Modified:
subversion/branches/fsfs-lock-many/subversion/tests/libsvn_ra/ra-test.c
Modified: subversion/branches/fsfs-lock-many/subversion/tests/libsvn_ra/ra-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-lock-many/subversion/tests/libsvn_ra/ra-test.c?rev=1574150&r1=1574149&r2=1574150&view=diff
==============================================================================
--- subversion/branches/fsfs-lock-many/subversion/tests/libsvn_ra/ra-test.c (original)
+++ subversion/branches/fsfs-lock-many/subversion/tests/libsvn_ra/ra-test.c Tue Mar 4 17:44:53 2014
@@ -416,11 +416,13 @@ lock_test(const svn_test_opts_t *opts,
apr_pool_t *pool)
{
svn_ra_session_t *session;
- apr_hash_t *targets = apr_hash_make(pool);
+ apr_hash_t *lock_targets = apr_hash_make(pool);
+ apr_hash_t *unlock_targets = apr_hash_make(pool);
svn_revnum_t rev = 1;
svn_fs_lock_result_t *result;
struct lock_baton_t baton;
svn_lock_t *lock;
+ apr_hash_index_t *hi;
SVN_ERR(make_and_open_local_repos(&session, "test-repo-lock", opts,
pool));
@@ -429,11 +431,11 @@ lock_test(const svn_test_opts_t *opts,
baton.results = apr_hash_make(pool);
baton.pool = pool;
- svn_hash_sets(targets, "A/B/f", &rev);
- svn_hash_sets(targets, "A/B/g", &rev);
- svn_hash_sets(targets, "A/B/z", &rev);
- svn_hash_sets(targets, "A/BB/f", &rev);
- svn_hash_sets(targets, "X/z", &rev);
+ svn_hash_sets(lock_targets, "A/B/f", &rev);
+ svn_hash_sets(lock_targets, "A/B/g", &rev);
+ svn_hash_sets(lock_targets, "A/B/z", &rev);
+ svn_hash_sets(lock_targets, "A/BB/f", &rev);
+ svn_hash_sets(lock_targets, "X/z", &rev);
#define EXPECT_LOCK(path) \
result = svn_hash_gets(baton.results, (path)); \
@@ -447,35 +449,76 @@ lock_test(const svn_test_opts_t *opts,
SVN_ERR(svn_ra_get_lock(session, &lock, (path), pool)); \
SVN_TEST_ASSERT(!lock)
- SVN_ERR(svn_ra_lock(session, targets, "foo", FALSE, lock_cb, &baton, pool));
+#define EXPECT_UNLOCK(path) \
+ result = svn_hash_gets(baton.results, (path)); \
+ SVN_TEST_ASSERT(result && !result->err); \
+ SVN_ERR(svn_ra_get_lock(session, &lock, (path), pool)); \
+ SVN_TEST_ASSERT(!lock)
- apr_hash_clear(targets);
+#define EXPECT_UNLOCK_ERROR(path) \
+ result = svn_hash_gets(baton.results, (path)); \
+ SVN_TEST_ASSERT(result && result->err); \
+ SVN_ERR(svn_ra_get_lock(session, &lock, (path), pool)); \
+ SVN_TEST_ASSERT(lock)
+
+ /* Lock some paths. */
+ SVN_ERR(svn_ra_lock(session, lock_targets, "foo", FALSE, lock_cb, &baton,
+ pool));
EXPECT_LOCK("A/B/f");
- svn_hash_sets(targets, "A/B/f", result->lock->token);
EXPECT_LOCK("A/B/g");
- svn_hash_sets(targets, "A/B/g", result->lock->token);
EXPECT_ERROR("A/B/z");
- svn_hash_sets(targets, "A/B/z", "foo");
EXPECT_LOCK("A/BB/f");
- svn_hash_sets(targets, "A/BB/f", result->lock->token);
EXPECT_ERROR("X/z");
- svn_hash_sets(targets, "X/z", "foo");
-#define EXPECT_NO_ERROR(path) \
- result = svn_hash_gets(baton.results, (path)); \
- SVN_TEST_ASSERT(result && !result->err)
+ /* Unlock without force and wrong lock tokens */
+ for (hi = apr_hash_first(pool, lock_targets); hi; hi = apr_hash_next(hi))
+ svn_hash_sets(unlock_targets, svn__apr_hash_index_key(hi), "wrong-token");
+ apr_hash_clear(baton.results);
+ SVN_ERR(svn_ra_unlock(session, unlock_targets, FALSE, lock_cb, &baton, pool));
+
+ EXPECT_UNLOCK_ERROR("A/B/f");
+ EXPECT_UNLOCK_ERROR("A/B/g");
+ EXPECT_ERROR("A/B/z");
+ EXPECT_UNLOCK_ERROR("A/BB/f");
+ EXPECT_ERROR("X/z");
+ /* Force unlock */
+ for (hi = apr_hash_first(pool, lock_targets); hi; hi = apr_hash_next(hi))
+ svn_hash_sets(unlock_targets, svn__apr_hash_index_key(hi), "");
apr_hash_clear(baton.results);
+ SVN_ERR(svn_ra_unlock(session, unlock_targets, TRUE, lock_cb, &baton, pool));
- SVN_ERR(svn_ra_unlock(session, targets, FALSE, lock_cb, &baton, pool));
+ EXPECT_UNLOCK("A/B/f");
+ EXPECT_UNLOCK("A/B/g");
+ EXPECT_ERROR("A/B/z");
+ EXPECT_UNLOCK("A/BB/f");
+ EXPECT_ERROR("X/z");
+
+ /* Lock again. */
+ apr_hash_clear(baton.results);
+ SVN_ERR(svn_ra_lock(session, lock_targets, "foo", FALSE, lock_cb, &baton,
+ pool));
- apr_hash_clear(targets);
- EXPECT_NO_ERROR("A/B/f");
- EXPECT_NO_ERROR("A/B/g");
+ EXPECT_LOCK("A/B/f");
+ EXPECT_LOCK("A/B/g");
EXPECT_ERROR("A/B/z");
- EXPECT_NO_ERROR("A/BB/f");
+ EXPECT_LOCK("A/BB/f");
EXPECT_ERROR("X/z");
+
+ for (hi = apr_hash_first(pool, baton.results); hi; hi = apr_hash_next(hi))
+ {
+ result = svn__apr_hash_index_val(hi);
+ svn_hash_sets(unlock_targets, svn__apr_hash_index_key(hi),
+ result->lock ? result->lock->token : "non-existent-token");
+ }
+ apr_hash_clear(baton.results);
+ SVN_ERR(svn_ra_unlock(session, unlock_targets, FALSE, lock_cb, &baton, pool));
+
+ EXPECT_UNLOCK("A/B/f");
+ EXPECT_UNLOCK("A/B/g");
+ EXPECT_ERROR("A/B/z");
+ EXPECT_UNLOCK("A/BB/f");
EXPECT_ERROR("X/z");
return SVN_NO_ERROR;