| #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(); |
| } |