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.File;
20d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.io.FileOutputStream;
21d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.io.IOException;
22d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.io.OutputStream;
23d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.io.PipedInputStream;
24d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.io.PipedOutputStream;
25d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.util.zip.Checksum;
26d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.util.zip.GZIPInputStream;
27d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathimport java.util.zip.GZIPOutputStream;
28d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
29d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamathpublic class GZIPOutputStreamTest extends junit.framework.TestCase {
30d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
31d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    class TestGZIPOutputStream extends GZIPOutputStream {
32d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        TestGZIPOutputStream(OutputStream out) throws IOException {
33d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            super(out);
34d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
35d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
36d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        TestGZIPOutputStream(OutputStream out, int size) throws IOException {
37d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            super(out, size);
38d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
39d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
40d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        Checksum getChecksum() {
41d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            return crc;
42d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
43d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
44d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
45d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    /**
46d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     * java.util.zip.GZIPOutputStream#GZIPOutputStream(java.io.OutputStream)
47d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     */
48d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    public void test_ConstructorLjava_io_OutputStream() {
49d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
50e10c61bb13373b95ba857cc3af60f94b9941ab9eNarayan Kamath            FileOutputStream outFile = new FileOutputStream(
51e10c61bb13373b95ba857cc3af60f94b9941ab9eNarayan Kamath                    File.createTempFile("GZIPCon", ".txt"));
52d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            TestGZIPOutputStream outGZIP = new TestGZIPOutputStream(outFile);
53d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            assertNotNull("the constructor for GZIPOutputStream is null",
54d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                    outGZIP);
55d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            assertEquals("the CRC value of the outputStream is not zero", 0, outGZIP
56d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                    .getChecksum().getValue());
57d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            outGZIP.close();
58d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (IOException e) {
59d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail(
60d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                    "an IO error occured while trying to find the output file or creating GZIP constructor");
61d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
62d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
63d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
64d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    /**
65d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     * java.util.zip.GZIPOutputStream#GZIPOutputStream(java.io.OutputStream,
66d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     *int)
67d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     */
68d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    public void test_ConstructorLjava_io_OutputStreamI() {
69d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
70e10c61bb13373b95ba857cc3af60f94b9941ab9eNarayan Kamath            FileOutputStream outFile = new FileOutputStream(
71e10c61bb13373b95ba857cc3af60f94b9941ab9eNarayan Kamath                    File.createTempFile("GZIPOutCon", ".txt"));
72d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            TestGZIPOutputStream outGZIP = new TestGZIPOutputStream(outFile,
73d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                    100);
74d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            assertNotNull("the constructor for GZIPOutputStream is null",
75d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                    outGZIP);
76d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            assertEquals("the CRC value of the outputStream is not zero", 0, outGZIP
77d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                    .getChecksum().getValue());
78d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            outGZIP.close();
79d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (IOException e) {
80d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail(
81d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                    "an IO error occured while trying to find the output file or creating GZIP constructor");
82d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
83d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
84d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
85d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    /**
86d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     * java.util.zip.GZIPOutputStream#finish()
87d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     */
88d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    public void test_finish() {
89d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        // test method java.util.zip.GZIPOutputStream.finish()
90d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        byte byteArray[] = { 3, 5, 2, 'r', 'g', 'e', 'f', 'd', 'e', 'w' };
91d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
92e10c61bb13373b95ba857cc3af60f94b9941ab9eNarayan Kamath            FileOutputStream outFile = new FileOutputStream(
93e10c61bb13373b95ba857cc3af60f94b9941ab9eNarayan Kamath                    File.createTempFile("GZIPOutFinish", ".txt"));
94d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            TestGZIPOutputStream outGZIP = new TestGZIPOutputStream(outFile);
95d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
96d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            outGZIP.finish();
97d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            int r = 0;
98d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            try {
99d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                outGZIP.write(byteArray, 0, 1);
100d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            } catch (IOException e) {
101d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                r = 1;
102d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            }
103d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
104d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            assertEquals("GZIP instance can still be used after finish is called",
105d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                    1, r);
106d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            outGZIP.close();
107d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (IOException e) {
108d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail(
109d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                    "an IO error occured while trying to find the output file or creating GZIP constructor");
110d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
111d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
112d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
113d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    /**
114d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     * java.util.zip.GZIPOutputStream#close()
115d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     */
116d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    public void test_close() {
117d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        // test method java.util.zip.GZIPOutputStream.close()
118d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        byte byteArray[] = { 3, 5, 2, 'r', 'g', 'e', 'f', 'd', 'e', 'w' };
119d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
120e10c61bb13373b95ba857cc3af60f94b9941ab9eNarayan Kamath            FileOutputStream outFile = new FileOutputStream(
121e10c61bb13373b95ba857cc3af60f94b9941ab9eNarayan Kamath                    File.createTempFile("GZIPOutClose2", ".txt"));
122d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            TestGZIPOutputStream outGZIP = new TestGZIPOutputStream(outFile);
123d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            outGZIP.close();
124d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            int r = 0;
125d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            try {
126d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                outGZIP.write(byteArray, 0, 1);
127d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            } catch (IOException e) {
128d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                r = 1;
129d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            }
130d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            assertEquals("GZIP instance can still be used after close is called",
131d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                    1, r);
132d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (IOException e) {
133d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail(
134d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                    "an IO error occured while trying to find the output file or creating GZIP constructor");
135d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
136d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
137d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
138d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    /**
139d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     * java.util.zip.GZIPOutputStream#write(byte[], int, int)
140d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath     */
141d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    public void test_write$BII() {
142d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        // test method java.util.zip.GZIPOutputStream.writeBII
143d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        byte byteArray[] = { 3, 5, 2, 'r', 'g', 'e', 'f', 'd', 'e', 'w' };
144d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        try {
145e10c61bb13373b95ba857cc3af60f94b9941ab9eNarayan Kamath            FileOutputStream outFile = new FileOutputStream(
146e10c61bb13373b95ba857cc3af60f94b9941ab9eNarayan Kamath                    File.createTempFile("GZIPOutWrite", ".txt"));
147d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            TestGZIPOutputStream outGZIP = new TestGZIPOutputStream(outFile);
148d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            outGZIP.write(byteArray, 0, 10);
149d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            // ran JDK and found this CRC32 value is 3097700292
150d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            // System.out.print(outGZIP.getChecksum().getValue());
151d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            assertEquals("the checksum value was incorrect result of write from GZIP",
152d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                    3097700292L, outGZIP.getChecksum().getValue());
153d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
154d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            // test for boundary check
155d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            int r = 0;
156d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            try {
157d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                outGZIP.write(byteArray, 0, 11);
158d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            } catch (IndexOutOfBoundsException e) {
159d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                r = 1;
160d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            }
161d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            assertEquals("out of bounds exception is not present", 1, r);
162d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            outGZIP.close();
163d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        } catch (IOException e) {
164d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath            fail(
165d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath                    "an IO error occured while trying to find the output file or creating GZIP constructor");
166d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        }
167d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
168d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
16999b471492b5e0910653f115094d77d633bd340ecNarayan Kamath    public void testSyncFlush() throws IOException {
170d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        PipedOutputStream pout = new PipedOutputStream();
171d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        PipedInputStream pin = new PipedInputStream(pout);
17299b471492b5e0910653f115094d77d633bd340ecNarayan Kamath        GZIPOutputStream out = new GZIPOutputStream(pout, true /* syncFlush */);
173d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        GZIPInputStream in = new GZIPInputStream(pin);
174d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath
175d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        out.write(1);
176d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        out.write(2);
177d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        out.write(3);
178d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        out.flush();
17999b471492b5e0910653f115094d77d633bd340ecNarayan Kamath        // flush() is guaranteed to flush data only if syncFlush is true.
18099b471492b5e0910653f115094d77d633bd340ecNarayan Kamath        // The default flush param is NO_FLUSH so it's up to the deflater to
18199b471492b5e0910653f115094d77d633bd340ecNarayan Kamath        // decide how much input it wants to read before generating a compressed
18299b471492b5e0910653f115094d77d633bd340ecNarayan Kamath        // block.
18399b471492b5e0910653f115094d77d633bd340ecNarayan Kamath        assertEquals(1, in.read());
184d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        assertEquals(2, in.read());
185d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath        assertEquals(3, in.read());
186d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath    }
187d567f9025c4b94fc5e9b47f5702c1b48c2a45c96Narayan Kamath}
188