| // Copyright 2014 The Bazel Authors. All rights reserved. |
| // |
| // Licensed 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 com.google.devtools.build.lib.vfs; |
| |
| import static com.google.common.truth.Truth.assertThat; |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.assertTrue; |
| import static org.junit.Assert.fail; |
| |
| import com.google.common.collect.Lists; |
| import com.google.common.io.CharStreams; |
| import com.google.devtools.build.lib.testutil.BlazeTestUtils; |
| import com.google.devtools.build.lib.testutil.TestConstants; |
| import com.google.devtools.build.lib.vfs.util.FileSystems; |
| |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.JUnit4; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.InputStreamReader; |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| |
| @RunWith(JUnit4.class) |
| public class ZipFileSystemTest { |
| |
| /** |
| * Expected listing of sample zip files, in alpha sorted order |
| */ |
| private static final String[] LISTING = { |
| "/dir1", |
| "/dir1/file1a", |
| "/dir1/file1b", |
| "/dir2", |
| "/dir2/dir3", |
| "/dir2/dir3/dir4", |
| "/dir2/dir3/dir4/file4", |
| "/dir2/file2", |
| "/file0", |
| }; |
| |
| private FileSystem zipFS1; |
| private FileSystem zipFS2; |
| |
| @Before |
| public final void initializeFileSystems() throws Exception { |
| FileSystem unixFs = FileSystems.getNativeFileSystem(); |
| Path testdataDir = unixFs.getPath(BlazeTestUtils.runfilesDir()).getRelative( |
| TestConstants.JAVATESTS_ROOT + "/com/google/devtools/build/lib/vfs"); |
| Path zPath1 = testdataDir.getChild("sample_with_dirs.zip"); |
| Path zPath2 = testdataDir.getChild("sample_without_dirs.zip"); |
| zipFS1 = new ZipFileSystem(zPath1); |
| zipFS2 = new ZipFileSystem(zPath2); |
| } |
| |
| private void checkExists(FileSystem fs) { |
| assertTrue(fs.getPath("/dir2/dir3/dir4").exists()); |
| assertTrue(fs.getPath("/dir2/dir3/dir4/file4").exists()); |
| assertFalse(fs.getPath("/dir2/dir3/dir4/bogus").exists()); |
| } |
| |
| @Test |
| public void testExists() { |
| checkExists(zipFS1); |
| checkExists(zipFS2); |
| } |
| |
| private void checkIsFile(FileSystem fs) { |
| assertFalse(fs.getPath("/dir2/dir3/dir4").isFile()); |
| assertTrue(fs.getPath("/dir2/dir3/dir4/file4").isFile()); |
| assertFalse(fs.getPath("/dir2/dir3/dir4/bogus").isFile()); |
| } |
| |
| @Test |
| public void testIsFile() { |
| checkIsFile(zipFS1); |
| checkIsFile(zipFS2); |
| } |
| |
| private void checkIsDir(FileSystem fs) { |
| assertTrue(fs.getPath("/dir2/dir3/dir4").isDirectory()); |
| assertFalse(fs.getPath("/dir2/dir3/dir4/file4").isDirectory()); |
| assertFalse(fs.getPath("/bogus/mobogus").isDirectory()); |
| assertFalse(fs.getPath("/bogus").isDirectory()); |
| } |
| |
| @Test |
| public void testIsDir() { |
| checkIsDir(zipFS1); |
| checkIsDir(zipFS2); |
| } |
| |
| /** |
| * Recursively add the contents of a given path, rendered as strings, into a |
| * given list. |
| */ |
| private static void listChildren(Path p, List<String> list) |
| throws IOException { |
| for (Path c : p.getDirectoryEntries()) { |
| list.add(c.getPathString()); |
| if (c.isDirectory()) { |
| listChildren(c, list); |
| } |
| } |
| } |
| |
| private void checkListing(FileSystem fs) throws Exception { |
| List<String> list = new ArrayList<>(); |
| listChildren(fs.getRootDirectory(), list); |
| Collections.sort(list); |
| assertEquals(Lists.newArrayList(LISTING), list); |
| } |
| |
| @Test |
| public void testListing() throws Exception { |
| checkListing(zipFS1); |
| checkListing(zipFS2); |
| |
| // Regression test for: creation of a path (i.e. a file *name*) |
| // must not affect the result of getDirectoryEntries(). |
| zipFS1.getPath("/dir1/notthere"); |
| checkListing(zipFS1); |
| } |
| |
| private void checkFileSize(FileSystem fs, String name, long expectedSize) |
| throws IOException { |
| assertEquals(expectedSize, fs.getPath(name).getFileSize()); |
| } |
| |
| @Test |
| public void testCanReadRoot() { |
| Path rootDirectory = zipFS1.getRootDirectory(); |
| assertTrue(rootDirectory.isDirectory()); |
| } |
| |
| @Test |
| public void testFileSize() throws IOException { |
| checkFileSize(zipFS1, "/dir1/file1a", 5); |
| checkFileSize(zipFS2, "/dir1/file1a", 5); |
| checkFileSize(zipFS1, "/dir2/dir3/dir4/file4", 5000); |
| checkFileSize(zipFS2, "/dir2/dir3/dir4/file4", 5000); |
| } |
| |
| private void checkCantGetFileSize(FileSystem fs, String name) { |
| try { |
| fs.getPath(name).getFileSize(); |
| fail(); |
| } catch (IOException expected) { |
| // expected |
| } |
| } |
| |
| @Test |
| public void testCantGetFileSize() { |
| checkCantGetFileSize(zipFS1, "/dir2/dir3/dir4/bogus"); |
| checkCantGetFileSize(zipFS2, "/dir2/dir3/dir4/bogus"); |
| } |
| |
| private void checkOpenFile(FileSystem fs, String name, int expectedSize) |
| throws Exception { |
| InputStream is = fs.getPath(name).getInputStream(); |
| List<String> lines = CharStreams.readLines(new InputStreamReader(is, "ISO-8859-1")); |
| assertThat(lines).hasSize(expectedSize); |
| for (int i = 0; i < expectedSize; i++) { |
| assertEquals("body", lines.get(i)); |
| } |
| } |
| |
| @Test |
| public void testOpenSmallFile() throws Exception { |
| checkOpenFile(zipFS1, "/dir1/file1a", 1); |
| checkOpenFile(zipFS2, "/dir1/file1a", 1); |
| } |
| |
| @Test |
| public void testOpenBigFile() throws Exception { |
| checkOpenFile(zipFS1, "/dir2/dir3/dir4/file4", 1000); |
| checkOpenFile(zipFS2, "/dir2/dir3/dir4/file4", 1000); |
| } |
| |
| private void checkCantOpenFile(FileSystem fs, String name) { |
| try { |
| fs.getPath(name).getInputStream(); |
| fail(); |
| } catch (IOException expected) { |
| // expected |
| } |
| } |
| |
| @Test |
| public void testCantOpenFile() throws Exception { |
| checkCantOpenFile(zipFS1, "/dir2/dir3/dir4/bogus"); |
| checkCantOpenFile(zipFS2, "/dir2/dir3/dir4/bogus"); |
| } |
| |
| private void checkCantCreateAnything(FileSystem fs, String name) { |
| Path p = fs.getPath(name); |
| try { |
| p.createDirectory(); |
| fail(); |
| } catch (Exception expected) {} |
| try { |
| FileSystemUtils.createEmptyFile(p); |
| fail(); |
| } catch (Exception expected) {} |
| try { |
| p.createSymbolicLink(p); |
| fail(); |
| } catch (Exception expected) {} |
| } |
| |
| @Test |
| public void testCantCreateAnything() throws Exception { |
| checkCantCreateAnything(zipFS1, "/dir2/dir3/dir4/new"); |
| checkCantCreateAnything(zipFS2, "/dir2/dir3/dir4/new"); |
| } |
| |
| } |