Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 | |
|
kinuko
2013/01/08 12:22:43
License comment?
It's great to have this test fil
tbarzic
2013/01/09 01:26:34
yeah, test files are always good, I even caught a
| |
| 2 #include "base/file_path.h" | |
| 3 #include "googleurl/src/url_util.h" | |
| 4 #include "testing/gtest/include/gtest/gtest.h" | |
| 5 #include "webkit/chromeos/fileapi/cros_mount_point_provider.h" | |
| 6 #include "webkit/fileapi/external_mount_points.h" | |
| 7 #include "webkit/fileapi/file_system_url.h" | |
| 8 #include "webkit/fileapi/isolated_context.h" | |
| 9 #include "webkit/quota/mock_special_storage_policy.h" | |
| 10 | |
| 11 #define FPL(x) FILE_PATH_LITERAL(x) | |
| 12 | |
| 13 #if defined(FILE_PATH_USES_DRIVE_LETTERS) | |
| 14 #define DRIVE FPL("C:") | |
| 15 #else | |
| 16 #define DRIVE | |
| 17 #endif | |
| 18 | |
| 19 namespace { | |
| 20 | |
| 21 FilePath GetFilePath(const std::string& path_str) { | |
| 22 return FilePath(DRIVE FPL(path_str)); | |
| 23 } | |
| 24 | |
| 25 fileapi::FileSystemURL CreateFileSystemURL(const std::string& extension, | |
| 26 const std::string& path) { | |
| 27 return fileapi::FileSystemURL(GURL("chrome-extension://" + extension + "/"), | |
| 28 fileapi::kFileSystemTypeNativeLocal, | |
| 29 GetFilePath(path)); | |
| 30 } | |
| 31 | |
| 32 bool VectorHasPath(const std::vector<FilePath>& path_vector, | |
| 33 const FilePath& path) { | |
| 34 for (size_t i = 0; i < path_vector.size(); ++i) { | |
| 35 if (path_vector[i] == path) { | |
| 36 return true; | |
| 37 } | |
| 38 } | |
| 39 return false; | |
| 40 } | |
| 41 | |
| 42 TEST(CrosMountPointProviderTest, DefaultMountPoints) { | |
| 43 scoped_refptr<quota::SpecialStoragePolicy> storage_policy = | |
| 44 new quota::MockSpecialStoragePolicy(); | |
| 45 scoped_refptr<fileapi::ExternalMountPoints> mount_points( | |
| 46 fileapi::ExternalMountPoints::CreateRefCounted()); | |
| 47 chromeos::CrosMountPointProvider provider( | |
| 48 storage_policy, | |
| 49 mount_points.get(), | |
| 50 fileapi::ExternalMountPoints::GetSystemInstance()); | |
| 51 // By default there should be 4 mount points. | |
| 52 std::vector<FilePath> root_dirs = provider.GetRootDirectories(true); | |
| 53 EXPECT_EQ(4u, root_dirs.size()); | |
| 54 EXPECT_TRUE(VectorHasPath(root_dirs, GetFilePath("/media/removable"))); | |
| 55 EXPECT_TRUE(VectorHasPath(root_dirs, GetFilePath("/media/archive"))); | |
| 56 EXPECT_TRUE(VectorHasPath(root_dirs, GetFilePath("/usr/share/oem"))); | |
| 57 // Fourth mount point is Downloads, but it's local path is device specific. | |
| 58 } | |
| 59 | |
| 60 TEST(CrosMountPointProviderTest, GetRootDirectories) { | |
| 61 scoped_refptr<quota::SpecialStoragePolicy> storage_policy = | |
| 62 new quota::MockSpecialStoragePolicy(); | |
| 63 scoped_refptr<fileapi::ExternalMountPoints> mount_points( | |
| 64 fileapi::ExternalMountPoints::CreateRefCounted()); | |
| 65 | |
| 66 scoped_refptr<fileapi::ExternalMountPoints> system_mount_points( | |
| 67 fileapi::ExternalMountPoints::CreateRefCounted()); | |
| 68 | |
| 69 chromeos::CrosMountPointProvider provider( | |
| 70 storage_policy, | |
| 71 mount_points.get(), | |
| 72 system_mount_points.get()); | |
| 73 | |
| 74 // Register 'local' test mount points. | |
| 75 mount_points->RegisterFileSystem("c", | |
| 76 fileapi::kFileSystemTypeNativeLocal, | |
| 77 GetFilePath("/a/b/c")); | |
| 78 mount_points->RegisterFileSystem("d", | |
| 79 fileapi::kFileSystemTypeNativeLocal, | |
| 80 GetFilePath("/b/c/d")); | |
| 81 | |
| 82 // Register system test mount points. | |
| 83 system_mount_points->RegisterFileSystem("d", | |
| 84 fileapi::kFileSystemTypeNativeLocal, | |
| 85 GetFilePath("/g/c/d")); | |
| 86 system_mount_points->RegisterFileSystem("e", | |
| 87 fileapi::kFileSystemTypeNativeLocal, | |
| 88 GetFilePath("/g/d/e")); | |
| 89 | |
| 90 std::vector<FilePath> root_dirs = | |
| 91 provider.GetRootDirectories(true /* include system points */); | |
| 92 EXPECT_EQ(4u, root_dirs.size()); | |
| 93 EXPECT_TRUE(VectorHasPath(root_dirs, GetFilePath("/a/b/c"))); | |
| 94 EXPECT_TRUE(VectorHasPath(root_dirs, GetFilePath("/b/c/d"))); | |
| 95 EXPECT_TRUE(VectorHasPath(root_dirs, GetFilePath("/g/c/d"))); | |
| 96 EXPECT_TRUE(VectorHasPath(root_dirs, GetFilePath("/g/d/e"))); | |
| 97 | |
| 98 root_dirs = provider.GetRootDirectories(false /* include system points */); | |
| 99 EXPECT_EQ(2u, root_dirs.size()); | |
| 100 EXPECT_TRUE(VectorHasPath(root_dirs, GetFilePath("/a/b/c"))); | |
| 101 EXPECT_TRUE(VectorHasPath(root_dirs, GetFilePath("/b/c/d"))); | |
| 102 } | |
| 103 | |
| 104 TEST(CrosMountPointProviderTest, MountPointsVisibility) { | |
| 105 scoped_refptr<quota::SpecialStoragePolicy> storage_policy = | |
| 106 new quota::MockSpecialStoragePolicy(); | |
| 107 scoped_refptr<fileapi::ExternalMountPoints> mount_points( | |
| 108 fileapi::ExternalMountPoints::CreateRefCounted()); | |
| 109 scoped_refptr<fileapi::ExternalMountPoints> sibling_mount_points( | |
| 110 fileapi::ExternalMountPoints::CreateRefCounted()); | |
| 111 | |
| 112 scoped_refptr<fileapi::ExternalMountPoints> system_mount_points( | |
| 113 fileapi::ExternalMountPoints::CreateRefCounted()); | |
| 114 | |
| 115 chromeos::CrosMountPointProvider provider( | |
| 116 storage_policy, | |
| 117 mount_points.get(), | |
| 118 system_mount_points.get()); | |
| 119 | |
| 120 // A provider that shares system_mount_points with |provider|. | |
| 121 chromeos::CrosMountPointProvider sibling_provider( | |
| 122 storage_policy, | |
| 123 sibling_mount_points.get(), | |
| 124 system_mount_points.get()); | |
| 125 | |
| 126 FilePath ignored; | |
| 127 | |
| 128 // Add mount point to the provider. | |
| 129 EXPECT_TRUE(provider.AddLocalMountPoint(GetFilePath("/a/b/c"))); | |
| 130 | |
| 131 EXPECT_TRUE(provider.HasMountPoint(GetFilePath("/a/b/c"))); | |
| 132 EXPECT_FALSE(sibling_provider.HasMountPoint(GetFilePath("/a/b/c"))); | |
| 133 EXPECT_TRUE(mount_points->GetRegisteredPath("c", &ignored)); | |
| 134 EXPECT_FALSE(system_mount_points->GetRegisteredPath("c", &ignored)); | |
| 135 | |
| 136 // Add mount point directly to |mount_points|. It should be seen by | |
| 137 // |provider|. | |
| 138 EXPECT_TRUE(mount_points->RegisterFileSystem( | |
| 139 "d", fileapi::kFileSystemTypeNativeLocal, GetFilePath("/b/c/d"))); | |
| 140 | |
| 141 EXPECT_TRUE(provider.HasMountPoint(GetFilePath("/b/c/d"))); | |
| 142 EXPECT_FALSE(sibling_provider.HasMountPoint(GetFilePath("/b/c/d"))); | |
| 143 | |
| 144 // Add mount point to system mount points. | |
| 145 EXPECT_TRUE(system_mount_points->RegisterFileSystem( | |
| 146 "e", fileapi::kFileSystemTypeNativeLocal, GetFilePath("/g/c/d/e"))); | |
| 147 | |
| 148 EXPECT_FALSE(provider.HasMountPoint(GetFilePath("/g/c/d/e"))); | |
| 149 EXPECT_FALSE(sibling_provider.HasMountPoint(GetFilePath("/g/c/d/e"))); | |
| 150 | |
| 151 // Can't remove system nount point. | |
| 152 provider.RemoveMountPoint(GetFilePath("/g/c/d/e")); | |
| 153 EXPECT_TRUE(system_mount_points->GetRegisteredPath("e", &ignored)); | |
| 154 | |
| 155 // Add a mount points whose paths overlap with the system one's. | |
| 156 // The same path | |
| 157 EXPECT_TRUE(provider.AddLocalMountPoint(GetFilePath("/g/c/d/e"))); | |
| 158 EXPECT_TRUE(provider.HasMountPoint(GetFilePath("/g/c/d/e"))); | |
| 159 provider.RemoveMountPoint(GetFilePath("/g/c/d/e")); | |
| 160 // Parent path. | |
| 161 EXPECT_TRUE(provider.AddLocalMountPoint(GetFilePath("/g"))); | |
| 162 EXPECT_TRUE(provider.HasMountPoint(GetFilePath("/g"))); | |
| 163 provider.RemoveMountPoint(GetFilePath("/g")); | |
| 164 // Child path. | |
| 165 EXPECT_TRUE(provider.AddLocalMountPoint(GetFilePath("/g/c/d/e/f/g"))); | |
| 166 EXPECT_TRUE(provider.HasMountPoint(GetFilePath("/g/c/d/e/f/g"))); | |
| 167 provider.RemoveMountPoint(GetFilePath("/g/c/d/e/f/g")); | |
| 168 | |
| 169 // Add mount point with the same name as a global one. Should succeed. | |
| 170 EXPECT_TRUE(provider.AddLocalMountPoint(GetFilePath("/d/e"))); | |
| 171 | |
| 172 EXPECT_TRUE(provider.HasMountPoint(GetFilePath("/d/e"))); | |
| 173 | |
| 174 // Remove system mount point with the same name as the added one. | |
| 175 // Should fail. | |
| 176 provider.RemoveMountPoint(GetFilePath("/g/c/d/e")); | |
| 177 | |
| 178 EXPECT_TRUE(provider.HasMountPoint(GetFilePath("/d/e"))); | |
| 179 EXPECT_TRUE(system_mount_points->GetRegisteredPath("e", &ignored)); | |
| 180 | |
| 181 // Remove mount point. | |
| 182 provider.RemoveMountPoint(GetFilePath("/d/e")); | |
| 183 | |
| 184 EXPECT_FALSE(provider.HasMountPoint(GetFilePath("/d/e"))); | |
| 185 } | |
| 186 | |
| 187 TEST(CrosMountPointProviderTest, AddMountPoint) { | |
| 188 scoped_refptr<quota::SpecialStoragePolicy> storage_policy = | |
| 189 new quota::MockSpecialStoragePolicy(); | |
| 190 scoped_refptr<fileapi::ExternalMountPoints> mount_points( | |
| 191 fileapi::ExternalMountPoints::CreateRefCounted()); | |
| 192 scoped_refptr<fileapi::ExternalMountPoints> ignored_mount_points( | |
| 193 fileapi::ExternalMountPoints::CreateRefCounted()); | |
| 194 chromeos::CrosMountPointProvider provider(storage_policy, | |
| 195 mount_points.get(), | |
| 196 ignored_mount_points); | |
| 197 | |
| 198 struct TestCase { | |
| 199 const char* const mount_point; | |
| 200 bool success; | |
| 201 bool should_exist_after_adding; | |
| 202 }; | |
| 203 | |
| 204 const TestCase kTestCases[] = { | |
| 205 // Valid mount point. | |
| 206 { "/foo/test", true, true }, | |
| 207 // Valid mount point with only one path component. | |
| 208 { "/bbb/", true, true }, | |
| 209 // Existing mount point path is substring of the mount points path. | |
| 210 { "/foo/test11", true, true }, | |
| 211 // Path substring of an existing path. | |
| 212 { "/foo/test1", true, true }, | |
| 213 // Empty mount point path. | |
| 214 { "", false, false }, | |
| 215 // Empty mount point name. | |
| 216 { "/", false, false }, | |
| 217 // References parent. | |
| 218 { "../foo/invalid", false, false }, | |
| 219 // Relative path. | |
| 220 { "foo/relative", false, false }, | |
| 221 // Existing mount point. | |
| 222 { "/foo/test", false, true }, | |
| 223 // Existing mount point with trailing /. | |
| 224 { "/foo/test/", false, false }, | |
| 225 // Mount point with the same name exists. | |
| 226 { "/foo/a/test", false, false }, | |
| 227 // Child of an existing mount point. | |
| 228 { "/foo/test/a", false, false }, | |
| 229 // Parent of an existing mount point. | |
| 230 { "/foo", false, false }, | |
| 231 // Bit bigger depth. | |
| 232 { "/foo/a/b/c/d/e/f/g", true, true }, | |
| 233 // Sibling mount point (with similar name) exists. | |
| 234 { "/foo/a/b/c/d/e/ff", true, true }, | |
| 235 // Lexicographically last among existing mount points. | |
| 236 { "/zzz/yyy", true, true }, | |
| 237 // Parent of the lexicographically last mount point. | |
| 238 { "/zzz/", false, false }, | |
| 239 // Child of the lexicographically last mount point. | |
| 240 { "/zzz/yyy/xxx", false, false }, | |
| 241 // Lexicographically first among existing mount points. | |
| 242 { "/a/b", true, true }, | |
| 243 // Parent of lexicographically first mount point. | |
| 244 { "/a", false, false }, | |
| 245 // Child of lexicographically last mount point. | |
| 246 { "/a/b/c", false, false }, | |
| 247 }; | |
| 248 | |
| 249 // Test adding mount points. | |
| 250 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) { | |
| 251 FilePath mount_point = GetFilePath(kTestCases[i].mount_point); | |
| 252 EXPECT_EQ(kTestCases[i].success, | |
| 253 provider.AddLocalMountPoint(mount_point)) | |
| 254 << "Adding mount point: " << kTestCases[i].mount_point; | |
| 255 } | |
| 256 | |
| 257 // Test that final mount point presence state is as expected. | |
| 258 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) { | |
| 259 FilePath mount_point = GetFilePath(kTestCases[i].mount_point); | |
| 260 EXPECT_EQ(kTestCases[i].should_exist_after_adding, | |
| 261 provider.HasMountPoint(mount_point)) | |
| 262 << "Has mount point: " << kTestCases[i].mount_point; | |
| 263 } | |
| 264 } | |
| 265 | |
| 266 TEST(CrosMountPointProviderTest, AccessPermissions) { | |
| 267 url_util::AddStandardScheme("chrome-extension"); | |
| 268 | |
| 269 scoped_refptr<quota::MockSpecialStoragePolicy> storage_policy = | |
| 270 new quota::MockSpecialStoragePolicy(); | |
| 271 scoped_refptr<fileapi::ExternalMountPoints> mount_points( | |
| 272 fileapi::ExternalMountPoints::CreateRefCounted()); | |
| 273 scoped_refptr<fileapi::ExternalMountPoints> system_mount_points( | |
| 274 fileapi::ExternalMountPoints::CreateRefCounted()); | |
| 275 chromeos::CrosMountPointProvider provider( | |
| 276 storage_policy, | |
| 277 mount_points.get(), | |
| 278 system_mount_points.get()); | |
| 279 | |
| 280 std::string extension("ddammdhioacbehjngdmkjcjbnfginlla"); | |
| 281 | |
| 282 storage_policy->AddFileHandler(extension); | |
| 283 | |
| 284 // Initialize mount points. | |
| 285 system_mount_points->RegisterFileSystem("system", | |
| 286 fileapi::kFileSystemTypeNativeLocal, | |
| 287 GetFilePath("/g/system")); | |
| 288 ASSERT_TRUE(provider.AddLocalMountPoint(GetFilePath("/media/removable"))); | |
| 289 ASSERT_TRUE(provider.AddRestrictedLocalMountPoint( | |
| 290 GetFilePath("/usr/share/oem"))); | |
| 291 | |
| 292 // Provider specific mount point access. | |
| 293 EXPECT_FALSE(provider.IsAccessAllowed(CreateFileSystemURL(extension, | |
| 294 "removable/foo"))); | |
| 295 | |
| 296 provider.GrantFileAccessToExtension(extension, GetFilePath("removable/foo")); | |
| 297 EXPECT_TRUE(provider.IsAccessAllowed(CreateFileSystemURL(extension, | |
| 298 "removable/foo"))); | |
| 299 EXPECT_FALSE(provider.IsAccessAllowed(CreateFileSystemURL(extension, | |
| 300 "removable/foo1"))); | |
| 301 | |
| 302 // System mount point access. | |
| 303 EXPECT_FALSE( | |
| 304 provider.IsAccessAllowed(CreateFileSystemURL(extension, "system/foo"))); | |
| 305 | |
| 306 provider.GrantFileAccessToExtension(extension, GetFilePath("system/foo")); | |
| 307 EXPECT_TRUE( | |
| 308 provider.IsAccessAllowed(CreateFileSystemURL(extension, "system/foo"))); | |
| 309 EXPECT_FALSE( | |
| 310 provider.IsAccessAllowed(CreateFileSystemURL(extension, "system/foo1"))); | |
| 311 | |
| 312 // oem is restricted file system. | |
| 313 provider.GrantFileAccessToExtension(extension, GetFilePath("oem/foo")); | |
| 314 // The extension should not be able to access the file even if | |
| 315 // GrantFileAccessToExtension was called. | |
| 316 EXPECT_FALSE( | |
| 317 provider.IsAccessAllowed(CreateFileSystemURL(extension, "oem/foo"))); | |
| 318 | |
| 319 provider.GrantFullAccessToExtension(extension); | |
| 320 // The extension should be able to access restricted file system after it was | |
| 321 // granted full access. | |
| 322 EXPECT_TRUE( | |
| 323 provider.IsAccessAllowed(CreateFileSystemURL(extension, "oem/foo"))); | |
| 324 // The extension which was granted fulle access should be able to access any | |
| 325 // path on curent file systems. | |
| 326 EXPECT_TRUE(provider.IsAccessAllowed( | |
| 327 CreateFileSystemURL(extension, "removable/foo1"))); | |
| 328 EXPECT_TRUE(provider.IsAccessAllowed( | |
| 329 CreateFileSystemURL(extension, "system/foo1"))); | |
| 330 | |
| 331 // The extension still cannot access new mount points. | |
| 332 ASSERT_TRUE(provider.AddLocalMountPoint(GetFilePath("/foo/test"))); | |
| 333 EXPECT_FALSE( | |
| 334 provider.IsAccessAllowed(CreateFileSystemURL(extension, "test_/foo"))); | |
| 335 | |
| 336 provider.RevokeAccessForExtension(extension); | |
| 337 EXPECT_FALSE(provider.IsAccessAllowed( | |
| 338 CreateFileSystemURL(extension,"removable/foo"))); | |
| 339 | |
| 340 fileapi::FileSystemURL internal_url(GURL("chrome://foo"), | |
| 341 fileapi::kFileSystemTypeExternal, | |
| 342 GetFilePath("removable/")); | |
| 343 // Internal WebUI should have full access. | |
| 344 EXPECT_TRUE(provider.IsAccessAllowed(internal_url)); | |
| 345 } | |
| 346 | |
| 347 // TODO(tbarzic): This could be moved to external_mount_points tests. | |
| 348 TEST(CrosMountPointProvider, GetVirtualPath) { | |
| 349 scoped_refptr<quota::MockSpecialStoragePolicy> storage_policy = | |
| 350 new quota::MockSpecialStoragePolicy(); | |
| 351 scoped_refptr<fileapi::ExternalMountPoints> mount_points( | |
| 352 fileapi::ExternalMountPoints::CreateRefCounted()); | |
| 353 scoped_refptr<fileapi::ExternalMountPoints> system_mount_points( | |
| 354 fileapi::ExternalMountPoints::CreateRefCounted()); | |
| 355 chromeos::CrosMountPointProvider provider(storage_policy, | |
| 356 system_mount_points.get(), | |
| 357 mount_points.get()); | |
| 358 | |
| 359 ASSERT_TRUE(provider.AddLocalMountPoint(GetFilePath("/a/b/c"))); | |
| 360 ASSERT_TRUE(provider.AddLocalMountPoint(GetFilePath("/z/y/x"))); | |
| 361 ASSERT_TRUE(provider.AddLocalMountPoint(GetFilePath("/m/n/o"))); | |
| 362 | |
| 363 // Register mount point whose name does not match its path base name. | |
| 364 ASSERT_TRUE( | |
| 365 mount_points->RegisterFileSystem("mount", | |
| 366 fileapi::kFileSystemTypeNativeLocal, | |
| 367 FilePath(DRIVE FPL("/root/foo")))); | |
| 368 | |
| 369 struct TestCase { | |
| 370 const char* const local_path; | |
| 371 bool success; | |
| 372 const char* const virtual_path; | |
| 373 }; | |
| 374 | |
| 375 const TestCase kTestCases[] = { | |
| 376 // Empty path. | |
| 377 { "", false, "" }, | |
| 378 // No registered mount point (but is parent to a mount point). | |
| 379 { "/a/b", false, ""}, | |
| 380 // No registered mount point (but is parent to a mount point). | |
| 381 { "/z/y", false, ""}, | |
| 382 // No registered mount point (but is parent to a mount point). | |
| 383 { "/m/n", false, ""}, | |
| 384 // No registered mount point. | |
| 385 { "/foo/mount", false, ""}, | |
| 386 // An existing mount point path is substring. | |
| 387 { "/a/b/c1", false, "" }, | |
| 388 // No leading /. | |
| 389 { "a/b/c", false, "" }, | |
| 390 // Sibling to a root path. | |
| 391 { "/a/b/d/e", false, ""}, | |
| 392 // Sibling to a root path. | |
| 393 { "/z/y/v/u", false, ""}, | |
| 394 // Sibling to a root path. | |
| 395 { "/m/n/p/q", false, ""}, | |
| 396 // Mount point root path. | |
| 397 { "/a/b/c", true, "c"}, | |
| 398 // Mount point root path. | |
| 399 { "/z/y/x", true, "x"}, | |
| 400 // Mount point root path. | |
| 401 { "/m/n/o", true, "o"}, | |
| 402 // Mount point child path. | |
| 403 { "/a/b/c/d/e", true, "c/d/e"}, | |
| 404 // Mount point child path. | |
| 405 { "/z/y/x/v/u", true, "x/v/u"}, | |
| 406 // Mount point child path. | |
| 407 { "/m/n/o/p/q", true, "o/p/q"}, | |
| 408 // Name doesn't match mount point path base name. | |
| 409 { "/root/foo/a/b/c", true, "mount/a/b/c" }, | |
| 410 { "/root/foo", true, "mount" }, | |
| 411 }; | |
| 412 | |
| 413 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) { | |
| 414 // Init virtual path with a value. | |
| 415 FilePath virtual_path(DRIVE FPL("/mount")); | |
| 416 FilePath local_path(DRIVE FPL(kTestCases[i].local_path)); | |
| 417 EXPECT_EQ(kTestCases[i].success, | |
| 418 provider.GetVirtualPath(local_path, &virtual_path)) | |
| 419 << "Resolving " << kTestCases[i].local_path; | |
| 420 | |
| 421 // There are no guaranties for |virtual_path| value if |GetVirtualPath| | |
| 422 // fails. | |
| 423 if (!kTestCases[i].success) | |
| 424 continue; | |
| 425 | |
| 426 FilePath expected_virtual_path(DRIVE FPL(kTestCases[i].virtual_path)); | |
| 427 EXPECT_EQ(expected_virtual_path, virtual_path) | |
| 428 << "Resolving " << kTestCases[i].local_path; | |
| 429 } | |
| 430 } | |
| 431 | |
| 432 TEST(CrosMountPointProvider, GetVirtualPathConflictWithSystemPoints) { | |
| 433 scoped_refptr<quota::MockSpecialStoragePolicy> storage_policy = | |
| 434 new quota::MockSpecialStoragePolicy(); | |
| 435 scoped_refptr<fileapi::ExternalMountPoints> mount_points( | |
| 436 fileapi::ExternalMountPoints::CreateRefCounted()); | |
| 437 scoped_refptr<fileapi::ExternalMountPoints> system_mount_points( | |
| 438 fileapi::ExternalMountPoints::CreateRefCounted()); | |
| 439 chromeos::CrosMountPointProvider provider(storage_policy, | |
| 440 mount_points.get(), | |
| 441 system_mount_points.get()); | |
| 442 | |
| 443 const fileapi::FileSystemType type = fileapi::kFileSystemTypeNativeLocal; | |
| 444 | |
| 445 // Provider specific mount points. | |
| 446 ASSERT_TRUE( | |
| 447 mount_points->RegisterFileSystem("b", type, GetFilePath("/a/b"))); | |
| 448 ASSERT_TRUE( | |
| 449 mount_points->RegisterFileSystem("y", type, GetFilePath("/z/y"))); | |
| 450 ASSERT_TRUE( | |
| 451 mount_points->RegisterFileSystem("n", type, GetFilePath("/m/n"))); | |
| 452 | |
| 453 // System mount points | |
| 454 ASSERT_TRUE( | |
| 455 system_mount_points->RegisterFileSystem("gb", type, GetFilePath("/a/b"))); | |
| 456 ASSERT_TRUE( | |
| 457 system_mount_points->RegisterFileSystem("gz", type, GetFilePath("/z"))); | |
| 458 ASSERT_TRUE(system_mount_points->RegisterFileSystem("gp", type, | |
| 459 GetFilePath("/m/n/o/p"))); | |
| 460 struct TestCase { | |
| 461 const char* const local_path; | |
| 462 bool success; | |
| 463 const char* const virtual_path; | |
| 464 }; | |
| 465 | |
| 466 const TestCase kTestCases[] = { | |
| 467 // Same paths in both mount points. | |
| 468 { "/a/b/c/d", true, "b/c/d" }, | |
| 469 // System mount points path more specific. | |
| 470 { "/m/n/o/p/r/s", true, "n/o/p/r/s" }, | |
| 471 // System mount points path less specific. | |
| 472 { "/z/y/x", true, "y/x"}, | |
| 473 // Only system mount points path matches. | |
| 474 { "/z/q/r/s", true, "gz/q/r/s"}, | |
| 475 // No match. | |
| 476 { "/foo/xxx", false, "" }, | |
| 477 }; | |
| 478 | |
| 479 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) { | |
| 480 // Init virtual path with a value. | |
| 481 FilePath virtual_path(DRIVE FPL("/mount")); | |
| 482 FilePath local_path(DRIVE FPL(kTestCases[i].local_path)); | |
| 483 EXPECT_EQ(kTestCases[i].success, | |
| 484 provider.GetVirtualPath(local_path, &virtual_path)) | |
| 485 << "Resolving " << kTestCases[i].local_path; | |
| 486 | |
| 487 // There are no guaranties for |virtual_path| value if |GetVirtualPath| | |
| 488 // fails. | |
| 489 if (!kTestCases[i].success) | |
| 490 continue; | |
| 491 | |
| 492 FilePath expected_virtual_path(DRIVE FPL(kTestCases[i].virtual_path)); | |
| 493 EXPECT_EQ(expected_virtual_path, virtual_path) | |
| 494 << "Resolving " << kTestCases[i].local_path; | |
| 495 } | |
| 496 } | |
| 497 | |
| 498 } // namespace | |
| OLD | NEW |