/* * 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.catalina.webresources; import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; import java.net.URL; import java.util.HashSet; import java.util.Set; import java.util.jar.Manifest; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.apache.catalina.LifecycleException; import org.apache.catalina.WebResource; import org.apache.catalina.WebResourceRoot; public abstract class AbstractTestResourceSet { protected WebResourceRoot resourceRoot; protected abstract WebResourceRoot getWebResourceRoot(); protected abstract boolean isWriteable(); public String getMount() { return ""; } public abstract File getBaseDir(); @Before public final void setup() throws LifecycleException { resourceRoot = getWebResourceRoot(); resourceRoot.start(); } @After public final void teardown() throws LifecycleException { resourceRoot.stop(); resourceRoot.destroy(); } @Test(expected = IllegalArgumentException.class) public final void testGetResourceEmpty() { resourceRoot.getResource(""); } //------------------------------------------------------------ getResource() @Test public final void testGetResourceRoot() { doTestGetResourceRoot(true); } @Test public final void testGetResourceRootNoSlash() { doTestGetResourceRoot(false); } private void doTestGetResourceRoot(boolean slash) { String mount = getMount(); if (!slash && mount.length() == 0) { return; } mount = mount + (slash ? "/" : ""); WebResource webResource = resourceRoot.getResource(mount); Assert.assertTrue(webResource.isDirectory()); String expected; if (getMount().length() > 0) { expected = getMount().substring(1); } else { expected = ""; } Assert.assertEquals(expected, webResource.getName()); Assert.assertEquals(mount + (!slash ? "/" : ""), webResource.getWebappPath()); } @Test public final void testGetResourceDirA() { WebResource webResource = resourceRoot.getResource(getMount() + "/d1"); Assert.assertTrue(webResource.isDirectory()); Assert.assertEquals("d1", webResource.getName()); Assert.assertEquals(getMount() + "/d1/", webResource.getWebappPath()); Assert.assertEquals(-1, webResource.getContentLength()); Assert.assertNull(webResource.getContent()); Assert.assertNull(webResource.getInputStream()); } @Test public final void testGetResourceDirB() { WebResource webResource = resourceRoot.getResource(getMount() + "/d1/"); Assert.assertTrue(webResource.isDirectory()); Assert.assertEquals("d1", webResource.getName()); Assert.assertEquals(getMount() + "/d1/", webResource.getWebappPath()); Assert.assertEquals(-1, webResource.getContentLength()); Assert.assertNull(webResource.getContent()); Assert.assertNull(webResource.getInputStream()); } @Test public final void testGetResourceFile() { WebResource webResource = resourceRoot.getResource(getMount() + "/d1/d1-f1.txt"); Assert.assertTrue(webResource.isFile()); Assert.assertEquals("d1-f1.txt", webResource.getName()); Assert.assertEquals( getMount() + "/d1/d1-f1.txt", webResource.getWebappPath()); Assert.assertEquals(0, webResource.getContentLength()); Assert.assertEquals(0, webResource.getContent().length); Assert.assertNotNull(webResource.getInputStream()); } @Test public final void testGetResourceCaseSensitive() { WebResource webResource = resourceRoot.getResource(getMount() + "/d1/d1-F1.txt"); Assert.assertFalse(webResource.exists()); } @Test public final void testGetResourceTraversal() { WebResource webResource = null; try { webResource = resourceRoot.getResource(getMount() + "/../"); } catch (IllegalArgumentException iae) { // Expected if mount point is zero length Assert.assertTrue(getMount().length() == 0); return; } Assert.assertFalse(webResource.exists()); } //------------------------------------------------------------------- list() @Test(expected = IllegalArgumentException.class) public final void testListEmpty() { resourceRoot.list(""); } @Test public final void testListRoot() { doTestListRoot(true); } @Test public final void testListRootNoSlash() { doTestListRoot(false); } private void doTestListRoot(boolean slash) { String mount = getMount(); if (!slash && mount.length() == 0) { return; } String[] results = resourceRoot.list(mount + (slash ? "/" : "")); Set<String> expected = new HashSet<>(); expected.add("d1"); expected.add("d2"); expected.add("f1.txt"); expected.add("f2.txt"); // Directories created by Subversion 1.6 and earlier clients Set<String> optional = new HashSet<>(); optional.add(".svn"); // Files visible in some tests only optional.add(getMount() + ".ignore-me.txt"); optional.add("META-INF"); for (String result : results) { Assert.assertTrue(result, expected.remove(result) || optional.remove(result)); } Assert.assertEquals(0, expected.size()); } @Test public final void testListDirA() { String[] results = resourceRoot.list(getMount() + "/d1"); Set<String> expected = new HashSet<>(); expected.add("d1-f1.txt"); // Directories created by Subversion 1.6 and earlier clients Set<String> optional = new HashSet<>(); optional.add(".svn"); // Files visible in some tests only optional.add(".ignore-me.txt"); for (String result : results) { Assert.assertTrue(result, expected.remove(result) || optional.remove(result)); } Assert.assertEquals(0, expected.size()); } @Test public final void testListDirB() { String[] results = resourceRoot.list(getMount() + "/d1/"); Set<String> expected = new HashSet<>(); expected.add("d1-f1.txt"); // Directories created by Subversion 1.6 and earlier clients Set<String> optional = new HashSet<>(); optional.add(".svn"); // Files visible in some tests only optional.add(".ignore-me.txt"); for (String result : results) { Assert.assertTrue(result, expected.remove(result) || optional.remove(result)); } Assert.assertEquals(0, expected.size()); } @Test public final void testListFile() { String[] results = resourceRoot.list(getMount() + "/d1/d1-f1.txt"); Assert.assertNotNull(results); Assert.assertEquals(0, results.length); } //-------------------------------------------------------- listWebAppPaths() @Test(expected = IllegalArgumentException.class) public final void testListWebAppPathsEmpty() { resourceRoot.listWebAppPaths(""); } @Test public final void testListWebAppPathsRoot() { doTestListWebAppPathsRoot(true); } @Test public final void testListWebAppPathsRootNoSlash() { doTestListWebAppPathsRoot(false); } private void doTestListWebAppPathsRoot(boolean slash) { String mount = getMount(); if (!slash && mount.length() == 0) { return; } Set<String> results = resourceRoot.listWebAppPaths(mount + (slash ? "/" : "")); Set<String> expected = new HashSet<>(); expected.add(getMount() + "/d1/"); expected.add(getMount() + "/d2/"); expected.add(getMount() + "/f1.txt"); expected.add(getMount() + "/f2.txt"); // Directories created by Subversion 1.6 and earlier clients Set<String> optional = new HashSet<>(); optional.add(getMount() + "/.svn/"); // Files visible in some tests only optional.add(getMount() + "/.ignore-me.txt"); // Files visible in some configurations only optional.add(getMount() + "/META-INF/"); for (String result : results) { Assert.assertTrue(result, expected.remove(result) || optional.remove(result)); } Assert.assertEquals(0, expected.size()); } @Test public final void testListWebAppPathsDirA() { Set<String> results = resourceRoot.listWebAppPaths(getMount() + "/d1"); Set<String> expected = new HashSet<>(); expected.add(getMount() + "/d1/d1-f1.txt"); // Directories created by Subversion 1.6 and earlier clients Set<String> optional = new HashSet<>(); optional.add(getMount() + "/d1/.svn/"); // Files visible in some tests only optional.add(getMount() + "/d1/.ignore-me.txt"); for (String result : results) { Assert.assertTrue(result, expected.remove(result) || optional.remove(result)); } Assert.assertEquals(0, expected.size()); } @Test public final void testListWebAppPathsDirB() { Set<String> results = resourceRoot.listWebAppPaths(getMount() + "/d1/"); Set<String> expected = new HashSet<>(); expected.add(getMount() + "/d1/d1-f1.txt"); // Directories created by Subversion 1.6 and earlier clients Set<String> optional = new HashSet<>(); optional.add(getMount() + "/d1/.svn/"); // Files visible in some tests only optional.add(getMount() + "/d1/.ignore-me.txt"); for (String result : results) { Assert.assertTrue(result, expected.remove(result) || optional.remove(result)); } Assert.assertEquals(0, expected.size()); } @Test public final void testListWebAppPathsFile() { Set<String> results = resourceRoot.listWebAppPaths(getMount() + "/d1/d1-f1.txt"); Assert.assertNull(results); } //------------------------------------------------------------------ mkdir() @Test(expected = IllegalArgumentException.class) public final void testMkdirEmpty() { resourceRoot.mkdir(""); } @Test public final void testMkdirRoot() { Assert.assertFalse(resourceRoot.mkdir(getMount() + "/")); } @Test public final void testMkdirDirA() { WebResource d1 = resourceRoot.getResource(getMount() + "/d1"); if (d1.exists()) { Assert.assertFalse(resourceRoot.mkdir(getMount() + "/d1")); } else if (d1.isVirtual()) { Assert.assertTrue(resourceRoot.mkdir(getMount() + "/d1")); File file = new File(getBaseDir(), "d1"); Assert.assertTrue(file.isDirectory()); Assert.assertTrue(file.delete()); } else { Assert.fail("Unhandled condition in unit test"); } } @Test public final void testMkdirDirB() { WebResource d1 = resourceRoot.getResource(getMount() + "/d1/"); if (d1.exists()) { Assert.assertFalse(resourceRoot.mkdir(getMount() + "/d1/")); } else if (d1.isVirtual()) { Assert.assertTrue(resourceRoot.mkdir(getMount() + "/d1/")); File file = new File(getBaseDir(), "d1"); Assert.assertTrue(file.isDirectory()); Assert.assertTrue(file.delete()); } else { Assert.fail("Unhandled condition in unit test"); } } @Test public final void testMkdirFile() { Assert.assertFalse(resourceRoot.mkdir(getMount() + "/d1/d1-f1.txt")); } @Test public final void testMkdirNew() { String newDirName = getNewDirName(); if (isWriteable()) { Assert.assertTrue(resourceRoot.mkdir(getMount() + "/" + newDirName)); File file = new File(getBaseDir(), newDirName); Assert.assertTrue(file.isDirectory()); Assert.assertTrue(file.delete()); } else { Assert.assertFalse(resourceRoot.mkdir(getMount() + "/" + newDirName)); } } protected abstract String getNewDirName(); //------------------------------------------------------------------ write() @Test(expected = IllegalArgumentException.class) public final void testWriteEmpty() { InputStream is = new ByteArrayInputStream("test".getBytes()); resourceRoot.write("", is, false); } @Test public final void testWriteRoot() { InputStream is = new ByteArrayInputStream("test".getBytes()); Assert.assertFalse(resourceRoot.write(getMount() + "/", is, false)); } @Test public final void testWriteDirA() { WebResource d1 = resourceRoot.getResource(getMount() + "/d1"); InputStream is = new ByteArrayInputStream("test".getBytes()); if (d1.exists()) { Assert.assertFalse(resourceRoot.write(getMount() + "/d1", is, false)); } else if (d1.isVirtual()) { Assert.assertTrue(resourceRoot.write( getMount() + "/d1", is, false)); File file = new File(getBaseDir(), "d1"); Assert.assertTrue(file.exists()); Assert.assertTrue(file.delete()); } else { Assert.fail("Unhandled condition in unit test"); } } @Test public final void testWriteDirB() { WebResource d1 = resourceRoot.getResource(getMount() + "/d1/"); InputStream is = new ByteArrayInputStream("test".getBytes()); if (d1.exists()) { Assert.assertFalse(resourceRoot.write(getMount() + "/d1/", is, false)); } else if (d1.isVirtual()) { Assert.assertTrue(resourceRoot.write( getMount() + "/d1/", is, false)); File file = new File(getBaseDir(), "d1"); Assert.assertTrue(file.exists()); Assert.assertTrue(file.delete()); } else { Assert.fail("Unhandled condition in unit test"); } } @Test public final void testWriteFile() { InputStream is = new ByteArrayInputStream("test".getBytes()); Assert.assertFalse(resourceRoot.write( getMount() + "/d1/d1-f1.txt", is, false)); } @Test(expected = NullPointerException.class) public final void testWriteNull() { resourceRoot.write(getMount() + "/" + getNewFileNameNull(), null, false); } protected abstract String getNewFileNameNull(); @Test public final void testWrite() { String newFileName = getNewFileName(); InputStream is = new ByteArrayInputStream("test".getBytes()); if (isWriteable()) { Assert.assertTrue(resourceRoot.write( getMount() + "/" + newFileName, is, false)); File file = new File(getBaseDir(), newFileName); Assert.assertTrue(file.exists()); Assert.assertTrue(file.delete()); } else { Assert.assertFalse(resourceRoot.write( getMount() + "/" + newFileName, is, false)); } } protected abstract String getNewFileName(); // ------------------------------------------------------ getCanonicalPath() @Test public final void testGetCanonicalPathExists() { WebResource exists = resourceRoot.getResource(getMount() + "/d1/d1-f1.txt"); String existsCanonicalPath = exists.getCanonicalPath(); URL existsUrl = exists.getURL(); if ("file".equals(existsUrl.getProtocol())) { // Should have a canonical path Assert.assertNotNull(existsCanonicalPath); } else { Assert.assertNull(existsCanonicalPath); } } @Test public final void testGetCanonicalPathDoesNotExist() { WebResource exists = resourceRoot.getResource(getMount() + "/d1/d1-f1.txt"); WebResource doesNotExist = resourceRoot.getResource(getMount() + "/d1/dummy.txt"); String doesNotExistCanonicalPath = doesNotExist.getCanonicalPath(); URL existsUrl = exists.getURL(); if ("file".equals(existsUrl.getProtocol())) { // Should be possible to construct a canonical path for a resource // that doesn't exist given that a resource that does exist in the // same directory has a URL with the file protocol Assert.assertNotNull(doesNotExistCanonicalPath); } else { Assert.assertNull(doesNotExistCanonicalPath); } } // ----------------------------------------------------------- getManifest() @Test public final void testGetManifest() { WebResource exists = resourceRoot.getResource(getMount() + "/d1/d1-f1.txt"); boolean manifestExists = resourceRoot.getResource("/META-INF/MANIFEST.MF").exists(); Manifest m = exists.getManifest(); if (getMount().equals("") && manifestExists) { Assert.assertNotNull(m); } else { Assert.assertNull(m); } } // ------------------------------------------------------------ constructors public abstract void testNoArgConstructor(); }