
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>
94 lines
2.1 KiB
C
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);
|
|
}
|