#define DISABLE_SIGN_COMPARE_WARNINGS #include "lib-reftable.h" #include "test-lib.h" #include "reftable/constants.h" #include "reftable/writer.h" #include "strbuf.h" void t_reftable_set_hash(uint8_t *p, int i, enum reftable_hash 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 reftable_buf *buf, struct reftable_write_options *opts) { struct reftable_writer *writer; int ret = reftable_writer_new(&writer, &strbuf_writer_write, &strbuf_writer_flush, buf, opts); check(!ret); return writer; } void t_reftable_write_to_buf(struct reftable_buf *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 == REFTABLE_HASH_SHA256 ? 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); }