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. 4 5 #include "apps/saved_files_service.h" 6 #include "base/file_util.h" 7 #include "base/path_service.h" 8 #include "build/build_config.h" 9 #include "chrome/browser/chrome_notification_types.h" 10 #include "chrome/browser/extensions/api/file_system/file_system_api.h" 11 #include "chrome/browser/extensions/extension_prefs.h" 12 #include "chrome/browser/extensions/platform_app_browsertest_util.h" 13 #include "chrome/common/chrome_paths.h" 14 #include "content/public/browser/notification_observer.h" 15 #include "content/public/browser/notification_service.h" 16 17 namespace extensions { 18 19 namespace { 20 21 class AppInstallObserver : public content::NotificationObserver { 22 public: 23 AppInstallObserver( 24 base::Callback<void(const Extension*)> callback) 25 : callback_(callback) { 26 registrar_.Add(this, 27 chrome::NOTIFICATION_EXTENSION_LOADED, 28 content::NotificationService::AllSources()); 29 } 30 31 virtual void Observe(int type, 32 const content::NotificationSource& source, 33 const content::NotificationDetails& details) OVERRIDE { 34 EXPECT_EQ(chrome::NOTIFICATION_EXTENSION_LOADED, type); 35 callback_.Run(content::Details<const Extension>(details).ptr()); 36 } 37 38 private: 39 content::NotificationRegistrar registrar_; 40 base::Callback<void(const Extension*)> callback_; 41 DISALLOW_COPY_AND_ASSIGN(AppInstallObserver); 42 }; 43 44 void SetLastChooseEntryDirectory(const base::FilePath& choose_entry_directory, 45 ExtensionPrefs* prefs, 46 const Extension* extension) { 47 file_system_api::SetLastChooseEntryDirectory( 48 prefs, extension->id(), choose_entry_directory); 49 } 50 51 void SetLastChooseEntryDirectoryToAppDirectory( 52 ExtensionPrefs* prefs, 53 const Extension* extension) { 54 file_system_api::SetLastChooseEntryDirectory( 55 prefs, extension->id(), extension->path()); 56 } 57 58 void AddSavedEntry(const base::FilePath& path_to_save, 59 apps::SavedFilesService* service, 60 const Extension* extension) { 61 service->RegisterFileEntry( 62 extension->id(), "magic id", path_to_save, /* writable */ true); 63 } 64 65 } // namespace 66 67 class FileSystemApiTest : public PlatformAppBrowserTest { 68 public: 69 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 70 PlatformAppBrowserTest::SetUpCommandLine(command_line); 71 test_root_folder_ = test_data_dir_.AppendASCII("api_test") 72 .AppendASCII("file_system"); 73 FileSystemChooseEntryFunction::RegisterTempExternalFileSystemForTest( 74 "test_root", test_root_folder_); 75 } 76 77 virtual void TearDown() OVERRIDE { 78 FileSystemChooseEntryFunction::StopSkippingPickerForTest(); 79 PlatformAppBrowserTest::TearDown(); 80 }; 81 82 protected: 83 base::FilePath TempFilePath(const std::string& destination_name, 84 bool copy_gold) { 85 if (!temp_dir_.CreateUniqueTempDir()) { 86 ADD_FAILURE() << "CreateUniqueTempDir failed"; 87 return base::FilePath(); 88 } 89 FileSystemChooseEntryFunction::RegisterTempExternalFileSystemForTest( 90 "test_temp", temp_dir_.path()); 91 92 base::FilePath destination = temp_dir_.path().AppendASCII(destination_name); 93 if (copy_gold) { 94 base::FilePath source = test_root_folder_.AppendASCII("gold.txt"); 95 EXPECT_TRUE(base::CopyFile(source, destination)); 96 } 97 return destination; 98 } 99 100 std::vector<base::FilePath> TempFilePaths( 101 const std::vector<std::string>& destination_names, 102 bool copy_gold) { 103 if (!temp_dir_.CreateUniqueTempDir()) { 104 ADD_FAILURE() << "CreateUniqueTempDir failed"; 105 return std::vector<base::FilePath>(); 106 } 107 FileSystemChooseEntryFunction::RegisterTempExternalFileSystemForTest( 108 "test_temp", temp_dir_.path()); 109 110 std::vector<base::FilePath> result; 111 for (std::vector<std::string>::const_iterator it = 112 destination_names.begin(); 113 it != destination_names.end(); ++it) { 114 base::FilePath destination = temp_dir_.path().AppendASCII(*it); 115 if (copy_gold) { 116 base::FilePath source = test_root_folder_.AppendASCII("gold.txt"); 117 EXPECT_TRUE(base::CopyFile(source, destination)); 118 } 119 result.push_back(destination); 120 } 121 return result; 122 } 123 124 void CheckStoredDirectoryMatches(const base::FilePath& filename) { 125 const Extension* extension = GetSingleLoadedExtension(); 126 ASSERT_TRUE(extension); 127 std::string extension_id = extension->id(); 128 ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); 129 base::FilePath stored_value; 130 if (filename.empty()) { 131 EXPECT_FALSE(file_system_api::GetLastChooseEntryDirectory( 132 prefs, extension_id, &stored_value)); 133 } else { 134 EXPECT_TRUE(file_system_api::GetLastChooseEntryDirectory( 135 prefs, extension_id, &stored_value)); 136 EXPECT_EQ(base::MakeAbsoluteFilePath(filename.DirName()), 137 base::MakeAbsoluteFilePath(stored_value)); 138 } 139 } 140 141 base::FilePath test_root_folder_; 142 base::ScopedTempDir temp_dir_; 143 }; 144 145 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiGetDisplayPath) { 146 base::FilePath test_file = test_root_folder_.AppendASCII("gold.txt"); 147 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 148 &test_file); 149 ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/get_display_path")) 150 << message_; 151 } 152 153 #if defined(OS_WIN) || defined(OS_POSIX) 154 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiGetDisplayPathPrettify) { 155 #if defined(OS_WIN) 156 int override = base::DIR_PROFILE; 157 #elif defined(OS_POSIX) 158 int override = base::DIR_HOME; 159 #endif 160 ASSERT_TRUE(PathService::OverrideAndCreateIfNeeded(override, 161 test_root_folder_, false)); 162 163 base::FilePath test_file = test_root_folder_.AppendASCII("gold.txt"); 164 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 165 &test_file); 166 ASSERT_TRUE(RunPlatformAppTest( 167 "api_test/file_system/get_display_path_prettify")) << message_; 168 } 169 #endif 170 171 #if defined(OS_MACOSX) 172 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 173 FileSystemApiGetDisplayPathPrettifyMac) { 174 // On Mac, "test.localized" will be localized into just "test". 175 base::FilePath test_path = TempFilePath("test.localized", false); 176 ASSERT_TRUE(file_util::CreateDirectory(test_path)); 177 178 base::FilePath test_file = test_path.AppendASCII("gold.txt"); 179 base::FilePath source = test_root_folder_.AppendASCII("gold.txt"); 180 EXPECT_TRUE(base::CopyFile(source, test_file)); 181 182 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 183 &test_file); 184 ASSERT_TRUE(RunPlatformAppTest( 185 "api_test/file_system/get_display_path_prettify_mac")) << message_; 186 } 187 #endif 188 189 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiOpenExistingFileTest) { 190 base::FilePath test_file = TempFilePath("open_existing.txt", true); 191 ASSERT_FALSE(test_file.empty()); 192 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 193 &test_file); 194 ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_existing")) 195 << message_; 196 CheckStoredDirectoryMatches(test_file); 197 } 198 199 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 200 FileSystemApiOpenExistingFileUsingPreviousPathTest) { 201 base::FilePath test_file = TempFilePath("open_existing.txt", true); 202 ASSERT_FALSE(test_file.empty()); 203 FileSystemChooseEntryFunction:: 204 SkipPickerAndSelectSuggestedPathForTest(); 205 { 206 AppInstallObserver observer( 207 base::Bind(SetLastChooseEntryDirectory, 208 test_file.DirName(), 209 ExtensionPrefs::Get(profile()))); 210 ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_existing")) 211 << message_; 212 } 213 CheckStoredDirectoryMatches(test_file); 214 } 215 216 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 217 FileSystemApiOpenExistingFilePreviousPathDoesNotExistTest) { 218 base::FilePath test_file = TempFilePath("open_existing.txt", true); 219 ASSERT_FALSE(test_file.empty()); 220 ASSERT_TRUE(PathService::OverrideAndCreateIfNeeded( 221 chrome::DIR_USER_DOCUMENTS, test_file.DirName(), false)); 222 FileSystemChooseEntryFunction:: 223 SkipPickerAndSelectSuggestedPathForTest(); 224 { 225 AppInstallObserver observer(base::Bind( 226 SetLastChooseEntryDirectory, 227 test_file.DirName().Append( 228 base::FilePath::FromUTF8Unsafe("fake_directory_does_not_exist")), 229 ExtensionPrefs::Get(profile()))); 230 ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_existing")) 231 << message_; 232 } 233 CheckStoredDirectoryMatches(test_file); 234 } 235 236 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 237 FileSystemApiOpenExistingFileDefaultPathTest) { 238 base::FilePath test_file = TempFilePath("open_existing.txt", true); 239 ASSERT_FALSE(test_file.empty()); 240 ASSERT_TRUE(PathService::OverrideAndCreateIfNeeded( 241 chrome::DIR_USER_DOCUMENTS, test_file.DirName(), false)); 242 FileSystemChooseEntryFunction:: 243 SkipPickerAndSelectSuggestedPathForTest(); 244 ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_existing")) 245 << message_; 246 CheckStoredDirectoryMatches(test_file); 247 } 248 249 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiOpenMultipleSuggested) { 250 base::FilePath test_file = TempFilePath("open_existing.txt", true); 251 ASSERT_FALSE(test_file.empty()); 252 ASSERT_TRUE(PathService::OverrideAndCreateIfNeeded( 253 chrome::DIR_USER_DOCUMENTS, test_file.DirName(), false)); 254 FileSystemChooseEntryFunction::SkipPickerAndSelectSuggestedPathForTest(); 255 ASSERT_TRUE(RunPlatformAppTest( 256 "api_test/file_system/open_multiple_with_suggested_name")) 257 << message_; 258 CheckStoredDirectoryMatches(test_file); 259 } 260 261 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 262 FileSystemApiOpenMultipleExistingFilesTest) { 263 std::vector<std::string> names; 264 names.push_back("open_existing1.txt"); 265 names.push_back("open_existing2.txt"); 266 std::vector<base::FilePath> test_files = TempFilePaths(names, true); 267 ASSERT_EQ(2u, test_files.size()); 268 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathsForTest( 269 &test_files); 270 ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_multiple_existing")) 271 << message_; 272 } 273 274 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 275 FileSystemApiInvalidChooseEntryTypeTest) { 276 base::FilePath test_file = TempFilePath("open_existing.txt", true); 277 ASSERT_FALSE(test_file.empty()); 278 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 279 &test_file); 280 ASSERT_TRUE(RunPlatformAppTest( 281 "api_test/file_system/invalid_choose_file_type")) << message_; 282 CheckStoredDirectoryMatches(base::FilePath()); 283 } 284 285 // http://crbug.com/177163 286 #if defined(OS_WIN) && !defined(NDEBUG) 287 #define MAYBE_FileSystemApiOpenExistingFileWithWriteTest DISABLED_FileSystemApiOpenExistingFileWithWriteTest 288 #else 289 #define MAYBE_FileSystemApiOpenExistingFileWithWriteTest FileSystemApiOpenExistingFileWithWriteTest 290 #endif 291 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 292 MAYBE_FileSystemApiOpenExistingFileWithWriteTest) { 293 base::FilePath test_file = TempFilePath("open_existing.txt", true); 294 ASSERT_FALSE(test_file.empty()); 295 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 296 &test_file); 297 ASSERT_TRUE(RunPlatformAppTest( 298 "api_test/file_system/open_existing_with_write")) << message_; 299 CheckStoredDirectoryMatches(test_file); 300 } 301 302 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 303 FileSystemApiOpenWritableExistingFileTest) { 304 base::FilePath test_file = TempFilePath("open_existing.txt", true); 305 ASSERT_FALSE(test_file.empty()); 306 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 307 &test_file); 308 ASSERT_TRUE(RunPlatformAppTest( 309 "api_test/file_system/open_writable_existing")) << message_; 310 CheckStoredDirectoryMatches(base::FilePath()); 311 } 312 313 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 314 FileSystemApiOpenWritableExistingFileWithWriteTest) { 315 base::FilePath test_file = TempFilePath("open_existing.txt", true); 316 ASSERT_FALSE(test_file.empty()); 317 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 318 &test_file); 319 ASSERT_TRUE(RunPlatformAppTest( 320 "api_test/file_system/open_writable_existing_with_write")) << message_; 321 CheckStoredDirectoryMatches(test_file); 322 } 323 324 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 325 FileSystemApiOpenMultipleWritableExistingFilesTest) { 326 std::vector<std::string> names; 327 names.push_back("open_existing1.txt"); 328 names.push_back("open_existing2.txt"); 329 std::vector<base::FilePath> test_files = TempFilePaths(names, true); 330 ASSERT_EQ(2u, test_files.size()); 331 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathsForTest( 332 &test_files); 333 ASSERT_TRUE(RunPlatformAppTest( 334 "api_test/file_system/open_multiple_writable_existing_with_write")) 335 << message_; 336 } 337 338 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiOpenCancelTest) { 339 FileSystemChooseEntryFunction::SkipPickerAndAlwaysCancelForTest(); 340 ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_cancel")) 341 << message_; 342 CheckStoredDirectoryMatches(base::FilePath()); 343 } 344 345 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiOpenBackgroundTest) { 346 ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_background")) 347 << message_; 348 } 349 350 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiSaveNewFileTest) { 351 base::FilePath test_file = TempFilePath("save_new.txt", false); 352 ASSERT_FALSE(test_file.empty()); 353 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 354 &test_file); 355 ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/save_new")) 356 << message_; 357 CheckStoredDirectoryMatches(base::FilePath()); 358 } 359 360 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiSaveExistingFileTest) { 361 base::FilePath test_file = TempFilePath("save_existing.txt", true); 362 ASSERT_FALSE(test_file.empty()); 363 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 364 &test_file); 365 ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/save_existing")) 366 << message_; 367 CheckStoredDirectoryMatches(base::FilePath()); 368 } 369 370 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 371 FileSystemApiSaveNewFileWithWriteTest) { 372 base::FilePath test_file = TempFilePath("save_new.txt", false); 373 ASSERT_FALSE(test_file.empty()); 374 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 375 &test_file); 376 ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/save_new_with_write")) 377 << message_; 378 CheckStoredDirectoryMatches(test_file); 379 } 380 381 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 382 FileSystemApiSaveExistingFileWithWriteTest) { 383 base::FilePath test_file = TempFilePath("save_existing.txt", true); 384 ASSERT_FALSE(test_file.empty()); 385 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 386 &test_file); 387 ASSERT_TRUE(RunPlatformAppTest( 388 "api_test/file_system/save_existing_with_write")) << message_; 389 CheckStoredDirectoryMatches(test_file); 390 } 391 392 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiSaveMultipleFilesTest) { 393 std::vector<std::string> names; 394 names.push_back("save1.txt"); 395 names.push_back("save2.txt"); 396 std::vector<base::FilePath> test_files = TempFilePaths(names, false); 397 ASSERT_EQ(2u, test_files.size()); 398 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathsForTest( 399 &test_files); 400 ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/save_multiple")) 401 << message_; 402 } 403 404 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiSaveCancelTest) { 405 FileSystemChooseEntryFunction::SkipPickerAndAlwaysCancelForTest(); 406 ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/save_cancel")) 407 << message_; 408 } 409 410 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiSaveBackgroundTest) { 411 ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/save_background")) 412 << message_; 413 } 414 415 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiGetWritableTest) { 416 base::FilePath test_file = TempFilePath("writable.txt", true); 417 ASSERT_FALSE(test_file.empty()); 418 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 419 &test_file); 420 ASSERT_TRUE(RunPlatformAppTest( 421 "api_test/file_system/get_writable_file_entry")) << message_; 422 } 423 424 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 425 FileSystemApiGetWritableWithWriteTest) { 426 base::FilePath test_file = TempFilePath("writable.txt", true); 427 ASSERT_FALSE(test_file.empty()); 428 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 429 &test_file); 430 ASSERT_TRUE(RunPlatformAppTest( 431 "api_test/file_system/get_writable_file_entry_with_write")) << message_; 432 } 433 434 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 435 FileSystemApiGetWritableInUserDataDirTest) { 436 base::FilePath test_file = 437 base::MakeAbsoluteFilePath(TempFilePath("test.js", true)); 438 ASSERT_FALSE(test_file.empty()); 439 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 440 &test_file); 441 ASSERT_TRUE(PathService::OverrideAndCreateIfNeeded( 442 chrome::DIR_USER_DATA, test_file.DirName(), false)); 443 ASSERT_TRUE(RunPlatformAppTest( 444 "api_test/file_system/get_writable_file_entry_non_writable_file")) 445 << message_; 446 } 447 448 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 449 FileSystemApiGetWritableInChromeDirTest) { 450 base::FilePath test_file = 451 base::MakeAbsoluteFilePath(TempFilePath("test.js", true)); 452 ASSERT_FALSE(test_file.empty()); 453 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 454 &test_file); 455 ASSERT_TRUE(PathService::OverrideAndCreateIfNeeded( 456 chrome::DIR_APP, test_file.DirName(), false)); 457 ASSERT_TRUE(RunPlatformAppTest( 458 "api_test/file_system/get_writable_file_entry_non_writable_file")) 459 << message_; 460 } 461 462 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 463 FileSystemApiGetWritableInAppDirectory) { 464 FileSystemChooseEntryFunction::SkipPickerAndSelectSuggestedPathForTest(); 465 { 466 AppInstallObserver observer( 467 base::Bind(SetLastChooseEntryDirectoryToAppDirectory, 468 ExtensionPrefs::Get(profile()))); 469 ASSERT_TRUE(RunPlatformAppTest( 470 "api_test/file_system/get_writable_file_entry_non_writable_file")) 471 << message_; 472 } 473 } 474 475 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiIsWritableTest) { 476 base::FilePath test_file = TempFilePath("writable.txt", true); 477 ASSERT_FALSE(test_file.empty()); 478 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 479 &test_file); 480 ASSERT_TRUE(RunPlatformAppTest( 481 "api_test/file_system/is_writable_file_entry")) << message_; 482 } 483 484 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiRetainEntry) { 485 base::FilePath test_file = TempFilePath("writable.txt", true); 486 ASSERT_FALSE(test_file.empty()); 487 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 488 &test_file); 489 ASSERT_TRUE(RunPlatformAppTest( 490 "api_test/file_system/retain_entry")) << message_; 491 std::vector<apps::SavedFileEntry> file_entries = apps::SavedFilesService::Get( 492 profile())->GetAllFileEntries(GetSingleLoadedExtension()->id()); 493 ASSERT_EQ(1u, file_entries.size()); 494 EXPECT_EQ(test_file, file_entries[0].path); 495 EXPECT_EQ(1, file_entries[0].sequence_number); 496 EXPECT_FALSE(file_entries[0].writable); 497 } 498 499 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiRestoreEntry) { 500 base::FilePath test_file = TempFilePath("writable.txt", true); 501 ASSERT_FALSE(test_file.empty()); 502 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 503 &test_file); 504 { 505 AppInstallObserver observer(base::Bind( 506 AddSavedEntry, test_file, apps::SavedFilesService::Get(profile()))); 507 ASSERT_TRUE(RunPlatformAppTest( 508 "api_test/file_system/restore_entry")) << message_; 509 } 510 } 511 512 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 513 FileSystemApiOpenNonWritableFileForRead) { 514 base::FilePath test_file = TempFilePath("open_existing.txt", true); 515 ASSERT_FALSE(test_file.empty()); 516 ASSERT_TRUE(PathService::OverrideAndCreateIfNeeded( 517 chrome::DIR_USER_DATA, test_file.DirName(), false)); 518 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 519 &test_file); 520 ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_existing")) 521 << message_; 522 } 523 524 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 525 FileSystemApiOpenInUserDataDirForWrite) { 526 base::FilePath test_file = 527 base::MakeAbsoluteFilePath(TempFilePath("open_existing.txt", true)); 528 ASSERT_FALSE(test_file.empty()); 529 ASSERT_TRUE(PathService::OverrideAndCreateIfNeeded( 530 chrome::DIR_USER_DATA, test_file.DirName(), false)); 531 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 532 &test_file); 533 ASSERT_TRUE(RunPlatformAppTest( 534 "api_test/file_system/open_writable_existing_non_writable")) << message_; 535 } 536 537 #if defined(OS_CHROMEOS) 538 // In Chrome OS the download directory is whitelisted for write. 539 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 540 FileSystemApiOpenInDownloadDirForWrite) { 541 base::FilePath test_file = 542 base::MakeAbsoluteFilePath(TempFilePath("writable.txt", true)); 543 ASSERT_FALSE(test_file.empty()); 544 ASSERT_TRUE(PathService::OverrideAndCreateIfNeeded( 545 chrome::DIR_USER_DATA, test_file.DirName(), false)); 546 ASSERT_TRUE(PathService::OverrideAndCreateIfNeeded( 547 chrome::DIR_DEFAULT_DOWNLOADS_SAFE, test_file.DirName(), false)); 548 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 549 &test_file); 550 ASSERT_TRUE(RunPlatformAppTest( 551 "api_test/file_system/is_writable_file_entry")) << message_; 552 } 553 #endif 554 555 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 556 FileSystemApiOpenInChromeDirForWrite) { 557 base::FilePath test_file = 558 base::MakeAbsoluteFilePath(TempFilePath("open_existing.txt", true)); 559 ASSERT_FALSE(test_file.empty()); 560 ASSERT_TRUE(PathService::OverrideAndCreateIfNeeded( 561 chrome::DIR_APP, test_file.DirName(), false)); 562 FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( 563 &test_file); 564 ASSERT_TRUE(RunPlatformAppTest( 565 "api_test/file_system/open_writable_existing_non_writable")) << message_; 566 } 567 568 IN_PROC_BROWSER_TEST_F(FileSystemApiTest, 569 FileSystemApiOpenInAppDirectoryForWrite) { 570 FileSystemChooseEntryFunction::SkipPickerAndSelectSuggestedPathForTest(); 571 { 572 AppInstallObserver observer( 573 base::Bind(SetLastChooseEntryDirectoryToAppDirectory, 574 ExtensionPrefs::Get(profile()))); 575 ASSERT_TRUE(RunPlatformAppTest( 576 "api_test/file_system/open_writable_existing_non_writable")) 577 << message_; 578 } 579 } 580 581 } // namespace extensions 582