// // CompressTest.cpp // // Copyright (c) 2007, Applied Informatics Software Engineering GmbH. // and Contributors. // // SPDX-License-Identifier: BSL-1.0 // #include "CompressTest.h" #include "ZipTest.h" #include "Poco/Buffer.h" #include "Poco/Zip/Compress.h" #include "Poco/Zip/ZipManipulator.h" #include "Poco/File.h" #include "Poco/FileStream.h" #include "CppUnit/TestCaller.h" #include "CppUnit/TestSuite.h" #include #undef min #include using namespace Poco::Zip; CompressTest::CompressTest(const std::string& name): CppUnit::TestCase(name) { } CompressTest::~CompressTest() { } void CompressTest::testSingleFile() { Poco::FileOutputStream out(Poco::Path::temp() + "appinf.zip"); Poco::Path theFile(ZipTest::getTestFile("data", "test.zip")); Compress c(out, true); c.addFile(theFile, theFile.getFileName()); ZipArchive a(c.close()); } void CompressTest::testDirectory() { Poco::FileOutputStream out(Poco::Path::temp() + "pocobin.zip"); Poco::File aFile("some/"); if (aFile.exists()) aFile.remove(true); Poco::File aDir("some/recursive/dir/"); aDir.createDirectories(); Poco::File aDir2("some/other/recursive/dir/"); aDir2.createDirectories(); Poco::File aF("some/recursive/dir/test.file"); aF.createFile(); Poco::FileOutputStream fos(aF.path()); fos << "just some test data"; fos.close(); Poco::Path theFile(aFile.path()); theFile.makeDirectory(); Compress c(out, true); c.addRecursive(theFile, ZipCommon::CL_MAXIMUM, false, theFile); ZipArchive a(c.close()); Poco::File(aFile).remove(true); } void CompressTest::testManipulator() { { Poco::FileOutputStream out(Poco::Path::temp() + "appinf.zip"); Poco::Path theFile(ZipTest::getTestFile("data", "test.zip")); Compress c(out, true); c.addFile(theFile, theFile.getFileName()); ZipArchive a(c.close()); } ZipManipulator zm(Poco::Path::temp() + "appinf.zip", true); zm.renameFile("test.zip", "renamedtest.zip"); zm.addFile("doc/othertest.zip", ZipTest::getTestFile("data", "test.zip")); ZipArchive archive=zm.commit(); assertTrue (archive.findHeader("doc/othertest.zip") != archive.headerEnd()); } void CompressTest::testManipulatorDel() { { Poco::FileOutputStream out(Poco::Path::temp() + "appinf.zip"); Poco::Path theFile(ZipTest::getTestFile("data", "test.zip")); Compress c(out, true); c.addFile(theFile, theFile.getFileName()); ZipArchive a(c.close()); } ZipManipulator zm(Poco::Path::temp() + "appinf.zip", true); zm.deleteFile("test.zip"); zm.addFile("doc/data.zip", ZipTest::getTestFile("data", "data.zip")); ZipArchive archive=zm.commit(); assertTrue (archive.findHeader("test.zip") == archive.headerEnd()); assertTrue (archive.findHeader("doc/data.zip") != archive.headerEnd()); } void CompressTest::testManipulatorReplace() { { Poco::FileOutputStream out(Poco::Path::temp() + "appinf.zip"); Poco::Path theFile(ZipTest::getTestFile("data", "test.zip")); Compress c(out, true); c.addFile(theFile, theFile.getFileName()); ZipArchive a(c.close()); } ZipManipulator zm(Poco::Path::temp() + "appinf.zip", true); zm.replaceFile("test.zip", ZipTest::getTestFile("data", "doc.zip")); ZipArchive archive=zm.commit(); assertTrue (archive.findHeader("test.zip") != archive.headerEnd()); assertTrue (archive.findHeader("doc.zip") == archive.headerEnd()); } void CompressTest::testSetZipComment() { std::string comment("Testing...123..."); Poco::FileOutputStream out(Poco::Path::temp() + "comment.zip"); Poco::Path theFile(ZipTest::getTestFile("data", "test.zip")); Compress c(out, true); c.addFile(theFile, theFile.getFileName()); c.setZipComment(comment); ZipArchive a(c.close()); assertTrue (a.getZipComment() == comment); } void CompressTest::createDataFile(const std::string& path, Poco::UInt64 size) { Poco::FileOutputStream out(path.c_str(), std::ios::trunc); assertTrue ( ! out.fail() ); Poco::Buffer buffer(MB); for(int i = 0; size != 0; i++) { std::memset(buffer.begin(), i, buffer.size()); Poco::UInt64 bytesToWrite = std::min(size, static_cast(buffer.size())); out.write(buffer.begin(), bytesToWrite); assertTrue ( ! out.fail() ); size -= bytesToWrite; } out.flush(); assertTrue ( ! out.fail() ); out.close(); assertTrue ( ! out.fail() ); } void CompressTest::testZip64() { using FileMap = std::map; std::cout << std::endl; FileMap files; files["data1.bin"] = static_cast(KB)*4096+1; files["data2.bin"] = static_cast(KB)*16; files["data3.bin"] = static_cast(KB)*4096-1; for(FileMap::const_iterator it = files.begin(); it != files.end(); it++) { std::cout << '\t' << "createDataFile(" << it->first << ", " << it->second << ");" << std::endl; createDataFile(it->first, it->second); } Poco::FileOutputStream out(Poco::Path::temp() + "zip64.zip", std::ios::trunc); Compress c(out, true, true); for(FileMap::const_iterator it = files.begin(); it != files.end(); it++) { const std::string& path = it->first; std::cout << '\t' << "addFile(" << path << ");" << std::endl; c.addFile(path, path, ZipCommon::CM_STORE); } ZipArchive a(c.close()); for(FileMap::const_iterator it = files.begin(); it != files.end(); it++) { const std::string& path = it->first; Poco::UInt64 size = it->second; ZipArchive::FileHeaders::const_iterator it2 = a.findHeader(path); assertTrue (it2 != a.headerEnd()); const Poco::Zip::ZipLocalFileHeader& file = it2->second; assertTrue (file.getUncompressedSize() == size); assertTrue (file.getCompressedSize() == size); } for (FileMap::const_iterator it = files.begin(); it != files.end(); it++) { Poco::File(it->first).remove(); } } void CompressTest::setUp() { } void CompressTest::tearDown() { } CppUnit::Test* CompressTest::suite() { CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("CompressTest"); CppUnit_addTest(pSuite, CompressTest, testSingleFile); CppUnit_addTest(pSuite, CompressTest, testDirectory); CppUnit_addTest(pSuite, CompressTest, testManipulator); CppUnit_addTest(pSuite, CompressTest, testManipulatorDel); CppUnit_addTest(pSuite, CompressTest, testManipulatorReplace); CppUnit_addTest(pSuite, CompressTest, testSetZipComment); CppUnit_addTest(pSuite, CompressTest, testZip64); return pSuite; }