diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2017-12-17 16:31:35 +0000 |
---|---|---|
committer | Edward Thomson <ethomson@edwardthomson.com> | 2018-02-01 16:50:30 -0800 |
commit | b1e66bfc6cd5068dd0b1695e44d28b6c586c8e2e (patch) | |
tree | 4fef695c9b9d886704a8f1f7e0faa9b8a822bcb1 | |
parent | 80dc3946d82fc55ff235c30005d6d93c4f664520 (diff) | |
download | libgit2-b1e66bfc6cd5068dd0b1695e44d28b6c586c8e2e.tar.gz |
odb: test loose object streaming
-rw-r--r-- | tests/odb/loose.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/tests/odb/loose.c b/tests/odb/loose.c index 2e24d6723..220712869 100644 --- a/tests/odb/loose.c +++ b/tests/odb/loose.c @@ -55,6 +55,44 @@ static void test_read_object(object_data *data) git_odb_free(odb); } +static void test_readstream_object(object_data *data, size_t blocksize) +{ + git_oid id; + git_odb *odb; + git_odb_stream *stream; + git_rawobj tmp; + char buf[2048], *ptr = buf; + size_t remain; + int ret; + + write_object_files(data); + + cl_git_pass(git_odb_open(&odb, "test-objects")); + cl_git_pass(git_oid_fromstr(&id, data->id)); + cl_git_pass(git_odb_open_rstream(&stream, &tmp.len, &tmp.type, odb, &id)); + + remain = tmp.len; + + while (remain) { + cl_assert((ret = git_odb_stream_read(stream, ptr, blocksize)) >= 0); + if (ret == 0) + break; + + cl_assert(remain >= (size_t)ret); + remain -= ret; + ptr += ret; + } + + cl_assert(remain == 0); + + tmp.data = buf; + + cmp_objects(&tmp, data); + + git_odb_stream_free(stream); + git_odb_free(odb); +} + void test_odb_loose__initialize(void) { p_fsync__cnt = 0; @@ -103,6 +141,22 @@ void test_odb_loose__simple_reads(void) test_read_object(&some); } +void test_odb_loose__streaming_reads(void) +{ + size_t blocksizes[] = { 1, 2, 4, 16, 99, 1024, 123456789 }; + size_t i; + + for (i = 0; i < ARRAY_SIZE(blocksizes); i++) { + test_readstream_object(&commit, blocksizes[i]); + test_readstream_object(&tree, blocksizes[i]); + test_readstream_object(&tag, blocksizes[i]); + test_readstream_object(&zero, blocksizes[i]); + test_readstream_object(&one, blocksizes[i]); + test_readstream_object(&two, blocksizes[i]); + test_readstream_object(&some, blocksizes[i]); + } +} + void test_write_object_permission( mode_t dir_mode, mode_t file_mode, mode_t expected_dir_mode, mode_t expected_file_mode) |