namespace util { | |
namespace stream { | |
namespace { | |
BOOST_AUTO_TEST_CASE(RewindableStreamTest) { | |
scoped_fd in(MakeTemp("io_test_temp")); | |
for (uint64_t i = 0; i < 100000; ++i) { | |
WriteOrThrow(in.get(), &i, sizeof(uint64_t)); | |
} | |
SeekOrThrow(in.get(), 0); | |
ChainConfig config; | |
config.entry_size = 8; | |
config.total_memory = 100; | |
config.block_count = 6; | |
Chain chain(config); | |
RewindableStream s; | |
chain >> Read(in.get()) >> s >> kRecycle; | |
uint64_t i = 0; | |
for (; s; ++s, ++i) { | |
BOOST_CHECK_EQUAL(i, *static_cast<const uint64_t*>(s.Get())); | |
if (100000UL - i == 2) | |
s.Mark(); | |
} | |
BOOST_CHECK_EQUAL(100000ULL, i); | |
s.Rewind(); | |
BOOST_CHECK_EQUAL(100000ULL - 2, *static_cast<const uint64_t*>(s.Get())); | |
} | |
} | |
} | |
} | |