/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.utils;
import java.io.File;
import java.io.FileFilter;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import junit.framework.TestCase;
import org.openflexo.toolbox.FileUtils;
import org.openflexo.toolbox.ZipUtils;
public class ZipTest extends TestCase {
private static final String INNER_FILE_NAME = "InnerFileName";
private static final String SUB_INNER_FILE_NAME = "SubInnerFileName";
private static final String INNER_DIRECTORY_NAME = "InnerDirectoryName";
private static final String FILE_CONTENT = "²&é\"'(§è!çà)-azertyuiop^$qsdfghjklmùµ<wxcvbn,;:=³1234567890°_AZERTYUIOP¨*QSDFGHJKLM%%%£>WXCVBN?./+|@#^{}€[]µ´`\\~\n";
private File directory;
private File innerFile;
private File innerDirectory;
private File subInnerFile;
@Override
protected void setUp() throws Exception {
super.setUp();
File temp = File.createTempFile("ZipTests", "");
temp.delete();
assertTrue(temp.mkdir());
directory = temp;
System.err.println("Zip directory test: " + directory.getAbsolutePath());
innerFile = new File(directory, INNER_FILE_NAME);
assertTrue(innerFile.createNewFile());
FileUtils.saveToFile(innerFile, FILE_CONTENT);
innerDirectory = new File(directory, INNER_DIRECTORY_NAME);
assertTrue(innerDirectory.mkdir());
subInnerFile = new File(innerDirectory, SUB_INNER_FILE_NAME);
assertTrue(subInnerFile.createNewFile());
FileUtils.saveToFile(subInnerFile, FILE_CONTENT);
}
@Override
protected void tearDown() throws Exception {
FileUtils.deleteDir(directory);
super.tearDown();
}
public void testZipUnzip() throws Exception {
File archive = File.createTempFile("ZipTestFile", ".zip");
System.err.println("Zip archive: " + archive.getAbsolutePath());
ZipUtils.makeZip(archive, directory);
assertTrue(archive.exists());
ZipFile zipFile = new ZipFile(archive);
assertZipEntryCount(zipFile, 2); // Directories don't count
File output = new File(System.getProperty("java.io.tmpdir"), "OutputOf" + archive.getName());
ZipUtils.unzip(archive, output);
File extractedDirectory = new File(output, directory.getName());
File extractedInnerFile = new File(extractedDirectory, INNER_FILE_NAME);
File extractedInnerDirectory = new File(extractedDirectory, INNER_DIRECTORY_NAME);
File extractedSubInnerFile = new File(extractedInnerDirectory, SUB_INNER_FILE_NAME);
assertTrue(extractedDirectory.exists());
assertTrue(extractedDirectory.isDirectory());
assertTrue(extractedInnerDirectory.exists());
assertTrue(extractedInnerDirectory.isDirectory());
assertTrue(extractedInnerFile.exists());
assertTrue(extractedInnerFile.isFile());
assertTrue(extractedSubInnerFile.exists());
assertTrue(extractedSubInnerFile.isFile());
assertEquals(FILE_CONTENT, FileUtils.fileContents(extractedInnerFile));
assertEquals(FILE_CONTENT, FileUtils.fileContents(extractedSubInnerFile));
FileUtils.deleteDir(output);
archive.delete();
}
public void testZipUnzipFiltered() throws Exception {
File archive = File.createTempFile("ZipTestFile", ".zip");
System.err.println("Zip archive: " + archive.getAbsolutePath());
ZipUtils.makeZip(archive, directory, null, new FileFilter() {
@Override
public boolean accept(File pathname) {
return !pathname.equals(innerFile);
}
});
assertTrue(archive.exists());
ZipFile zipFile = new ZipFile(archive);
assertZipEntryCount(zipFile, 1);
File output = new File(System.getProperty("java.io.tmpdir"), "OutputOf" + archive.getName());
ZipUtils.unzip(archive, output);
File extractedDirectory = new File(output, directory.getName());
File extractedInnerFile = new File(extractedDirectory, INNER_FILE_NAME);
File extractedInnerDirectory = new File(extractedDirectory, INNER_DIRECTORY_NAME);
File extractedSubInnerFile = new File(extractedInnerDirectory, SUB_INNER_FILE_NAME);
assertTrue(extractedDirectory.exists());
assertTrue(extractedDirectory.isDirectory());
assertTrue(extractedInnerDirectory.exists());
assertTrue(extractedInnerDirectory.isDirectory());
assertFalse(extractedInnerFile.exists());
assertTrue(extractedSubInnerFile.exists());
assertTrue(extractedSubInnerFile.isFile());
FileUtils.deleteDir(output);
archive.delete();
}
public void testZipUnzipFiltered2() throws Exception {
File archive = File.createTempFile("ZipTestFile", ".zip");
System.err.println("Zip archive: " + archive.getAbsolutePath());
ZipUtils.makeZip(archive, directory, null, new FileFilter() {
@Override
public boolean accept(File pathname) {
return !pathname.equals(subInnerFile);
}
});
assertTrue(archive.exists());
ZipFile zipFile = new ZipFile(archive);
assertZipEntryCount(zipFile, 1);
File output = new File(System.getProperty("java.io.tmpdir"), "OutputOf" + archive.getName());
ZipUtils.unzip(archive, output);
File extractedDirectory = new File(output, directory.getName());
File extractedInnerFile = new File(extractedDirectory, INNER_FILE_NAME);
File extractedInnerDirectory = new File(extractedDirectory, INNER_DIRECTORY_NAME);
File extractedSubInnerFile = new File(extractedInnerDirectory, SUB_INNER_FILE_NAME);
assertTrue(extractedDirectory.exists());
assertTrue(extractedDirectory.isDirectory());
assertFalse(extractedInnerDirectory.exists());
assertTrue(extractedInnerFile.exists());
assertFalse(extractedSubInnerFile.exists());
FileUtils.deleteDir(output);
archive.delete();
}
/**
* @param zipFile
*/
private void assertZipEntryCount(ZipFile zipFile, int expected) {
int count = 0;
Enumeration<? extends ZipEntry> en = zipFile.entries();
while (en.hasMoreElements()) {
ZipEntry e = en.nextElement();
count++;
}
assertEquals(expected, count);
}
}