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 }