| /* |
| * Copyright (C) 2009 The Guava Authors |
| * |
| * 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.common.io; |
| |
| import static com.google.common.base.Charsets.UTF_8; |
| import static com.google.common.io.Files.simplifyPath; |
| |
| import com.google.common.base.CharMatcher; |
| import com.google.common.base.Splitter; |
| |
| import junit.framework.TestCase; |
| |
| import java.io.IOException; |
| import java.net.URL; |
| import java.util.Iterator; |
| |
| /** |
| * Unit tests for {@link Files#simplifyPath}. |
| * |
| * @author Pablo Bellver |
| */ |
| public class FilesSimplifyPathTest extends TestCase { |
| |
| public void testSimplifyEmptyString() { |
| assertEquals(".", simplifyPath("")); |
| } |
| |
| public void testSimplifyDot() { |
| assertEquals(".", simplifyPath(".")); |
| } |
| |
| public void testSimplifyWhiteSpace() { |
| assertEquals(" ", simplifyPath(" ")); |
| } |
| |
| public void testSimplify2() { |
| assertEquals("x", simplifyPath("x")); |
| } |
| |
| public void testSimplify3() { |
| assertEquals("/a/b/c/d", simplifyPath("/a/b/c/d")); |
| } |
| |
| public void testSimplify4() { |
| assertEquals("/a/b/c/d", simplifyPath("/a/b/c/d/")); |
| } |
| |
| public void testSimplify5() { |
| assertEquals("/a/b", simplifyPath("/a//b")); |
| } |
| |
| public void testSimplify6() { |
| assertEquals("/a/b", simplifyPath("//a//b/")); |
| } |
| |
| public void testSimplify7() { |
| assertEquals("/", simplifyPath("/..")); |
| } |
| |
| public void testSimplify8() { |
| assertEquals("/", simplifyPath("/././././")); |
| } |
| |
| public void testSimplify9() { |
| assertEquals("/a", simplifyPath("/a/b/..")); |
| } |
| |
| public void testSimplify10() { |
| assertEquals("/", simplifyPath("/a/b/../../..")); |
| } |
| |
| public void testSimplify11() { |
| assertEquals("/", simplifyPath("//a//b/..////../..//")); |
| } |
| |
| public void testSimplify12() { |
| assertEquals("/x", simplifyPath("//a//../x//")); |
| } |
| |
| public void testSimplify13() { |
| assertEquals("../c", simplifyPath("a/b/../../../c")); |
| } |
| |
| public void testSimplifyDotDot() { |
| assertEquals("..", simplifyPath("..")); |
| } |
| |
| public void testSimplifyDotDotSlash() { |
| assertEquals("..", simplifyPath("../")); |
| assertEquals("..", simplifyPath("a/../..")); |
| assertEquals("..", simplifyPath("a/../../")); |
| } |
| |
| public void testSimplifyDotDots() { |
| assertEquals("../..", simplifyPath("a/../../..")); |
| assertEquals("../../..", simplifyPath("a/../../../..")); |
| } |
| |
| public void testSimplifyRootedDotDots() { |
| assertEquals("/", simplifyPath("/../../..")); |
| assertEquals("/", simplifyPath("/../../../")); |
| } |
| |
| // b/4558855 |
| public void testMadbotsBug() { |
| assertEquals("../this", simplifyPath("../this")); |
| assertEquals("../this/is/ok", simplifyPath("../this/is/ok")); |
| assertEquals("../ok", simplifyPath("../this/../ok")); |
| } |
| |
| // https://code.google.com/p/guava-libraries/issues/detail?id=705 |
| public void test705() { |
| assertEquals("../b", simplifyPath("x/../../b")); |
| assertEquals("b", simplifyPath("x/../b")); |
| } |
| |
| // https://code.google.com/p/guava-libraries/issues/detail?id=716 |
| public void test716() { |
| assertEquals("b", simplifyPath("./b")); |
| assertEquals("b", simplifyPath("./b/.")); |
| assertEquals("b", simplifyPath("././b/./.")); |
| assertEquals("b", simplifyPath("././b")); |
| assertEquals("a/b", simplifyPath("./a/b")); |
| } |
| |
| public void testHiddenFiles() { |
| assertEquals(".b", simplifyPath(".b")); |
| assertEquals(".b", simplifyPath("./.b")); |
| assertEquals(".metadata/b", simplifyPath(".metadata/b")); |
| assertEquals(".metadata/b", simplifyPath("./.metadata/b")); |
| } |
| |
| // https://code.google.com/p/guava-libraries/issues/detail?id=716 |
| public void testMultipleDotFilenames() { |
| assertEquals("..a", simplifyPath("..a")); |
| assertEquals("/..a", simplifyPath("/..a")); |
| assertEquals("/..a/..b", simplifyPath("/..a/..b")); |
| assertEquals("/.....a/..b", simplifyPath("/.....a/..b")); |
| assertEquals("..../....", simplifyPath("..../....")); |
| assertEquals("..a../..b..", simplifyPath("..a../..b..")); |
| } |
| |
| public void testSlashDot() { |
| assertEquals("/", simplifyPath("/.")); |
| } |
| |
| // http://code.google.com/p/guava-libraries/issues/detail?id=722 |
| public void testInitialSlashDotDot() { |
| assertEquals("/c", simplifyPath("/../c")); |
| } |
| |
| // http://code.google.com/p/guava-libraries/issues/detail?id=722 |
| public void testInitialSlashDot() { |
| assertEquals("/a", simplifyPath("/./a")); |
| assertEquals("/.a", simplifyPath("/.a/a/..")); |
| } |
| |
| // http://code.google.com/p/guava-libraries/issues/detail?id=722 |
| public void testConsecutiveParentsAfterPresent() { |
| assertEquals("../..", simplifyPath("./../../")); |
| assertEquals("../..", simplifyPath("./.././../")); |
| } |
| |
| /* |
| * We co-opt some URI resolution tests for our purposes. |
| * Some of the tests have queries and anchors that are a little silly here. |
| */ |
| |
| /** http://gbiv.com/protocols/uri/rfc/rfc2396.html#rfc.section.C.1 */ |
| public void testRfc2396Normal() { |
| assertEquals("/a/b/c/g", simplifyPath("/a/b/c/g")); |
| assertEquals("/a/b/c/g", simplifyPath("/a/b/c/./g")); |
| assertEquals("/a/b/c/g", simplifyPath("/a/b/c/g/")); |
| |
| assertEquals("/a/b/c/g?y", simplifyPath("/a/b/c/g?y")); |
| assertEquals("/a/b/c/g#s", simplifyPath("/a/b/c/g#s")); |
| assertEquals("/a/b/c/g?y#s", simplifyPath("/a/b/c/g?y#s")); |
| assertEquals("/a/b/c/;x", simplifyPath("/a/b/c/;x")); |
| assertEquals("/a/b/c/g;x", simplifyPath("/a/b/c/g;x")); |
| assertEquals("/a/b/c/g;x?y#s", simplifyPath("/a/b/c/g;x?y#s")); |
| assertEquals("/a/b/c", simplifyPath("/a/b/c/.")); |
| assertEquals("/a/b/c", simplifyPath("/a/b/c/./")); |
| assertEquals("/a/b", simplifyPath("/a/b/c/..")); |
| assertEquals("/a/b", simplifyPath("/a/b/c/../")); |
| assertEquals("/a/b/g", simplifyPath("/a/b/c/../g")); |
| assertEquals("/a", simplifyPath("/a/b/c/../..")); |
| assertEquals("/a", simplifyPath("/a/b/c/../../")); |
| assertEquals("/a/g", simplifyPath("/a/b/c/../../g")); |
| } |
| |
| /** http://gbiv.com/protocols/uri/rfc/rfc2396.html#rfc.section.C.2 */ |
| public void testRfc2396Abnormal() { |
| assertEquals("/a/b/c/g.", simplifyPath("/a/b/c/g.")); |
| assertEquals("/a/b/c/.g", simplifyPath("/a/b/c/.g")); |
| assertEquals("/a/b/c/g..", simplifyPath("/a/b/c/g..")); |
| assertEquals("/a/b/c/..g", simplifyPath("/a/b/c/..g")); |
| assertEquals("/a/b/g", simplifyPath("/a/b/c/./../g")); |
| assertEquals("/a/b/c/g", simplifyPath("/a/b/c/./g/.")); |
| assertEquals("/a/b/c/g/h", simplifyPath("/a/b/c/g/./h")); |
| assertEquals("/a/b/c/h", simplifyPath("/a/b/c/g/../h")); |
| assertEquals("/a/b/c/g;x=1/y", simplifyPath("/a/b/c/g;x=1/./y")); |
| assertEquals("/a/b/c/y", simplifyPath("/a/b/c/g;x=1/../y")); |
| } |
| |
| /** http://gbiv.com/protocols/uri/rfc/rfc3986.html#relative-normal */ |
| public void testRfc3986Normal() { |
| assertEquals("/a/b/c/g", simplifyPath("/a/b/c/g")); |
| assertEquals("/a/b/c/g", simplifyPath("/a/b/c/./g")); |
| assertEquals("/a/b/c/g", simplifyPath("/a/b/c/g/")); |
| |
| assertEquals("/a/b/c/g?y", simplifyPath("/a/b/c/g?y")); |
| assertEquals("/a/b/c/g#s", simplifyPath("/a/b/c/g#s")); |
| assertEquals("/a/b/c/g?y#s", simplifyPath("/a/b/c/g?y#s")); |
| assertEquals("/a/b/c/;x", simplifyPath("/a/b/c/;x")); |
| assertEquals("/a/b/c/g;x", simplifyPath("/a/b/c/g;x")); |
| assertEquals("/a/b/c/g;x?y#s", simplifyPath("/a/b/c/g;x?y#s")); |
| |
| assertEquals("/a/b/c", simplifyPath("/a/b/c/.")); |
| assertEquals("/a/b/c", simplifyPath("/a/b/c/./")); |
| assertEquals("/a/b", simplifyPath("/a/b/c/..")); |
| assertEquals("/a/b", simplifyPath("/a/b/c/../")); |
| assertEquals("/a/b/g", simplifyPath("/a/b/c/../g")); |
| assertEquals("/a", simplifyPath("/a/b/c/../..")); |
| assertEquals("/a", simplifyPath("/a/b/c/../../")); |
| assertEquals("/a/g", simplifyPath("/a/b/c/../../g")); |
| } |
| |
| /** http://gbiv.com/protocols/uri/rfc/rfc3986.html#relative-abnormal */ |
| public void testRfc3986Abnormal() { |
| assertEquals("/g", simplifyPath("/a/b/c/../../../g")); |
| assertEquals("/g", simplifyPath("/a/b/c/../../../../g")); |
| |
| assertEquals("/a/b/c/g.", simplifyPath("/a/b/c/g.")); |
| assertEquals("/a/b/c/.g", simplifyPath("/a/b/c/.g")); |
| assertEquals("/a/b/c/g..", simplifyPath("/a/b/c/g..")); |
| assertEquals("/a/b/c/..g", simplifyPath("/a/b/c/..g")); |
| assertEquals("/a/b/g", simplifyPath("/a/b/c/./../g")); |
| assertEquals("/a/b/c/g", simplifyPath("/a/b/c/./g/.")); |
| assertEquals("/a/b/c/g/h", simplifyPath("/a/b/c/g/./h")); |
| assertEquals("/a/b/c/h", simplifyPath("/a/b/c/g/../h")); |
| assertEquals("/a/b/c/g;x=1/y", simplifyPath("/a/b/c/g;x=1/./y")); |
| assertEquals("/a/b/c/y", simplifyPath("/a/b/c/g;x=1/../y")); |
| } |
| |
| public void testExtensiveWithAbsolutePrefix() throws IOException { |
| // Inputs are /b/c/<every possible 10-character string of characters "a./"> |
| // Expected outputs are from realpath -s. |
| doExtensiveTest("testdata/simplifypathwithabsoluteprefixtests.txt"); |
| } |
| |
| public void testExtensiveNoPrefix() throws IOException { |
| /* |
| * Inputs are <every possible 10-character string of characters "a./"> |
| * |
| * Expected outputs are generated by the code itself, but they've been |
| * checked against the inputs under Bash in order to confirm that the two |
| * forms are equivalent (though not necessarily minimal, though we hope this |
| * to be the case). Thus, this test is more of a regression test. |
| * |
| * Rough instructions to regenerate the test outputs and verify correctness: |
| * - Temporarily change this test: |
| * --- Comment out assertEquals. |
| * --- System.out.println(input + " " + simplifyPath(input)); |
| * --- fail(). (If the test were to pass, its output would be hidden.) |
| * - Run the test. |
| * - Pull the relevant lines of output from the test into a testcases file. |
| * - Test the output: |
| * --- cat testcases | while read L; do |
| * X=($L) |
| * A=$( cd /b/c && sudo mkdir -p ${X[0]} && cd ${X[0]} && pwd | |
| * sed -e 's#^//*#/#' ) |
| * B=$( cd /b/c && cd ${X[1]} && pwd ) |
| * cmp -s <(echo $A) <(echo $B) || echo "$X[0] -> $A vs. $B" |
| * done | tee testoutput |
| * - Move that testcases file to the appropriate name under testdata. |
| * |
| * The last test will take hours, and if it passes, the output will be empty. |
| */ |
| doExtensiveTest("testdata/simplifypathnoprefixtests.txt"); |
| } |
| |
| private void doExtensiveTest(String resourceName) throws IOException { |
| Splitter splitter = Splitter.on(CharMatcher.WHITESPACE); |
| URL url = getClass().getResource(resourceName); |
| for (String line : Resources.readLines(url, UTF_8)) { |
| Iterator<String> iterator = splitter.split(line).iterator(); |
| String input = iterator.next(); |
| String expectedOutput = iterator.next(); |
| assertFalse(iterator.hasNext()); |
| assertEquals(expectedOutput, simplifyPath(input)); |
| } |
| } |
| } |