Roll src/third_party/WebKit f298044:aa8346d (svn 202628:202629)
[chromium-blink-merge.git] / content / browser / fileapi / file_system_url_unittest.cc
blobe4dd5e2b3f565a1b434d4e3d02ca88a5c311c3c2
1 // Copyright 2014 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 "storage/browser/fileapi/file_system_url.h"
7 #include "base/files/file_path.h"
8 #include "storage/common/fileapi/file_system_types.h"
9 #include "storage/common/fileapi/file_system_util.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "url/gurl.h"
13 #define FPL FILE_PATH_LITERAL
15 #if defined(FILE_PATH_USES_DRIVE_LETTERS)
16 #define DRIVE FPL("C:")
17 #else
18 #define DRIVE FPL("/a/")
19 #endif
21 using storage::FileSystemURL;
22 using storage::kFileSystemTypeExternal;
23 using storage::kFileSystemTypeIsolated;
24 using storage::kFileSystemTypePersistent;
25 using storage::kFileSystemTypeTemporary;
26 using storage::VirtualPath;
28 namespace content {
30 namespace {
32 FileSystemURL CreateFileSystemURL(const std::string& url_string) {
33 FileSystemURL url = FileSystemURL::CreateForTest(GURL(url_string));
34 EXPECT_TRUE(url.type() != kFileSystemTypeExternal &&
35 url.type() != kFileSystemTypeIsolated);
36 return url;
39 std::string NormalizedUTF8Path(const base::FilePath& path) {
40 return path.NormalizePathSeparators().AsUTF8Unsafe();
43 } // namespace
45 TEST(FileSystemURLTest, ParsePersistent) {
46 FileSystemURL url = CreateFileSystemURL(
47 "filesystem:http://chromium.org/persistent/directory/file");
48 ASSERT_TRUE(url.is_valid());
49 EXPECT_EQ("http://chromium.org/", url.origin().spec());
50 EXPECT_EQ(kFileSystemTypePersistent, url.type());
51 EXPECT_EQ(FPL("file"), VirtualPath::BaseName(url.path()).value());
52 EXPECT_EQ(FPL("directory"), url.path().DirName().value());
55 TEST(FileSystemURLTest, ParseTemporary) {
56 FileSystemURL url = CreateFileSystemURL(
57 "filesystem:http://chromium.org/temporary/directory/file");
58 ASSERT_TRUE(url.is_valid());
59 EXPECT_EQ("http://chromium.org/", url.origin().spec());
60 EXPECT_EQ(kFileSystemTypeTemporary, url.type());
61 EXPECT_EQ(FPL("file"), VirtualPath::BaseName(url.path()).value());
62 EXPECT_EQ(FPL("directory"), url.path().DirName().value());
65 TEST(FileSystemURLTest, EnsureFilePathIsRelative) {
66 FileSystemURL url = CreateFileSystemURL(
67 "filesystem:http://chromium.org/temporary/////directory/file");
68 ASSERT_TRUE(url.is_valid());
69 EXPECT_EQ("http://chromium.org/", url.origin().spec());
70 EXPECT_EQ(kFileSystemTypeTemporary, url.type());
71 EXPECT_EQ(FPL("file"), VirtualPath::BaseName(url.path()).value());
72 EXPECT_EQ(FPL("directory"), url.path().DirName().value());
73 EXPECT_FALSE(url.path().IsAbsolute());
76 TEST(FileSystemURLTest, RejectBadSchemes) {
77 EXPECT_FALSE(CreateFileSystemURL("http://chromium.org/").is_valid());
78 EXPECT_FALSE(CreateFileSystemURL("https://chromium.org/").is_valid());
79 EXPECT_FALSE(CreateFileSystemURL("file:///foo/bar").is_valid());
80 EXPECT_FALSE(CreateFileSystemURL("foobar:///foo/bar").is_valid());
83 TEST(FileSystemURLTest, UnescapePath) {
84 FileSystemURL url = CreateFileSystemURL(
85 "filesystem:http://chromium.org/persistent/%7Echromium/space%20bar");
86 ASSERT_TRUE(url.is_valid());
87 EXPECT_EQ(FPL("space bar"), VirtualPath::BaseName(url.path()).value());
88 EXPECT_EQ(FPL("~chromium"), url.path().DirName().value());
91 TEST(FileSystemURLTest, RejectBadType) {
92 EXPECT_FALSE(CreateFileSystemURL(
93 "filesystem:http://c.org/foobar/file").is_valid());
94 EXPECT_FALSE(CreateFileSystemURL(
95 "filesystem:http://c.org/temporaryfoo/file").is_valid());
98 TEST(FileSystemURLTest, RejectMalformedURL) {
99 EXPECT_FALSE(CreateFileSystemURL("filesystem:///foobar/file").is_valid());
100 EXPECT_FALSE(CreateFileSystemURL("filesystem:foobar/file").is_valid());
103 TEST(FileSystemURLTest, CompareURLs) {
104 const GURL urls[] = {
105 GURL("filesystem:http://chromium.org/temporary/dir a/file a"),
106 GURL("filesystem:http://chromium.org/temporary/dir a/file a"),
107 GURL("filesystem:http://chromium.org/temporary/dir a/file b"),
108 GURL("filesystem:http://chromium.org/temporary/dir a/file aa"),
109 GURL("filesystem:http://chromium.org/temporary/dir b/file a"),
110 GURL("filesystem:http://chromium.org/temporary/dir aa/file b"),
111 GURL("filesystem:http://chromium.com/temporary/dir a/file a"),
112 GURL("filesystem:https://chromium.org/temporary/dir a/file a")
115 FileSystemURL::Comparator compare;
116 for (size_t i = 0; i < arraysize(urls); ++i) {
117 for (size_t j = 0; j < arraysize(urls); ++j) {
118 SCOPED_TRACE(testing::Message() << i << " < " << j);
119 EXPECT_EQ(urls[i] < urls[j],
120 compare(FileSystemURL::CreateForTest(urls[i]),
121 FileSystemURL::CreateForTest(urls[j])));
125 const FileSystemURL a = CreateFileSystemURL(
126 "filesystem:http://chromium.org/temporary/dir a/file a");
127 const FileSystemURL b = CreateFileSystemURL(
128 "filesystem:http://chromium.org/persistent/dir a/file a");
129 EXPECT_EQ(a.type() < b.type(), compare(a, b));
130 EXPECT_EQ(b.type() < a.type(), compare(b, a));
133 TEST(FileSystemURLTest, IsParent) {
134 const std::string root1 = GetFileSystemRootURI(
135 GURL("http://example.com"), kFileSystemTypeTemporary).spec();
136 const std::string root2 = GetFileSystemRootURI(
137 GURL("http://example.com"), kFileSystemTypePersistent).spec();
138 const std::string root3 = GetFileSystemRootURI(
139 GURL("http://chromium.org"), kFileSystemTypeTemporary).spec();
141 const std::string parent("dir");
142 const std::string child("dir/child");
143 const std::string other("other");
145 // True cases.
146 EXPECT_TRUE(CreateFileSystemURL(root1 + parent).IsParent(
147 CreateFileSystemURL(root1 + child)));
148 EXPECT_TRUE(CreateFileSystemURL(root2 + parent).IsParent(
149 CreateFileSystemURL(root2 + child)));
151 // False cases: the path is not a child.
152 EXPECT_FALSE(CreateFileSystemURL(root1 + parent).IsParent(
153 CreateFileSystemURL(root1 + other)));
154 EXPECT_FALSE(CreateFileSystemURL(root1 + parent).IsParent(
155 CreateFileSystemURL(root1 + parent)));
156 EXPECT_FALSE(CreateFileSystemURL(root1 + child).IsParent(
157 CreateFileSystemURL(root1 + parent)));
159 // False case: different types.
160 EXPECT_FALSE(CreateFileSystemURL(root1 + parent).IsParent(
161 CreateFileSystemURL(root2 + child)));
163 // False case: different origins.
164 EXPECT_FALSE(CreateFileSystemURL(root1 + parent).IsParent(
165 CreateFileSystemURL(root3 + child)));
168 TEST(FileSystemURLTest, ToGURL) {
169 EXPECT_TRUE(FileSystemURL().ToGURL().is_empty());
170 const char* kTestURL[] = {
171 "filesystem:http://chromium.org/persistent/directory/file0",
172 "filesystem:http://chromium.org/temporary/directory/file1",
173 "filesystem:http://chromium.org/isolated/directory/file2",
174 "filesystem:http://chromium.org/external/directory/file2",
175 "filesystem:http://chromium.org/test/directory/file3",
176 "filesystem:http://chromium.org/test/plus%2B/space%20/colon%3A",
179 for (size_t i = 0; i < arraysize(kTestURL); ++i) {
180 EXPECT_EQ(
181 kTestURL[i],
182 FileSystemURL::CreateForTest(GURL(kTestURL[i])).ToGURL().spec());
186 TEST(FileSystemURLTest, DebugString) {
187 const GURL kOrigin("http://example.com");
188 const base::FilePath kPath(FPL("dir/file"));
190 const FileSystemURL kURL1 = FileSystemURL::CreateForTest(
191 kOrigin, kFileSystemTypeTemporary, kPath);
192 EXPECT_EQ("filesystem:http://example.com/temporary/" +
193 NormalizedUTF8Path(kPath),
194 kURL1.DebugString());
197 TEST(FileSystemURLTest, IsInSameFileSystem) {
198 FileSystemURL url_foo_temp_a = FileSystemURL::CreateForTest(
199 GURL("http://foo"), kFileSystemTypeTemporary,
200 base::FilePath::FromUTF8Unsafe("a"));
201 FileSystemURL url_foo_temp_b = FileSystemURL::CreateForTest(
202 GURL("http://foo"), kFileSystemTypeTemporary,
203 base::FilePath::FromUTF8Unsafe("b"));
204 FileSystemURL url_foo_perm_a = FileSystemURL::CreateForTest(
205 GURL("http://foo"), kFileSystemTypePersistent,
206 base::FilePath::FromUTF8Unsafe("a"));
207 FileSystemURL url_bar_temp_a = FileSystemURL::CreateForTest(
208 GURL("http://bar"), kFileSystemTypeTemporary,
209 base::FilePath::FromUTF8Unsafe("a"));
210 FileSystemURL url_bar_perm_a = FileSystemURL::CreateForTest(
211 GURL("http://bar"), kFileSystemTypePersistent,
212 base::FilePath::FromUTF8Unsafe("a"));
214 EXPECT_TRUE(url_foo_temp_a.IsInSameFileSystem(url_foo_temp_a));
215 EXPECT_TRUE(url_foo_temp_a.IsInSameFileSystem(url_foo_temp_b));
216 EXPECT_FALSE(url_foo_temp_a.IsInSameFileSystem(url_foo_perm_a));
217 EXPECT_FALSE(url_foo_temp_a.IsInSameFileSystem(url_bar_temp_a));
218 EXPECT_FALSE(url_foo_temp_a.IsInSameFileSystem(url_bar_perm_a));
221 } // namespace content