#include "util/read_compressed.hh" #include "util/file.hh" #include "util/have.hh" #define BOOST_TEST_MODULE ReadCompressedTest #include <boost/test/unit_test.hpp> #include <boost/scoped_ptr.hpp> #include <fstream> #include <string> #include <stdlib.h> #if defined __MINGW32__ #include <time.h> #include <fcntl.h> #if !defined mkstemp // TODO insecure int mkstemp(char * stemplate) { char *filename = mktemp(stemplate); if (filename == NULL) return -1; return open(filename, O_RDWR | O_CREAT, 0600); } #endif #endif // defined namespace util { namespace { void ReadLoop(ReadCompressed &reader, void *to_void, std::size_t amount) { uint8_t *to = static_cast<uint8_t*>(to_void); while (amount) { std::size_t ret = reader.Read(to, amount); BOOST_REQUIRE(ret); to += ret; amount -= ret; } } const uint32_t kSize4 = 100000 / 4; std::string WriteRandom() { char name[] = "tempXXXXXX"; scoped_fd original(mkstemp(name)); BOOST_REQUIRE(original.get() > 0); for (uint32_t i = 0; i < kSize4; ++i) { WriteOrThrow(original.get(), &i, sizeof(uint32_t)); } return name; } void VerifyRead(ReadCompressed &reader) { for (uint32_t i = 0; i < kSize4; ++i) { uint32_t got; ReadLoop(reader, &got, sizeof(uint32_t)); BOOST_CHECK_EQUAL(i, got); } char ignored; BOOST_CHECK_EQUAL((std::size_t)0, reader.Read(&ignored, 1)); // Test double EOF call. BOOST_CHECK_EQUAL((std::size_t)0, reader.Read(&ignored, 1)); } void TestRandom(const char *compressor) { std::string name(WriteRandom()); char gzname[] = "tempXXXXXX"; scoped_fd gzipped(mkstemp(gzname)); std::string command(compressor); #ifdef __CYGWIN__ command += ".exe"; #endif command += " <\""; command += name; command += "\" >\""; command += gzname; command += "\""; BOOST_REQUIRE_EQUAL(0, system(command.c_str())); BOOST_CHECK_EQUAL(0, unlink(name.c_str())); BOOST_CHECK_EQUAL(0, unlink(gzname)); ReadCompressed reader(gzipped.release()); VerifyRead(reader); } BOOST_AUTO_TEST_CASE(Uncompressed) { TestRandom("cat"); } #ifdef HAVE_ZLIB BOOST_AUTO_TEST_CASE(ReadGZ) { TestRandom("gzip"); } #endif // HAVE_ZLIB #ifdef HAVE_BZLIB BOOST_AUTO_TEST_CASE(ReadBZ) { TestRandom("bzip2"); } #endif // HAVE_BZLIB #ifdef HAVE_XZLIB BOOST_AUTO_TEST_CASE(ReadXZ) { TestRandom("xz"); } #endif BOOST_AUTO_TEST_CASE(IStream) { std::string name(WriteRandom()); std::fstream stream(name.c_str(), std::ios::in); BOOST_CHECK_EQUAL(0, unlink(name.c_str())); ReadCompressed reader; reader.Reset(stream); VerifyRead(reader); } } // namespace } // namespace util