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. 4 5 #include "storage/browser/fileapi/file_system_url.h" 6 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" 12 13 #define FPL FILE_PATH_LITERAL 14 15 #if defined(FILE_PATH_USES_DRIVE_LETTERS) 16 #define DRIVE FPL("C:") 17 #else 18 #define DRIVE FPL("/a/") 19 #endif 20 21 using storage::FileSystemURL; 22 using storage::kFileSystemTypeExternal; 23 using storage::kFileSystemTypeIsolated; 24 using storage::kFileSystemTypePersistent; 25 using storage::kFileSystemTypeTemporary; 26 using storage::VirtualPath; 27 28 namespace content { 29 30 namespace { 31 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; 37 } 38 39 std::string NormalizedUTF8Path(const base::FilePath& path) { 40 return path.NormalizePathSeparators().AsUTF8Unsafe(); 41 } 42 43 } // namespace 44 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()); 53 } 54 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()); 63 } 64 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()); 74 } 75 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()); 81 } 82 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()); 89 } 90 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()); 96 } 97 98 TEST(FileSystemURLTest, RejectMalformedURL) { 99 EXPECT_FALSE(CreateFileSystemURL("filesystem:///foobar/file").is_valid()); 100 EXPECT_FALSE(CreateFileSystemURL("filesystem:foobar/file").is_valid()); 101 } 102 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") 113 }; 114 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]))); 122 } 123 } 124 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)); 131 } 132 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(); 140 141 const std::string parent("dir"); 142 const std::string child("dir/child"); 143 const std::string other("other"); 144 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))); 150 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))); 158 159 // False case: different types. 160 EXPECT_FALSE(CreateFileSystemURL(root1 + parent).IsParent( 161 CreateFileSystemURL(root2 + child))); 162 163 // False case: different origins. 164 EXPECT_FALSE(CreateFileSystemURL(root1 + parent).IsParent( 165 CreateFileSystemURL(root3 + child))); 166 } 167 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", 177 }; 178 179 for (size_t i = 0; i < arraysize(kTestURL); ++i) { 180 EXPECT_EQ( 181 kTestURL[i], 182 FileSystemURL::CreateForTest(GURL(kTestURL[i])).ToGURL().spec()); 183 } 184 } 185 186 TEST(FileSystemURLTest, DebugString) { 187 const GURL kOrigin("http://example.com"); 188 const base::FilePath kPath(FPL("dir/file")); 189 190 const FileSystemURL kURL1 = FileSystemURL::CreateForTest( 191 kOrigin, kFileSystemTypeTemporary, kPath); 192 EXPECT_EQ("filesystem:http://example.com/temporary/" + 193 NormalizedUTF8Path(kPath), 194 kURL1.DebugString()); 195 } 196 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")); 213 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)); 219 } 220 221 } // namespace content 222