• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Licensed to the Apache Software Foundation (ASF) under one or more
3  *  contributor license agreements.  See the NOTICE file distributed with
4  *  this work for additional information regarding copyright ownership.
5  *  The ASF licenses this file to You under the Apache License, Version 2.0
6  *  (the "License"); you may not use this file except in compliance with
7  *  the License.  You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  */
18 package org.apache.commons.compress.archivers.sevenz;
19 
20 import static org.junit.Assert.assertTrue;
21 
22 import java.io.ByteArrayInputStream;
23 import java.io.ByteArrayOutputStream;
24 import java.util.concurrent.atomic.AtomicBoolean;
25 import java.util.zip.DataFormatException;
26 import java.util.zip.Deflater;
27 import java.util.zip.Inflater;
28 import org.apache.commons.compress.AbstractTestCase;
29 import org.apache.commons.compress.archivers.sevenz.Coders.DeflateDecoder;
30 import org.apache.commons.compress.archivers.sevenz.Coders.DeflateDecoder.DeflateDecoderInputStream;
31 import org.apache.commons.compress.archivers.sevenz.Coders.DeflateDecoder.DeflateDecoderOutputStream;
32 import org.junit.Test;
33 
34 public class SevenZNativeHeapTest extends AbstractTestCase {
35 
36 
37     @Test
testEndDeflaterOnCloseStream()38     public void testEndDeflaterOnCloseStream() throws Exception {
39         Coders.DeflateDecoder deflateDecoder = new DeflateDecoder();
40 
41         final DeflateDecoderOutputStream outputStream =
42             (DeflateDecoderOutputStream) deflateDecoder.encode(new ByteArrayOutputStream(), 9);
43         DelegatingDeflater delegatingDeflater = new DelegatingDeflater(outputStream.deflater);
44         outputStream.deflater = delegatingDeflater;
45         outputStream.close();
46         assertTrue(delegatingDeflater.isEnded.get());
47 
48     }
49 
50     @Test
testEndInflaterOnCloseStream()51     public void testEndInflaterOnCloseStream() throws Exception {
52         Coders.DeflateDecoder deflateDecoder = new DeflateDecoder();
53         final DeflateDecoderInputStream inputStream =
54             (DeflateDecoderInputStream) deflateDecoder.decode("dummy",new ByteArrayInputStream(new byte[0]),0,null,null);
55         DelegatingInflater delegatingInflater = new DelegatingInflater(inputStream.inflater);
56         inputStream.inflater = delegatingInflater;
57         inputStream.close();
58 
59         assertTrue(delegatingInflater.isEnded.get());
60     }
61 
62     private class DelegatingInflater extends Inflater {
63 
64         private final Inflater inflater;
65 
DelegatingInflater(Inflater inflater)66         public DelegatingInflater(Inflater inflater) {
67             this.inflater = inflater;
68         }
69         AtomicBoolean isEnded = new AtomicBoolean();
70 
71         @Override
end()72         public void end() {
73             isEnded.set(true);
74             inflater.end();
75         }
76 
77         @Override
setInput(byte[] b, int off, int len)78         public void setInput(byte[] b, int off, int len) {
79             inflater.setInput(b, off, len);
80         }
81 
82         @Override
setInput(byte[] b)83         public void setInput(byte[] b) {
84             inflater.setInput(b);
85         }
86 
87         @Override
setDictionary(byte[] b, int off, int len)88         public void setDictionary(byte[] b, int off, int len) {
89             inflater.setDictionary(b, off, len);
90         }
91 
92         @Override
setDictionary(byte[] b)93         public void setDictionary(byte[] b) {
94             inflater.setDictionary(b);
95         }
96 
97         @Override
getRemaining()98         public int getRemaining() {
99             return inflater.getRemaining();
100         }
101 
102         @Override
needsInput()103         public boolean needsInput() {
104             return inflater.needsInput();
105         }
106 
107         @Override
needsDictionary()108         public boolean needsDictionary() {
109             return inflater.needsDictionary();
110         }
111 
112         @Override
finished()113         public boolean finished() {
114             return inflater.finished();
115         }
116 
117         @Override
inflate(byte[] b, int off, int len)118         public int inflate(byte[] b, int off, int len) throws DataFormatException {
119             return inflater.inflate(b, off, len);
120         }
121 
122         @Override
inflate(byte[] b)123         public int inflate(byte[] b) throws DataFormatException {
124             return inflater.inflate(b);
125         }
126 
127         @Override
getAdler()128         public int getAdler() {
129             return inflater.getAdler();
130         }
131 
132         @Override
getTotalIn()133         public int getTotalIn() {
134             return inflater.getTotalIn();
135         }
136 
137         @Override
getBytesRead()138         public long getBytesRead() {
139             return inflater.getBytesRead();
140         }
141 
142         @Override
getTotalOut()143         public int getTotalOut() {
144             return inflater.getTotalOut();
145         }
146 
147         @Override
getBytesWritten()148         public long getBytesWritten() {
149             return inflater.getBytesWritten();
150         }
151 
152         @Override
reset()153         public void reset() {
154             inflater.reset();
155         }
156 
157     }
158 
159     private class DelegatingDeflater extends Deflater {
160 
161         private final Deflater deflater;
162 
DelegatingDeflater(Deflater deflater)163         public DelegatingDeflater(Deflater deflater) {
164             this.deflater = deflater;
165         }
166 
167         AtomicBoolean isEnded = new AtomicBoolean();
168 
169         @Override
end()170         public void end() {
171             isEnded.set(true);
172             deflater.end();
173         }
174 
175         @Override
setInput(byte[] b, int off, int len)176         public void setInput(byte[] b, int off, int len) {
177             deflater.setInput(b, off, len);
178         }
179 
180         @Override
setInput(byte[] b)181         public void setInput(byte[] b) {
182             deflater.setInput(b);
183         }
184 
185         @Override
setDictionary(byte[] b, int off, int len)186         public void setDictionary(byte[] b, int off, int len) {
187             deflater.setDictionary(b, off, len);
188         }
189 
190         @Override
setDictionary(byte[] b)191         public void setDictionary(byte[] b) {
192             deflater.setDictionary(b);
193         }
194 
195         @Override
setStrategy(int strategy)196         public void setStrategy(int strategy) {
197             deflater.setStrategy(strategy);
198         }
199 
200         @Override
setLevel(int level)201         public void setLevel(int level) {
202             deflater.setLevel(level);
203         }
204 
205         @Override
needsInput()206         public boolean needsInput() {
207             return deflater.needsInput();
208         }
209 
210         @Override
finish()211         public void finish() {
212             deflater.finish();
213         }
214 
215         @Override
finished()216         public boolean finished() {
217             return deflater.finished();
218         }
219 
220         @Override
deflate(byte[] b, int off, int len)221         public int deflate(byte[] b, int off, int len) {
222             return deflater.deflate(b, off, len);
223         }
224 
225         @Override
deflate(byte[] b)226         public int deflate(byte[] b) {
227             return deflater.deflate(b);
228         }
229 
230         @Override
deflate(byte[] b, int off, int len, int flush)231         public int deflate(byte[] b, int off, int len, int flush) {
232             return deflater.deflate(b, off, len, flush);
233         }
234 
235         @Override
getAdler()236         public int getAdler() {
237             return deflater.getAdler();
238         }
239 
240         @Override
getTotalIn()241         public int getTotalIn() {
242             return deflater.getTotalIn();
243         }
244 
245         @Override
getBytesRead()246         public long getBytesRead() {
247             return deflater.getBytesRead();
248         }
249 
250         @Override
getTotalOut()251         public int getTotalOut() {
252             return deflater.getTotalOut();
253         }
254 
255         @Override
getBytesWritten()256         public long getBytesWritten() {
257             return deflater.getBytesWritten();
258         }
259 
260         @Override
reset()261         public void reset() {
262             deflater.reset();
263         }
264 
265 
266     }
267 }
268