You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by pe...@apache.org on 2020/11/30 01:45:36 UTC

[commons-compress] 01/03: COMPRESS-560: Do not return false if the entry is a tar sparse entry

This is an automated email from the ASF dual-hosted git repository.

peterlee pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-compress.git

commit b86feb61e7d96e36c9348b4c4ac9ead331fc714a
Author: theobisproject <th...@gmail.com>
AuthorDate: Sun Nov 22 14:07:21 2020 +0100

    COMPRESS-560: Do not return false if the entry is a tar sparse entry
---
 .../archivers/tar/TarArchiveInputStream.java       |  8 +--
 .../compress/archivers/tar/SparseFilesTest.java    | 59 +++++++++++++---------
 2 files changed, 37 insertions(+), 30 deletions(-)

diff --git a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
index cdaf692..ea68d7c 100644
--- a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
@@ -1006,15 +1006,11 @@ public class TarArchiveInputStream extends ArchiveInputStream {
     /**
      * Whether this class is able to read the given entry.
      *
-     * <p>May return false if the current entry is a sparse file.</p>
+     * @return The implementation will return true if the {@link ArchiveEntry} is an instance of {@link TarArchiveEntry}
      */
     @Override
     public boolean canReadEntryData(final ArchiveEntry ae) {
-        if (ae instanceof TarArchiveEntry) {
-            final TarArchiveEntry te = (TarArchiveEntry) ae;
-            return !te.isSparse();
-        }
-        return false;
+        return ae instanceof TarArchiveEntry;
     }
 
     /**
diff --git a/src/test/java/org/apache/commons/compress/archivers/tar/SparseFilesTest.java b/src/test/java/org/apache/commons/compress/archivers/tar/SparseFilesTest.java
index d528b65..49f49e1 100644
--- a/src/test/java/org/apache/commons/compress/archivers/tar/SparseFilesTest.java
+++ b/src/test/java/org/apache/commons/compress/archivers/tar/SparseFilesTest.java
@@ -45,7 +45,7 @@ public class SparseFilesTest extends AbstractTestCase {
             assertTrue(ae.isOldGNUSparse());
             assertTrue(ae.isGNUSparse());
             assertFalse(ae.isPaxGNUSparse());
-            assertFalse(tin.canReadEntryData(ae));
+            assertTrue(tin.canReadEntryData(ae));
 
             final List<TarArchiveStructSparse> sparseHeaders = ae.getSparseHeaders();
             assertEquals(3, sparseHeaders.size());
@@ -82,27 +82,33 @@ public class SparseFilesTest extends AbstractTestCase {
         try (TarArchiveInputStream paxGNUSparseInputStream = new TarArchiveInputStream(new FileInputStream(paxGNUSparseTar))) {
 
             // compare between old GNU and PAX 0.0
-            paxGNUSparseInputStream.getNextTarEntry();
+            TarArchiveEntry paxGNUEntry = paxGNUSparseInputStream.getNextTarEntry();
+            assertTrue(paxGNUSparseInputStream.canReadEntryData(paxGNUEntry));
             try (TarArchiveInputStream oldGNUSparseInputStream = new TarArchiveInputStream(new FileInputStream(oldGNUSparseTar))) {
-                oldGNUSparseInputStream.getNextTarEntry();
+                final TarArchiveEntry oldGNUEntry = oldGNUSparseInputStream.getNextTarEntry();
+                assertTrue(oldGNUSparseInputStream.canReadEntryData(oldGNUEntry));
                 assertArrayEquals(IOUtils.toByteArray(oldGNUSparseInputStream),
-                    IOUtils.toByteArray(paxGNUSparseInputStream));
+                        IOUtils.toByteArray(paxGNUSparseInputStream));
             }
 
             // compare between old GNU and PAX 0.1
-            paxGNUSparseInputStream.getNextTarEntry();
+            paxGNUEntry = paxGNUSparseInputStream.getNextTarEntry();
+            assertTrue(paxGNUSparseInputStream.canReadEntryData(paxGNUEntry));
             try (TarArchiveInputStream oldGNUSparseInputStream = new TarArchiveInputStream(new FileInputStream(oldGNUSparseTar))) {
-                oldGNUSparseInputStream.getNextTarEntry();
+                final TarArchiveEntry oldGNUEntry = oldGNUSparseInputStream.getNextTarEntry();
+                assertTrue(oldGNUSparseInputStream.canReadEntryData(oldGNUEntry));
                 assertArrayEquals(IOUtils.toByteArray(oldGNUSparseInputStream),
-                    IOUtils.toByteArray(paxGNUSparseInputStream));
+                        IOUtils.toByteArray(paxGNUSparseInputStream));
             }
 
             // compare between old GNU and PAX 1.0
-            paxGNUSparseInputStream.getNextTarEntry();
+            paxGNUEntry = paxGNUSparseInputStream.getNextTarEntry();
+            assertTrue(paxGNUSparseInputStream.canReadEntryData(paxGNUEntry));
             try (TarArchiveInputStream oldGNUSparseInputStream = new TarArchiveInputStream(new FileInputStream(oldGNUSparseTar))) {
-                oldGNUSparseInputStream.getNextTarEntry();
+                final TarArchiveEntry oldGNUEntry = oldGNUSparseInputStream.getNextTarEntry();
+                assertTrue(oldGNUSparseInputStream.canReadEntryData(oldGNUEntry));
                 assertArrayEquals(IOUtils.toByteArray(oldGNUSparseInputStream),
-                    IOUtils.toByteArray(paxGNUSparseInputStream));
+                        IOUtils.toByteArray(paxGNUSparseInputStream));
             }
         }
     }
@@ -114,13 +120,14 @@ public class SparseFilesTest extends AbstractTestCase {
         }
 
         try {
-        final File file = getFile("oldgnu_sparse.tar");
-        try (InputStream sparseFileInputStream = extractTarAndGetInputStream(file, "sparsefile");
-             TarArchiveInputStream tin = new TarArchiveInputStream(new FileInputStream(file))) {
-            tin.getNextTarEntry();
-            assertArrayEquals(IOUtils.toByteArray(tin),
-                IOUtils.toByteArray(sparseFileInputStream));
-        }
+            final File file = getFile("oldgnu_sparse.tar");
+            try (InputStream sparseFileInputStream = extractTarAndGetInputStream(file, "sparsefile");
+                 TarArchiveInputStream tin = new TarArchiveInputStream(new FileInputStream(file))) {
+                final TarArchiveEntry entry = tin.getNextTarEntry();
+                assertTrue(tin.canReadEntryData(entry));
+                assertArrayEquals(IOUtils.toByteArray(tin),
+                        IOUtils.toByteArray(sparseFileInputStream));
+            }
         } catch (RuntimeException | IOException ex) {
             ex.printStackTrace();
             throw ex;
@@ -137,6 +144,7 @@ public class SparseFilesTest extends AbstractTestCase {
         try (InputStream sparseFileInputStream = extractTarAndGetInputStream(file, "sparse6");
              TarArchiveInputStream tin = new TarArchiveInputStream(new FileInputStream(file))) {
             final TarArchiveEntry ae = tin.getNextTarEntry();
+            assertTrue(tin.canReadEntryData(ae));
 
             assertArrayEquals(IOUtils.toByteArray(tin),
                 IOUtils.toByteArray(sparseFileInputStream));
@@ -176,24 +184,27 @@ public class SparseFilesTest extends AbstractTestCase {
         final File file = getFile("pax_gnu_sparse.tar");
         try (TarArchiveInputStream tin = new TarArchiveInputStream(new FileInputStream(file))) {
 
-            tin.getNextTarEntry();
+            TarArchiveEntry paxGNUEntry = tin.getNextTarEntry();
+            assertTrue(tin.canReadEntryData(paxGNUEntry));
             try (InputStream sparseFileInputStream = extractTarAndGetInputStream(file, "sparsefile-0.0")) {
                 assertArrayEquals(IOUtils.toByteArray(tin),
-                    IOUtils.toByteArray(sparseFileInputStream));
+                        IOUtils.toByteArray(sparseFileInputStream));
             }
 
             // TODO : it's wired that I can only get a 0 size sparsefile-0.1 on my Ubuntu 16.04
             //        using "tar -xf pax_gnu_sparse.tar"
-            tin.getNextTarEntry();
+            paxGNUEntry = tin.getNextTarEntry();
+            assertTrue(tin.canReadEntryData(paxGNUEntry));
             try (InputStream sparseFileInputStream = extractTarAndGetInputStream(file, "sparsefile-0.0")) {
                 assertArrayEquals(IOUtils.toByteArray(tin),
-                    IOUtils.toByteArray(sparseFileInputStream));
+                        IOUtils.toByteArray(sparseFileInputStream));
             }
 
-            tin.getNextTarEntry();
+            paxGNUEntry = tin.getNextTarEntry();
+            assertTrue(tin.canReadEntryData(paxGNUEntry));
             try (InputStream sparseFileInputStream = extractTarAndGetInputStream(file, "sparsefile-1.0")) {
                 assertArrayEquals(IOUtils.toByteArray(tin),
-                    IOUtils.toByteArray(sparseFileInputStream));
+                        IOUtils.toByteArray(sparseFileInputStream));
             }
         }
     }
@@ -204,7 +215,7 @@ public class SparseFilesTest extends AbstractTestCase {
         assertTrue(ae.isGNUSparse());
         assertTrue(ae.isPaxGNUSparse());
         assertFalse(ae.isOldGNUSparse());
-        assertFalse(tin.canReadEntryData(ae));
+        assertTrue(tin.canReadEntryData(ae));
 
         final List<TarArchiveStructSparse> sparseHeaders = ae.getSparseHeaders();
         assertEquals(3, sparseHeaders.size());