Add "bool FilePath::ReferencesParent()" which adds a clean & simple way for
checking for ".." in a FilePath. Needed to make an upcoming security fix
clean.

BUG=NONE
TEST=FilePathTest.ReferencesParent

Review URL: http://codereview.chromium.org/172012

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@23528 0039d316-1c4b-4281-b951-d872f2087c98


CrOS-Libchrome-Original-Commit: 067086103743fa898f4dedae1c7c07a9688c27be
diff --git a/base/file_path_unittest.cc b/base/file_path_unittest.cc
index ca30baa..e14bbca 100644
--- a/base/file_path_unittest.cc
+++ b/base/file_path_unittest.cc
@@ -535,7 +535,6 @@
       b.value();
   }
 
-  
   for (size_t i = 0; i < arraysize(cases); ++i) {
     FilePath a(cases[i].inputs[0]);
     FilePath b(cases[i].inputs[1]);
@@ -734,3 +733,35 @@
         "i: " << i << ", path: " << path.value() << ", ext: " << ext;
   }
 }
+
+TEST_F(FilePathTest, ReferencesParent) {
+  const struct UnaryBooleanTestData cases[] = {
+    { FPL("."),        false },
+    { FPL(".."),       true },
+    { FPL("a.."),      false },
+    { FPL("..a"),      false },
+    { FPL("../"),      true },
+    { FPL("/.."),      true },
+    { FPL("/../"),     true },
+    { FPL("/a../"),    false },
+    { FPL("/..a/"),    false },
+    { FPL("//.."),     true },
+    { FPL("..//"),     true },
+    { FPL("//..//"),   true },
+    { FPL("a//..//c"), true },
+    { FPL("../b/c"),   true },
+    { FPL("/../b/c"),  true },
+    { FPL("a/b/.."),   true },
+    { FPL("a/b/../"),  true },
+    { FPL("a/../c"),   true },
+    { FPL("a/b/c"),    false },
+  };
+
+  for (size_t i = 0; i < arraysize(cases); ++i) {
+    FilePath input(cases[i].input);
+    bool observed = input.ReferencesParent();
+    EXPECT_EQ(cases[i].expected, observed) <<
+              "i: " << i << ", input: " << input.value();
+  }
+}
+