void ZipTest::test_addFolder_notPreservesPath_and_notRecursive() { bool expected = true; std::string zipFileName = tempFolder + "/" + zipFile; zip->open(zipFileName); bool actual = zip->addFolder("data/test", false, false); zip->close(); CPPUNIT_ASSERT_EQUAL(expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 3, numFilesInZip(zipFileName)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFolder(zipFileName, "test")); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, "test/TestFile.txt")); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, "test/TestFile_ümlaut.txt")); }
void ZipTest::test_openAppendToZipWithFileAlreadyExisting() { bool expected = false; std::string zipFileName = tempFolder + "/" + zipFile; createFolder(zipFileName); copyFile(zipFile, zipFileName); //first open zip->open(zipFileName, OpenFlags::OpenExisting); std::string theString("Lorem Ipsum..."); std::vector<unsigned char> content; content.insert(content.end(), theString.begin(), theString.end()); zip->addFile("file1.txt", content); zip->close(); //second open zip->open(zipFileName, OpenFlags::OpenExisting); theString = "Lorem Ipsum Number 2..."; content.insert(content.end(), theString.begin(), theString.end()); bool actual = zip->addFile("file1.txt", content); zip->close(); CPPUNIT_ASSERT_EQUAL_MESSAGE("add", expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, "file1.txt")); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 7, numFilesInZip(zipFileName)); }
void ZipTest::test_addFiles_WithNotPreservePath() { bool expected = true; std::string zipFileName = tempFolder + "/" + zipFile; zip->open(zipFileName); std::string dataDir = "data/test/"; std::list<std::string> fileNames; fileNames.push_back(dataDir + fileInsideZip); fileNames.push_back(dataDir + fileInsideZipWithUmlaut); bool actual = zip->addFiles(fileNames, false); zip->close(); CPPUNIT_ASSERT_EQUAL_MESSAGE("add", expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 2, numFilesInZip(zipFileName)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, fileInsideZip)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, fileInsideZipWithUmlaut)); }
void ZipTest::test_addFolder_recursive() { bool expected = true; std::string zipFileName = tempFolder + "/" + zipFile; zip->open(zipFileName); bool actual = zip->addFolder("data/test"); zip->close(); CPPUNIT_ASSERT_EQUAL(expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 7, numFilesInZip(zipFileName)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFolder(zipFileName, "data/test")); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, "data/test/TestFile.txt")); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, "data/test/TestFile_ümlaut.txt")); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFolder(zipFileName, "data/test/info")); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, "data/test/info/readme.txt")); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFolder(zipFileName, "data/test/pics")); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, "data/test/pics/matrix.jpg")); }
void ZipTest::test_addFile_WithDestinationFile() { bool expected = true; std::string zipFileName = tempFolder + "/" + zipFile; zip->open(zipFileName); bool actual = zip->addFile(readMeFileName, anotherFileName); zip->close(); CPPUNIT_ASSERT_EQUAL(expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 1, numFilesInZip(zipFileName)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, anotherFileName)); }
bool Unzip::goToFile(const std::string & fileName) { if(containsFile(fileName) == false){ return false; } if(unzLocateFile(zipfile_handle, fileName.c_str(), 0) == UNZ_OK){ return true; } else { return false; } }
void ZipTest::test_addFile_WithNotPreservePath() { bool expected = true; std::string zipFileName = tempFolder + "/" + zipFile; zip->open(zipFileName); bool actual = zip->addFile(readMeFileName, false); zip->close(); CPPUNIT_ASSERT_EQUAL(expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 1, numFilesInZip(zipFileName)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, boost::filesystem::path(readMeFileName).filename().string())); }
void ZipTest::test_addFile_Content_WithEmptyContent() { std::vector<unsigned char> content; bool expected = true; std::string zipFileName = tempFolder + "/" + zipFile; zip->open(zipFileName); bool actual = zip->addFile(fileInsideZip, content); zip->close(); CPPUNIT_ASSERT_EQUAL(expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 1, numFilesInZip(zipFileName)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, fileInsideZip)); }
void ZipTest::test_deleteFiles() { bool expected = true; std::string zipFileName = tempFolder + "/" + zipFileFor_deleteAndReplace; createFolder(zipFileName); copyFile(zipFileFor_deleteAndReplace, zipFileName); zip->open(zipFileName, OpenFlags::OpenExisting); std::string fileToDelete1 = folderNameInsideZip + "/file1.txt"; std::string fileToDelete2 = folderNameInsideZip + "/file2.txt"; std::list<std::string> filesToDelete; filesToDelete.push_back(fileToDelete1); filesToDelete.push_back(fileToDelete2); bool actual = zip->deleteFiles(filesToDelete); zip->close(); CPPUNIT_ASSERT_EQUAL(expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 6, numFilesInZip(zipFileName)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", false, containsFile(zipFileName, fileToDelete1)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", false, containsFile(zipFileName, fileToDelete2)); }
void ZipTest::test_addFile_WhenFileNameAlreadyExists() { bool expected = false; std::string zipFileName = tempFolder + "/" + zipFile; zip->open(zipFileName); zip->addFile(readMeFileName); bool actual = zip->addFile(readMeFileName); zip->close(); CPPUNIT_ASSERT_EQUAL(expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 1, numFilesInZip(zipFileName)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, readMeFileName)); }
void ZipTest::test_addFile_Content_FromAString() { std::string contentAsString("this is a string"); std::vector<unsigned char> content; content.insert(content.end(), contentAsString.begin(), contentAsString.end()); bool expected = true; std::string zipFileName = tempFolder + "/" + zipFile; zip->open(zipFileName); bool actual = zip->addFile(fileInsideZip, content); zip->close(); CPPUNIT_ASSERT_EQUAL(expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 1, numFilesInZip(zipFileName)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, fileInsideZip)); }
void ZipTest::test_replaceFile_WhenFileNotExistsOnFileSystem(){ bool expected = false; std::string zipFileName = tempFolder + "/" + zipFileFor_deleteAndReplace; createFolder(zipFileName); copyFile(zipFileFor_deleteAndReplace, zipFileName); zip->open(zipFileName, OpenFlags::OpenExisting); std::string fileToReplace = folderNameInsideZip + "/file2.txt"; bool actual = zip->replaceFile(notExistingFileName, fileToReplace); zip->close(); CPPUNIT_ASSERT_EQUAL(expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 7, numFilesInZip(zipFileName)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", false, containsFile(zipFileName, fileToReplace)); }
void ZipTest::test_addFile_Content_WithSubFoldersFileName() { std::vector<unsigned char> content; content.push_back('a'); content.push_back('z'); content.push_back('7'); bool expected = true; std::string zipFileName = tempFolder + "/" + zipFile; zip->open(zipFileName); bool actual = zip->addFile("folder/subfolder/test.txt", content); zip->close(); CPPUNIT_ASSERT_EQUAL(expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 1, numFilesInZip(zipFileName)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, "folder/subfolder/test.txt")); }
void ZipTest::test_addFiles_WhenOneFileNotExists() { bool expected = false; std::string zipFileName = tempFolder + "/" + zipFile; zip->open(zipFileName); std::string dataDir = "data/test/"; std::list<std::string> fileNames; fileNames.push_back(notExistingFileName); fileNames.push_back(dataDir + fileInsideZip); bool actual = zip->addFiles(fileNames); zip->close(); CPPUNIT_ASSERT_EQUAL_MESSAGE("add", expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 1, numFilesInZip(zipFileName)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, dataDir + fileInsideZip)); }
void ZipTest::test_addFile_Content_FromAString_WithPasswordProtection() { std::string contentAsString("this is a string"); std::vector<unsigned char> content; content.insert(content.end(), contentAsString.begin(), contentAsString.end()); bool expected = true; zip->open(tempFolder + "/" + zipFile, OpenFlags::CreateAndOverwrite, "secret"); bool actual = zip->addFile(fileInsideZip, content); zip->close(); CPPUNIT_ASSERT_EQUAL(expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 1, numFilesInZip(tempFolder + "/" + zipFile)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(tempFolder + "/" + zipFile, fileInsideZip)); std::vector<unsigned char> fileContent; fileContent = getFileContent(tempFolder + "/" + zipFile, fileInsideZip, "secret"); std::string fileContentAsString(fileContent.begin(), fileContent.end()); CPPUNIT_ASSERT_EQUAL_MESSAGE("file content", contentAsString, fileContentAsString); }
void ZipTest::test_replaceFile_Content() { std::vector<unsigned char> content; content.push_back('a'); content.push_back('z'); content.push_back('7'); bool expected = true; std::string zipFileName = tempFolder + "/" + zipFileFor_deleteAndReplace; createFolder(zipFileName); copyFile(zipFileFor_deleteAndReplace, zipFileName); zip->open(zipFileName, OpenFlags::OpenExisting); std::string fileToReplace = folderNameInsideZip + "/file2.txt"; bool actual = zip->replaceFile(fileToReplace, content); zip->close(); CPPUNIT_ASSERT_EQUAL(expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 8, numFilesInZip(zipFileName)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, fileToReplace)); }
void ZipTest::test_addFile_WithPasswordProtection() { bool expected = true; zip->open(tempFolder + "/" + zipFile, OpenFlags::CreateAndOverwrite, "secret"); bool actual = zip->addFile("data/test/" + fileInsideZip , false); zip->close(); CPPUNIT_ASSERT_EQUAL(expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 1, numFilesInZip(tempFolder + "/" + zipFile)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(tempFolder + "/" + zipFile, fileInsideZip)); std::vector<unsigned char> fileContent = getFileContent(tempFolder + "/" + zipFile, fileInsideZip, "secret"); std::string fileContentAsString(fileContent.begin(), fileContent.end()); //TODO: normally a would test it with the \n at the end, but it seems, // that on windows a carriage return (13) and a new line (10) is added instead // of one simple \n //std::string contentAsString("a\n"); //CPPUNIT_ASSERT_EQUAL_MESSAGE("file content", contentAsString, fileContentAsString); std::string contentAsString("this is a string"); CPPUNIT_ASSERT_MESSAGE("file content", boost::algorithm::starts_with(fileContentAsString, contentAsString)); }
void ZipTest::test_deleteFile_CheckOtherFileContent() { bool expected = true; std::string zipFileName = tempFolder + "/" + zipFileFor_deleteAndReplace; createFolder(zipFileName); copyFile(zipFileFor_deleteAndReplace, zipFileName); zip->open(zipFileName, OpenFlags::OpenExisting); std::string fileToDelete = folderNameInsideZip + "/file1.txt"; bool actual = zip->deleteFile(fileToDelete); zip->close(); CPPUNIT_ASSERT_EQUAL(expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 7, numFilesInZip(zipFileName)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", false, containsFile(zipFileName, fileToDelete)); std::string fileNameToCheckContent = folderNameInsideZip + "/file2.txt"; std::string fileContent = getFileContentAsString(zipFileName, fileNameToCheckContent, ""); CPPUNIT_ASSERT_MESSAGE("FileContent begin", boost::algorithm::starts_with(fileContent, "Lorem ipsum dolor")); }
void ZipTest::test_deleteFile_WhenTemparyFileCouldntCreated() { bool expected = false; std::string zipFileName = tempFolder + "/" + zipFileFor_deleteAndReplace; std::string tempZipFileName = tempFolder + "/" + "testZips/.~" + "zipFileFor_deleteAndReplaceTests.zip"; createFolder(zipFileName); copyFile(zipFileFor_deleteAndReplace, zipFileName); #ifdef WIN32 createFile(tempZipFileName, ""); // make tempZipFileName that zip want's to create read-only boost::filesystem::perms savedTempfolderPerms = boost::filesystem::status(tempZipFileName).permissions(); boost::filesystem::permissions(tempZipFileName, boost::filesystem::owner_read); #else // make folder which contains the zip read-only boost::filesystem::perms savedTempfolderPerms = boost::filesystem::status(tempFolder + "/" + testZipsFolder).permissions(); boost::filesystem::permissions(tempFolder + "/" + testZipsFolder, boost::filesystem::owner_read | boost::filesystem::owner_exe); #endif zip->open(zipFileName, OpenFlags::OpenExisting); std::string fileToDelete = folderNameInsideZip + "/file1.txt"; bool actual = zip->deleteFile(fileToDelete); zip->close(); #ifdef WIN32 // make the file writeable again so it can be deleted boost::filesystem::permissions(tempZipFileName, savedTempfolderPerms); #else // make the folder writeable again so it can be deleted boost::filesystem::permissions(tempFolder + "/" + testZipsFolder, savedTempfolderPerms); #endif CPPUNIT_ASSERT_EQUAL(expected, actual); CPPUNIT_ASSERT_EQUAL_MESSAGE("count", 8, numFilesInZip(zipFileName)); CPPUNIT_ASSERT_EQUAL_MESSAGE("contains", true, containsFile(zipFileName, fileToDelete)); }
bool Unzip::extractFileTo_Internal( const std::string & fileName, const std::string & path, int max, int current, const bool & overwriteExistingFile) { if(! containsFile(fileName)){ return false; } if(!overwriteExistingFile && doesFileExistOnFileSystem(path)){ return false; } bool extraction_ok = true; try{ std::string destinationPath = path; beforeFileExtraction(destinationPath); boost::filesystem::path p(destinationPath); if(createFolderIfNotExists(p.parent_path().string()) == false){ extraction_ok = false; } //locate filefileContent if(! goToFile(fileName)){ return false; } //open file if(UNZ_OK != unzOpenCurrentFile3(zipfile_handle, NULL, NULL, 0, formatPassword(this->password))){ return false; } //destination boost::filesystem::ofstream ofs(p, std::ios::out | std::ios::binary); //copy the content unsigned char buffer[CPPZIP_UNZIP_CHAR_ARRAY_BUFFER_SIZE]; unsigned int len = 0; while((len = unzReadCurrentFile( zipfile_handle, buffer, CPPZIP_UNZIP_CHAR_ARRAY_BUFFER_SIZE)) ){ ofs.write((const char *)buffer, len); } //close file if(UNZ_OK != unzCloseCurrentFile(zipfile_handle)){ return false; } ofs.flush(); if(ofs.fail()){ extraction_ok = false; } ofs.close(); fileExtracted(destinationPath, max, current); } catch(...){ return false; } return extraction_ok; }