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/02/25 21:18:18 UTC
svn commit: r1571812 [2/2] - in
/subversion/branches/fsfs-lock-many/subversion: include/ libsvn_fs/
libsvn_fs_base/ libsvn_fs_fs/ libsvn_repos/ tests/libsvn_fs/ tests/libsvn_ra/
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=1571812&r1=1571811&r2=1571812&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 Feb 25 20:18:18 2014
@@ -35,6 +35,7 @@
#include "svn_pools.h"
#include "svn_cmdline.h"
#include "svn_dirent_uri.h"
+#include "svn_hash.h"
#include "../svn_test.h"
#include "../svn_test_fs.h"
@@ -58,6 +59,13 @@ make_and_open_local_repos(svn_ra_session
svn_ra_callbacks2_t *cbtable;
SVN_ERR(svn_ra_create_callbacks(&cbtable, pool));
+ SVN_ERR(svn_cmdline_create_auth_baton(&cbtable->auth_baton,
+ TRUE /* non_interactive */,
+ "jrandom", "rayjandom",
+ NULL,
+ TRUE /* no_auth_cache */,
+ FALSE /* trust_server_cert */,
+ NULL, NULL, NULL, pool));
SVN_ERR(svn_test__create_repos(&repos, repos_name, opts, pool));
SVN_ERR(svn_ra_initialize(pool));
@@ -94,6 +102,48 @@ commit_changes(svn_ra_session_t *session
return SVN_NO_ERROR;
}
+static svn_error_t *
+commit_tree(svn_ra_session_t *session,
+ apr_pool_t *pool)
+{
+ apr_hash_t *revprop_table = apr_hash_make(pool);
+ const svn_delta_editor_t *editor;
+ void *edit_baton;
+ const char *repos_root_url;
+ void *root_baton, *A_baton, *B_baton, *file_baton;
+
+ SVN_ERR(svn_ra_get_commit_editor3(session, &editor, &edit_baton,
+ revprop_table,
+ NULL, NULL, NULL, TRUE, pool));
+ SVN_ERR(svn_ra_get_repos_root(session, &repos_root_url, pool));
+
+ SVN_ERR(editor->open_root(edit_baton, SVN_INVALID_REVNUM,
+ pool, &root_baton));
+ SVN_ERR(editor->add_directory("A", root_baton, NULL, SVN_INVALID_REVNUM,
+ pool, &A_baton));
+ SVN_ERR(editor->add_directory("A/B", A_baton, NULL, SVN_INVALID_REVNUM,
+ pool, &B_baton));
+ SVN_ERR(editor->add_file("A/B/f", B_baton, NULL, SVN_INVALID_REVNUM,
+ pool, &file_baton));
+ SVN_ERR(editor->close_file(file_baton, NULL, pool));
+ SVN_ERR(editor->add_file("A/B/g", B_baton, NULL, SVN_INVALID_REVNUM,
+ pool, &file_baton));
+ SVN_ERR(editor->close_file(file_baton, NULL, pool));
+ SVN_ERR(editor->close_directory(B_baton, pool));
+ SVN_ERR(editor->add_directory("A/BB", A_baton, NULL, SVN_INVALID_REVNUM,
+ pool, &B_baton));
+ SVN_ERR(editor->add_file("A/BB/f", B_baton, NULL, SVN_INVALID_REVNUM,
+ pool, &file_baton));
+ SVN_ERR(editor->close_file(file_baton, NULL, pool));
+ SVN_ERR(editor->add_file("A/BB/g", B_baton, NULL, SVN_INVALID_REVNUM,
+ pool, &file_baton));
+ SVN_ERR(editor->close_file(file_baton, NULL, pool));
+ SVN_ERR(editor->close_directory(B_baton, pool));
+ SVN_ERR(editor->close_directory(A_baton, pool));
+ SVN_ERR(editor->close_edit(edit_baton, pool));
+ return SVN_NO_ERROR;
+}
+
static svn_boolean_t last_tunnel_check;
static int tunnel_open_count;
static void *check_tunnel_baton;
@@ -324,6 +374,113 @@ tunnel_callback_test(const svn_test_opts
return SVN_NO_ERROR;
}
+struct lock_baton_t {
+ apr_hash_t *results;
+ apr_pool_t *pool;
+};
+
+/* Implements svn_ra_lock_callback_t. */
+static svn_error_t *
+lock_cb(void *baton,
+ const char *path,
+ svn_boolean_t do_lock,
+ const svn_lock_t *lock,
+ svn_error_t *ra_err,
+ apr_pool_t *pool)
+{
+ struct lock_baton_t *b = baton;
+ svn_fs_lock_result_t *result = apr_palloc(b->pool,
+ sizeof(svn_fs_lock_result_t));
+
+ if (lock)
+ {
+ result->lock = apr_palloc(b->pool, sizeof(svn_lock_t));
+ *result->lock = *lock;
+ result->lock->path = apr_pstrdup(b->pool, lock->path);
+ result->lock->token = apr_pstrdup(b->pool, lock->token);
+ result->lock->owner = apr_pstrdup(b->pool, lock->owner);
+ result->lock->comment = apr_pstrdup(b->pool, lock->comment);
+ }
+ else
+ result->lock = NULL;
+ result->err = ra_err;
+
+ svn_hash_sets(b->results, apr_pstrdup(b->pool, path), result);
+
+ return SVN_NO_ERROR;
+}
+
+/* Test svn_ra_lock(). */
+static svn_error_t *
+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);
+ svn_revnum_t rev = 1;
+ svn_fs_lock_result_t *result;
+ struct lock_baton_t baton;
+ svn_lock_t *lock;
+
+ SVN_ERR(make_and_open_local_repos(&session, "test-repo-lock", opts,
+ pool));
+ SVN_ERR(commit_tree(session, pool));
+
+ 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);
+
+#define EXPECT_LOCK(path) \
+ result = svn_hash_gets(baton.results, (path)); \
+ SVN_TEST_ASSERT(result && result->lock && !result->err); \
+ SVN_ERR(svn_ra_get_lock(session, &lock, (path), pool)); \
+ SVN_TEST_ASSERT(lock)
+
+#define EXPECT_ERROR(path) \
+ result = svn_hash_gets(baton.results, (path)); \
+ SVN_TEST_ASSERT(result && !result->lock && result->err); \
+ 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));
+
+ apr_hash_clear(targets);
+
+ 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)
+
+ apr_hash_clear(baton.results);
+
+ SVN_ERR(svn_ra_unlock(session, targets, FALSE, lock_cb, &baton, pool));
+
+ apr_hash_clear(targets);
+ EXPECT_NO_ERROR("A/B/f");
+ EXPECT_NO_ERROR("A/B/g");
+ EXPECT_ERROR("A/B/z");
+ EXPECT_NO_ERROR("A/BB/f");
+ EXPECT_ERROR("X/z");
+ EXPECT_ERROR("X/z");
+
+ return SVN_NO_ERROR;
+}
+
/* The test table. */
@@ -339,5 +496,7 @@ struct svn_test_descriptor_t test_funcs[
"test ra_svn tunnel callback check"),
SVN_TEST_OPTS_PASS(tunnel_callback_test,
"test ra_svn tunnel creation callbacks"),
+ SVN_TEST_OPTS_PASS(lock_test,
+ "lock multiple paths"),
SVN_TEST_NULL
};