Files
git/t/unit-tests/lib-reftable.c
Patrick Steinhardt a4f50bb1e9 t/unit-tests: introduce reftable library
We have recently migrated all of the reftable unit tests that were part
of the reftable library into our own unit testing framework. As part of
that migration we have duplicated some of the functionality that was
part of the reftable test framework into each of the migrated test
suites. This was a sensible decision to not have all of the migrations
dependent on each other, but now that the migration is done it makes
sense to deduplicate the functionality again.

Introduce a new reftable test library that hosts some shared code and
adapt tests to use it.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2024-09-16 13:57:18 -07:00

94 lines
2.1 KiB
C

#include "lib-reftable.h"
#include "test-lib.h"
#include "reftable/constants.h"
#include "reftable/writer.h"
void t_reftable_set_hash(uint8_t *p, int i, uint32_t id)
{
memset(p, (uint8_t)i, hash_size(id));
}
static ssize_t strbuf_writer_write(void *b, const void *data, size_t sz)
{
strbuf_add(b, data, sz);
return sz;
}
static int strbuf_writer_flush(void *arg UNUSED)
{
return 0;
}
struct reftable_writer *t_reftable_strbuf_writer(struct strbuf *buf,
struct reftable_write_options *opts)
{
return reftable_new_writer(&strbuf_writer_write,
&strbuf_writer_flush,
buf, opts);
}
void t_reftable_write_to_buf(struct strbuf *buf,
struct reftable_ref_record *refs,
size_t nrefs,
struct reftable_log_record *logs,
size_t nlogs,
struct reftable_write_options *_opts)
{
struct reftable_write_options opts = { 0 };
const struct reftable_stats *stats;
struct reftable_writer *writer;
uint64_t min = 0xffffffff;
uint64_t max = 0;
int ret;
if (_opts)
opts = *_opts;
for (size_t i = 0; i < nrefs; i++) {
uint64_t ui = refs[i].update_index;
if (ui > max)
max = ui;
if (ui < min)
min = ui;
}
for (size_t i = 0; i < nlogs; i++) {
uint64_t ui = logs[i].update_index;
if (ui > max)
max = ui;
if (ui < min)
min = ui;
}
writer = t_reftable_strbuf_writer(buf, &opts);
reftable_writer_set_limits(writer, min, max);
if (nrefs) {
ret = reftable_writer_add_refs(writer, refs, nrefs);
check_int(ret, ==, 0);
}
if (nlogs) {
ret = reftable_writer_add_logs(writer, logs, nlogs);
check_int(ret, ==, 0);
}
ret = reftable_writer_close(writer);
check_int(ret, ==, 0);
stats = reftable_writer_stats(writer);
for (size_t i = 0; i < stats->ref_stats.blocks; i++) {
size_t off = i * (opts.block_size ? opts.block_size
: DEFAULT_BLOCK_SIZE);
if (!off)
off = header_size(opts.hash_id == GIT_SHA256_FORMAT_ID ? 2 : 1);
check_char(buf->buf[off], ==, 'r');
}
if (nrefs)
check_int(stats->ref_stats.blocks, >, 0);
if (nlogs)
check_int(stats->log_stats.blocks, >, 0);
reftable_writer_free(writer);
}