Add test cases for concatenated compressed files

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/compress/trunk@1660151 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java b/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java
index b459fff..677da4e 100644
--- a/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java
+++ b/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java
@@ -358,4 +358,9 @@
         }
         throw new CompressorException("Compressor: " + name + " not found.");
     }
+
+    // For Unit tests
+    boolean getDecompressConcatenated() {
+        return decompressConcatenated;
+    }
 }
diff --git a/src/test/java/org/apache/commons/compress/DetectCompressorTestCase.java b/src/test/java/org/apache/commons/compress/DetectCompressorTestCase.java
deleted file mode 100644
index 09e7b85..0000000
--- a/src/test/java/org/apache/commons/compress/DetectCompressorTestCase.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.commons.compress;
-
-import static org.apache.commons.compress.AbstractTestCase.getFile;
-
-import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.FileInputStream;
-import java.io.IOException;
-import junit.framework.TestCase;
-
-import org.apache.commons.compress.compressors.CompressorException;
-import org.apache.commons.compress.compressors.CompressorInputStream;
-import org.apache.commons.compress.compressors.CompressorStreamFactory;
-import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
-import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
-import org.apache.commons.compress.compressors.pack200.Pack200CompressorInputStream;
-import org.apache.commons.compress.compressors.xz.XZCompressorInputStream;
-
-public final class DetectCompressorTestCase extends TestCase {
-
-    public DetectCompressorTestCase(String name) {
-        super(name);
-    }
-
-    final CompressorStreamFactory factory = new CompressorStreamFactory();
-
-    public void testDetection() throws Exception {
-        CompressorInputStream bzip2 = getStreamFor("bla.txt.bz2"); 
-        assertNotNull(bzip2);
-        assertTrue(bzip2 instanceof BZip2CompressorInputStream);
-
-        CompressorInputStream gzip = getStreamFor("bla.tgz");
-        assertNotNull(gzip);
-        assertTrue(gzip instanceof GzipCompressorInputStream);
-        
-        CompressorInputStream pack200 = getStreamFor("bla.pack");
-        assertNotNull(pack200);
-        assertTrue(pack200 instanceof Pack200CompressorInputStream);
-
-        CompressorInputStream xz = getStreamFor("bla.tar.xz");
-        assertNotNull(xz);
-        assertTrue(xz instanceof XZCompressorInputStream);
-
-        try {
-            factory.createCompressorInputStream(new ByteArrayInputStream(new byte[0]));
-            fail("No exception thrown for an empty input stream");
-        } catch (CompressorException e) {
-            // expected
-        }
-    }
-
-    private CompressorInputStream getStreamFor(String resource)
-            throws CompressorException, IOException {
-        return factory.createCompressorInputStream(
-                   new BufferedInputStream(new FileInputStream(
-                       getFile(resource))));
-    }
-
-}
diff --git a/src/test/java/org/apache/commons/compress/compressors/DetectCompressorTestCase.java b/src/test/java/org/apache/commons/compress/compressors/DetectCompressorTestCase.java
new file mode 100644
index 0000000..9554bdd
--- /dev/null
+++ b/src/test/java/org/apache/commons/compress/compressors/DetectCompressorTestCase.java
@@ -0,0 +1,148 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.commons.compress.compressors;
+
+import static org.apache.commons.compress.AbstractTestCase.getFile;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.compress.compressors.CompressorException;
+import org.apache.commons.compress.compressors.CompressorInputStream;
+import org.apache.commons.compress.compressors.CompressorStreamFactory;
+import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
+import org.apache.commons.compress.compressors.pack200.Pack200CompressorInputStream;
+import org.apache.commons.compress.compressors.xz.XZCompressorInputStream;
+
+@SuppressWarnings("deprecation") // deliberately tests setDecompressConcatenated
+public final class DetectCompressorTestCase extends TestCase {
+
+    public DetectCompressorTestCase(String name) {
+        super(name);
+    }
+
+    final CompressorStreamFactory factory = new CompressorStreamFactory();
+    private static final CompressorStreamFactory factoryTrue = new CompressorStreamFactory(true);
+    private static final CompressorStreamFactory factoryFalse = new CompressorStreamFactory(false);
+
+    // Must be static to allow use in the TestData entries
+    private static final CompressorStreamFactory factorySetTrue;
+    private static final CompressorStreamFactory factorySetFalse;
+
+    static {
+        factorySetTrue = new CompressorStreamFactory();
+        factorySetTrue.setDecompressConcatenated(true);
+        factorySetFalse = new CompressorStreamFactory();
+        factorySetFalse.setDecompressConcatenated(false);        
+    }
+
+    static class TestData {
+        final String fileName; // The multiple file name
+        final char[] entryNames; // expected entries ...
+        final CompressorStreamFactory factory; // ... when using this factory
+        final boolean concat; // expected value for decompressConcatenated
+        TestData(String name, char[] names, CompressorStreamFactory factory, boolean concat) {
+            this.fileName = name;
+            this.entryNames = names;
+            this.factory = factory;
+            this.concat = concat;
+        }
+    }
+
+    private final TestData[] tests = {
+        new TestData("multiple.bz2", new char[]{'a','b'}, factoryTrue, true),
+        new TestData("multiple.bz2", new char[]{'a','b'}, factorySetTrue, true),
+        new TestData("multiple.bz2", new char[]{'a'}, factoryFalse, false),
+        new TestData("multiple.bz2", new char[]{'a'}, factorySetFalse, false),
+        new TestData("multiple.bz2", new char[]{'a'}, factory, false),
+
+        new TestData("multiple.gz", new char[]{'a','b'}, factoryTrue, true),
+        new TestData("multiple.gz", new char[]{'a','b'}, factorySetTrue, true),
+        new TestData("multiple.gz", new char[]{'a'}, factoryFalse, false),
+        new TestData("multiple.gz", new char[]{'a'}, factorySetFalse, false),
+        new TestData("multiple.gz", new char[]{'a'}, factory, false),
+
+        new TestData("multiple.xz", new char[]{'a','b'}, factoryTrue, true),
+        new TestData("multiple.xz", new char[]{'a','b'}, factorySetTrue, true),
+        new TestData("multiple.xz", new char[]{'a'}, factoryFalse, false),
+        new TestData("multiple.xz", new char[]{'a'}, factorySetFalse, false),
+        new TestData("multiple.xz", new char[]{'a'}, factory, false),
+    };
+    
+    public void testDetection() throws Exception {
+        CompressorInputStream bzip2 = getStreamFor("bla.txt.bz2"); 
+        assertNotNull(bzip2);
+        assertTrue(bzip2 instanceof BZip2CompressorInputStream);
+
+        CompressorInputStream gzip = getStreamFor("bla.tgz");
+        assertNotNull(gzip);
+        assertTrue(gzip instanceof GzipCompressorInputStream);
+        
+        CompressorInputStream pack200 = getStreamFor("bla.pack");
+        assertNotNull(pack200);
+        assertTrue(pack200 instanceof Pack200CompressorInputStream);
+
+        CompressorInputStream xz = getStreamFor("bla.tar.xz");
+        assertNotNull(xz);
+        assertTrue(xz instanceof XZCompressorInputStream);
+
+        try {
+            factory.createCompressorInputStream(new ByteArrayInputStream(new byte[0]));
+            fail("No exception thrown for an empty input stream");
+        } catch (CompressorException e) {
+            // expected
+        }
+    }
+
+    public void testMutiples() throws Exception {
+        for(int i=0; i <tests.length; i++) {
+            TestData test = tests[i];
+            final CompressorStreamFactory fac = test.factory;
+            assertNotNull("Test entry "+i, fac);
+            assertEquals("Test entry "+i, test.concat, fac.getDecompressConcatenated());
+            CompressorInputStream in = getStreamFor(test.fileName, fac);
+            assertNotNull("Test entry "+i,in);
+            for (char entry : test.entryNames) {
+                assertEquals("Test entry" + i, entry, in.read());                
+            }
+            assertEquals(0, in.available());
+            assertEquals(-1, in.read());
+        }
+    }
+
+    private CompressorInputStream getStreamFor(String resource)
+            throws CompressorException, IOException {
+        return factory.createCompressorInputStream(
+                   new BufferedInputStream(new FileInputStream(
+                       getFile(resource))));
+    }
+
+    private CompressorInputStream getStreamFor(String resource, CompressorStreamFactory factory)
+            throws CompressorException, IOException {
+        return factory.createCompressorInputStream(
+                   new BufferedInputStream(new FileInputStream(
+                       getFile(resource))));
+    }
+
+}