blob: be3f5c3b89097db0edf612d3f33247c4eed7c5b2 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* @author max
*/
package com.intellij.util.io.zip;
import com.intellij.openapi.util.io.FileUtil;
import junit.framework.TestCase;
import java.io.*;
import java.util.zip.CRC32;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
public class UpdateableZipTest extends TestCase {
private File zipFile;
@Override
protected void setUp() throws Exception {
super.setUp();
zipFile = createTestUtilZip();
}
@Override
protected void tearDown() throws Exception {
FileUtil.delete(zipFile);
super.tearDown();
}
public void testRead() throws Exception {
JBZipFile jbZip = new JBZipFile(zipFile);
assertEntryWithContentExists(jbZip, "/first", "first");
assertEntryWithContentExists(jbZip, "/second", "second");
}
public void testAppendEntry() throws Exception {
File zipFile = createTestUtilZip();
JBZipFile jbZip = new JBZipFile(zipFile);
assertEntryWithContentExists(jbZip, "/first", "first");
assertEntryWithContentExists(jbZip, "/second", "second");
JBZipEntry newEntry = jbZip.getOrCreateEntry("/third");
newEntry.setData("third".getBytes());
jbZip.close();
ZipFile utilZip = new ZipFile(zipFile);
ZipEntry thirdEntry = utilZip.getEntry("/third");
assertNotNull(thirdEntry);
String thirdText = FileUtil.loadTextAndClose(new InputStreamReader(utilZip.getInputStream(thirdEntry)));
assertEquals("third", thirdText);
utilZip.close();
}
public void testReplaceEntryContent() throws Exception {
File zipFile = createTestUtilZip();
JBZipFile jbZip = new JBZipFile(zipFile);
assertEntryWithContentExists(jbZip, "/first", "first");
assertEntryWithContentExists(jbZip, "/second", "second");
JBZipEntry newEntry = jbZip.getOrCreateEntry("/second");
newEntry.setData("Content Replaced".getBytes());
jbZip.close();
ZipFile utilZip = new ZipFile(zipFile);
ZipEntry updatedEntry = utilZip.getEntry("/second");
assertNotNull(updatedEntry);
String thirdText = FileUtil.loadTextAndClose(new InputStreamReader(utilZip.getInputStream(updatedEntry)));
assertEquals("Content Replaced", thirdText);
utilZip.close();
}
public void testRemoveEntry() throws Exception {
File zipFile = createTestUtilZip();
JBZipFile jbZip = new JBZipFile(zipFile);
assertEntryWithContentExists(jbZip, "/first", "first");
assertEntryWithContentExists(jbZip, "/second", "second");
jbZip.getEntry("/second").erase();
jbZip.close();
ZipFile utilZip = new ZipFile(zipFile);
ZipEntry removedEntry = utilZip.getEntry("/second");
assertNull(removedEntry);
utilZip.close();
}
/*
public void testAppendToIdeaJar() throws Exception {
//ProfilingUtil.startCPUProfiling();
for (int i = 0; i < 20; i++) {
long tm = System.currentTimeMillis();
JBZipFile jbZip = new JBZipFile(new File("/Users/max/idea.jar"));
long tm2 = System.currentTimeMillis();
System.out.print("Loaded in: " + (tm2 - tm) + " msec ");
jbZip.getOrCreateEntry("/somenewtext.txt").setData("New text".getBytes());
jbZip.close();
long tm3 = System.currentTimeMillis();
System.out.println("Updated in: " + (tm3 - tm2) + " msec");
}
//ProfilingUtil.captureCPUSnapshot();
}
*/
private File createTestUtilZip() throws Exception {
File zipFile = FileUtil.createTempFile("test", ".zip");
ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
appendEntry(zos, "/first", "first".getBytes());
appendEntry(zos, "/second", "second".getBytes());
zos.close();
return zipFile;
}
private static void assertEntryWithContentExists(JBZipFile jbZip, String entryName, String content) throws IOException {
JBZipEntry entry = jbZip.getEntry(entryName);
assertNotNull(entry);
String text = new String(entry.getData());
assertEquals(content, text);
}
private void appendEntry(ZipOutputStream zos, String name, byte[] content) throws Exception{
ZipEntry e = new ZipEntry(name);
e.setMethod(ZipEntry.STORED);
e.setSize(content.length);
CRC32 crc = new CRC32();
crc.update(content);
e.setCrc(crc.getValue());
zos.putNextEntry(e);
zos.write(content, 0, content.length);
zos.closeEntry();
}
}