mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-22 08:13:02 +00:00

In the odb::backend::nonrefreshing test suite, we set up a fake backend so that we are able to determine if backend functions are called correctly. During the setup, we also parse an OID which is later on used to read out the pseudo-object. While this procedure works right now, it will create problems later when we implement hash verification for looked up objects. The current OID ("deadbeef") will not match the hash of contents we give back to the ODB layer and thus cannot be verified. Make the hash configurable so that we can simply switch the returned for single tests.
277 lines
5.8 KiB
C
277 lines
5.8 KiB
C
#include "clar_libgit2.h"
|
|
#include "git2/sys/odb_backend.h"
|
|
#include "repository.h"
|
|
|
|
typedef struct fake_backend {
|
|
git_odb_backend parent;
|
|
|
|
git_error_code error_code;
|
|
|
|
int exists_calls;
|
|
int read_calls;
|
|
int read_header_calls;
|
|
int read_prefix_calls;
|
|
} fake_backend;
|
|
|
|
static git_repository *_repo;
|
|
static fake_backend *_fake;
|
|
static git_oid _oid;
|
|
|
|
#define HASH "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"
|
|
|
|
static int fake_backend__exists(git_odb_backend *backend, const git_oid *oid)
|
|
{
|
|
fake_backend *fake;
|
|
|
|
GIT_UNUSED(oid);
|
|
|
|
fake = (fake_backend *)backend;
|
|
|
|
fake->exists_calls++;
|
|
|
|
return (fake->error_code == GIT_OK);
|
|
}
|
|
|
|
static int fake_backend__read(
|
|
void **buffer_p, size_t *len_p, git_otype *type_p,
|
|
git_odb_backend *backend, const git_oid *oid)
|
|
{
|
|
fake_backend *fake;
|
|
|
|
GIT_UNUSED(buffer_p);
|
|
GIT_UNUSED(len_p);
|
|
GIT_UNUSED(type_p);
|
|
GIT_UNUSED(oid);
|
|
|
|
fake = (fake_backend *)backend;
|
|
|
|
fake->read_calls++;
|
|
|
|
*len_p = 0;
|
|
*buffer_p = NULL;
|
|
*type_p = GIT_OBJ_BLOB;
|
|
|
|
return fake->error_code;
|
|
}
|
|
|
|
static int fake_backend__read_header(
|
|
size_t *len_p, git_otype *type_p,
|
|
git_odb_backend *backend, const git_oid *oid)
|
|
{
|
|
fake_backend *fake;
|
|
|
|
GIT_UNUSED(len_p);
|
|
GIT_UNUSED(type_p);
|
|
GIT_UNUSED(oid);
|
|
|
|
fake = (fake_backend *)backend;
|
|
|
|
fake->read_header_calls++;
|
|
|
|
*len_p = 0;
|
|
*type_p = GIT_OBJ_BLOB;
|
|
|
|
return fake->error_code;
|
|
}
|
|
|
|
static int fake_backend__read_prefix(
|
|
git_oid *out_oid, void **buffer_p, size_t *len_p, git_otype *type_p,
|
|
git_odb_backend *backend, const git_oid *short_oid, size_t len)
|
|
{
|
|
fake_backend *fake;
|
|
|
|
GIT_UNUSED(buffer_p);
|
|
GIT_UNUSED(len_p);
|
|
GIT_UNUSED(type_p);
|
|
GIT_UNUSED(short_oid);
|
|
GIT_UNUSED(len);
|
|
|
|
fake = (fake_backend *)backend;
|
|
|
|
fake->read_prefix_calls++;
|
|
|
|
git_oid_cpy(out_oid, &_oid);
|
|
*len_p = 0;
|
|
*buffer_p = NULL;
|
|
*type_p = GIT_OBJ_BLOB;
|
|
|
|
return fake->error_code;
|
|
}
|
|
|
|
static void fake_backend__free(git_odb_backend *_backend)
|
|
{
|
|
fake_backend *backend;
|
|
|
|
backend = (fake_backend *)_backend;
|
|
|
|
git__free(backend);
|
|
}
|
|
|
|
static int build_fake_backend(
|
|
git_odb_backend **out,
|
|
git_error_code error_code)
|
|
{
|
|
fake_backend *backend;
|
|
|
|
backend = git__calloc(1, sizeof(fake_backend));
|
|
GITERR_CHECK_ALLOC(backend);
|
|
|
|
backend->parent.version = GIT_ODB_BACKEND_VERSION;
|
|
|
|
backend->parent.refresh = NULL;
|
|
backend->error_code = error_code;
|
|
|
|
backend->parent.read = fake_backend__read;
|
|
backend->parent.read_prefix = fake_backend__read_prefix;
|
|
backend->parent.read_header = fake_backend__read_header;
|
|
backend->parent.exists = fake_backend__exists;
|
|
backend->parent.free = &fake_backend__free;
|
|
|
|
*out = (git_odb_backend *)backend;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void setup_repository_and_backend(git_error_code error_code, const char *hash)
|
|
{
|
|
git_odb *odb = NULL;
|
|
git_odb_backend *backend = NULL;
|
|
|
|
_repo = cl_git_sandbox_init("testrepo.git");
|
|
|
|
cl_git_pass(build_fake_backend(&backend, error_code));
|
|
|
|
cl_git_pass(git_repository_odb__weakptr(&odb, _repo));
|
|
cl_git_pass(git_odb_add_backend(odb, backend, 10));
|
|
|
|
_fake = (fake_backend *)backend;
|
|
|
|
cl_git_pass(git_oid_fromstr(&_oid, hash));
|
|
}
|
|
|
|
void test_odb_backend_nonrefreshing__cleanup(void)
|
|
{
|
|
cl_git_sandbox_cleanup();
|
|
}
|
|
|
|
void test_odb_backend_nonrefreshing__exists_is_invoked_once_on_failure(void)
|
|
{
|
|
git_odb *odb;
|
|
|
|
setup_repository_and_backend(GIT_ENOTFOUND, HASH);
|
|
|
|
cl_git_pass(git_repository_odb__weakptr(&odb, _repo));
|
|
cl_assert_equal_b(false, git_odb_exists(odb, &_oid));
|
|
|
|
cl_assert_equal_i(1, _fake->exists_calls);
|
|
}
|
|
|
|
void test_odb_backend_nonrefreshing__read_is_invoked_once_on_failure(void)
|
|
{
|
|
git_object *obj;
|
|
|
|
setup_repository_and_backend(GIT_ENOTFOUND, HASH);
|
|
|
|
cl_git_fail_with(
|
|
git_object_lookup(&obj, _repo, &_oid, GIT_OBJ_ANY),
|
|
GIT_ENOTFOUND);
|
|
|
|
cl_assert_equal_i(1, _fake->read_calls);
|
|
}
|
|
|
|
void test_odb_backend_nonrefreshing__readprefix_is_invoked_once_on_failure(void)
|
|
{
|
|
git_object *obj;
|
|
|
|
setup_repository_and_backend(GIT_ENOTFOUND, HASH);
|
|
|
|
cl_git_fail_with(
|
|
git_object_lookup_prefix(&obj, _repo, &_oid, 7, GIT_OBJ_ANY),
|
|
GIT_ENOTFOUND);
|
|
|
|
cl_assert_equal_i(1, _fake->read_prefix_calls);
|
|
}
|
|
|
|
void test_odb_backend_nonrefreshing__readheader_is_invoked_once_on_failure(void)
|
|
{
|
|
git_odb *odb;
|
|
size_t len;
|
|
git_otype type;
|
|
|
|
setup_repository_and_backend(GIT_ENOTFOUND, HASH);
|
|
|
|
cl_git_pass(git_repository_odb__weakptr(&odb, _repo));
|
|
|
|
cl_git_fail_with(
|
|
git_odb_read_header(&len, &type, odb, &_oid),
|
|
GIT_ENOTFOUND);
|
|
|
|
cl_assert_equal_i(1, _fake->read_header_calls);
|
|
}
|
|
|
|
void test_odb_backend_nonrefreshing__exists_is_invoked_once_on_success(void)
|
|
{
|
|
git_odb *odb;
|
|
|
|
setup_repository_and_backend(GIT_OK, HASH);
|
|
|
|
cl_git_pass(git_repository_odb__weakptr(&odb, _repo));
|
|
cl_assert_equal_b(true, git_odb_exists(odb, &_oid));
|
|
|
|
cl_assert_equal_i(1, _fake->exists_calls);
|
|
}
|
|
|
|
void test_odb_backend_nonrefreshing__read_is_invoked_once_on_success(void)
|
|
{
|
|
git_object *obj;
|
|
|
|
setup_repository_and_backend(GIT_OK, HASH);
|
|
|
|
cl_git_pass(git_object_lookup(&obj, _repo, &_oid, GIT_OBJ_ANY));
|
|
|
|
cl_assert_equal_i(1, _fake->read_calls);
|
|
|
|
git_object_free(obj);
|
|
}
|
|
|
|
void test_odb_backend_nonrefreshing__readprefix_is_invoked_once_on_success(void)
|
|
{
|
|
git_object *obj;
|
|
|
|
setup_repository_and_backend(GIT_OK, EMPTY_HASH);
|
|
|
|
cl_git_pass(git_object_lookup_prefix(&obj, _repo, &_oid, 7, GIT_OBJ_ANY));
|
|
|
|
cl_assert_equal_i(1, _fake->read_prefix_calls);
|
|
|
|
git_object_free(obj);
|
|
}
|
|
|
|
void test_odb_backend_nonrefreshing__readheader_is_invoked_once_on_success(void)
|
|
{
|
|
git_odb *odb;
|
|
size_t len;
|
|
git_otype type;
|
|
|
|
setup_repository_and_backend(GIT_OK, HASH);
|
|
|
|
cl_git_pass(git_repository_odb__weakptr(&odb, _repo));
|
|
|
|
cl_git_pass(git_odb_read_header(&len, &type, odb, &_oid));
|
|
|
|
cl_assert_equal_i(1, _fake->read_header_calls);
|
|
}
|
|
|
|
void test_odb_backend_nonrefreshing__read_is_invoked_once_when_revparsing_a_full_oid(void)
|
|
{
|
|
git_object *obj;
|
|
|
|
setup_repository_and_backend(GIT_ENOTFOUND, HASH);
|
|
|
|
cl_git_fail_with(
|
|
git_revparse_single(&obj, _repo, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"),
|
|
GIT_ENOTFOUND);
|
|
|
|
cl_assert_equal_i(1, _fake->read_calls);
|
|
}
|