blob: fb326a69b71f0a332493b38e658118d411311cf6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.harmony.archive.tests.java.util.zip;
import dalvik.annotation.KnownFailure;
import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetClass;
import dalvik.annotation.TestTargetNew;
import tests.support.Support_PlatformFile;
import tests.support.resource.Support_Resources;
import tests.util.TestEnvironment;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FilePermission;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Permission;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
@TestTargetClass(ZipFile.class)
public class ZipFileTest extends junit.framework.TestCase {
public byte[] getAllBytesFromStream(InputStream is) throws IOException {
ByteArrayOutputStream bs = new ByteArrayOutputStream();
byte[] buf = new byte[512];
int iRead;
int off;
while (is.available() > 0) {
iRead = is.read(buf, 0, buf.length);
if (iRead > 0) bs.write(buf, 0, iRead);
}
return bs.toByteArray();
}
// the file hyts_zipFile.zip in setup must be included as a resource
private String tempFileName;
private ZipFile zfile;
// custom security manager
SecurityManager sm = new SecurityManager() {
final String forbidenPermissionAction = "read";
public void checkPermission(Permission perm) {
// only check if it's a FilePermission because Locale checks
// for a PropertyPermission with action"read" to get system props.
if (perm instanceof FilePermission
&& perm.getActions().equals(forbidenPermissionAction)) {
throw new SecurityException();
}
}
};
/**
* @tests java.util.zip.ZipFile#ZipFile(java.io.File)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "setUp procedure checks this type of constructor.",
method = "ZipFile",
args = {java.io.File.class}
)
public void test_ConstructorLjava_io_File() {
// Test for method java.util.zip.ZipFile(java.io.File)
assertTrue("Used to test", true);
}
/**
* @tests java.util.zip.ZipFile#ZipFile(java.io.File, int)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "ZipFile",
args = {java.io.File.class, int.class}
)
public void test_ConstructorLjava_io_FileI() throws IOException {
zfile.close(); // about to reopen the same temp file
File file = new File(tempFileName);
ZipFile zip = new ZipFile(file, ZipFile.OPEN_DELETE | ZipFile.OPEN_READ);
zip.close();
assertTrue("Zip should not exist", !file.exists());
file = new File(tempFileName);
file.delete();
try {
zip = new ZipFile(file, ZipFile.OPEN_READ);
fail("IOException expected");
} catch (IOException ee) {
// expected
}
// IOException can not be checked throws ZipException in case of IO
// problems.
SecurityManager oldSm = System.getSecurityManager();
System.setSecurityManager(sm);
try {
file = new File(tempFileName);
zip = new ZipFile(file, ZipFile.OPEN_READ);
fail("SecurityException expected");
} catch (SecurityException e) {
// expected
} finally {
System.setSecurityManager(oldSm);
}
file = new File(tempFileName);
try {
zip = new ZipFile(file, -1);
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException ee) {
// expected
}
}
/**
* @throws IOException
* @tests java.util.zip.ZipFile#ZipFile(java.lang.String)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test contains empty brackets.",
method = "ZipFile",
args = {java.lang.String.class}
)
public void test_ConstructorLjava_lang_String() throws IOException {
System.setProperty("user.dir", System.getProperty("java.io.tmpdir"));
zfile.close(); // about to reopen the same temp file
ZipFile zip = new ZipFile(tempFileName);
zip.close();
File file = File.createTempFile("zip", "tmp");
try {
zip = new ZipFile(file.getName());
fail("ZipException expected");
} catch (ZipException ee) {
// expected
}
file.delete();
// IOException can not be checked throws ZipException in case of IO
// problems.
SecurityManager oldSm = System.getSecurityManager();
System.setSecurityManager(sm);
try {
zip = new ZipFile(tempFileName);
fail("SecurityException expected");
} catch (SecurityException e) {
// expected
} finally {
System.setSecurityManager(oldSm);
}
}
protected ZipEntry test_finalize1(ZipFile zip) {
return zip.getEntry("File1.txt");
}
protected ZipFile test_finalize2(File file) throws IOException {
return new ZipFile(file);
}
/**
* @tests java.util.zip.ZipFile#finalize()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "finalize",
args = {}
)
public void test_finalize() throws IOException {
InputStream in = Support_Resources.getStream("hyts_ZipFile.zip");
File file = Support_Resources.createTempFile(".jar");
OutputStream out = new FileOutputStream(file);
int result;
byte[] buf = new byte[4096];
while ((result = in.read(buf)) != -1) {
out.write(buf, 0, result);
}
in.close();
out.close();
/*
* ZipFile zip = new ZipFile(file); ZipEntry entry1 =
* zip.getEntry("File1.txt"); assertNotNull("Did not find entry",
* entry1); entry1 = null; zip = null;
*/
assertNotNull("Did not find entry",
test_finalize1(test_finalize2(file)));
System.gc();
System.gc();
System.runFinalization();
file.delete();
assertTrue("Zip should not exist", !file.exists());
}
/**
* @throws IOException
* @tests java.util.zip.ZipFile#close()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "close",
args = {}
)
public void test_close() throws IOException {
// Test for method void java.util.zip.ZipFile.close()
File fl = new File(tempFileName);
ZipFile zf = new ZipFile(fl);
InputStream is1 = zf.getInputStream(zf.getEntry("File1.txt"));
InputStream is2 = zf.getInputStream(zf.getEntry("File2.txt"));
is1.read();
is2.read();
zf.close();
try {
is1.read();
fail("IOException expected");
} catch (IOException ee) {
// expected
}
try {
is2.read();
fail("IOException expected");
} catch (IOException ee) {
// expected
}
}
/**
* @tests java.util.zip.ZipFile#entries()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "entries",
args = {}
)
public void test_entries() throws Exception {
// Test for method java.util.Enumeration java.util.zip.ZipFile.entries()
Enumeration<? extends ZipEntry> enumer = zfile.entries();
int c = 0;
while (enumer.hasMoreElements()) {
++c;
enumer.nextElement();
}
assertTrue("Incorrect number of entries returned: " + c, c == 6);
Enumeration<? extends ZipEntry> enumeration = zfile.entries();
zfile.close();
try {
enumeration.nextElement();
fail("did not detect closed file");
} catch (IllegalStateException expected) {
}
try {
enumeration.hasMoreElements();
fail("did not detect closed file");
} catch (IllegalStateException expected) {
}
try {
zfile.entries();
fail("did not detect closed file");
} catch (IllegalStateException expected) {
}
}
/**
* @tests java.util.zip.ZipFile#getEntry(java.lang.String)
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
method = "getEntry",
args = {java.lang.String.class}
)
public void test_getEntryLjava_lang_String() throws IOException {
// Test for method java.util.zip.ZipEntry
// java.util.zip.ZipFile.getEntry(java.lang.String)
java.util.zip.ZipEntry zentry = zfile.getEntry("File1.txt");
assertNotNull("Could not obtain ZipEntry", zentry);
int r;
InputStream in;
zentry = zfile.getEntry("testdir1/File1.txt");
assertNotNull("Could not obtain ZipEntry: testdir1/File1.txt", zentry);
zentry = zfile.getEntry("testdir1/");
assertNotNull("Could not obtain ZipEntry: testdir1/", zentry);
in = zfile.getInputStream(zentry);
assertNotNull("testdir1/ should not have null input stream", in);
r = in.read();
in.close();
assertEquals("testdir1/ should not contain data", -1, r);
zentry = zfile.getEntry("testdir1/testdir1");
assertNotNull("Could not obtain ZipEntry: testdir1/testdir1", zentry);
in = zfile.getInputStream(zentry);
byte[] buf = new byte[256];
r = in.read(buf);
in.close();
assertEquals("incorrect contents", "This is also text", new String(buf,
0, r));
}
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
method = "getEntry",
args = {java.lang.String.class}
)
public void test_getEntryLjava_lang_String_AndroidOnly() throws IOException {
java.util.zip.ZipEntry zentry = zfile.getEntry("File1.txt");
assertNotNull("Could not obtain ZipEntry", zentry);
int r;
InputStream in;
zentry = zfile.getEntry("testdir1");
assertNotNull("Must be able to obtain ZipEntry: testdir1", zentry);
in = zfile.getInputStream(zentry);
/*
* Android delivers empty InputStream, RI no InputStream at all. The
* spec doesn't clarify this, so we need to deal with both situations.
*/
int data = -1;
if (in != null) {
data = in.read();
in.close();
}
assertEquals("Must not be able to read directory data", -1, data);
}
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "IllegalStateException checking.",
method = "getEntry",
args = {java.lang.String.class}
)
public void test_getEntryLjava_lang_String_Ex() throws IOException {
java.util.zip.ZipEntry zentry = zfile.getEntry("File1.txt");
assertNotNull("Could not obtain ZipEntry", zentry);
zfile.close();
try {
zfile.getEntry("File2.txt");
fail("IllegalStateException expected");
} catch (IllegalStateException ee) {
}
}
/**
* @throws IOException
* @tests java.util.zip.ZipFile#getInputStream(java.util.zip.ZipEntry)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getInputStream",
args = {java.util.zip.ZipEntry.class}
)
public void test_getInputStreamLjava_util_zip_ZipEntry() throws IOException {
// Test for method java.io.InputStream
// java.util.zip.ZipFile.getInputStream(java.util.zip.ZipEntry)
ZipEntry zentry = null;
InputStream is = null;
try {
zentry = zfile.getEntry("File1.txt");
is = zfile.getInputStream(zentry);
byte[] rbuf = new byte[1000];
int r;
is.read(rbuf, 0, r = (int) zentry.getSize());
assertEquals("getInputStream read incorrect data", "This is text",
new String(rbuf, 0, r));
} catch (java.io.IOException e) {
fail("IOException during getInputStream");
} finally {
try {
is.close();
} catch (java.io.IOException e) {
fail("Failed to close input stream");
}
}
zentry = zfile.getEntry("File2.txt");
zfile.close();
try {
is = zfile.getInputStream(zentry);
fail("IllegalStateException expected");
} catch (IllegalStateException ee) {
// expected
}
// ZipException can not be checked. Stream object returned or null.
}
/**
* @tests java.util.zip.ZipFile#getName()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getName",
args = {}
)
public void test_getName() {
// Test for method java.lang.String java.util.zip.ZipFile.getName()
assertTrue("Returned incorrect name: " + zfile.getName(), zfile
.getName().equals(tempFileName));
}
/**
* @throws IOException
* @tests java.util.zip.ZipFile#size()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "size",
args = {}
)
public void test_size() throws IOException {
assertEquals(6, zfile.size());
zfile.close();
try {
zfile.size();
fail("IllegalStateException expected");
} catch (IllegalStateException expected) {
}
}
/**
* @tests java.io.InputStream#reset()
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
method = "getInputStream",
args = {java.util.zip.ZipEntry.class}
)
@KnownFailure("ZipEntry.getInputStream().reset() fails with an IOException")
public void test_reset() throws IOException {
// read an uncompressed entry
ZipEntry zentry = zfile.getEntry("File1.txt");
InputStream is = zfile.getInputStream(zentry);
byte[] rbuf1 = new byte[6];
byte[] rbuf2 = new byte[6];
int r1, r2;
r1 = is.read(rbuf1);
assertEquals(rbuf1.length, r1);
r2 = is.read(rbuf2);
assertEquals(rbuf2.length, r2);
is.reset();
r2 = is.read(rbuf2);
assertEquals(rbuf2.length, r2);
is.close();
// read a compressed entry
byte[] rbuf3 = new byte[4185];
ZipEntry zentry2 = zfile.getEntry("File3.txt");
is = zfile.getInputStream(zentry2);
r1 = is.read(rbuf3);
assertEquals(4183, r1);
is.reset();
r1 = is.read(rbuf3);
assertEquals(4183, r1);
is.close();
is = zfile.getInputStream(zentry2);
r1 = is.read(rbuf3, 0, 3000);
assertEquals(3000, r1);
is.reset();
r1 = is.read(rbuf3, 0, 3000);
assertEquals(3000, r1);
is.close();
}
/**
* @tests java.io.InputStream#reset()
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
method = "getInputStream",
args = {java.util.zip.ZipEntry.class}
)
@KnownFailure("ZipEntry.getInputStream().reset() fails with an IOException")
public void test_reset_subtest0() throws IOException {
// read an uncompressed entry
ZipEntry zentry = zfile.getEntry("File1.txt");
InputStream is = zfile.getInputStream(zentry);
byte[] rbuf1 = new byte[12];
byte[] rbuf2 = new byte[12];
int r = is.read(rbuf1, 0, 4);
assertEquals(4, r);
is.mark(0);
r = is.read(rbuf1);
assertEquals(8, r);
assertEquals(-1, is.read());
is.reset();
r = is.read(rbuf2);
assertEquals(8, r);
assertEquals(-1, is.read());
is.close();
// read a compressed entry
byte[] rbuf3 = new byte[4185];
ZipEntry zentry2 = zfile.getEntry("File3.txt");
is = zfile.getInputStream(zentry2);
r = is.read(rbuf3, 0, 3000);
assertEquals(3000, r);
is.mark(0);
r = is.read(rbuf3);
assertEquals(1183, r);
assertEquals(-1, is.read());
is.reset();
r = is.read(rbuf3);
assertEquals(1183, r);
assertEquals(-1, is.read());
is.close();
}
/**
* Sets up the fixture, for example, open a network connection. This method
* is called before a test is executed.
*/
@Override
protected void setUp() {
try {
// Create a local copy of the file since some tests want to alter
// information.
tempFileName = System.getProperty("java.io.tmpdir");
String separator = System.getProperty("file.separator");
if (tempFileName.charAt(tempFileName.length() - 1) == separator
.charAt(0)) {
tempFileName = Support_PlatformFile.getNewPlatformFile(
tempFileName, "gabba.zip");
} else {
tempFileName = Support_PlatformFile.getNewPlatformFile(
tempFileName + separator, "gabba.zip");
}
File f = new File(tempFileName);
f.delete();
InputStream is = Support_Resources.getStream("hyts_ZipFile.zip");
FileOutputStream fos = new FileOutputStream(f);
byte[] rbuf = getAllBytesFromStream(is);
fos.write(rbuf, 0, rbuf.length);
is.close();
fos.close();
zfile = new ZipFile(f);
} catch (Exception e) {
System.out.println("Exception during ZipFile setup:");
e.printStackTrace();
}
}
/**
* Tears down the fixture, for example, close a network connection. This
* method is called after a test is executed.
*/
@Override
protected void tearDown() {
TestEnvironment.reset();
try {
if (zfile != null) {
// Note zfile is a user-defined zip file used by other tests and
// should not be deleted
zfile.close();
tempFileName = System.getProperty("java.io.tmpdir");
String separator = System.getProperty("file.separator");
if (tempFileName.charAt(tempFileName.length() - 1) == separator
.charAt(0)) {
tempFileName = Support_PlatformFile.getNewPlatformFile(
tempFileName, "gabba.zip");
} else {
tempFileName = Support_PlatformFile.getNewPlatformFile(
tempFileName + separator, "gabba.zip");
}
File f = new File(tempFileName);
f.delete();
}
} catch (Exception e) {
}
}
}