1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "webkit/browser/fileapi/file_system_url.h"
7 #include "base/files/file_path.h"
8 #include "testing/gtest/include/gtest/gtest.h"
10 #include "webkit/common/fileapi/file_system_types.h"
11 #include "webkit/common/fileapi/file_system_util.h"
13 #define FPL FILE_PATH_LITERAL
15 #if defined(FILE_PATH_USES_DRIVE_LETTERS)
16 #define DRIVE FPL("C:")
18 #define DRIVE FPL("/a/")
25 FileSystemURL CreateFileSystemURL(const std::string& url_string) {
26 FileSystemURL url = FileSystemURL::CreateForTest(GURL(url_string));
27 EXPECT_TRUE(url.type() != kFileSystemTypeExternal &&
28 url.type() != kFileSystemTypeIsolated);
32 std::string NormalizedUTF8Path(const base::FilePath& path) {
33 return path.NormalizePathSeparators().AsUTF8Unsafe();
38 TEST(FileSystemURLTest, ParsePersistent) {
39 FileSystemURL url = CreateFileSystemURL(
40 "filesystem:http://chromium.org/persistent/directory/file");
41 ASSERT_TRUE(url.is_valid());
42 EXPECT_EQ("http://chromium.org/", url.origin().spec());
43 EXPECT_EQ(kFileSystemTypePersistent, url.type());
44 EXPECT_EQ(FPL("file"), VirtualPath::BaseName(url.path()).value());
45 EXPECT_EQ(FPL("directory"), url.path().DirName().value());
48 TEST(FileSystemURLTest, ParseTemporary) {
49 FileSystemURL url = CreateFileSystemURL(
50 "filesystem:http://chromium.org/temporary/directory/file");
51 ASSERT_TRUE(url.is_valid());
52 EXPECT_EQ("http://chromium.org/", url.origin().spec());
53 EXPECT_EQ(kFileSystemTypeTemporary, url.type());
54 EXPECT_EQ(FPL("file"), VirtualPath::BaseName(url.path()).value());
55 EXPECT_EQ(FPL("directory"), url.path().DirName().value());
58 TEST(FileSystemURLTest, EnsureFilePathIsRelative) {
59 FileSystemURL url = CreateFileSystemURL(
60 "filesystem:http://chromium.org/temporary/////directory/file");
61 ASSERT_TRUE(url.is_valid());
62 EXPECT_EQ("http://chromium.org/", url.origin().spec());
63 EXPECT_EQ(kFileSystemTypeTemporary, url.type());
64 EXPECT_EQ(FPL("file"), VirtualPath::BaseName(url.path()).value());
65 EXPECT_EQ(FPL("directory"), url.path().DirName().value());
66 EXPECT_FALSE(url.path().IsAbsolute());
69 TEST(FileSystemURLTest, RejectBadSchemes) {
70 EXPECT_FALSE(CreateFileSystemURL("http://chromium.org/").is_valid());
71 EXPECT_FALSE(CreateFileSystemURL("https://chromium.org/").is_valid());
72 EXPECT_FALSE(CreateFileSystemURL("file:///foo/bar").is_valid());
73 EXPECT_FALSE(CreateFileSystemURL("foobar:///foo/bar").is_valid());
76 TEST(FileSystemURLTest, UnescapePath) {
77 FileSystemURL url = CreateFileSystemURL(
78 "filesystem:http://chromium.org/persistent/%7Echromium/space%20bar");
79 ASSERT_TRUE(url.is_valid());
80 EXPECT_EQ(FPL("space bar"), VirtualPath::BaseName(url.path()).value());
81 EXPECT_EQ(FPL("~chromium"), url.path().DirName().value());
84 TEST(FileSystemURLTest, RejectBadType) {
85 EXPECT_FALSE(CreateFileSystemURL(
86 "filesystem:http://c.org/foobar/file").is_valid());
87 EXPECT_FALSE(CreateFileSystemURL(
88 "filesystem:http://c.org/temporaryfoo/file").is_valid());
91 TEST(FileSystemURLTest, RejectMalformedURL) {
92 EXPECT_FALSE(CreateFileSystemURL("filesystem:///foobar/file").is_valid());
93 EXPECT_FALSE(CreateFileSystemURL("filesystem:foobar/file").is_valid());
96 TEST(FileSystemURLTest, CompareURLs) {
98 GURL("filesystem:http://chromium.org/temporary/dir a/file a"),
99 GURL("filesystem:http://chromium.org/temporary/dir a/file a"),
100 GURL("filesystem:http://chromium.org/temporary/dir a/file b"),
101 GURL("filesystem:http://chromium.org/temporary/dir a/file aa"),
102 GURL("filesystem:http://chromium.org/temporary/dir b/file a"),
103 GURL("filesystem:http://chromium.org/temporary/dir aa/file b"),
104 GURL("filesystem:http://chromium.com/temporary/dir a/file a"),
105 GURL("filesystem:https://chromium.org/temporary/dir a/file a")
108 FileSystemURL::Comparator compare;
109 for (size_t i = 0; i < arraysize(urls); ++i) {
110 for (size_t j = 0; j < arraysize(urls); ++j) {
111 SCOPED_TRACE(testing::Message() << i << " < " << j);
112 EXPECT_EQ(urls[i] < urls[j],
113 compare(FileSystemURL::CreateForTest(urls[i]),
114 FileSystemURL::CreateForTest(urls[j])));
118 const FileSystemURL a = CreateFileSystemURL(
119 "filesystem:http://chromium.org/temporary/dir a/file a");
120 const FileSystemURL b = CreateFileSystemURL(
121 "filesystem:http://chromium.org/persistent/dir a/file a");
122 EXPECT_EQ(a.type() < b.type(), compare(a, b));
123 EXPECT_EQ(b.type() < a.type(), compare(b, a));
126 TEST(FileSystemURLTest, IsParent) {
127 const std::string root1 = GetFileSystemRootURI(
128 GURL("http://example.com"), kFileSystemTypeTemporary).spec();
129 const std::string root2 = GetFileSystemRootURI(
130 GURL("http://example.com"), kFileSystemTypePersistent).spec();
131 const std::string root3 = GetFileSystemRootURI(
132 GURL("http://chromium.org"), kFileSystemTypeTemporary).spec();
134 const std::string parent("dir");
135 const std::string child("dir/child");
136 const std::string other("other");
139 EXPECT_TRUE(CreateFileSystemURL(root1 + parent).IsParent(
140 CreateFileSystemURL(root1 + child)));
141 EXPECT_TRUE(CreateFileSystemURL(root2 + parent).IsParent(
142 CreateFileSystemURL(root2 + child)));
144 // False cases: the path is not a child.
145 EXPECT_FALSE(CreateFileSystemURL(root1 + parent).IsParent(
146 CreateFileSystemURL(root1 + other)));
147 EXPECT_FALSE(CreateFileSystemURL(root1 + parent).IsParent(
148 CreateFileSystemURL(root1 + parent)));
149 EXPECT_FALSE(CreateFileSystemURL(root1 + child).IsParent(
150 CreateFileSystemURL(root1 + parent)));
152 // False case: different types.
153 EXPECT_FALSE(CreateFileSystemURL(root1 + parent).IsParent(
154 CreateFileSystemURL(root2 + child)));
156 // False case: different origins.
157 EXPECT_FALSE(CreateFileSystemURL(root1 + parent).IsParent(
158 CreateFileSystemURL(root3 + child)));
161 TEST(FileSystemURLTest, ToGURL) {
162 EXPECT_TRUE(FileSystemURL().ToGURL().is_empty());
163 const char* kTestURL[] = {
164 "filesystem:http://chromium.org/persistent/directory/file0",
165 "filesystem:http://chromium.org/temporary/directory/file1",
166 "filesystem:http://chromium.org/isolated/directory/file2",
167 "filesystem:http://chromium.org/external/directory/file2",
168 "filesystem:http://chromium.org/test/directory/file3",
171 for (size_t i = 0; i < arraysize(kTestURL); ++i) {
174 FileSystemURL::CreateForTest(GURL(kTestURL[i])).ToGURL().spec());
178 TEST(FileSystemURLTest, DebugString) {
179 const GURL kOrigin("http://example.com");
180 const base::FilePath kPath(FPL("dir/file"));
182 const FileSystemURL kURL1 = FileSystemURL::CreateForTest(
183 kOrigin, kFileSystemTypeTemporary, kPath);
184 EXPECT_EQ("filesystem:http://example.com/temporary/" +
185 NormalizedUTF8Path(kPath),
186 kURL1.DebugString());
189 TEST(FileSystemURLTest, IsInSameFileSystem) {
190 FileSystemURL url_foo_temp_a = FileSystemURL::CreateForTest(
191 GURL("http://foo"), kFileSystemTypeTemporary,
192 base::FilePath::FromUTF8Unsafe("a"));
193 FileSystemURL url_foo_temp_b = FileSystemURL::CreateForTest(
194 GURL("http://foo"), kFileSystemTypeTemporary,
195 base::FilePath::FromUTF8Unsafe("b"));
196 FileSystemURL url_foo_perm_a = FileSystemURL::CreateForTest(
197 GURL("http://foo"), kFileSystemTypePersistent,
198 base::FilePath::FromUTF8Unsafe("a"));
199 FileSystemURL url_bar_temp_a = FileSystemURL::CreateForTest(
200 GURL("http://bar"), kFileSystemTypeTemporary,
201 base::FilePath::FromUTF8Unsafe("a"));
202 FileSystemURL url_bar_perm_a = FileSystemURL::CreateForTest(
203 GURL("http://bar"), kFileSystemTypePersistent,
204 base::FilePath::FromUTF8Unsafe("a"));
206 EXPECT_TRUE(url_foo_temp_a.IsInSameFileSystem(url_foo_temp_a));
207 EXPECT_TRUE(url_foo_temp_a.IsInSameFileSystem(url_foo_temp_b));
208 EXPECT_FALSE(url_foo_temp_a.IsInSameFileSystem(url_foo_perm_a));
209 EXPECT_FALSE(url_foo_temp_a.IsInSameFileSystem(url_bar_temp_a));
210 EXPECT_FALSE(url_foo_temp_a.IsInSameFileSystem(url_bar_perm_a));
213 } // namespace fileapi