blob: 97c0f63b73302e6d6269242d8bdfc342c88bdbd5 [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* 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.
*/
package libcore.java.util.zip;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import junit.framework.TestCase;
/**
* Basic tests for ZipFile.
*/
public class OldAndroidZipFileTest extends TestCase {
private static final int SAMPLE_SIZE = 128 * 1024;
public void testZipFile() throws Exception {
File file = File.createTempFile("ZipFileTest", ".zip");
try {
// create a test file; assume it's not going to collide w/anything
FileOutputStream outStream = new FileOutputStream(file);
createCompressedZip(outStream);
scanZip(file.getPath());
read2(file.getPath());
} finally {
file.delete();
}
}
/*
* stepStep == 0 --> >99% compression
* stepStep == 1 --> ~30% compression
* stepStep == 2 --> no compression
*/
static byte[] makeSampleFile(int stepStep) throws IOException {
byte[] sample = new byte[SAMPLE_SIZE];
byte val, step;
int i, j, offset;
val = 0;
step = 1;
offset = 0;
for (i = 0; i < SAMPLE_SIZE / 256; i++) {
for (j = 0; j < 256; j++) {
sample[offset++] = val;
val += step;
}
step += stepStep;
}
return sample;
}
static void createCompressedZip(OutputStream bytesOut) throws IOException {
ZipOutputStream out = new ZipOutputStream(bytesOut);
try {
int i;
for (i = 0; i < 3; i++) {
byte[] input = makeSampleFile(i);
ZipEntry newEntry = new ZipEntry("file-" + i);
if (i != 1) {
newEntry.setComment("this is file " + i);
}
out.putNextEntry(newEntry);
out.write(input, 0, input.length);
out.closeEntry();
}
out.setComment("This is a lovely compressed archive!");
} finally {
out.close();
}
}
static void scanZip(String fileName) throws IOException {
ZipFile zipFile = new ZipFile(fileName);
Enumeration fileList;
int idx = 0;
// System.out.println("Contents of " + zipFile + ":");
for (fileList = zipFile.entries(); fileList.hasMoreElements();) {
ZipEntry entry = (ZipEntry) fileList.nextElement();
// System.out.println(" " + entry.getName());
assertEquals(entry.getName(), "file-" + idx);
idx++;
}
zipFile.close();
}
/*
* Read compressed data from two different entries at the same time,
* to verify that the streams aren't getting confused. If we do
* something wrong, the inflater will choke and throw a ZipException.
*
* This doesn't test synchronization in multi-threaded use.
*/
static void read2(String fileName) throws IOException {
ZipFile zipFile;
ZipEntry entry1, entry2;
byte buf[] = new byte[16384];
InputStream stream1, stream2;
int len, totalLen1, totalLen2;
/* use file-1 and file-2 because the compressed data is large */
zipFile = new ZipFile(fileName);
entry1 = zipFile.getEntry("file-1");
entry2 = zipFile.getEntry("file-2");
/* make sure we got the right thing */
assertEquals("file-1", entry1.getName());
assertEquals("file-2", entry2.getName());
/* create streams */
stream1 = zipFile.getInputStream(entry1);
stream2 = zipFile.getInputStream(entry2);
/*
* Read a piece of file #1.
*/
totalLen1 = stream1.read(buf);
assertTrue("initial read failed on #1", totalLen1 >= 0);
/*
* Read a piece of file #2.
*/
totalLen2 = stream2.read(buf);
assertTrue("initial read failed on #2", totalLen2 >= 0);
/*
* Read the rest of file #1, and close the stream.
*
* If our streams are crossed up, we'll fail here.
*/
while ((len = stream1.read(buf)) > 0) {
totalLen1 += len;
}
assertEquals(SAMPLE_SIZE, totalLen1);
stream1.close();
/*
* Read the rest of file #2, and close the stream.
*/
while ((len = stream2.read(buf)) > 0) {
totalLen2 += len;
}
assertEquals(SAMPLE_SIZE, totalLen2);
stream2.close();
/*
* Open a new one.
*/
stream1 = zipFile.getInputStream(zipFile.getEntry("file-0"));
/*
* Close the ZipFile. According to the RI, none if its InputStreams can
* be read after this point.
*/
zipFile.close();
Exception error = null;
try {
stream1.read(buf);
} catch (Exception ex) {
error = ex;
}
assertNotNull("ZipFile shouldn't allow reading of closed files.", error);
}
}