1d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath/*
2d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath * Licensed to the Apache Software Foundation (ASF) under one or more
3d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath * contributor license agreements.  See the NOTICE file distributed with
4d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath * this work for additional information regarding copyright ownership.
5d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath * The ASF licenses this file to You under the Apache License, Version 2.0
6d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath * (the "License"); you may not use this file except in compliance with
7d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath * the License.  You may obtain a copy of the License at
8d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath *
9d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath *     http://www.apache.org/licenses/LICENSE-2.0
10d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath *
11d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath * Unless required by applicable law or agreed to in writing, software
12d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath * distributed under the License is distributed on an "AS IS" BASIS,
13d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath * See the License for the specific language governing permissions and
15d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath * limitations under the License.
16d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath */
17d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathpackage org.apache.harmony.tests.java.util.zip;
18d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
19d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.io.ByteArrayInputStream;
20d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.io.ByteArrayOutputStream;
21d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.io.File;
22d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.io.FileOutputStream;
23d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.io.IOException;
24d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.util.zip.CRC32;
25d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.util.zip.ZipEntry;
26d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.util.zip.ZipException;
27d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.util.zip.ZipInputStream;
28d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.util.zip.ZipOutputStream;
29d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
30d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathpublic class ZipOutputStreamTest extends junit.framework.TestCase {
31d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
32d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    ZipOutputStream zos;
33d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
34d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    ByteArrayOutputStream bos;
35d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
36d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    ZipInputStream zis;
37d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
38d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    static final String data = "HelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorld";
39d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
40d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    /**
41d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     * java.util.zip.ZipOutputStream#close()
42d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     */
43d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    public void test_close() throws Exception {
44d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos = new ZipOutputStream(bos);
45d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.putNextEntry(new ZipEntry("XX"));
46d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.closeEntry();
47d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.close();
48d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
49d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        // Regression for HARMONY-97
50d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        ZipOutputStream zos = new ZipOutputStream(new ByteArrayOutputStream());
51d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.putNextEntry(new ZipEntry("myFile"));
52d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.close();
53d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.close(); // Should be a no-op
54d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
55d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
56d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    /**
57d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     * java.util.zip.ZipOutputStream#closeEntry()
58d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     */
59d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    public void test_closeEntry() throws IOException {
60d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        ZipEntry ze = new ZipEntry("testEntry");
61d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        ze.setTime(System.currentTimeMillis());
62d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.putNextEntry(ze);
63d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.write("Hello World".getBytes("UTF-8"));
64d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.closeEntry();
65d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        assertTrue("closeEntry failed to update required fields",
66d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                ze.getSize() == 11 && ze.getCompressedSize() == 13);
67d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
68d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
69d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
70d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    /**
71d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     * java.util.zip.ZipOutputStream#finish()
72d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     */
73d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    public void test_finish() throws Exception {
74d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        ZipEntry ze = new ZipEntry("test");
75d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.putNextEntry(ze);
76d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.write("Hello World".getBytes());
77d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.finish();
78d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        assertEquals("Finish failed to closeCurrentEntry", 11, ze.getSize());
79d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
80d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        ZipOutputStream zos = new ZipOutputStream(new ByteArrayOutputStream());
81d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.putNextEntry(new ZipEntry("myFile"));
82d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.finish();
83d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.close();
84d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
85d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            zos.finish();
86d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail("Assert 0: Expected IOException");
87d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (IOException e) {
88d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            // Expected
89d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
90d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
91d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
92d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    /**
93d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     * java.util.zip.ZipOutputStream#putNextEntry(java.util.zip.ZipEntry)
94d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     */
95d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    public void test_putNextEntryLjava_util_zip_ZipEntry() throws IOException {
96d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        ZipEntry ze = new ZipEntry("testEntry");
97d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        ze.setTime(System.currentTimeMillis());
98d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.putNextEntry(ze);
99d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.write("Hello World".getBytes());
100d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.closeEntry();
101d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.close();
102d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zis = new ZipInputStream(new ByteArrayInputStream(bos.toByteArray()));
103d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        ZipEntry ze2 = zis.getNextEntry();
104d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zis.closeEntry();
105d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        assertEquals("Failed to write correct entry", ze.getName(), ze2.getName());
106d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        assertEquals("Failed to write correct entry", ze.getCrc(), ze2.getCrc());
107d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
108d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            zos.putNextEntry(ze);
109d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail("Entry with incorrect setting failed to throw exception");
110d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (IOException e) {
111d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            // expected
112d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
113d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
114d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
115d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    /**
116d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     * java.util.zip.ZipOutputStream#setComment(java.lang.String)
117d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     */
118d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    public void test_setCommentLjava_lang_String() {
119d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        // There is no way to get the comment back, so no way to determine if
120d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        // the comment is set correct
121d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.setComment("test setComment");
122d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
123d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
124d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            zos.setComment(new String(new byte[0xFFFF + 1]));
125d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail("Comment over 0xFFFF in length should throw exception");
126d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (IllegalArgumentException e) {
127d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            // Passed
128d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
129d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
130d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
131d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    /**
132d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     * java.util.zip.ZipOutputStream#setLevel(int)
133d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     */
134d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    public void test_setLevelI() throws IOException {
135d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        ZipEntry ze = new ZipEntry("test");
136d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.putNextEntry(ze);
137d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.write(data.getBytes());
138d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.closeEntry();
139d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        long csize = ze.getCompressedSize();
140d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.setLevel(9); // Max Compression
141d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.putNextEntry(ze = new ZipEntry("test2"));
142d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.write(data.getBytes());
143d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.closeEntry();
144d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        assertTrue("setLevel failed", csize <= ze.getCompressedSize());
145d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
146d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
147d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    /**
148d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     * java.util.zip.ZipOutputStream#setMethod(int)
149d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     */
150d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    public void test_setMethodI() throws IOException {
151d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        ZipEntry ze = new ZipEntry("test");
152d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.setMethod(ZipOutputStream.STORED);
153d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        CRC32 tempCrc = new CRC32();
154d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        tempCrc.update(data.getBytes());
155d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        ze.setCrc(tempCrc.getValue());
156d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        ze.setSize(new String(data).length());
157d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.putNextEntry(ze);
158d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.write(data.getBytes());
159d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.closeEntry();
160d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        long csize = ze.getCompressedSize();
161d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.setMethod(ZipOutputStream.DEFLATED);
162d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.putNextEntry(ze = new ZipEntry("test2"));
163d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.write(data.getBytes());
164d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.closeEntry();
165d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        assertTrue("setLevel failed", csize >= ze.getCompressedSize());
166d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
167d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
168d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    /**
169d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     * java.util.zip.ZipOutputStream#write(byte[], int, int)
170d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     */
171d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    public void test_write$BII() throws IOException {
172d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        ZipEntry ze = new ZipEntry("test");
173d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.putNextEntry(ze);
174d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.write(data.getBytes());
175d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.closeEntry();
176d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos.close();
177d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos = null;
178d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zis = new ZipInputStream(new ByteArrayInputStream(bos.toByteArray()));
179d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zis.getNextEntry();
180d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        byte[] b = new byte[data.length()];
181d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        int r = 0;
182d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        int count = 0;
183d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        while (count != b.length && (r = zis.read(b, count, b.length)) != -1) {
184d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            count += r;
185d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
186d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zis.closeEntry();
187d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        assertEquals("Write failed to write correct bytes", new String(b), data);
188d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
189d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        File f = File.createTempFile("testZip", "tst");
190d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        f.deleteOnExit();
191d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        FileOutputStream stream = new FileOutputStream(f);
192d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        ZipOutputStream zip = new ZipOutputStream(stream);
193d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zip.setMethod(ZipEntry.STORED);
194d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
195d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
196d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            zip.putNextEntry(new ZipEntry("Second"));
197d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail("Not set an entry. Should have thrown ZipException.");
198d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (ZipException e) {
199d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            // expected -- We have not set an entry
200d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
201d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
202d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
203d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            // We try to write data without entry
204d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            zip.write(new byte[2]);
205d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail("Writing data without an entry. Should have thrown IOException");
206d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (IOException e) {
207d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            // expected
208d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
209d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
210d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
211d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            // Try to write without an entry and with nonsense offset and
212d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            // length
213d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            zip.write(new byte[2], 0, 12);
214d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail("Writing data without an entry. Should have thrown IndexOutOfBoundsException");
215d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (IndexOutOfBoundsException e) {
216d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            // expected
217d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
218d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
219d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        // Regression for HARMONY-4405
220d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
221d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            zip.write(null, 0, -2);
222d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail();
223d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (NullPointerException expected) {
224d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (IndexOutOfBoundsException expected) {
225d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
226d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
227d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            zip.write(null, 0, 2);
228d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail();
229d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (NullPointerException expected) {
230d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
231d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
232d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            zip.write(new byte[2], 0, -2);
233d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail();
234d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (IndexOutOfBoundsException expected) {
235d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
236d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
237d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        // Close stream because ZIP is invalid
238d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        stream.close();
239d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
240d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
241d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    /**
242d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     * java.util.zip.ZipOutputStream#write(byte[], int, int)
243d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     */
244d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    public void test_write$BII_2() throws IOException {
245d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        // Regression for HARMONY-577
246d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        File f1 = File.createTempFile("testZip1", "tst");
247d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        f1.deleteOnExit();
248d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        FileOutputStream stream1 = new FileOutputStream(f1);
249d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        ZipOutputStream zip1 = new ZipOutputStream(stream1);
250d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zip1.putNextEntry(new ZipEntry("one"));
251d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zip1.setMethod(ZipOutputStream.STORED);
252d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zip1.setMethod(ZipEntry.STORED);
253d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
254d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zip1.write(new byte[2]);
255d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
256d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
257d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            zip1.putNextEntry(new ZipEntry("Second"));
258d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail("ZipException expected");
259d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (ZipException e) {
260d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            // expected - We have not set an entry
261d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
262d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
263d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
264d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            zip1.write(new byte[2]); // try to write data without entry
265d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail("expected IOE there");
266d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (IOException e2) {
267d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            // expected
268d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
269d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
270d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zip1.close();
271d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
272d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
273d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    @Override
274d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    protected void setUp() throws Exception {
275d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        super.setUp();
276d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        zos = new ZipOutputStream(bos = new ByteArrayOutputStream());
277d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
278d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
279d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    @Override
280d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    protected void tearDown() throws Exception {
281d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
282d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            if (zos != null) {
283d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                zos.close();
284d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            }
285d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            if (zis != null) {
286d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                zis.close();
287d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            }
288d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (Exception e) {
289d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
290d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        super.tearDown();
291d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
292d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath}
293