// Copyright 2013 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 "extensions/common/file_util.h"
#include "base/basictypes.h"
#include "base/file_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
typedef testing::Test FileUtilTest;
TEST_F(FileUtilTest, ExtensionURLToRelativeFilePath) {
#define URL_PREFIX "chrome-extension://extension-id/"
struct TestCase {
const char* url;
const char* expected_relative_path;
} test_cases[] = {
{ URL_PREFIX "simple.html",
"simple.html" },
{ URL_PREFIX "directory/to/file.html",
"directory/to/file.html" },
{ URL_PREFIX "escape%20spaces.html",
"escape spaces.html" },
{ URL_PREFIX "%C3%9Cber.html",
"\xC3\x9C" "ber.html" },
#if defined(OS_WIN)
{ URL_PREFIX "C%3A/simple.html",
"" },
#endif
{ URL_PREFIX "////simple.html",
"simple.html" },
{ URL_PREFIX "/simple.html",
"simple.html" },
{ URL_PREFIX "\\simple.html",
"simple.html" },
{ URL_PREFIX "\\\\foo\\simple.html",
"foo/simple.html" },
};
#undef URL_PREFIX
for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
GURL url(test_cases[i].url);
base::FilePath expected_path =
base::FilePath::FromUTF8Unsafe(test_cases[i].expected_relative_path);
base::FilePath actual_path =
extensions::file_util::ExtensionURLToRelativeFilePath(url);
EXPECT_FALSE(actual_path.IsAbsolute()) <<
" For the path " << actual_path.value();
EXPECT_EQ(expected_path.value(), actual_path.value()) <<
" For the path " << url;
}
}
TEST_F(FileUtilTest, ExtensionResourceURLToFilePath) {
// Setup filesystem for testing.
base::FilePath root_path;
ASSERT_TRUE(base::CreateNewTempDirectory(
base::FilePath::StringType(), &root_path));
root_path = base::MakeAbsoluteFilePath(root_path);
ASSERT_FALSE(root_path.empty());
base::FilePath api_path = root_path.Append(FILE_PATH_LITERAL("apiname"));
ASSERT_TRUE(base::CreateDirectory(api_path));
const char data[] = "Test Data";
base::FilePath resource_path = api_path.Append(FILE_PATH_LITERAL("test.js"));
ASSERT_TRUE(file_util::WriteFile(resource_path, data, sizeof(data)));
resource_path = api_path.Append(FILE_PATH_LITERAL("escape spaces.js"));
ASSERT_TRUE(file_util::WriteFile(resource_path, data, sizeof(data)));
#ifdef FILE_PATH_USES_WIN_SEPARATORS
#define SEP "\\"
#else
#define SEP "/"
#endif
#define URL_PREFIX "chrome-extension-resource://"
struct TestCase {
const char* url;
const base::FilePath::CharType* expected_path;
} test_cases[] = {
{ URL_PREFIX "apiname/test.js",
FILE_PATH_LITERAL("test.js") },
{ URL_PREFIX "/apiname/test.js",
FILE_PATH_LITERAL("test.js") },
// Test % escape
{ URL_PREFIX "apiname/%74%65st.js",
FILE_PATH_LITERAL("test.js") },
{ URL_PREFIX "apiname/escape%20spaces.js",
FILE_PATH_LITERAL("escape spaces.js") },
// Test file does not exist.
{ URL_PREFIX "apiname/directory/to/file.js",
NULL },
// Test apiname/../../test.js
{ URL_PREFIX "apiname/../../test.js",
FILE_PATH_LITERAL("test.js") },
{ URL_PREFIX "apiname/..%2F../test.js",
NULL },
{ URL_PREFIX "apiname/f/../../../test.js",
FILE_PATH_LITERAL("test.js") },
{ URL_PREFIX "apiname/f%2F..%2F..%2F../test.js",
NULL },
};
#undef SEP
#undef URL_PREFIX
for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
GURL url(test_cases[i].url);
base::FilePath expected_path;
if (test_cases[i].expected_path)
expected_path = root_path.Append(FILE_PATH_LITERAL("apiname")).Append(
test_cases[i].expected_path);
base::FilePath actual_path =
extensions::file_util::ExtensionResourceURLToFilePath(url, root_path);
EXPECT_EQ(expected_path.value(), actual_path.value()) <<
" For the path " << url;
}
// Remove temp files.
ASSERT_TRUE(base::DeleteFile(root_path, true));
}