View Javadoc
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  package org.apache.commons.compress.archivers.sevenz;
18  
19  import static org.junit.jupiter.api.Assertions.assertTrue;
20  
21  import java.io.ByteArrayInputStream;
22  import java.io.ByteArrayOutputStream;
23  import java.util.concurrent.atomic.AtomicBoolean;
24  import java.util.zip.DataFormatException;
25  import java.util.zip.Deflater;
26  import java.util.zip.Inflater;
27  
28  import org.apache.commons.compress.AbstractTest;
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.apache.commons.compress.utils.ByteUtils;
33  import org.junit.jupiter.api.Test;
34  
35  public class SevenZNativeHeapTest extends AbstractTest {
36  
37      private static final class DelegatingDeflater extends Deflater {
38  
39          private final Deflater deflater;
40  
41          final AtomicBoolean isEnded = new AtomicBoolean();
42  
43          DelegatingDeflater(final Deflater deflater) {
44              this.deflater = deflater;
45          }
46  
47          @Override
48          public int deflate(final byte[] b) {
49              return deflater.deflate(b);
50          }
51  
52          @Override
53          public int deflate(final byte[] b, final int off, final int len) {
54              return deflater.deflate(b, off, len);
55          }
56  
57          @Override
58          public int deflate(final byte[] b, final int off, final int len, final int flush) {
59              return deflater.deflate(b, off, len, flush);
60          }
61  
62          @Override
63          public void end() {
64              isEnded.set(true);
65              deflater.end();
66          }
67  
68          @Override
69          public void finish() {
70              deflater.finish();
71          }
72  
73          @Override
74          public boolean finished() {
75              return deflater.finished();
76          }
77  
78          @Override
79          public int getAdler() {
80              return deflater.getAdler();
81          }
82  
83          @Override
84          public long getBytesRead() {
85              return deflater.getBytesRead();
86          }
87  
88          @Override
89          public long getBytesWritten() {
90              return deflater.getBytesWritten();
91          }
92  
93          @Override
94          public int getTotalIn() {
95              return deflater.getTotalIn();
96          }
97  
98          @Override
99          public int getTotalOut() {
100             return deflater.getTotalOut();
101         }
102 
103         @Override
104         public boolean needsInput() {
105             return deflater.needsInput();
106         }
107 
108         @Override
109         public void reset() {
110             deflater.reset();
111         }
112 
113         @Override
114         public void setDictionary(final byte[] b) {
115             deflater.setDictionary(b);
116         }
117 
118         @Override
119         public void setDictionary(final byte[] b, final int off, final int len) {
120             deflater.setDictionary(b, off, len);
121         }
122 
123         @Override
124         public void setInput(final byte[] b) {
125             deflater.setInput(b);
126         }
127 
128         @Override
129         public void setInput(final byte[] b, final int off, final int len) {
130             deflater.setInput(b, off, len);
131         }
132 
133         @Override
134         public void setLevel(final int level) {
135             deflater.setLevel(level);
136         }
137 
138         @Override
139         public void setStrategy(final int strategy) {
140             deflater.setStrategy(strategy);
141         }
142 
143     }
144 
145     private static final class DelegatingInflater extends Inflater {
146 
147         private final Inflater inflater;
148 
149         final AtomicBoolean isEnded = new AtomicBoolean();
150 
151         DelegatingInflater(final Inflater inflater) {
152             this.inflater = inflater;
153         }
154 
155         @Override
156         public void end() {
157             isEnded.set(true);
158             inflater.end();
159         }
160 
161         @Override
162         public boolean finished() {
163             return inflater.finished();
164         }
165 
166         @Override
167         public int getAdler() {
168             return inflater.getAdler();
169         }
170 
171         @Override
172         public long getBytesRead() {
173             return inflater.getBytesRead();
174         }
175 
176         @Override
177         public long getBytesWritten() {
178             return inflater.getBytesWritten();
179         }
180 
181         @Override
182         public int getRemaining() {
183             return inflater.getRemaining();
184         }
185 
186         @Override
187         public int getTotalIn() {
188             return inflater.getTotalIn();
189         }
190 
191         @Override
192         public int getTotalOut() {
193             return inflater.getTotalOut();
194         }
195 
196         @Override
197         public int inflate(final byte[] b) throws DataFormatException {
198             return inflater.inflate(b);
199         }
200 
201         @Override
202         public int inflate(final byte[] b, final int off, final int len) throws DataFormatException {
203             return inflater.inflate(b, off, len);
204         }
205 
206         @Override
207         public boolean needsDictionary() {
208             return inflater.needsDictionary();
209         }
210 
211         @Override
212         public boolean needsInput() {
213             return inflater.needsInput();
214         }
215 
216         @Override
217         public void reset() {
218             inflater.reset();
219         }
220 
221         @Override
222         public void setDictionary(final byte[] b) {
223             inflater.setDictionary(b);
224         }
225 
226         @Override
227         public void setDictionary(final byte[] b, final int off, final int len) {
228             inflater.setDictionary(b, off, len);
229         }
230 
231         @Override
232         public void setInput(final byte[] b) {
233             inflater.setInput(b);
234         }
235 
236         @Override
237         public void setInput(final byte[] b, final int off, final int len) {
238             inflater.setInput(b, off, len);
239         }
240 
241     }
242 
243     @Test
244     public void testEndDeflaterOnCloseStream() throws Exception {
245         final Coders.DeflateDecoder deflateDecoder = new DeflateDecoder();
246         final DelegatingDeflater delegatingDeflater;
247         try (DeflateDecoderOutputStream outputStream = (DeflateDecoderOutputStream) deflateDecoder.encode(new ByteArrayOutputStream(), 9)) {
248             delegatingDeflater = new DelegatingDeflater(outputStream.deflater);
249             outputStream.deflater = delegatingDeflater;
250         }
251         assertTrue(delegatingDeflater.isEnded.get());
252 
253     }
254 
255     @Test
256     public void testEndInflaterOnCloseStream() throws Exception {
257         final Coders.DeflateDecoder deflateDecoder = new DeflateDecoder();
258         final DelegatingInflater delegatingInflater;
259         try (DeflateDecoderInputStream inputStream = (DeflateDecoderInputStream) deflateDecoder.decode("dummy",
260                 new ByteArrayInputStream(ByteUtils.EMPTY_BYTE_ARRAY), 0, null, null, Integer.MAX_VALUE)) {
261             delegatingInflater = new DelegatingInflater(inputStream.inflater);
262             inputStream.inflater = delegatingInflater;
263         }
264 
265         assertTrue(delegatingInflater.isEnded.get());
266     }
267 }