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