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