Home | History | Annotate | Download | only in sevenz
      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