00001 #include "util/stream/io.hh"
00002
00003 #include "util/stream/rewindable_stream.hh"
00004 #include "util/file.hh"
00005
00006 #define BOOST_TEST_MODULE RewindableStreamTest
00007 #include <boost/test/unit_test.hpp>
00008
00009 namespace util {
00010 namespace stream {
00011 namespace {
00012
00013 BOOST_AUTO_TEST_CASE(RewindableStreamTest) {
00014 scoped_fd in(MakeTemp("io_test_temp"));
00015 for (uint64_t i = 0; i < 100000; ++i) {
00016 WriteOrThrow(in.get(), &i, sizeof(uint64_t));
00017 }
00018 SeekOrThrow(in.get(), 0);
00019
00020 ChainConfig config;
00021 config.entry_size = 8;
00022 config.total_memory = 100;
00023 config.block_count = 6;
00024
00025 Chain chain(config);
00026 RewindableStream s;
00027 chain >> Read(in.get()) >> s >> kRecycle;
00028 uint64_t i = 0;
00029 for (; s; ++s, ++i) {
00030 BOOST_CHECK_EQUAL(i, *static_cast<const uint64_t*>(s.Get()));
00031 if (100000UL - i == 2)
00032 s.Mark();
00033 }
00034 BOOST_CHECK_EQUAL(100000ULL, i);
00035 s.Rewind();
00036 BOOST_CHECK_EQUAL(100000ULL - 2, *static_cast<const uint64_t*>(s.Get()));
00037 }
00038
00039 }
00040 }
00041 }