| // 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(file_util::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(file_util::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)); |
| } |