blob: 33cde7bf337476ba8cadd862f89cce12f0795c02 [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/files/file_path.h"
#include <stddef.h>
#include <sstream>
#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"
// This macro helps avoid wrapped lines in the test structs.
#define FPL(x) PA_FILE_PATH_LITERAL(x)
// This macro constructs strings which can contain NULs.
#define FPS(x) FilePath::StringType(FPL(x), std::size(FPL(x)) - 1)
namespace partition_alloc::internal::base {
struct UnaryTestData {
FilePath::StringType input;
FilePath::StringType expected;
};
struct UnaryBooleanTestData {
FilePath::StringType input;
bool expected;
};
struct BinaryTestData {
FilePath::StringType inputs[2];
FilePath::StringType expected;
};
struct BinaryBooleanTestData {
FilePath::StringType inputs[2];
bool expected;
};
struct BinaryIntTestData {
FilePath::StringType inputs[2];
int expected;
};
TEST(PartitionAllocBaseFilePathTest, Append) {
const struct BinaryTestData cases[] = {
{{FPL(""), FPL("cc")}, FPL("cc")},
{{FPL("."), FPL("ff")}, FPL("ff")},
{{FPL("."), FPL("")}, FPL(".")},
{{FPL("/"), FPL("cc")}, FPL("/cc")},
{{FPL("/aa"), FPL("")}, FPL("/aa")},
{{FPL("/aa/"), FPL("")}, FPL("/aa")},
{{FPL("//aa"), FPL("")}, FPL("//aa")},
{{FPL("//aa/"), FPL("")}, FPL("//aa")},
{{FPL("//"), FPL("aa")}, FPL("//aa")},
#if defined(PA_FILE_PATH_USES_DRIVE_LETTERS)
{{FPL("c:"), FPL("a")}, FPL("c:a")},
{{FPL("c:"), FPL("")}, FPL("c:")},
{{FPL("c:/"), FPL("a")}, FPL("c:/a")},
{{FPL("c://"), FPL("a")}, FPL("c://a")},
{{FPL("c:///"), FPL("a")}, FPL("c:/a")},
#endif // PA_FILE_PATH_USES_DRIVE_LETTERS
#if defined(PA_FILE_PATH_USES_WIN_SEPARATORS)
// Append introduces the default separator character, so these test cases
// need to be defined with different expected results on platforms that use
// different default separator characters.
{{FPL("\\"), FPL("cc")}, FPL("\\cc")},
{{FPL("\\aa"), FPL("")}, FPL("\\aa")},
{{FPL("\\aa\\"), FPL("")}, FPL("\\aa")},
{{FPL("\\\\aa"), FPL("")}, FPL("\\\\aa")},
{{FPL("\\\\aa\\"), FPL("")}, FPL("\\\\aa")},
{{FPL("\\\\"), FPL("aa")}, FPL("\\\\aa")},
{{FPL("/aa/bb"), FPL("cc")}, FPL("/aa/bb\\cc")},
{{FPL("/aa/bb/"), FPL("cc")}, FPL("/aa/bb\\cc")},
{{FPL("aa/bb/"), FPL("cc")}, FPL("aa/bb\\cc")},
{{FPL("aa/bb"), FPL("cc")}, FPL("aa/bb\\cc")},
{{FPL("a/b"), FPL("c")}, FPL("a/b\\c")},
{{FPL("a/b/"), FPL("c")}, FPL("a/b\\c")},
{{FPL("//aa"), FPL("bb")}, FPL("//aa\\bb")},
{{FPL("//aa/"), FPL("bb")}, FPL("//aa\\bb")},
{{FPL("\\aa\\bb"), FPL("cc")}, FPL("\\aa\\bb\\cc")},
{{FPL("\\aa\\bb\\"), FPL("cc")}, FPL("\\aa\\bb\\cc")},
{{FPL("aa\\bb\\"), FPL("cc")}, FPL("aa\\bb\\cc")},
{{FPL("aa\\bb"), FPL("cc")}, FPL("aa\\bb\\cc")},
{{FPL("a\\b"), FPL("c")}, FPL("a\\b\\c")},
{{FPL("a\\b\\"), FPL("c")}, FPL("a\\b\\c")},
{{FPL("\\\\aa"), FPL("bb")}, FPL("\\\\aa\\bb")},
{{FPL("\\\\aa\\"), FPL("bb")}, FPL("\\\\aa\\bb")},
#if defined(PA_FILE_PATH_USES_DRIVE_LETTERS)
{{FPL("c:\\"), FPL("a")}, FPL("c:\\a")},
{{FPL("c:\\\\"), FPL("a")}, FPL("c:\\\\a")},
{{FPL("c:\\\\\\"), FPL("a")}, FPL("c:\\a")},
{{FPL("c:\\"), FPL("")}, FPL("c:\\")},
{{FPL("c:\\a"), FPL("b")}, FPL("c:\\a\\b")},
{{FPL("c:\\a\\"), FPL("b")}, FPL("c:\\a\\b")},
#endif // PA_FILE_PATH_USES_DRIVE_LETTERS
#else // PA_FILE_PATH_USES_WIN_SEPARATORS
{{FPL("/aa/bb"), FPL("cc")}, FPL("/aa/bb/cc")},
{{FPL("/aa/bb/"), FPL("cc")}, FPL("/aa/bb/cc")},
{{FPL("aa/bb/"), FPL("cc")}, FPL("aa/bb/cc")},
{{FPL("aa/bb"), FPL("cc")}, FPL("aa/bb/cc")},
{{FPL("a/b"), FPL("c")}, FPL("a/b/c")},
{{FPL("a/b/"), FPL("c")}, FPL("a/b/c")},
{{FPL("//aa"), FPL("bb")}, FPL("//aa/bb")},
{{FPL("//aa/"), FPL("bb")}, FPL("//aa/bb")},
#if defined(PA_FILE_PATH_USES_DRIVE_LETTERS)
{{FPL("c:/"), FPL("a")}, FPL("c:/a")},
{{FPL("c:/"), FPL("")}, FPL("c:/")},
{{FPL("c:/a"), FPL("b")}, FPL("c:/a/b")},
{{FPL("c:/a/"), FPL("b")}, FPL("c:/a/b")},
#endif // PA_FILE_PATH_USES_DRIVE_LETTERS
#endif // PA_FILE_PATH_USES_WIN_SEPARATORS
};
for (size_t i = 0; i < std::size(cases); ++i) {
FilePath root(cases[i].inputs[0]);
FilePath::StringType leaf(cases[i].inputs[1]);
FilePath observed_str = root.Append(leaf);
EXPECT_EQ(FilePath::StringType(cases[i].expected), observed_str.value())
<< "i: " << i << ", root: " << root.value() << ", leaf: " << leaf;
FilePath observed_path = root.Append(FilePath(leaf));
EXPECT_EQ(FilePath::StringType(cases[i].expected), observed_path.value())
<< "i: " << i << ", root: " << root.value() << ", leaf: " << leaf;
}
}
TEST(PartitionAllocBaseFilePathTest, ConstructWithNUL) {
// Assert FPS() works.
ASSERT_EQ(3U, FPS("a\0b").length());
// Test constructor strips '\0'
FilePath path(FPS("a\0b"));
EXPECT_EQ(1U, path.value().length());
EXPECT_EQ(FPL("a"), path.value());
}
TEST(PartitionAllocBaseFilePathTest, AppendWithNUL) {
// Assert FPS() works.
ASSERT_EQ(3U, FPS("b\0b").length());
// Test Append() strips '\0'
FilePath path(FPL("a"));
path = path.Append(FPS("b\0b"));
EXPECT_EQ(3U, path.value().length());
#if defined(PA_FILE_PATH_USES_WIN_SEPARATORS)
EXPECT_EQ(FPL("a\\b"), path.value());
#else
EXPECT_EQ(FPL("a/b"), path.value());
#endif
}
} // namespace partition_alloc::internal::base