mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-05 22:55:47 +00:00

Right now, the fake backend is quite restrained in the way how it works: we pass it an OID which it is to return later as well as an error code we want it to return. While this is sufficient for existing tests, we can make the fake backend a little bit more generic in order to allow us testing for additional scenarios. To do so, we change the backend to not accept an error code and OID which it is to return for queries, but instead a simple array of OIDs with their respective blob contents. On each query, the fake backend simply iterates through this array and returns the first matching object.
148 lines
3.4 KiB
C
148 lines
3.4 KiB
C
#include "clar_libgit2.h"
|
|
#include "repository.h"
|
|
#include "backend_helpers.h"
|
|
|
|
static git_repository *_repo;
|
|
static fake_backend *_fake;
|
|
|
|
#define NONEXISTING_HASH "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"
|
|
#define EXISTING_HASH "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
|
|
|
static const fake_object _objects[] = {
|
|
{ EXISTING_HASH, "" },
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
static git_oid _nonexisting_oid;
|
|
static git_oid _existing_oid;
|
|
|
|
static void setup_repository_and_backend(void)
|
|
{
|
|
git_odb *odb = NULL;
|
|
git_odb_backend *backend = NULL;
|
|
|
|
_repo = cl_git_sandbox_init("testrepo.git");
|
|
|
|
cl_git_pass(build_fake_backend(&backend, _objects));
|
|
|
|
cl_git_pass(git_repository_odb__weakptr(&odb, _repo));
|
|
cl_git_pass(git_odb_add_backend(odb, backend, 10));
|
|
|
|
_fake = (fake_backend *)backend;
|
|
}
|
|
|
|
void test_odb_backend_nonrefreshing__initialize(void)
|
|
{
|
|
git_oid_fromstr(&_nonexisting_oid, NONEXISTING_HASH);
|
|
git_oid_fromstr(&_existing_oid, EXISTING_HASH);
|
|
setup_repository_and_backend();
|
|
}
|
|
|
|
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;
|
|
|
|
cl_git_pass(git_repository_odb__weakptr(&odb, _repo));
|
|
cl_assert_equal_b(false, git_odb_exists(odb, &_nonexisting_oid));
|
|
|
|
cl_assert_equal_i(1, _fake->exists_calls);
|
|
}
|
|
|
|
void test_odb_backend_nonrefreshing__read_is_invoked_once_on_failure(void)
|
|
{
|
|
git_object *obj;
|
|
|
|
cl_git_fail_with(
|
|
git_object_lookup(&obj, _repo, &_nonexisting_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;
|
|
|
|
cl_git_fail_with(
|
|
git_object_lookup_prefix(&obj, _repo, &_nonexisting_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;
|
|
|
|
cl_git_pass(git_repository_odb__weakptr(&odb, _repo));
|
|
|
|
cl_git_fail_with(
|
|
git_odb_read_header(&len, &type, odb, &_nonexisting_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;
|
|
|
|
cl_git_pass(git_repository_odb__weakptr(&odb, _repo));
|
|
cl_assert_equal_b(true, git_odb_exists(odb, &_existing_oid));
|
|
|
|
cl_assert_equal_i(1, _fake->exists_calls);
|
|
}
|
|
|
|
void test_odb_backend_nonrefreshing__read_is_invoked_once_on_success(void)
|
|
{
|
|
git_object *obj;
|
|
|
|
cl_git_pass(git_object_lookup(&obj, _repo, &_existing_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;
|
|
|
|
cl_git_pass(git_object_lookup_prefix(&obj, _repo, &_existing_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;
|
|
|
|
cl_git_pass(git_repository_odb__weakptr(&odb, _repo));
|
|
|
|
cl_git_pass(git_odb_read_header(&len, &type, odb, &_existing_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;
|
|
|
|
cl_git_fail_with(
|
|
git_revparse_single(&obj, _repo, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"),
|
|
GIT_ENOTFOUND);
|
|
|
|
cl_assert_equal_i(1, _fake->read_calls);
|
|
}
|