Blame tests/odb/backend/simple.c

Packit Service 20376f
#include "clar_libgit2.h"
Packit Service 20376f
#include "repository.h"
Packit Service 20376f
#include "backend_helpers.h"
Packit Service 20376f
Packit Service 20376f
#define EMPTY_HASH "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
Packit Service 20376f
Packit Service 20376f
static git_repository *_repo;
Packit Service 20376f
static git_odb *_odb;
Packit Service 20376f
static git_odb_object *_obj;
Packit Service 20376f
static git_oid _oid;
Packit Service 20376f
Packit Service 20376f
static void setup_backend(const fake_object *objs)
Packit Service 20376f
{
Packit Service 20376f
	git_odb_backend *backend;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(build_fake_backend(&backend, objs));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_odb__weakptr(&_odb, _repo));
Packit Service 20376f
	cl_git_pass(git_odb_add_backend(_odb, backend, 10));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static void assert_object_contains(git_odb_object *obj, const char *expected)
Packit Service 20376f
{
Packit Service 20376f
	const char *actual = (const char *) git_odb_object_data(obj);
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_s(actual, expected);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_odb_backend_simple__initialize(void)
Packit Service 20376f
{
Packit Service 20376f
	_repo = cl_git_sandbox_init("testrepo.git");
Packit Service 20376f
	_odb = NULL;
Packit Service 20376f
	_obj = NULL;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_odb_backend_simple__cleanup(void)
Packit Service 20376f
{
Packit Service 20376f
	git_odb_object_free(_obj);
Packit Service 20376f
	cl_git_sandbox_cleanup();
Packit Service 20376f
	cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, 1));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_odb_backend_simple__read_of_object_succeeds(void)
Packit Service 20376f
{
Packit Service 20376f
	const fake_object objs[] = {
Packit Service 20376f
		{ "f6ea0495187600e7b2288c8ac19c5886383a4632", "foobar" },
Packit Service 20376f
		{ NULL, NULL }
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	setup_backend(objs);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_oid_fromstr(&_oid, objs[0].oid));
Packit Service 20376f
	cl_git_pass(git_odb_read(&_obj, _odb, &_oid));
Packit Service 20376f
Packit Service 20376f
	assert_object_contains(_obj, objs[0].content);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_odb_backend_simple__read_of_nonexisting_object_fails(void)
Packit Service 20376f
{
Packit Service 20376f
	const fake_object objs[] = {
Packit Service 20376f
		{ "f6ea0495187600e7b2288c8ac19c5886383a4632", "foobar" },
Packit Service 20376f
		{ NULL, NULL }
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	setup_backend(objs);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_oid_fromstr(&_oid, "f6ea0495187600e7b2288c8ac19c5886383a4633"));
Packit Service 20376f
	cl_git_fail_with(GIT_ENOTFOUND, git_odb_read(&_obj, _odb, &_oid));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_odb_backend_simple__read_with_hash_mismatch_fails(void)
Packit Service 20376f
{
Packit Service 20376f
	const fake_object objs[] = {
Packit Service 20376f
		{ "1234567890123456789012345678901234567890", "nonmatching content" },
Packit Service 20376f
		{ NULL, NULL }
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	setup_backend(objs);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_oid_fromstr(&_oid, objs[0].oid));
Packit Service 20376f
	cl_git_fail_with(GIT_EMISMATCH, git_odb_read(&_obj, _odb, &_oid));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_odb_backend_simple__read_with_hash_mismatch_succeeds_without_verification(void)
Packit Service 20376f
{
Packit Service 20376f
	const fake_object objs[] = {
Packit Service 20376f
		{ "1234567890123456789012345678901234567890", "nonmatching content" },
Packit Service 20376f
		{ NULL, NULL }
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	setup_backend(objs);
Packit Service 20376f
	cl_git_pass(git_oid_fromstr(&_oid, objs[0].oid));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, 0));
Packit Service 20376f
	cl_git_pass(git_odb_read(&_obj, _odb, &_oid));
Packit Service 20376f
Packit Service 20376f
	assert_object_contains(_obj, objs[0].content);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_odb_backend_simple__read_prefix_succeeds(void)
Packit Service 20376f
{
Packit Service 20376f
	const fake_object objs[] = {
Packit Service 20376f
		{ "f6ea0495187600e7b2288c8ac19c5886383a4632", "foobar" },
Packit Service 20376f
		{ NULL, NULL }
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	setup_backend(objs);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_oid_fromstr(&_oid, "f6ea0495187600e7b2288c8ac19c5886383a4632"));
Packit Service 20376f
	cl_git_pass(git_odb_read(&_obj, _odb, &_oid));
Packit Service 20376f
Packit Service 20376f
	assert_object_contains(_obj, objs[0].content);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_odb_backend_simple__read_prefix_of_nonexisting_object_fails(void)
Packit Service 20376f
{
Packit Service 20376f
	const fake_object objs[] = {
Packit Service 20376f
		{ "f6ea0495187600e7b2288c8ac19c5886383a4632", "foobar" },
Packit Service 20376f
		{ NULL, NULL }
Packit Service 20376f
	};
Packit Service 20376f
	char *hash = "f6ea0495187600e8";
Packit Service 20376f
Packit Service 20376f
	setup_backend(objs);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_oid_fromstrn(&_oid, hash, strlen(hash)));
Packit Service 20376f
	cl_git_fail_with(GIT_ENOTFOUND, git_odb_read(&_obj, _odb, &_oid));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_odb_backend_simple__read_with_ambiguous_prefix_fails(void)
Packit Service 20376f
{
Packit Service 20376f
	const fake_object objs[] = {
Packit Service 20376f
		{ "1234567890111111111111111111111111111111", "first content" },
Packit Service 20376f
		{ "1234567890222222222222222222222222222222", "second content" },
Packit Service 20376f
		{ NULL, NULL }
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	setup_backend(objs);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_oid_fromstr(&_oid, objs[0].oid));
Packit Service 20376f
	cl_git_fail_with(GIT_EAMBIGUOUS, git_odb_read_prefix(&_obj, _odb, &_oid, 7));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_odb_backend_simple__read_with_highly_ambiguous_prefix(void)
Packit Service 20376f
{
Packit Service 20376f
	const fake_object objs[] = {
Packit Service 20376f
		{ "1234567890111111111111111111111111111111", "first content" },
Packit Service 20376f
		{ "1234567890111111111111111111111111111112", "second content" },
Packit Service 20376f
		{ NULL, NULL }
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	setup_backend(objs);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_oid_fromstr(&_oid, objs[0].oid));
Packit Service 20376f
	cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, 0));
Packit Service 20376f
	cl_git_fail_with(GIT_EAMBIGUOUS, git_odb_read_prefix(&_obj, _odb, &_oid, 39));
Packit Service 20376f
	cl_git_pass(git_odb_read_prefix(&_obj, _odb, &_oid, 40));
Packit Service 20376f
	assert_object_contains(_obj, objs[0].content);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_odb_backend_simple__exists_succeeds(void)
Packit Service 20376f
{
Packit Service 20376f
	const fake_object objs[] = {
Packit Service 20376f
		{ "f6ea0495187600e7b2288c8ac19c5886383a4632", "foobar" },
Packit Service 20376f
		{ NULL, NULL }
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	setup_backend(objs);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_oid_fromstr(&_oid, objs[0].oid));
Packit Service 20376f
	cl_assert(git_odb_exists(_odb, &_oid));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_odb_backend_simple__exists_fails_for_nonexisting_object(void)
Packit Service 20376f
{
Packit Service 20376f
	const fake_object objs[] = {
Packit Service 20376f
		{ "f6ea0495187600e7b2288c8ac19c5886383a4632", "foobar" },
Packit Service 20376f
		{ NULL, NULL }
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	setup_backend(objs);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_oid_fromstr(&_oid, "f6ea0495187600e7b2288c8ac19c5886383a4633"));
Packit Service 20376f
	cl_assert(git_odb_exists(_odb, &_oid) == 0);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_odb_backend_simple__exists_prefix_succeeds(void)
Packit Service 20376f
{
Packit Service 20376f
	const fake_object objs[] = {
Packit Service 20376f
		{ "1234567890111111111111111111111111111111", "first content" },
Packit Service 20376f
		{ "1234567890222222222222222222222222222222", "second content" },
Packit Service 20376f
		{ NULL, NULL }
Packit Service 20376f
	};
Packit Service 20376f
	git_oid found;
Packit Service 20376f
Packit Service 20376f
	setup_backend(objs);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_oid_fromstr(&_oid, objs[0].oid));
Packit Service 20376f
	cl_git_pass(git_odb_exists_prefix(&found, _odb, &_oid, 12));
Packit Service 20376f
	cl_assert(git_oid_equal(&found, &_oid));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_odb_backend_simple__exists_with_ambiguous_prefix_fails(void)
Packit Service 20376f
{
Packit Service 20376f
	const fake_object objs[] = {
Packit Service 20376f
		{ "1234567890111111111111111111111111111111", "first content" },
Packit Service 20376f
		{ "1234567890222222222222222222222222222222", "second content" },
Packit Service 20376f
		{ NULL, NULL }
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	setup_backend(objs);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_oid_fromstr(&_oid, objs[0].oid));
Packit Service 20376f
	cl_git_fail_with(GIT_EAMBIGUOUS, git_odb_exists_prefix(NULL, _odb, &_oid, 7));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_odb_backend_simple__exists_with_highly_ambiguous_prefix(void)
Packit Service 20376f
{
Packit Service 20376f
	const fake_object objs[] = {
Packit Service 20376f
		{ "1234567890111111111111111111111111111111", "first content" },
Packit Service 20376f
		{ "1234567890111111111111111111111111111112", "second content" },
Packit Service 20376f
		{ NULL, NULL }
Packit Service 20376f
	};
Packit Service 20376f
	git_oid found;
Packit Service 20376f
Packit Service 20376f
	setup_backend(objs);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_oid_fromstr(&_oid, objs[0].oid));
Packit Service 20376f
	cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, 0));
Packit Service 20376f
	cl_git_fail_with(GIT_EAMBIGUOUS, git_odb_exists_prefix(&found, _odb, &_oid, 39));
Packit Service 20376f
	cl_git_pass(git_odb_exists_prefix(&found, _odb, &_oid, 40));
Packit Service 20376f
	cl_assert(git_oid_equal(&found, &_oid));
Packit Service 20376f
}