1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <fcntl.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gtest/gtest.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "nacl_io/kernel_proxy.h"
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "nacl_io/path.h"
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing namespace nacl_io;
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PathTest, SanityChecks) {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // can we construct and delete?
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path ph1(".");
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path *ph2 = new Path(".");
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete ph2;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path p1(".");
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(p1.IsAbsolute());
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(".", p1.Join());
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path p2("/");
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(p2.IsAbsolute());
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/", p2.Join());
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PathTest, Assignment) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path empty;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path dot(".");
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path root("/");
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path abs_str("/abs/from/string");
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path rel_str("rel/from/string");
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path self_str("./rel/from/string");
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, empty.Size());
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(empty.IsAbsolute());
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("", empty.Join());
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, dot.Size());
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dot.IsAbsolute());
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(".", dot.Join());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, root.Size());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(root.IsAbsolute());
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("/", root.Join());
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, abs_str.Size());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(abs_str.IsAbsolute());
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("/abs/from/string", abs_str.Join());
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, rel_str.Size());
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rel_str.IsAbsolute());
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("rel/from/string", rel_str.Join());
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, self_str.Size());
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(self_str.IsAbsolute());
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("rel/from/string", self_str.Join());
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  empty = "";
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dot = ".";
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root = "/";
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  abs_str = "/abs/from/assign";
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rel_str = "rel/from/assign";
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  self_str = "./rel/from/assign";
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, empty.Size());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(empty.IsAbsolute());
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(".", empty.Join());
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, dot.Size());
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dot.IsAbsolute());
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(".", dot.Join());
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, root.Size());
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(root.IsAbsolute());
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("/", root.Join());
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, abs_str.Size());
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(abs_str.IsAbsolute());
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("/abs/from/assign", abs_str.Join());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, rel_str.Size());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(rel_str.IsAbsolute());
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("rel/from/assign", rel_str.Join());
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, self_str.Size());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(self_str.IsAbsolute());
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("rel/from/assign", self_str.Join());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path cpy_str;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cpy_str = empty;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, cpy_str.Size());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cpy_str.IsAbsolute());
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(".", cpy_str.Join());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cpy_str = dot;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, cpy_str.Size());
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cpy_str.IsAbsolute());
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(".", cpy_str.Join());
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cpy_str = root;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, cpy_str.Size());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cpy_str.IsAbsolute());
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("/", cpy_str.Join());
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cpy_str = abs_str;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, cpy_str.Size());
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cpy_str.IsAbsolute());
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("/abs/from/assign", cpy_str.Join());
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cpy_str = rel_str;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, cpy_str.Size());
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cpy_str.IsAbsolute());
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("rel/from/assign", cpy_str.Join());
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cpy_str = self_str;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, cpy_str.Size());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cpy_str.IsAbsolute());
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("rel/from/assign", cpy_str.Join());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PathTest, Collapse) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringArray_t path_components;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path p1("/simple/splitter/test");
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path_components = p1.Split();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/", path_components[0]);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/", p1.Part(0));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("simple", path_components[1]);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("simple", p1.Part(1));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("splitter",path_components[2]);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("splitter",p1.Part(2));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("test", path_components[3]);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("test", p1.Part(3));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path p2("///simple//splitter///test/");
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path_components = p2.Split();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, static_cast<int>(path_components.size()));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, static_cast<int>(p2.Size()));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/", path_components[0]);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("simple", path_components[1]);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("splitter", path_components[2]);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("test", path_components[3]);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path p3("sim/ple//spli/tter/te/st/");
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path_components = p3.Split();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(6, static_cast<int>(path_components.size()));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(p3.IsAbsolute());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("sim", path_components[0]);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("ple", path_components[1]);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("spli", path_components[2]);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("tter", path_components[3]);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("te", path_components[4]);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("st", path_components[5]);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path p4("");
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path_components = p4.Split();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, static_cast<int>(path_components.size()));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path p5("/");
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path_components = p5.Split();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, static_cast<int>(path_components.size()));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PathTest, AppendAndJoin) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path ph1("/usr/local/hi/there");
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/usr/local/hi/there", ph1.Join());
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ph1 = ph1.Append("..");
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/usr/local/hi", ph1.Join());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ph1 = ph1.Append(".././././hi/there/../.././././");
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/usr/local", ph1.Join());
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ph1 = ph1.Append("../../../../../../../../././../");
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/", ph1.Join());
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ph1 = ph1.Append("usr/lib/../bin/.././etc/../local/../share");
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/usr/share", ph1.Join());
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path ph2("./");
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(".", ph2.Join());
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path ph3("/");
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/", ph3.Join());
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ph3 = ph3.Append("");
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/", ph3.Join());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ph3 = ph3.Append("USR/local/SHARE");
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/USR/local/SHARE", ph3.Join());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ph3 = ph3.Append("///////////////////////////////");
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/USR/local/SHARE", ph3.Join());
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path ph4("..");
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("..", ph4.Join());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ph4 = ph4.Append("/node1/node3/../../node1/./");
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("../node1", ph4.Join());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ph4 = ph4.Append("node4/../../node1/./node5");
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("../node1/node5", ph4.Join());
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PathTest, Invalid) {
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Path absolute("/usr/local");
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path current("./usr/local");
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path relative("usr/local");
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Path test;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  test = absolute;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test.Append("../..");
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/", test.Join());
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  test = absolute;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test.Append("../../..");
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/", test.Join());
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  test = absolute;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test.Append("../../../foo");
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/foo", test.Join());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test = current;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test.Append("../..");
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(".", test.Join());
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test = current;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test.Append("../../..");
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("..", test.Join());
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test = current;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test.Append("../../../foo");
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("../foo", test.Join());
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test = relative;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test.Append("../..");
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(".", test.Join());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test = relative;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test.Append("../../..");
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("..", test.Join());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test = relative;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test.Append("../../../foo");
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("../foo", test.Join());
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(PathTest, Range) {
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Path p("/an/absolute/path");
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // p's parts should be ["/", "an", "absolute", "path"].
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("/an/absolute/path", p.Range(0, 4));
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("an/absolute/path", p.Range(1, 4));
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("absolute/path", p.Range(2, 4));
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("path", p.Range(3, 4));
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("/an/absolute", p.Range(0, 3));
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("an/absolute", p.Range(1, 3));
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("absolute", p.Range(2, 3));
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST(PathTest, PrependRelative) {
262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Path p("foo/bar");
263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  p.Prepend("prefix");
264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("prefix/foo/bar", p.Join());
265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST(PathTest, PrependAbsolute) {
268f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Path p("/foo/bar");
269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  p.Prepend("/prefix");
270f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("/prefix/foo/bar", p.Join());
271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
272