View Javadoc
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  
19  package org.apache.commons.compress;
20  
21  import static org.junit.Assert.*;
22  
23  import java.io.ByteArrayOutputStream;
24  import java.io.File;
25  import java.io.FileInputStream;
26  import java.io.InputStream;
27  import java.io.OutputStream;
28  
29  import org.apache.commons.compress.archivers.ArchiveEntry;
30  import org.apache.commons.compress.archivers.ArchiveInputStream;
31  import org.apache.commons.compress.archivers.ArchiveOutputStream;
32  import org.apache.commons.compress.archivers.ar.ArArchiveEntry;
33  import org.apache.commons.compress.archivers.cpio.CpioArchiveEntry;
34  import org.apache.commons.compress.archivers.jar.JarArchiveEntry;
35  import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
36  import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
37  import org.junit.Test;
38  
39  /**
40   * Check that the different write methods create the same output.
41   * TODO perform the same checks for reads.
42   */
43  public class IOMethodsTest extends AbstractTestCase {
44  
45      private static final int bytesToTest = 50;
46      private static final byte[] byteTest = new byte[bytesToTest];
47      static {
48          for(int i=0; i < byteTest.length ;) {
49              byteTest[i]=(byte) i;
50              byteTest[i+1]=(byte) -i;
51              i += 2;
52          }
53      }
54  
55      @Test
56      public void testWriteAr() throws Exception {
57          ArchiveEntry entry = new ArArchiveEntry("dummy", bytesToTest);
58          compareWrites("ar", entry);
59      }
60  
61      @Test
62      public void testWriteCpio() throws Exception {
63          ArchiveEntry entry = new CpioArchiveEntry("dummy", bytesToTest);
64          compareWrites("cpio", entry);
65      }
66  
67      @Test
68      public void testWriteJar() throws Exception {
69          ArchiveEntry entry = new JarArchiveEntry("dummy");
70          compareWrites("jar", entry);
71      }
72  
73      @Test
74      public void testWriteTar() throws Exception {
75          TarArchiveEntry entry = new TarArchiveEntry("dummy");
76          entry.setSize(bytesToTest);
77          compareWrites("tar", entry);
78      }
79  
80      @Test
81      public void testWriteZip() throws Exception {
82          ArchiveEntry entry = new ZipArchiveEntry("dummy");
83          compareWrites("zip", entry);
84      }
85  
86      @Test
87      public void testReadAr() throws Exception {
88          compareReads("ar");
89      }
90  
91      @Test
92      public void testReadCpio() throws Exception {
93          compareReads("cpio");
94      }
95  
96      @Test
97      public void testReadJar() throws Exception {
98          compareReads("jar");
99      }
100 
101     @Test
102     public void testReadTar() throws Exception {
103         compareReads("tar");
104     }
105 
106     @Test
107     public void testReadZip() throws Exception {
108         compareReads("zip");
109     }
110 
111     private void compareWrites(String archiverName, ArchiveEntry entry) throws Exception {
112         OutputStream out1 = new ByteArrayOutputStream();
113         OutputStream out2 = new ByteArrayOutputStream();
114         OutputStream out3 = new ByteArrayOutputStream();
115         ArchiveOutputStream aos1 = factory.createArchiveOutputStream(archiverName, out1);
116         aos1.putArchiveEntry(entry);
117         ArchiveOutputStream aos2 = factory.createArchiveOutputStream(archiverName, out2);
118         aos2.putArchiveEntry(entry);
119         ArchiveOutputStream aos3 = factory.createArchiveOutputStream(archiverName, out3);
120         aos3.putArchiveEntry(entry);
121         for (byte element : byteTest) {
122             aos1.write(element);
123         }
124         aos1.closeArchiveEntry();
125         aos1.close();
126 
127         aos2.write(byteTest);
128         aos2.closeArchiveEntry();
129         aos2.close();
130 
131         aos3.write(byteTest, 0, byteTest.length);
132         aos3.closeArchiveEntry();
133         aos3.close();
134         assertEquals("aos1Bytes!=aos2Bytes",aos1.getBytesWritten(),aos2.getBytesWritten());
135         assertEquals("aos1Bytes!=aos3Bytes",aos1.getBytesWritten(),aos3.getBytesWritten());
136         assertEquals("out1Len!=out2Len",out1.toString().length(),out2.toString().length());
137         assertEquals("out1Len!=out2Len",out1.toString().length(),out3.toString().length());
138         assertEquals("out1!=out2",out1.toString(),out2.toString());
139         assertEquals("out1!=out3",out1.toString(),out3.toString());
140     }
141 
142     private void compareReads(String archiverName) throws Exception {
143         OutputStream out1 = new ByteArrayOutputStream();
144         OutputStream out2 = new ByteArrayOutputStream();
145         OutputStream out3 = new ByteArrayOutputStream();
146         File file = createSingleEntryArchive(archiverName);
147         file.deleteOnExit();
148 
149         InputStream is1 = new FileInputStream(file);
150         ArchiveInputStream ais1 = factory.createArchiveInputStream(archiverName, is1);
151         final ArchiveEntry nextEntry = ais1.getNextEntry();
152         assertNotNull(nextEntry);
153 
154         byte [] buff = new byte[10]; // small so multiple reads are needed;
155         long size = nextEntry.getSize();
156         if (size != ArchiveEntry.SIZE_UNKNOWN) {
157             assertTrue("Size should be > 0, found: "+size, size > 0);
158         }
159 
160         InputStream is2 = new FileInputStream(file);
161         ArchiveInputStream ais2 = factory.createArchiveInputStream(archiverName, is2);
162         final ArchiveEntry nextEntry2 = ais2.getNextEntry();
163         assertNotNull(nextEntry2);
164         assertEquals("Expected same entry size", size, nextEntry2.getSize());
165 
166         InputStream is3 = new FileInputStream(file);
167         ArchiveInputStream ais3 = factory.createArchiveInputStream(archiverName, is3);
168         final ArchiveEntry nextEntry3 = ais3.getNextEntry();
169         assertNotNull(nextEntry3);
170         assertEquals("Expected same entry size", size, nextEntry3.getSize());
171 
172         int b;
173         while((b=ais1.read()) != -1){
174             out1.write(b);
175         }
176         ais1.close();
177 
178         int bytes;
179         while((bytes = ais2.read(buff)) > 0){
180             out2.write(buff, 0, bytes);
181         }
182         ais2.close();
183 
184         while((bytes=ais3.read(buff, 0 , buff.length)) > 0){
185             out3.write(buff, 0, bytes);
186         }
187         ais3.close();
188 
189         assertEquals("out1Len!=out2Len",out1.toString().length(),out2.toString().length());
190         assertEquals("out1Len!=out3Len",out1.toString().length(),out3.toString().length());
191         assertEquals("out1!=out2",out1.toString(),out2.toString());
192         assertEquals("out1!=out3",out1.toString(),out3.toString());
193     }
194 }