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 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 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 66 public DelegatingInflater(Inflater inflater) { 67 this.inflater = inflater; 68 } 69 AtomicBoolean isEnded = new AtomicBoolean(); 70 71 @Override 72 public void end() { 73 isEnded.set(true); 74 inflater.end(); 75 } 76 77 @Override 78 public void setInput(byte[] b, int off, int len) { 79 inflater.setInput(b, off, len); 80 } 81 82 @Override 83 public void setInput(byte[] b) { 84 inflater.setInput(b); 85 } 86 87 @Override 88 public void setDictionary(byte[] b, int off, int len) { 89 inflater.setDictionary(b, off, len); 90 } 91 92 @Override 93 public void setDictionary(byte[] b) { 94 inflater.setDictionary(b); 95 } 96 97 @Override 98 public int getRemaining() { 99 return inflater.getRemaining(); 100 } 101 102 @Override 103 public boolean needsInput() { 104 return inflater.needsInput(); 105 } 106 107 @Override 108 public boolean needsDictionary() { 109 return inflater.needsDictionary(); 110 } 111 112 @Override 113 public boolean finished() { 114 return inflater.finished(); 115 } 116 117 @Override 118 public int inflate(byte[] b, int off, int len) throws DataFormatException { 119 return inflater.inflate(b, off, len); 120 } 121 122 @Override 123 public int inflate(byte[] b) throws DataFormatException { 124 return inflater.inflate(b); 125 } 126 127 @Override 128 public int getAdler() { 129 return inflater.getAdler(); 130 } 131 132 @Override 133 public int getTotalIn() { 134 return inflater.getTotalIn(); 135 } 136 137 @Override 138 public long getBytesRead() { 139 return inflater.getBytesRead(); 140 } 141 142 @Override 143 public int getTotalOut() { 144 return inflater.getTotalOut(); 145 } 146 147 @Override 148 public long getBytesWritten() { 149 return inflater.getBytesWritten(); 150 } 151 152 @Override 153 public void reset() { 154 inflater.reset(); 155 } 156 157 } 158 159 private class DelegatingDeflater extends Deflater { 160 161 private final Deflater deflater; 162 163 public DelegatingDeflater(Deflater deflater) { 164 this.deflater = deflater; 165 } 166 167 AtomicBoolean isEnded = new AtomicBoolean(); 168 169 @Override 170 public void end() { 171 isEnded.set(true); 172 deflater.end(); 173 } 174 175 @Override 176 public void setInput(byte[] b, int off, int len) { 177 deflater.setInput(b, off, len); 178 } 179 180 @Override 181 public void setInput(byte[] b) { 182 deflater.setInput(b); 183 } 184 185 @Override 186 public void setDictionary(byte[] b, int off, int len) { 187 deflater.setDictionary(b, off, len); 188 } 189 190 @Override 191 public void setDictionary(byte[] b) { 192 deflater.setDictionary(b); 193 } 194 195 @Override 196 public void setStrategy(int strategy) { 197 deflater.setStrategy(strategy); 198 } 199 200 @Override 201 public void setLevel(int level) { 202 deflater.setLevel(level); 203 } 204 205 @Override 206 public boolean needsInput() { 207 return deflater.needsInput(); 208 } 209 210 @Override 211 public void finish() { 212 deflater.finish(); 213 } 214 215 @Override 216 public boolean finished() { 217 return deflater.finished(); 218 } 219 220 @Override 221 public int deflate(byte[] b, int off, int len) { 222 return deflater.deflate(b, off, len); 223 } 224 225 @Override 226 public int deflate(byte[] b) { 227 return deflater.deflate(b); 228 } 229 230 @Override 231 public int deflate(byte[] b, int off, int len, int flush) { 232 return deflater.deflate(b, off, len, flush); 233 } 234 235 @Override 236 public int getAdler() { 237 return deflater.getAdler(); 238 } 239 240 @Override 241 public int getTotalIn() { 242 return deflater.getTotalIn(); 243 } 244 245 @Override 246 public long getBytesRead() { 247 return deflater.getBytesRead(); 248 } 249 250 @Override 251 public int getTotalOut() { 252 return deflater.getTotalOut(); 253 } 254 255 @Override 256 public long getBytesWritten() { 257 return deflater.getBytesWritten(); 258 } 259 260 @Override 261 public void reset() { 262 deflater.reset(); 263 } 264 265 266 } 267 } 268