1
+#include "unit-test.h"
2
+#include "lib-reftable-clar.h"
3
+#include "hex.h"
4
+#include "parse-options.h"
5
+#include "reftable/constants.h"
6
+#include "reftable/writer.h"
7
+#include "strbuf.h"
8
+#include "string-list.h"
9
+#include "strvec.h"
10
+
11
+void cl_reftable_set_hash(uint8_t *p, int i, enum reftable_hash id)
12
+{
13
+ memset(p, (uint8_t)i, hash_size(id));
14
+}
15
+
16
+static ssize_t strbuf_writer_write(void *b, const void *data, size_t sz)
17
+{
18
+ strbuf_add(b, data, sz);
19
+ return sz;
20
+}
21
+
22
+static int strbuf_writer_flush(void *arg UNUSED)
23
+{
24
+ return 0;
25
+}
26
+
27
+struct reftable_writer *cl_reftable_strbuf_writer(struct reftable_buf *buf,
28
+ struct reftable_write_options *opts)
29
+{
30
+ struct reftable_writer *writer;
31
+ int ret = reftable_writer_new(&writer, &strbuf_writer_write, &strbuf_writer_flush,
32
+ buf, opts);
33
+ cl_assert(!ret);
34
+ return writer;
35
+}
36
+
37
+void cl_reftable_write_to_buf(struct reftable_buf *buf,
38
+ struct reftable_ref_record *refs,
39
+ size_t nrefs,
40
+ struct reftable_log_record *logs,
41
+ size_t nlogs,
42
+ struct reftable_write_options *_opts)
43
+{
44
+ struct reftable_write_options opts = { 0 };
45
+ const struct reftable_stats *stats;
46
+ struct reftable_writer *writer;
47
+ uint64_t min = 0xffffffff;
48
+ uint64_t max = 0;
49
+ int ret;
50
+
51
+ if (_opts)
52
+ opts = *_opts;
53
+
54
+ for (size_t i = 0; i < nrefs; i++) {
55
+ uint64_t ui = refs[i].update_index;
56
+ if (ui > max)
57
+ max = ui;
58
+ if (ui < min)
59
+ min = ui;
60
+ }
61
+ for (size_t i = 0; i < nlogs; i++) {
62
+ uint64_t ui = logs[i].update_index;
63
+ if (ui > max)
64
+ max = ui;
65
+ if (ui < min)
66
+ min = ui;
67
+ }
68
+
69
+ writer = cl_reftable_strbuf_writer(buf, &opts);
70
+ ret = reftable_writer_set_limits(writer, min, max);
71
+ cl_assert_equal_i(ret, 0);
72
+
73
+ if (nrefs) {
74
+ ret = reftable_writer_add_refs(writer, refs, nrefs);
75
+ cl_assert_equal_i(ret, 0);
76
+ }
77
+
78
+ if (nlogs) {
79
+ ret = reftable_writer_add_logs(writer, logs, nlogs);
80
+ cl_assert_equal_i(ret, 0);
81
+ }
82
+
83
+ ret = reftable_writer_close(writer);
84
+ cl_assert_equal_i(ret, 0);
85
+
86
+ stats = reftable_writer_stats(writer);
87
+ for (size_t i = 0; i < (size_t)stats->ref_stats.blocks; i++) {
88
+ size_t off = i * (opts.block_size ? opts.block_size
89
+ : DEFAULT_BLOCK_SIZE);
90
+ if (!off)
91
+ off = header_size(opts.hash_id == REFTABLE_HASH_SHA256 ? 2 : 1);
92
+ cl_assert(buf->buf[off] == 'r');
93
+ }
94
+
95
+ if (nrefs)
96
+ cl_assert(stats->ref_stats.blocks > 0);
97
+ if (nlogs)
98
+ cl_assert(stats->log_stats.blocks > 0);
99
+
100
+ reftable_writer_free(writer);
101
+}