diff options
Diffstat (limited to 'tests-clar/refdb/inmemory.c')
-rw-r--r-- | tests-clar/refdb/inmemory.c | 213 |
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); +} |