1b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson/*
2b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson * Copyright (C) 2010 The Android Open Source Project
3b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson *
4b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
5b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson * you may not use this file except in compliance with the License.
6b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson * You may obtain a copy of the License at
7b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson *
8b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
9b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson *
10b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson * Unless required by applicable law or agreed to in writing, software
11b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
12b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson * See the License for the specific language governing permissions and
14b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson * limitations under the License.
15b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson */
16b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson
17b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilsonpackage libcore.java.util.zip;
18b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson
19b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilsonimport java.io.ByteArrayInputStream;
20b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilsonimport java.io.ByteArrayOutputStream;
21b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilsonimport java.io.IOException;
22b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilsonimport java.io.InputStream;
23b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilsonimport java.util.Arrays;
24b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilsonimport java.util.zip.DeflaterInputStream;
25b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilsonimport java.util.zip.InflaterInputStream;
2627604018f783bf6354a13870b3e7785edca69b5fPaul Duffinimport libcore.junit.junit3.TestCaseWithRules;
2727604018f783bf6354a13870b3e7785edca69b5fPaul Duffinimport libcore.junit.util.ResourceLeakageDetector;
2827604018f783bf6354a13870b3e7785edca69b5fPaul Duffinimport org.junit.Rule;
2927604018f783bf6354a13870b3e7785edca69b5fPaul Duffinimport org.junit.rules.TestRule;
30b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson
3127604018f783bf6354a13870b3e7785edca69b5fPaul Duffinpublic final class DeflaterInputStreamTest extends TestCaseWithRules {
3227604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    @Rule
3327604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    public TestRule guardRule = ResourceLeakageDetector.getRule();
34b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson
35b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson    public void testReadByteByByte() throws IOException {
36b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        byte[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
37b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        InputStream in = new DeflaterInputStream(new ByteArrayInputStream(data));
38b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        ByteArrayOutputStream out = new ByteArrayOutputStream();
39b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson
40b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        assertEquals(1, in.available());
41b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        int b;
42b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        while ((b = in.read()) != -1) {
43b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson            out.write(b);
44b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        }
45b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        assertEquals(0, in.available());
46b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson
47b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        assertEquals(Arrays.toString(data), Arrays.toString(inflate(out.toByteArray())));
48b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson
49b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        in.close();
50b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        try {
51b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson            in.available();
52b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson            fail();
53b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        } catch (IOException expected) {
54b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        }
55b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson    }
56b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson
57b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson    public byte[] inflate(byte[] bytes) throws IOException {
5827604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        try (InputStream in = new InflaterInputStream(new ByteArrayInputStream(bytes))) {
5927604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            ByteArrayOutputStream out = new ByteArrayOutputStream();
6027604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            byte[] buffer = new byte[1024];
6127604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            int count;
6227604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            while ((count = in.read(buffer)) != -1) {
6327604018f783bf6354a13870b3e7785edca69b5fPaul Duffin                out.write(buffer, 0, count);
6427604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            }
6527604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            return out.toByteArray();
66b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        }
67b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson    }
68b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson
69b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson    public void testReadWithBuffer() throws IOException {
70b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        byte[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
71b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        byte[] buffer = new byte[8];
72b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        InputStream in = new DeflaterInputStream(new ByteArrayInputStream(data));
73b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        ByteArrayOutputStream out = new ByteArrayOutputStream();
74b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        assertEquals(1, in.available());
75b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        int count;
76b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        while ((count = in.read(buffer, 0, 5)) != -1) {
77b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson            assertTrue(count <= 5);
78b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson            out.write(buffer, 0, count);
79b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        }
80b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        assertEquals(0, in.available());
81b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson
82b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        assertEquals(Arrays.toString(data), Arrays.toString(inflate(out.toByteArray())));
83b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson
84b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        in.close();
85b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        try {
86b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson            in.available();
87b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson            fail();
88b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        } catch (IOException expected) {
89b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        }
90b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson    }
91b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson
92b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson    public void testReadExceptions() throws IOException {
93b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        byte[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
94b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        byte[] buffer = new byte[8];
95b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        InputStream in = new DeflaterInputStream(new ByteArrayInputStream(data));
96b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        try {
97b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson            in.read(buffer, 0, 10);
98b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson            fail();
99b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        } catch (IndexOutOfBoundsException expected) {
100b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        }
101b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        try {
102b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson            in.read(null, 0, 5);
103b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson            fail();
104b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        } catch (NullPointerException expected) {
105b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        }
106b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        try {
107b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson            in.read(buffer, -1, 5);
108b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson            fail();
109b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        } catch (IndexOutOfBoundsException expected) {
110b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        }
111b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        in.close();
112b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        try {
113b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson            in.read(buffer, 0, 5);
114b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson            fail();
115b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        } catch (IOException expected) {
116b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        }
117b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson    }
118b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson}
119