
We include "hash.h" in "reftable/system.h" such that we can use hash format IDs as well as the raw size of SHA1 and SHA256. As we are in the process of converting the reftable library to become standalone we of course cannot rely on those constants anymore. Introduce a new `enum reftable_hash` to replace internal uses of the hash format IDs and new constants that replace internal uses of the hash size. Adapt the reftable backend to set up the correct hash function. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
97 lines
2.5 KiB
C
97 lines
2.5 KiB
C
#include "test-lib.h"
|
|
#include "lib-reftable.h"
|
|
#include "reftable/blocksource.h"
|
|
#include "reftable/reader.h"
|
|
|
|
static int t_reader_seek_once(void)
|
|
{
|
|
struct reftable_ref_record records[] = {
|
|
{
|
|
.refname = (char *) "refs/heads/main",
|
|
.value_type = REFTABLE_REF_VAL1,
|
|
.value.val1 = { 42 },
|
|
},
|
|
};
|
|
struct reftable_block_source source = { 0 };
|
|
struct reftable_ref_record ref = { 0 };
|
|
struct reftable_iterator it = { 0 };
|
|
struct reftable_reader *reader;
|
|
struct reftable_buf buf = REFTABLE_BUF_INIT;
|
|
int ret;
|
|
|
|
t_reftable_write_to_buf(&buf, records, ARRAY_SIZE(records), NULL, 0, NULL);
|
|
block_source_from_buf(&source, &buf);
|
|
|
|
ret = reftable_reader_new(&reader, &source, "name");
|
|
check(!ret);
|
|
|
|
reftable_reader_init_ref_iterator(reader, &it);
|
|
ret = reftable_iterator_seek_ref(&it, "");
|
|
check(!ret);
|
|
ret = reftable_iterator_next_ref(&it, &ref);
|
|
check(!ret);
|
|
|
|
ret = reftable_ref_record_equal(&ref, &records[0], REFTABLE_HASH_SIZE_SHA1);
|
|
check_int(ret, ==, 1);
|
|
|
|
ret = reftable_iterator_next_ref(&it, &ref);
|
|
check_int(ret, ==, 1);
|
|
|
|
reftable_ref_record_release(&ref);
|
|
reftable_iterator_destroy(&it);
|
|
reftable_reader_decref(reader);
|
|
reftable_buf_release(&buf);
|
|
return 0;
|
|
}
|
|
|
|
static int t_reader_reseek(void)
|
|
{
|
|
struct reftable_ref_record records[] = {
|
|
{
|
|
.refname = (char *) "refs/heads/main",
|
|
.value_type = REFTABLE_REF_VAL1,
|
|
.value.val1 = { 42 },
|
|
},
|
|
};
|
|
struct reftable_block_source source = { 0 };
|
|
struct reftable_ref_record ref = { 0 };
|
|
struct reftable_iterator it = { 0 };
|
|
struct reftable_reader *reader;
|
|
struct reftable_buf buf = REFTABLE_BUF_INIT;
|
|
int ret;
|
|
|
|
t_reftable_write_to_buf(&buf, records, ARRAY_SIZE(records), NULL, 0, NULL);
|
|
block_source_from_buf(&source, &buf);
|
|
|
|
ret = reftable_reader_new(&reader, &source, "name");
|
|
check(!ret);
|
|
|
|
reftable_reader_init_ref_iterator(reader, &it);
|
|
|
|
for (size_t i = 0; i < 5; i++) {
|
|
ret = reftable_iterator_seek_ref(&it, "");
|
|
check(!ret);
|
|
ret = reftable_iterator_next_ref(&it, &ref);
|
|
check(!ret);
|
|
|
|
ret = reftable_ref_record_equal(&ref, &records[0], REFTABLE_HASH_SIZE_SHA1);
|
|
check_int(ret, ==, 1);
|
|
|
|
ret = reftable_iterator_next_ref(&it, &ref);
|
|
check_int(ret, ==, 1);
|
|
}
|
|
|
|
reftable_ref_record_release(&ref);
|
|
reftable_iterator_destroy(&it);
|
|
reftable_reader_decref(reader);
|
|
reftable_buf_release(&buf);
|
|
return 0;
|
|
}
|
|
|
|
int cmd_main(int argc UNUSED, const char *argv[] UNUSED)
|
|
{
|
|
TEST(t_reader_seek_once(), "reader can seek once");
|
|
TEST(t_reader_reseek(), "reader can reseek multiple times");
|
|
return test_done();
|
|
}
|