1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 }