From e1efa4c6ab32aa04842cc8158398ebd5e944a1ff Mon Sep 17 00:00:00 2001 From: Patrick Niklaus Date: Tue, 10 Apr 2018 15:55:11 +0000 Subject: [PATCH] Add test case for writing and reading huge tar file This test case is disabled by default because it needs too much storage, but serves as documentation for the future. --- unit_tests/storage/tar.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/unit_tests/storage/tar.cpp b/unit_tests/storage/tar.cpp index 3cd5b4b7f..18df9a0d0 100644 --- a/unit_tests/storage/tar.cpp +++ b/unit_tests/storage/tar.cpp @@ -3,6 +3,8 @@ #include "../common/range_tools.hpp" #include "../common/temporary_file.hpp" +#include +#include #include BOOST_AUTO_TEST_SUITE(tar) @@ -187,4 +189,35 @@ BOOST_AUTO_TEST_CASE(continue_write_tar_file) CHECK_EQUAL_COLLECTIONS(result_64bit_vector, vector_64bit); } +// This test case is disabled by default because it needs 70 GiB of storage +BOOST_AUTO_TEST_CASE(write_huge_tar_file, *boost::unit_test::disabled()) +{ + TemporaryFile tmp{TEST_DATA_DIR "/tar_huge_write_test.tar"}; + + std::uint64_t reference_checksum = 0; + { + storage::tar::FileWriter writer(tmp.path, storage::tar::FileWriter::GenerateFingerprint); + std::uint64_t value = 0; + const std::function encode_function = [&]() -> std::uint64_t { + reference_checksum += value; + return value++; + }; + std::uint64_t num_elements = (70ULL * 1024ULL * 1024ULL * 1024ULL) / sizeof(std::uint64_t); + writer.WriteStreaming( + "huge_data", + boost::make_function_input_iterator(encode_function, boost::infinite()), + num_elements); + } + + std::uint64_t checksum = 0; + { + storage::tar::FileReader reader(tmp.path, storage::tar::FileReader::VerifyFingerprint); + reader.ReadStreaming( + "huge_data", + boost::make_function_output_iterator([&](const auto &value) { checksum += value; })); + } + + BOOST_CHECK_EQUAL(checksum, reference_checksum); +} + BOOST_AUTO_TEST_SUITE_END()