/* * Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 3 of the License, or (at your option) * any later version. * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, see http://www.gnu.org/licenses/ */ package com.bc.ceres.core; import static org.junit.Assert.*; import org.junit.*; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.LineNumberReader; import java.util.Arrays; import java.util.List; public class VirtualDirTest { @Test public void testNestedZip() throws Exception { File zipFile = getTestDataDir("VirtualDirTestNested.zip"); final VirtualDir virtualDir = VirtualDir.create(zipFile); assertNotNull(virtualDir); try { String[] allFileArray = virtualDir.listAllFiles(); assertNotNull(allFileArray); List<String> allFiles = Arrays.asList(allFileArray); assertEquals(6, allFiles.size()); assertTrue(allFiles.contains("dir1/File3")); assertTrue(allFiles.contains("dir1/File4")); assertTrue(allFiles.contains("dir1/dir3/File6")); assertTrue(allFiles.contains("File1")); assertTrue(allFiles.contains("File2")); assertTrue(allFiles.contains("File5.gz")); assertNotNull(virtualDir.getFile("File1")); assertNotNull(virtualDir.getFile("File2")); assertNotNull(virtualDir.getFile("File5.gz")); assertNotNull(virtualDir.getFile("dir1")); assertNotNull(virtualDir.getFile("dir1/")); assertNotNull(virtualDir.getFile("dir1/dir3")); assertNotNull(virtualDir.getFile("dir2")); assertNotNull(virtualDir.getFile("dir1/File3")); assertNotNull(virtualDir.getFile("dir1/File4")); assertNotNull(virtualDir.getFile("dir1/dir3/File6")); } finally { virtualDir.close(); } } @Test public void testZip() throws IOException { File zipFile = getTestDataDir("VirtualDirTest.zip"); final VirtualDir virtualDir = VirtualDir.create(zipFile); final File file1 = virtualDir.getFile("File1"); assertTrue(file1.exists()); assertFalse("Path of File1 should not contain the parent path of the zip file.", file1.getAbsolutePath().contains(zipFile.getParent())); testFileNode(zipFile, virtualDir); assertTrue(virtualDir.isCompressed()); assertTrue(virtualDir.isArchive()); } @Test public void testDir() throws IOException { final File file = getTestDataDir("VirtualDirTest.dir"); // make empty "dir2", because git removes empty dirs final File dir2 = new File(file, "dir2"); dir2.mkdir(); dir2.deleteOnExit(); final VirtualDir virtualDir = VirtualDir.create(file); testFileNode(file, virtualDir); assertFalse(virtualDir.isCompressed()); assertFalse(virtualDir.isArchive()); } @Test public void testNoZip() throws IOException { File file = getTestDataDir("VirtualDirTest.nozip"); VirtualDir virtualDir = VirtualDir.create(file); assertNull(virtualDir); } @Test public void testNullArg() throws IOException { try { VirtualDir.create(null); fail("NullPointerException?"); } catch (NullPointerException e) { // ok } } @Test public void testFinalize() throws Throwable { File zipFile = getTestDataDir("VirtualDirTest.zip"); final VirtualDir virtualDir = VirtualDir.create(zipFile); final File file1 = virtualDir.getFile("File1"); // triggers the unzipping final File tempDir = virtualDir.getTempDir(); assertNotNull(tempDir); assertTrue(tempDir.isDirectory()); virtualDir.finalize(); assertFalse(tempDir.isDirectory()); } private static File getTestDataDir() { File dir = new File("./src/test/data/"); if (!dir.exists()) { dir = new File("./ceres-core/src/test/data/"); if (!dir.exists()) { fail("Can't find my test data. Where is '" + dir + "'?"); } } return dir; } private static File getTestDataDir(String path) { return new File(getTestDataDir(), path); } private void testFileNode(File file, VirtualDir virtualDir) throws IOException { assertNotNull(virtualDir); try { assertEquals(file.getPath(), virtualDir.getBasePath()); assertNotNull(virtualDir.getFile("File1")); assertNotNull(virtualDir.getFile("File2")); assertNotNull(virtualDir.getFile("File5.gz")); assertNotNull(virtualDir.getFile("dir1")); assertNotNull(virtualDir.getFile("dir1/File3")); assertNotNull(virtualDir.getFile("dir1/File4")); assertNotNull(virtualDir.getFile("dir2")); assertEquals(36, virtualDir.getFile("File5.gz").length()); try (LineNumberReader reader = new LineNumberReader(virtualDir.getReader("File5.gz"))) { assertEquals("Norman was was was here!", reader.readLine()); } List<String> dirNames = Arrays.asList(virtualDir.list(".")); assertNotNull(dirNames); assertEquals(5, dirNames.size()); assertTrue(dirNames.contains("dir1")); assertTrue(dirNames.contains("dir2")); assertTrue(dirNames.contains("File1")); assertTrue(dirNames.contains("File2")); assertTrue(dirNames.contains("File5.gz")); dirNames = Arrays.asList(virtualDir.list("")); assertNotNull(dirNames); assertEquals(5, dirNames.size()); assertTrue(dirNames.contains("dir1")); assertTrue(dirNames.contains("dir2")); assertTrue(dirNames.contains("File1")); assertTrue(dirNames.contains("File2")); assertTrue(dirNames.contains("File5.gz")); // todo - test other cases with same result, e.g. "dir1/.." List<String> dir1Names = Arrays.asList(virtualDir.list("dir1")); assertNotNull(dir1Names); assertEquals(2, dir1Names.size()); assertTrue(dir1Names.contains("File3")); assertTrue(dir1Names.contains("File4")); // todo - test other cases with same result, e.g. "./dir1" String[] dir2Names = virtualDir.list("dir2"); assertNotNull(dir2Names); assertEquals(0, dir2Names.length); try { virtualDir.list("dir3"); fail("IOException?"); } catch (FileNotFoundException ignored) { // ok } try { virtualDir.getFile("File3"); fail("IOException?"); } catch (FileNotFoundException ignored) { // ok } try { virtualDir.getFile("dir1/File1"); fail("IOException?"); } catch (FileNotFoundException ignored) { // ok } String[] allFileArray = virtualDir.listAllFiles(); assertNotNull(allFileArray); List<String> allFiles = Arrays.asList(allFileArray); assertEquals(5, allFiles.size()); assertTrue(allFiles.contains("dir1/File3")); assertTrue(allFiles.contains("dir1/File4")); assertTrue(allFiles.contains("File1")); assertTrue(allFiles.contains("File2")); assertTrue(allFiles.contains("File5.gz")); } finally { virtualDir.close(); } } }