blob: 29dce11359f373e1220fd9e70edd58359d0138b7 [file] [log] [blame]
// 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));
}