Skip to content

Commit 2ca088b

Browse files
authored
Merge pull request libgit2#4265 from pks-t/pks/read-prefix-tests
Read prefix tests
2 parents 99e40a6 + f148258 commit 2ca088b

File tree

4 files changed

+299
-155
lines changed

4 files changed

+299
-155
lines changed
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
#include "clar_libgit2.h"
2+
#include "git2/sys/odb_backend.h"
3+
#include "backend_helpers.h"
4+
5+
static int search_object(const fake_object **out, fake_backend *fake, const git_oid *oid, size_t len)
6+
{
7+
const fake_object *obj = fake->objects;
8+
9+
while (obj && obj->oid) {
10+
git_oid current_oid;
11+
12+
git_oid_fromstr(&current_oid, obj->oid);
13+
14+
if (git_oid_ncmp(&current_oid, oid, len) == 0) {
15+
if (out)
16+
*out = obj;
17+
return 0;
18+
}
19+
20+
obj++;
21+
}
22+
23+
return GIT_ENOTFOUND;
24+
}
25+
26+
static int fake_backend__exists(git_odb_backend *backend, const git_oid *oid)
27+
{
28+
fake_backend *fake;
29+
30+
fake = (fake_backend *)backend;
31+
32+
fake->exists_calls++;
33+
34+
return search_object(NULL, fake, oid, GIT_OID_RAWSZ) == GIT_OK;
35+
}
36+
37+
static int fake_backend__read(
38+
void **buffer_p, size_t *len_p, git_otype *type_p,
39+
git_odb_backend *backend, const git_oid *oid)
40+
{
41+
const fake_object *obj;
42+
fake_backend *fake;
43+
44+
fake = (fake_backend *)backend;
45+
46+
fake->read_calls++;
47+
48+
if (search_object(&obj, fake, oid, GIT_OID_RAWSZ) == 0) {
49+
*len_p = strlen(obj->content);
50+
*buffer_p = git__strdup(obj->content);
51+
*type_p = GIT_OBJ_BLOB;
52+
return 0;
53+
}
54+
55+
return GIT_ENOTFOUND;
56+
}
57+
58+
static int fake_backend__read_header(
59+
size_t *len_p, git_otype *type_p,
60+
git_odb_backend *backend, const git_oid *oid)
61+
{
62+
const fake_object *obj;
63+
fake_backend *fake;
64+
65+
fake = (fake_backend *)backend;
66+
67+
fake->read_header_calls++;
68+
69+
if (search_object(&obj, fake, oid, GIT_OID_RAWSZ) == 0) {
70+
*len_p = strlen(obj->content);
71+
*type_p = GIT_OBJ_BLOB;
72+
return 0;
73+
}
74+
75+
return GIT_ENOTFOUND;
76+
}
77+
78+
static int fake_backend__read_prefix(
79+
git_oid *out_oid, void **buffer_p, size_t *len_p, git_otype *type_p,
80+
git_odb_backend *backend, const git_oid *short_oid, size_t len)
81+
{
82+
const fake_object *obj;
83+
fake_backend *fake;
84+
85+
fake = (fake_backend *)backend;
86+
87+
fake->read_prefix_calls++;
88+
89+
if (search_object(&obj, fake, short_oid, len) == 0) {
90+
git_oid_fromstr(out_oid, obj->oid);
91+
*len_p = strlen(obj->content);
92+
*buffer_p = git__strdup(obj->content);
93+
*type_p = GIT_OBJ_BLOB;
94+
return 0;
95+
}
96+
97+
return GIT_ENOTFOUND;
98+
}
99+
100+
static void fake_backend__free(git_odb_backend *_backend)
101+
{
102+
fake_backend *backend;
103+
104+
backend = (fake_backend *)_backend;
105+
106+
git__free(backend);
107+
}
108+
109+
int build_fake_backend(
110+
git_odb_backend **out,
111+
const fake_object *objects)
112+
{
113+
fake_backend *backend;
114+
115+
backend = git__calloc(1, sizeof(fake_backend));
116+
GITERR_CHECK_ALLOC(backend);
117+
118+
backend->parent.version = GIT_ODB_BACKEND_VERSION;
119+
120+
backend->parent.refresh = NULL;
121+
backend->objects = objects;
122+
123+
backend->parent.read = fake_backend__read;
124+
backend->parent.read_prefix = fake_backend__read_prefix;
125+
backend->parent.read_header = fake_backend__read_header;
126+
backend->parent.exists = fake_backend__exists;
127+
backend->parent.free = &fake_backend__free;
128+
129+
*out = (git_odb_backend *)backend;
130+
131+
return 0;
132+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include "git2/sys/odb_backend.h"
2+
3+
typedef struct {
4+
const char *oid;
5+
const char *content;
6+
} fake_object;
7+
8+
typedef struct {
9+
git_odb_backend parent;
10+
11+
int exists_calls;
12+
int read_calls;
13+
int read_header_calls;
14+
int read_prefix_calls;
15+
16+
const fake_object *objects;
17+
} fake_backend;
18+
19+
int build_fake_backend(
20+
git_odb_backend **out,
21+
const fake_object *objects);

tests/odb/backend/multiple.c

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
#include "clar_libgit2.h"
2+
#include "repository.h"
3+
#include "backend_helpers.h"
4+
5+
#define EXISTING_HASH "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
6+
7+
static git_repository *_repo;
8+
static git_odb_object *_obj;
9+
static fake_backend *_fake_empty;
10+
static fake_backend *_fake_filled;
11+
12+
static git_oid _existing_oid;
13+
14+
static const fake_object _objects_filled[] = {
15+
{ EXISTING_HASH, "" },
16+
{ NULL, NULL }
17+
};
18+
19+
static const fake_object _objects_empty[] = {
20+
{ NULL, NULL }
21+
};
22+
23+
void test_odb_backend_multiple__initialize(void)
24+
{
25+
git_odb_backend *backend;
26+
27+
git_oid_fromstr(&_existing_oid, EXISTING_HASH);
28+
29+
_obj = NULL;
30+
_repo = cl_git_sandbox_init("testrepo.git");
31+
32+
cl_git_pass(build_fake_backend(&backend, _objects_filled));
33+
_fake_filled = (fake_backend *)backend;
34+
35+
cl_git_pass(build_fake_backend(&backend, _objects_empty));
36+
_fake_empty = (fake_backend *)backend;
37+
}
38+
39+
void test_odb_backend_multiple__cleanup(void)
40+
{
41+
git_odb_object_free(_obj);
42+
cl_git_sandbox_cleanup();
43+
}
44+
45+
void test_odb_backend_multiple__read_with_empty_first_succeeds(void)
46+
{
47+
git_odb *odb;
48+
49+
cl_git_pass(git_repository_odb__weakptr(&odb, _repo));
50+
cl_git_pass(git_odb_add_backend(odb, (git_odb_backend *)_fake_filled, 10));
51+
cl_git_pass(git_odb_add_backend(odb, (git_odb_backend *)_fake_empty, 50));
52+
53+
cl_git_pass(git_odb_read(&_obj, odb, &_existing_oid));
54+
55+
cl_assert_equal_i(1, _fake_filled->read_calls);
56+
cl_assert_equal_i(1, _fake_empty->read_calls);
57+
}
58+
59+
void test_odb_backend_multiple__read_with_first_matching_stops(void)
60+
{
61+
git_odb *odb;
62+
63+
cl_git_pass(git_repository_odb__weakptr(&odb, _repo));
64+
cl_git_pass(git_odb_add_backend(odb, (git_odb_backend *)_fake_empty, 10));
65+
cl_git_pass(git_odb_add_backend(odb, (git_odb_backend *)_fake_filled, 50));
66+
67+
cl_git_pass(git_odb_read(&_obj, odb, &_existing_oid));
68+
69+
cl_assert_equal_i(1, _fake_filled->read_calls);
70+
cl_assert_equal_i(0, _fake_empty->read_calls);
71+
}
72+
73+
void test_odb_backend_multiple__read_prefix_with_first_empty_succeeds(void)
74+
{
75+
git_odb *odb;
76+
77+
cl_git_pass(git_repository_odb__weakptr(&odb, _repo));
78+
cl_git_pass(git_odb_add_backend(odb, (git_odb_backend *)_fake_filled, 10));
79+
cl_git_pass(git_odb_add_backend(odb, (git_odb_backend *)_fake_empty, 50));
80+
81+
cl_git_pass(git_odb_read_prefix(&_obj, odb, &_existing_oid, 7));
82+
83+
cl_assert_equal_i(1, _fake_filled->read_prefix_calls);
84+
cl_assert_equal_i(1, _fake_empty->read_prefix_calls);
85+
}
86+
87+
void test_odb_backend_multiple__read_prefix_with_first_matching_reads_both(void)
88+
{
89+
git_odb *odb;
90+
91+
cl_git_pass(git_repository_odb__weakptr(&odb, _repo));
92+
cl_git_pass(git_odb_add_backend(odb, (git_odb_backend *)_fake_empty, -10));
93+
cl_git_pass(git_odb_add_backend(odb, (git_odb_backend *)_fake_filled, 50));
94+
95+
cl_git_pass(git_odb_read_prefix(&_obj, odb, &_existing_oid, 7));
96+
97+
cl_assert_equal_i(1, _fake_filled->read_prefix_calls);
98+
cl_assert_equal_i(1, _fake_empty->read_prefix_calls);
99+
}
100+
101+
void test_odb_backend_multiple__read_prefix_with_first_matching_succeeds_without_hash_verification(void)
102+
{
103+
git_odb *odb;
104+
105+
git_libgit2_opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, 0);
106+
107+
cl_git_pass(git_repository_odb__weakptr(&odb, _repo));
108+
cl_git_pass(git_odb_add_backend(odb, (git_odb_backend *)_fake_empty, -10));
109+
cl_git_pass(git_odb_add_backend(odb, (git_odb_backend *)_fake_filled, 50));
110+
111+
cl_git_pass(git_odb_read_prefix(&_obj, odb, &_existing_oid, 7));
112+
113+
/*
114+
* Both backends should be checked as we have to check
115+
* for collisions
116+
*/
117+
cl_assert_equal_i(1, _fake_filled->read_prefix_calls);
118+
cl_assert_equal_i(1, _fake_empty->read_prefix_calls);
119+
120+
git_libgit2_opts(GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION, 1);
121+
}

0 commit comments

Comments
 (0)