Example #1
0
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"));
}
Example #2
0
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));
}
Example #3
0
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));
}
Example #4
0
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"));
}
Example #5
0
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));
}
Example #6
0
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;
	}
}
Example #7
0
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()));
}
Example #8
0
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));
}
Example #9
0
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));
}
Example #10
0
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));
}
Example #11
0
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));
}
Example #12
0
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));
}
Example #13
0
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"));
}
Example #14
0
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));
}
Example #15
0
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);
}
Example #16
0
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));
}
Example #17
0
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));
}
Example #18
0
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"));
}
Example #19
0
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));
}
Example #20
0
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;
}