| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <fcntl.h> |
| |
| #include "gtest/gtest.h" |
| |
| #include "nacl_io/kernel_proxy.h" |
| #include "nacl_io/path.h" |
| |
| using namespace nacl_io; |
| |
| TEST(PathTest, SanityChecks) { |
| // can we construct and delete? |
| Path ph1("."); |
| Path *ph2 = new Path("."); |
| delete ph2; |
| |
| Path p1("."); |
| EXPECT_FALSE(p1.IsAbsolute()); |
| EXPECT_EQ(".", p1.Join()); |
| Path p2("/"); |
| EXPECT_TRUE(p2.IsAbsolute()); |
| EXPECT_EQ("/", p2.Join()); |
| } |
| |
| TEST(PathTest, Assignment) { |
| Path empty; |
| Path dot("."); |
| Path root("/"); |
| Path abs_str("/abs/from/string"); |
| Path rel_str("rel/from/string"); |
| Path self_str("./rel/from/string"); |
| |
| EXPECT_EQ(0, empty.Size()); |
| EXPECT_FALSE(empty.IsAbsolute()); |
| EXPECT_EQ(std::string(""), empty.Join()); |
| |
| EXPECT_EQ(1, dot.Size()); |
| EXPECT_FALSE(dot.IsAbsolute()); |
| EXPECT_EQ(std::string("."), dot.Join()); |
| |
| EXPECT_EQ(1, root.Size()); |
| EXPECT_TRUE(root.IsAbsolute()); |
| EXPECT_EQ(std::string("/"), root.Join()); |
| |
| EXPECT_EQ(4, abs_str.Size()); |
| EXPECT_TRUE(abs_str.IsAbsolute()); |
| EXPECT_EQ(std::string("/abs/from/string"), abs_str.Join()); |
| |
| EXPECT_EQ(3, rel_str.Size()); |
| EXPECT_FALSE(rel_str.IsAbsolute()); |
| EXPECT_EQ(std::string("rel/from/string"), rel_str.Join()); |
| |
| EXPECT_EQ(3, self_str.Size()); |
| EXPECT_FALSE(self_str.IsAbsolute()); |
| EXPECT_EQ(std::string("rel/from/string"), self_str.Join()); |
| |
| empty = ""; |
| dot = "."; |
| root = "/"; |
| abs_str = "/abs/from/assign"; |
| rel_str = "rel/from/assign"; |
| self_str = "./rel/from/assign"; |
| |
| EXPECT_EQ(1, empty.Size()); |
| EXPECT_FALSE(empty.IsAbsolute()); |
| EXPECT_EQ(std::string("."), empty.Join()); |
| |
| EXPECT_EQ(1, dot.Size()); |
| EXPECT_FALSE(dot.IsAbsolute()); |
| EXPECT_EQ(std::string("."), dot.Join()); |
| |
| EXPECT_EQ(1, root.Size()); |
| EXPECT_TRUE(root.IsAbsolute()); |
| EXPECT_EQ(std::string("/"), root.Join()); |
| |
| EXPECT_EQ(4, abs_str.Size()); |
| EXPECT_TRUE(abs_str.IsAbsolute()); |
| EXPECT_EQ(std::string("/abs/from/assign"), abs_str.Join()); |
| |
| EXPECT_EQ(3, rel_str.Size()); |
| EXPECT_FALSE(rel_str.IsAbsolute()); |
| EXPECT_EQ(std::string("rel/from/assign"), rel_str.Join()); |
| |
| EXPECT_EQ(3, self_str.Size()); |
| EXPECT_FALSE(self_str.IsAbsolute()); |
| EXPECT_EQ(std::string("rel/from/assign"), self_str.Join()); |
| |
| Path cpy_str; |
| cpy_str = empty; |
| EXPECT_EQ(1, cpy_str.Size()); |
| EXPECT_FALSE(cpy_str.IsAbsolute()); |
| EXPECT_EQ(std::string("."), cpy_str.Join()); |
| |
| cpy_str = dot; |
| EXPECT_EQ(1, cpy_str.Size()); |
| EXPECT_FALSE(cpy_str.IsAbsolute()); |
| EXPECT_EQ(std::string("."), cpy_str.Join()); |
| |
| cpy_str = root; |
| EXPECT_EQ(1, cpy_str.Size()); |
| EXPECT_TRUE(cpy_str.IsAbsolute()); |
| EXPECT_EQ(std::string("/"), cpy_str.Join()); |
| |
| cpy_str = abs_str; |
| EXPECT_EQ(4, cpy_str.Size()); |
| EXPECT_TRUE(cpy_str.IsAbsolute()); |
| EXPECT_EQ(std::string("/abs/from/assign"), cpy_str.Join()); |
| |
| cpy_str = rel_str; |
| EXPECT_EQ(3, cpy_str.Size()); |
| EXPECT_FALSE(cpy_str.IsAbsolute()); |
| EXPECT_EQ(std::string("rel/from/assign"), cpy_str.Join()); |
| |
| cpy_str = self_str; |
| EXPECT_EQ(3, cpy_str.Size()); |
| EXPECT_FALSE(cpy_str.IsAbsolute()); |
| EXPECT_EQ(std::string("rel/from/assign"), cpy_str.Join()); |
| } |
| |
| |
| TEST(PathTest, Collapse) { |
| StringArray_t path_components; |
| |
| Path p1("/simple/splitter/test"); |
| path_components = p1.Split(); |
| EXPECT_EQ("/", path_components[0]); |
| EXPECT_EQ("/", p1.Part(0)); |
| |
| EXPECT_EQ("simple", path_components[1]); |
| EXPECT_EQ("simple", p1.Part(1)); |
| |
| EXPECT_EQ("splitter",path_components[2]); |
| EXPECT_EQ("splitter",p1.Part(2)); |
| |
| EXPECT_EQ("test", path_components[3]); |
| EXPECT_EQ("test", p1.Part(3)); |
| |
| Path p2("///simple//splitter///test/"); |
| path_components = p2.Split(); |
| EXPECT_EQ(4, static_cast<int>(path_components.size())); |
| EXPECT_EQ(4, static_cast<int>(p2.Size())); |
| EXPECT_EQ("/", path_components[0]); |
| EXPECT_EQ("simple", path_components[1]); |
| EXPECT_EQ("splitter", path_components[2]); |
| EXPECT_EQ("test", path_components[3]); |
| |
| Path p3("sim/ple//spli/tter/te/st/"); |
| path_components = p3.Split(); |
| EXPECT_EQ(6, static_cast<int>(path_components.size())); |
| EXPECT_FALSE(p3.IsAbsolute()); |
| EXPECT_EQ("sim", path_components[0]); |
| EXPECT_EQ("ple", path_components[1]); |
| EXPECT_EQ("spli", path_components[2]); |
| EXPECT_EQ("tter", path_components[3]); |
| EXPECT_EQ("te", path_components[4]); |
| EXPECT_EQ("st", path_components[5]); |
| |
| Path p4(""); |
| path_components = p4.Split(); |
| EXPECT_EQ(1, static_cast<int>(path_components.size())); |
| |
| Path p5("/"); |
| path_components = p5.Split(); |
| EXPECT_EQ(1, static_cast<int>(path_components.size())); |
| } |
| |
| TEST(PathTest, AppendAndJoin) { |
| Path ph1("/usr/local/hi/there"); |
| |
| EXPECT_EQ("/usr/local/hi/there", ph1.Join()); |
| ph1 = ph1.Append(".."); |
| EXPECT_EQ("/usr/local/hi", ph1.Join()); |
| ph1 = ph1.Append(".././././hi/there/../.././././"); |
| EXPECT_EQ("/usr/local", ph1.Join()); |
| ph1 = ph1.Append("../../../../../../../../././../"); |
| EXPECT_EQ("/", ph1.Join()); |
| ph1 = ph1.Append("usr/lib/../bin/.././etc/../local/../share"); |
| EXPECT_EQ("/usr/share", ph1.Join()); |
| |
| Path ph2("./"); |
| EXPECT_EQ(".", ph2.Join()); |
| |
| Path ph3("/"); |
| EXPECT_EQ("/", ph3.Join()); |
| ph3 = ph3.Append(""); |
| EXPECT_EQ("/", ph3.Join()); |
| ph3 = ph3.Append("USR/local/SHARE"); |
| EXPECT_EQ("/USR/local/SHARE", ph3.Join()); |
| ph3 = ph3.Append("///////////////////////////////"); |
| EXPECT_EQ("/USR/local/SHARE", ph3.Join()); |
| |
| Path ph4(".."); |
| EXPECT_EQ("..", ph4.Join()); |
| ph4 = ph4.Append("/node1/node3/../../node1/./"); |
| EXPECT_EQ("../node1", ph4.Join()); |
| ph4 = ph4.Append("node4/../../node1/./node5"); |
| EXPECT_EQ("../node1/node5", ph4.Join()); |
| } |
| |
| |
| TEST(PathTest, Invalid) { |
| Path rooted("/usr/local"); |
| Path current("./usr/local"); |
| Path relative("usr/local"); |
| |
| Path test; |
| |
| test = rooted; |
| test.Append("../.."); |
| EXPECT_EQ("/", test.Join()); |
| |
| test = rooted; |
| test.Append("../../.."); |
| EXPECT_EQ("/", test.Join()); |
| |
| test = rooted; |
| test.Append("../../../foo"); |
| EXPECT_EQ("/foo", test.Join()); |
| |
| test = current; |
| test.Append("../.."); |
| EXPECT_EQ(".", test.Join()); |
| |
| test = current; |
| test.Append("../../.."); |
| EXPECT_EQ("..", test.Join()); |
| |
| test = current; |
| test.Append("../../../foo"); |
| EXPECT_EQ("../foo", test.Join()); |
| |
| test = relative; |
| test.Append("../.."); |
| EXPECT_EQ(".", test.Join()); |
| |
| test = relative; |
| test.Append("../../.."); |
| EXPECT_EQ("..", test.Join()); |
| |
| test = relative; |
| test.Append("../../../foo"); |
| EXPECT_EQ("../foo", test.Join()); |
| } |
| |
| TEST(PathTest, Range) { |
| Path p("/an/absolute/path"); |
| |
| // p's parts should be ["/", "an", "absolute", "path"]. |
| EXPECT_EQ("/an/absolute/path", p.Range(0, 4)); |
| EXPECT_EQ("an/absolute/path", p.Range(1, 4)); |
| EXPECT_EQ("absolute/path", p.Range(2, 4)); |
| EXPECT_EQ("path", p.Range(3, 4)); |
| |
| EXPECT_EQ("/an/absolute", p.Range(0, 3)); |
| EXPECT_EQ("an/absolute", p.Range(1, 3)); |
| EXPECT_EQ("absolute", p.Range(2, 3)); |
| } |
| |