Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'tests-clar/refdb/inmemory.c')
-rw-r--r--tests-clar/refdb/inmemory.c213
1 files changed, 213 insertions, 0 deletions
diff --git a/tests-clar/refdb/inmemory.c b/tests-clar/refdb/inmemory.c
new file mode 100644
index 000000000..6f5651964
--- /dev/null
+++ b/tests-clar/refdb/inmemory.c
@@ -0,0 +1,213 @@
+#include "clar_libgit2.h"
+#include "refdb.h"
+#include "repository.h"
+#include "testdb.h"
+
+#define TEST_REPO_PATH "testrepo"
+
+static git_repository *repo;
+static git_refdb *refdb;
+static git_refdb_backend *refdb_backend;
+
+int unlink_ref(void *payload, git_buf *file)
+{
+ GIT_UNUSED(payload);
+ return p_unlink(git_buf_cstr(file));
+}
+
+int empty(void *payload, git_buf *file)
+{
+ GIT_UNUSED(payload);
+ GIT_UNUSED(file);
+ return -1;
+}
+
+int ref_file_foreach(git_repository *repo, int (* cb)(void *payload, git_buf *filename))
+{
+ const char *repo_path;
+ git_buf repo_refs_dir = GIT_BUF_INIT;
+ int error = 0;
+
+ repo_path = git_repository_path(repo);
+
+ git_buf_joinpath(&repo_refs_dir, repo_path, "HEAD");
+ if (git_path_exists(git_buf_cstr(&repo_refs_dir)) &&
+ cb(NULL, &repo_refs_dir) < 0)
+ return -1;
+
+ git_buf_joinpath(&repo_refs_dir, repo_path, "refs");
+ git_buf_joinpath(&repo_refs_dir, git_buf_cstr(&repo_refs_dir), "heads");
+ if (git_path_direach(&repo_refs_dir, cb, NULL) != 0)
+ return -1;
+
+ git_buf_joinpath(&repo_refs_dir, repo_path, "packed-refs");
+ if (git_path_exists(git_buf_cstr(&repo_refs_dir)) &&
+ cb(NULL, &repo_refs_dir) < 0)
+ return -1;
+
+ git_buf_free(&repo_refs_dir);
+
+ return error;
+}
+
+void test_refdb_inmemory__initialize(void)
+{
+ git_buf repo_refs_dir = GIT_BUF_INIT;
+
+ repo = cl_git_sandbox_init(TEST_REPO_PATH);
+
+ cl_git_pass(git_repository_refdb(&refdb, repo));
+ cl_git_pass(refdb_backend_test(&refdb_backend, repo));
+ cl_git_pass(git_refdb_set_backend(refdb, refdb_backend));
+
+
+ ref_file_foreach(repo, unlink_ref);
+
+ git_buf_free(&repo_refs_dir);
+}
+
+void test_refdb_inmemory__cleanup(void)
+{
+ cl_git_sandbox_cleanup();
+}
+
+void test_refdb_inmemory__doesnt_write_ref_file(void)
+{
+ git_reference *ref;
+ git_oid oid;
+
+ cl_git_pass(git_oid_fromstr(&oid, "c47800c7266a2be04c571c04d5a6614691ea99bd"));
+ cl_git_pass(git_reference_create(&ref, repo, GIT_REFS_HEADS_DIR "test1", &oid, 0));
+
+ ref_file_foreach(repo, empty);
+
+ git_reference_free(ref);
+}
+
+void test_refdb_inmemory__read(void)
+{
+ git_reference *write1, *write2, *write3, *read1, *read2, *read3;
+ git_oid oid1, oid2, oid3;
+
+ cl_git_pass(git_oid_fromstr(&oid1, "c47800c7266a2be04c571c04d5a6614691ea99bd"));
+ cl_git_pass(git_reference_create(&write1, repo, GIT_REFS_HEADS_DIR "test1", &oid1, 0));
+
+ cl_git_pass(git_oid_fromstr(&oid2, "e90810b8df3e80c413d903f631643c716887138d"));
+ cl_git_pass(git_reference_create(&write2, repo, GIT_REFS_HEADS_DIR "test2", &oid2, 0));
+
+ cl_git_pass(git_oid_fromstr(&oid3, "763d71aadf09a7951596c9746c024e7eece7c7af"));
+ cl_git_pass(git_reference_create(&write3, repo, GIT_REFS_HEADS_DIR "test3", &oid3, 0));
+
+
+ cl_git_pass(git_reference_lookup(&read1, repo, GIT_REFS_HEADS_DIR "test1"));
+ cl_assert(strcmp(git_reference_name(read1), git_reference_name(write1)) == 0);
+ cl_assert(git_oid_cmp(git_reference_target(read1), git_reference_target(write1)) == 0);
+
+ cl_git_pass(git_reference_lookup(&read2, repo, GIT_REFS_HEADS_DIR "test2"));
+ cl_assert(strcmp(git_reference_name(read2), git_reference_name(write2)) == 0);
+ cl_assert(git_oid_cmp(git_reference_target(read2), git_reference_target(write2)) == 0);
+
+ cl_git_pass(git_reference_lookup(&read3, repo, GIT_REFS_HEADS_DIR "test3"));
+ cl_assert(strcmp(git_reference_name(read3), git_reference_name(write3)) == 0);
+ cl_assert(git_oid_cmp(git_reference_target(read3), git_reference_target(write3)) == 0);
+
+ git_reference_free(write1);
+ git_reference_free(write2);
+ git_reference_free(write3);
+
+ git_reference_free(read1);
+ git_reference_free(read2);
+ git_reference_free(read3);
+}
+
+int foreach_test(const char *ref_name, void *payload)
+{
+ git_reference *ref;
+ git_oid expected;
+ size_t *i = payload;
+
+ cl_git_pass(git_reference_lookup(&ref, repo, ref_name));
+
+ if (*i == 0)
+ cl_git_pass(git_oid_fromstr(&expected, "c47800c7266a2be04c571c04d5a6614691ea99bd"));
+ else if (*i == 1)
+ cl_git_pass(git_oid_fromstr(&expected, "e90810b8df3e80c413d903f631643c716887138d"));
+ else if (*i == 2)
+ cl_git_pass(git_oid_fromstr(&expected, "763d71aadf09a7951596c9746c024e7eece7c7af"));
+
+ cl_assert(git_oid_cmp(&expected, &ref->target.oid) == 0);
+
+ ++(*i);
+
+ git_reference_free(ref);
+
+ return 0;
+}
+
+void test_refdb_inmemory__foreach(void)
+{
+ git_reference *write1, *write2, *write3;
+ git_oid oid1, oid2, oid3;
+ size_t i = 0;
+
+ cl_git_pass(git_oid_fromstr(&oid1, "c47800c7266a2be04c571c04d5a6614691ea99bd"));
+ cl_git_pass(git_reference_create(&write1, repo, GIT_REFS_HEADS_DIR "test1", &oid1, 0));
+
+ cl_git_pass(git_oid_fromstr(&oid2, "e90810b8df3e80c413d903f631643c716887138d"));
+ cl_git_pass(git_reference_create(&write2, repo, GIT_REFS_HEADS_DIR "test2", &oid2, 0));
+
+ cl_git_pass(git_oid_fromstr(&oid3, "763d71aadf09a7951596c9746c024e7eece7c7af"));
+ cl_git_pass(git_reference_create(&write3, repo, GIT_REFS_HEADS_DIR "test3", &oid3, 0));
+
+ cl_git_pass(git_reference_foreach(repo, GIT_REF_LISTALL, foreach_test, &i));
+ cl_assert_equal_i(i, 3);
+
+ git_reference_free(write1);
+ git_reference_free(write2);
+ git_reference_free(write3);
+}
+
+int delete_test(const char *ref_name, void *payload)
+{
+ git_reference *ref;
+ git_oid expected;
+ size_t *i = payload;
+
+ cl_git_pass(git_reference_lookup(&ref, repo, ref_name));
+
+ cl_git_pass(git_oid_fromstr(&expected, "e90810b8df3e80c413d903f631643c716887138d"));
+ cl_assert(git_oid_cmp(&expected, &ref->target.oid) == 0);
+
+ ++(*i);
+
+ git_reference_free(ref);
+
+ return 0;
+}
+
+void test_refdb_inmemory__delete(void)
+{
+ git_reference *write1, *write2, *write3;
+ git_oid oid1, oid2, oid3;
+ size_t i = 0;
+
+ cl_git_pass(git_oid_fromstr(&oid1, "c47800c7266a2be04c571c04d5a6614691ea99bd"));
+ cl_git_pass(git_reference_create(&write1, repo, GIT_REFS_HEADS_DIR "test1", &oid1, 0));
+
+ cl_git_pass(git_oid_fromstr(&oid2, "e90810b8df3e80c413d903f631643c716887138d"));
+ cl_git_pass(git_reference_create(&write2, repo, GIT_REFS_HEADS_DIR "test2", &oid2, 0));
+
+ cl_git_pass(git_oid_fromstr(&oid3, "763d71aadf09a7951596c9746c024e7eece7c7af"));
+ cl_git_pass(git_reference_create(&write3, repo, GIT_REFS_HEADS_DIR "test3", &oid3, 0));
+
+ git_reference_delete(write1);
+ git_reference_free(write1);
+
+ git_reference_delete(write3);
+ git_reference_free(write3);
+
+ cl_git_pass(git_reference_foreach(repo, GIT_REF_LISTALL, delete_test, &i));
+ cl_assert_equal_i(i, 1);
+
+ git_reference_free(write2);
+}