| // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Browser test for basic Chrome OS file manager functionality: |
| // - The file list is updated when a file is added externally to the Downloads |
| // folder. |
| // - Selecting a file and copy-pasting it with the keyboard copies the file. |
| // - Selecting a file and pressing delete deletes it. |
| |
| #include <deque> |
| #include <string> |
| |
| #include "base/bind.h" |
| #include "base/files/file_path.h" |
| #include "base/files/file_util.h" |
| #include "base/json/json_reader.h" |
| #include "base/json/json_value_converter.h" |
| #include "base/json/json_writer.h" |
| #include "base/path_service.h" |
| #include "base/prefs/pref_service.h" |
| #include "base/strings/string_piece.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/time/time.h" |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/chromeos/drive/drive_integration_service.h" |
| #include "chrome/browser/chromeos/drive/file_system_interface.h" |
| #include "chrome/browser/chromeos/drive/test_util.h" |
| #include "chrome/browser/chromeos/file_manager/app_id.h" |
| #include "chrome/browser/chromeos/file_manager/drive_test_util.h" |
| #include "chrome/browser/chromeos/file_manager/path_util.h" |
| #include "chrome/browser/chromeos/file_manager/volume_manager.h" |
| #include "chrome/browser/chromeos/profiles/profile_helper.h" |
| #include "chrome/browser/drive/fake_drive_service.h" |
| #include "chrome/browser/extensions/component_loader.h" |
| #include "chrome/browser/extensions/extension_apitest.h" |
| #include "chrome/browser/notifications/notification.h" |
| #include "chrome/browser/notifications/notification_ui_manager.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/signin/signin_manager_factory.h" |
| #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" |
| #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/common/pref_names.h" |
| #include "chromeos/chromeos_switches.h" |
| #include "components/signin/core/browser/signin_manager.h" |
| #include "components/user_manager/user_manager.h" |
| #include "content/public/browser/notification_service.h" |
| #include "content/public/test/test_utils.h" |
| #include "extensions/browser/api/test/test_api.h" |
| #include "extensions/browser/app_window/app_window.h" |
| #include "extensions/browser/app_window/app_window_registry.h" |
| #include "extensions/browser/notification_types.h" |
| #include "extensions/common/extension.h" |
| #include "extensions/test/extension_test_message_listener.h" |
| #include "google_apis/drive/drive_api_parser.h" |
| #include "google_apis/drive/test_util.h" |
| #include "net/test/embedded_test_server/embedded_test_server.h" |
| #include "storage/browser/fileapi/external_mount_points.h" |
| |
| using drive::DriveIntegrationServiceFactory; |
| |
| namespace file_manager { |
| namespace { |
| |
| enum EntryType { |
| FILE, |
| DIRECTORY, |
| }; |
| |
| enum TargetVolume { LOCAL_VOLUME, DRIVE_VOLUME, USB_VOLUME, }; |
| |
| enum SharedOption { |
| NONE, |
| SHARED, |
| }; |
| |
| enum GuestMode { |
| NOT_IN_GUEST_MODE, |
| IN_GUEST_MODE, |
| IN_INCOGNITO |
| }; |
| |
| // This global operator is used from Google Test to format error messages. |
| std::ostream& operator<<(std::ostream& os, const GuestMode& guest_mode) { |
| return os << (guest_mode == IN_GUEST_MODE ? |
| "IN_GUEST_MODE" : "NOT_IN_GUEST_MODE"); |
| } |
| |
| // Maps the given string to EntryType. Returns true on success. |
| bool MapStringToEntryType(const base::StringPiece& value, EntryType* output) { |
| if (value == "file") |
| *output = FILE; |
| else if (value == "directory") |
| *output = DIRECTORY; |
| else |
| return false; |
| return true; |
| } |
| |
| // Maps the given string to SharedOption. Returns true on success. |
| bool MapStringToSharedOption(const base::StringPiece& value, |
| SharedOption* output) { |
| if (value == "shared") |
| *output = SHARED; |
| else if (value == "none") |
| *output = NONE; |
| else |
| return false; |
| return true; |
| } |
| |
| // Maps the given string to TargetVolume. Returns true on success. |
| bool MapStringToTargetVolume(const base::StringPiece& value, |
| TargetVolume* output) { |
| if (value == "drive") |
| *output = DRIVE_VOLUME; |
| else if (value == "local") |
| *output = LOCAL_VOLUME; |
| else if (value == "usb") |
| *output = USB_VOLUME; |
| else |
| return false; |
| return true; |
| } |
| |
| // Maps the given string to base::Time. Returns true on success. |
| bool MapStringToTime(const base::StringPiece& value, base::Time* time) { |
| return base::Time::FromString(value.as_string().c_str(), time); |
| } |
| |
| // Test data of file or directory. |
| struct TestEntryInfo { |
| TestEntryInfo() : type(FILE), shared_option(NONE) {} |
| |
| TestEntryInfo(EntryType type, |
| const std::string& source_file_name, |
| const std::string& target_path, |
| const std::string& mime_type, |
| SharedOption shared_option, |
| const base::Time& last_modified_time) : |
| type(type), |
| source_file_name(source_file_name), |
| target_path(target_path), |
| mime_type(mime_type), |
| shared_option(shared_option), |
| last_modified_time(last_modified_time) { |
| } |
| |
| EntryType type; |
| std::string source_file_name; // Source file name to be used as a prototype. |
| std::string target_path; // Target file or directory path. |
| std::string mime_type; |
| SharedOption shared_option; |
| base::Time last_modified_time; |
| |
| // Registers the member information to the given converter. |
| static void RegisterJSONConverter( |
| base::JSONValueConverter<TestEntryInfo>* converter); |
| }; |
| |
| // static |
| void TestEntryInfo::RegisterJSONConverter( |
| base::JSONValueConverter<TestEntryInfo>* converter) { |
| converter->RegisterCustomField("type", |
| &TestEntryInfo::type, |
| &MapStringToEntryType); |
| converter->RegisterStringField("sourceFileName", |
| &TestEntryInfo::source_file_name); |
| converter->RegisterStringField("targetPath", &TestEntryInfo::target_path); |
| converter->RegisterStringField("mimeType", &TestEntryInfo::mime_type); |
| converter->RegisterCustomField("sharedOption", |
| &TestEntryInfo::shared_option, |
| &MapStringToSharedOption); |
| converter->RegisterCustomField("lastModifiedTime", |
| &TestEntryInfo::last_modified_time, |
| &MapStringToTime); |
| } |
| |
| // Message from JavaScript to add entries. |
| struct AddEntriesMessage { |
| // Target volume to be added the |entries|. |
| TargetVolume volume; |
| |
| // Entries to be added. |
| ScopedVector<TestEntryInfo> entries; |
| |
| // Registers the member information to the given converter. |
| static void RegisterJSONConverter( |
| base::JSONValueConverter<AddEntriesMessage>* converter); |
| }; |
| |
| // static |
| void AddEntriesMessage::RegisterJSONConverter( |
| base::JSONValueConverter<AddEntriesMessage>* converter) { |
| converter->RegisterCustomField("volume", |
| &AddEntriesMessage::volume, |
| &MapStringToTargetVolume); |
| converter->RegisterRepeatedMessage<TestEntryInfo>( |
| "entries", |
| &AddEntriesMessage::entries); |
| } |
| |
| // Test volume. |
| class TestVolume { |
| protected: |
| explicit TestVolume(const std::string& name) : name_(name) {} |
| virtual ~TestVolume() {} |
| |
| bool CreateRootDirectory(const Profile* profile) { |
| const base::FilePath path = profile->GetPath().Append(name_); |
| return root_.path() == path || root_.Set(path); |
| } |
| |
| const std::string& name() { return name_; } |
| const base::FilePath root_path() { return root_.path(); } |
| |
| private: |
| std::string name_; |
| base::ScopedTempDir root_; |
| }; |
| |
| // The local volume class for test. |
| // This class provides the operations for a test volume that simulates local |
| // drive. |
| class LocalTestVolume : public TestVolume { |
| public: |
| explicit LocalTestVolume(const std::string& name) : TestVolume(name) {} |
| ~LocalTestVolume() override {} |
| |
| // Adds this volume to the file system as a local volume. Returns true on |
| // success. |
| virtual bool Mount(Profile* profile) = 0; |
| |
| void CreateEntry(const TestEntryInfo& entry) { |
| const base::FilePath target_path = |
| root_path().AppendASCII(entry.target_path); |
| |
| entries_.insert(std::make_pair(target_path, entry)); |
| switch (entry.type) { |
| case FILE: { |
| const base::FilePath source_path = |
| google_apis::test_util::GetTestFilePath("chromeos/file_manager"). |
| AppendASCII(entry.source_file_name); |
| ASSERT_TRUE(base::CopyFile(source_path, target_path)) |
| << "Copy from " << source_path.value() |
| << " to " << target_path.value() << " failed."; |
| break; |
| } |
| case DIRECTORY: |
| ASSERT_TRUE(base::CreateDirectory(target_path)) << |
| "Failed to create a directory: " << target_path.value(); |
| break; |
| } |
| ASSERT_TRUE(UpdateModifiedTime(entry)); |
| } |
| |
| private: |
| // Updates ModifiedTime of the entry and its parents by referring |
| // TestEntryInfo. Returns true on success. |
| bool UpdateModifiedTime(const TestEntryInfo& entry) { |
| const base::FilePath path = root_path().AppendASCII(entry.target_path); |
| if (!base::TouchFile(path, entry.last_modified_time, |
| entry.last_modified_time)) |
| return false; |
| |
| // Update the modified time of parent directories because it may be also |
| // affected by the update of child items. |
| if (path.DirName() != root_path()) { |
| const std::map<base::FilePath, const TestEntryInfo>::iterator it = |
| entries_.find(path.DirName()); |
| if (it == entries_.end()) |
| return false; |
| return UpdateModifiedTime(it->second); |
| } |
| return true; |
| } |
| |
| std::map<base::FilePath, const TestEntryInfo> entries_; |
| }; |
| |
| class DownloadsTestVolume : public LocalTestVolume { |
| public: |
| DownloadsTestVolume() : LocalTestVolume("Downloads") {} |
| ~DownloadsTestVolume() override {} |
| |
| bool Mount(Profile* profile) override { |
| return CreateRootDirectory(profile) && |
| VolumeManager::Get(profile) |
| ->RegisterDownloadsDirectoryForTesting(root_path()); |
| } |
| }; |
| |
| // Test volume for mimicing a specified type of volumes by a local folder. |
| class FakeTestVolume : public LocalTestVolume { |
| public: |
| FakeTestVolume(const std::string& name, |
| VolumeType volume_type, |
| chromeos::DeviceType device_type) |
| : LocalTestVolume(name), |
| volume_type_(volume_type), |
| device_type_(device_type) {} |
| ~FakeTestVolume() override {} |
| |
| // Simple test entries used for testing, e.g., read-only volumes. |
| bool PrepareTestEntries(Profile* profile) { |
| if (!CreateRootDirectory(profile)) |
| return false; |
| // Must be in sync with BASIC_FAKE_ENTRY_SET in the JS test code. |
| CreateEntry( |
| TestEntryInfo(FILE, "text.txt", "hello.txt", "text/plain", NONE, |
| base::Time::Now())); |
| CreateEntry( |
| TestEntryInfo(DIRECTORY, std::string(), "A", std::string(), NONE, |
| base::Time::Now())); |
| return true; |
| } |
| |
| bool Mount(Profile* profile) override { |
| if (!CreateRootDirectory(profile)) |
| return false; |
| storage::ExternalMountPoints* const mount_points = |
| storage::ExternalMountPoints::GetSystemInstance(); |
| |
| // First revoke the existing mount point (if any). |
| mount_points->RevokeFileSystem(name()); |
| const bool result = |
| mount_points->RegisterFileSystem(name(), |
| storage::kFileSystemTypeNativeLocal, |
| storage::FileSystemMountOption(), |
| root_path()); |
| if (!result) |
| return false; |
| |
| VolumeManager::Get(profile)->AddVolumeForTesting( |
| root_path(), volume_type_, device_type_, false /* read_only */); |
| return true; |
| } |
| |
| private: |
| const VolumeType volume_type_; |
| const chromeos::DeviceType device_type_; |
| }; |
| |
| // The drive volume class for test. |
| // This class provides the operations for a test volume that simulates Google |
| // drive. |
| class DriveTestVolume : public TestVolume { |
| public: |
| DriveTestVolume() : TestVolume("drive"), integration_service_(NULL) {} |
| ~DriveTestVolume() override {} |
| |
| void CreateEntry(const TestEntryInfo& entry) { |
| const base::FilePath path = |
| base::FilePath::FromUTF8Unsafe(entry.target_path); |
| const std::string target_name = path.BaseName().AsUTF8Unsafe(); |
| |
| // Obtain the parent entry. |
| drive::FileError error = drive::FILE_ERROR_OK; |
| scoped_ptr<drive::ResourceEntry> parent_entry(new drive::ResourceEntry); |
| integration_service_->file_system()->GetResourceEntry( |
| drive::util::GetDriveMyDriveRootPath().Append(path).DirName(), |
| google_apis::test_util::CreateCopyResultCallback( |
| &error, &parent_entry)); |
| content::RunAllBlockingPoolTasksUntilIdle(); |
| ASSERT_EQ(drive::FILE_ERROR_OK, error); |
| ASSERT_TRUE(parent_entry); |
| |
| switch (entry.type) { |
| case FILE: |
| CreateFile(entry.source_file_name, |
| parent_entry->resource_id(), |
| target_name, |
| entry.mime_type, |
| entry.shared_option == SHARED, |
| entry.last_modified_time); |
| break; |
| case DIRECTORY: |
| CreateDirectory( |
| parent_entry->resource_id(), target_name, entry.last_modified_time); |
| break; |
| } |
| } |
| |
| // Creates an empty directory with the given |name| and |modification_time|. |
| void CreateDirectory(const std::string& parent_id, |
| const std::string& target_name, |
| const base::Time& modification_time) { |
| google_apis::DriveApiErrorCode error = google_apis::DRIVE_OTHER_ERROR; |
| scoped_ptr<google_apis::FileResource> entry; |
| fake_drive_service_->AddNewDirectory( |
| parent_id, target_name, drive::AddNewDirectoryOptions(), |
| google_apis::test_util::CreateCopyResultCallback(&error, &entry)); |
| base::MessageLoop::current()->RunUntilIdle(); |
| ASSERT_EQ(google_apis::HTTP_CREATED, error); |
| ASSERT_TRUE(entry); |
| |
| fake_drive_service_->SetLastModifiedTime( |
| entry->file_id(), |
| modification_time, |
| google_apis::test_util::CreateCopyResultCallback(&error, &entry)); |
| base::MessageLoop::current()->RunUntilIdle(); |
| ASSERT_TRUE(error == google_apis::HTTP_SUCCESS); |
| ASSERT_TRUE(entry); |
| CheckForUpdates(); |
| } |
| |
| // Creates a test file with the given spec. |
| // Serves |test_file_name| file. Pass an empty string for an empty file. |
| void CreateFile(const std::string& source_file_name, |
| const std::string& parent_id, |
| const std::string& target_name, |
| const std::string& mime_type, |
| bool shared_with_me, |
| const base::Time& modification_time) { |
| google_apis::DriveApiErrorCode error = google_apis::DRIVE_OTHER_ERROR; |
| |
| std::string content_data; |
| if (!source_file_name.empty()) { |
| base::FilePath source_file_path = |
| google_apis::test_util::GetTestFilePath("chromeos/file_manager"). |
| AppendASCII(source_file_name); |
| ASSERT_TRUE(base::ReadFileToString(source_file_path, &content_data)); |
| } |
| |
| scoped_ptr<google_apis::FileResource> entry; |
| fake_drive_service_->AddNewFile( |
| mime_type, |
| content_data, |
| parent_id, |
| target_name, |
| shared_with_me, |
| google_apis::test_util::CreateCopyResultCallback(&error, &entry)); |
| base::MessageLoop::current()->RunUntilIdle(); |
| ASSERT_EQ(google_apis::HTTP_CREATED, error); |
| ASSERT_TRUE(entry); |
| |
| fake_drive_service_->SetLastModifiedTime( |
| entry->file_id(), |
| modification_time, |
| google_apis::test_util::CreateCopyResultCallback(&error, &entry)); |
| base::MessageLoop::current()->RunUntilIdle(); |
| ASSERT_EQ(google_apis::HTTP_SUCCESS, error); |
| ASSERT_TRUE(entry); |
| |
| CheckForUpdates(); |
| } |
| |
| // Notifies FileSystem that the contents in FakeDriveService are |
| // changed, hence the new contents should be fetched. |
| void CheckForUpdates() { |
| if (integration_service_ && integration_service_->file_system()) { |
| integration_service_->file_system()->CheckForUpdates(); |
| } |
| } |
| |
| // Sets the url base for the test server to be used to generate share urls |
| // on the files and directories. |
| void ConfigureShareUrlBase(const GURL& share_url_base) { |
| fake_drive_service_->set_share_url_base(share_url_base); |
| } |
| |
| drive::DriveIntegrationService* CreateDriveIntegrationService( |
| Profile* profile) { |
| profile_ = profile; |
| fake_drive_service_ = new drive::FakeDriveService; |
| fake_drive_service_->LoadAppListForDriveApi("drive/applist.json"); |
| |
| if (!CreateRootDirectory(profile)) |
| return NULL; |
| integration_service_ = new drive::DriveIntegrationService( |
| profile, NULL, fake_drive_service_, std::string(), root_path(), NULL); |
| return integration_service_; |
| } |
| |
| private: |
| Profile* profile_; |
| drive::FakeDriveService* fake_drive_service_; |
| drive::DriveIntegrationService* integration_service_; |
| }; |
| |
| // Listener to obtain the test relative messages synchronously. |
| class FileManagerTestListener : public content::NotificationObserver { |
| public: |
| struct Message { |
| int type; |
| std::string message; |
| scoped_refptr<extensions::TestSendMessageFunction> function; |
| }; |
| |
| FileManagerTestListener() { |
| registrar_.Add(this, |
| extensions::NOTIFICATION_EXTENSION_TEST_PASSED, |
| content::NotificationService::AllSources()); |
| registrar_.Add(this, |
| extensions::NOTIFICATION_EXTENSION_TEST_FAILED, |
| content::NotificationService::AllSources()); |
| registrar_.Add(this, |
| extensions::NOTIFICATION_EXTENSION_TEST_MESSAGE, |
| content::NotificationService::AllSources()); |
| } |
| |
| Message GetNextMessage() { |
| if (messages_.empty()) |
| content::RunMessageLoop(); |
| const Message entry = messages_.front(); |
| messages_.pop_front(); |
| return entry; |
| } |
| |
| void Observe(int type, |
| const content::NotificationSource& source, |
| const content::NotificationDetails& details) override { |
| Message entry; |
| entry.type = type; |
| entry.message = type != extensions::NOTIFICATION_EXTENSION_TEST_PASSED |
| ? *content::Details<std::string>(details).ptr() |
| : std::string(); |
| entry.function = |
| type == extensions::NOTIFICATION_EXTENSION_TEST_MESSAGE |
| ? content::Source<extensions::TestSendMessageFunction>(source).ptr() |
| : NULL; |
| messages_.push_back(entry); |
| base::MessageLoopForUI::current()->Quit(); |
| } |
| |
| private: |
| std::deque<Message> messages_; |
| content::NotificationRegistrar registrar_; |
| }; |
| |
| // The base test class. |
| class FileManagerBrowserTestBase : public ExtensionApiTest { |
| protected: |
| void SetUpInProcessBrowserTestFixture() override; |
| |
| void SetUpOnMainThread() override; |
| |
| // Adds an incognito and guest-mode flags for tests in the guest mode. |
| void SetUpCommandLine(base::CommandLine* command_line) override; |
| |
| // Loads our testing extension and sends it a string identifying the current |
| // test. |
| virtual void StartTest(); |
| void RunTestMessageLoop(); |
| |
| // Overriding point for test configurations. |
| virtual const char* GetTestManifestName() const { |
| return "file_manager_test_manifest.json"; |
| } |
| virtual GuestMode GetGuestModeParam() const = 0; |
| virtual const char* GetTestCaseNameParam() const = 0; |
| virtual void OnMessage(const std::string& name, |
| const base::DictionaryValue& value, |
| std::string* output); |
| |
| scoped_ptr<LocalTestVolume> local_volume_; |
| linked_ptr<DriveTestVolume> drive_volume_; |
| std::map<Profile*, linked_ptr<DriveTestVolume> > drive_volumes_; |
| scoped_ptr<FakeTestVolume> usb_volume_; |
| scoped_ptr<FakeTestVolume> mtp_volume_; |
| |
| private: |
| drive::DriveIntegrationService* CreateDriveIntegrationService( |
| Profile* profile); |
| DriveIntegrationServiceFactory::FactoryCallback |
| create_drive_integration_service_; |
| scoped_ptr<DriveIntegrationServiceFactory::ScopedFactoryForTest> |
| service_factory_for_test_; |
| }; |
| |
| void FileManagerBrowserTestBase::SetUpInProcessBrowserTestFixture() { |
| ExtensionApiTest::SetUpInProcessBrowserTestFixture(); |
| extensions::ComponentLoader::EnableBackgroundExtensionsForTesting(); |
| |
| local_volume_.reset(new DownloadsTestVolume); |
| if (GetGuestModeParam() != IN_GUEST_MODE) { |
| create_drive_integration_service_ = |
| base::Bind(&FileManagerBrowserTestBase::CreateDriveIntegrationService, |
| base::Unretained(this)); |
| service_factory_for_test_.reset( |
| new DriveIntegrationServiceFactory::ScopedFactoryForTest( |
| &create_drive_integration_service_)); |
| } |
| } |
| |
| void FileManagerBrowserTestBase::SetUpOnMainThread() { |
| ExtensionApiTest::SetUpOnMainThread(); |
| ASSERT_TRUE(local_volume_->Mount(profile())); |
| |
| if (GetGuestModeParam() != IN_GUEST_MODE) { |
| // Install the web server to serve the mocked share dialog. |
| ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
| const GURL share_url_base(embedded_test_server()->GetURL( |
| "/chromeos/file_manager/share_dialog_mock/index.html")); |
| drive_volume_ = drive_volumes_[profile()->GetOriginalProfile()]; |
| drive_volume_->ConfigureShareUrlBase(share_url_base); |
| test_util::WaitUntilDriveMountPointIsAdded(profile()); |
| } |
| |
| net::NetworkChangeNotifier::SetTestNotificationsOnly(true); |
| } |
| |
| void FileManagerBrowserTestBase::SetUpCommandLine( |
| base::CommandLine* command_line) { |
| if (GetGuestModeParam() == IN_GUEST_MODE) { |
| command_line->AppendSwitch(chromeos::switches::kGuestSession); |
| command_line->AppendSwitchNative(chromeos::switches::kLoginUser, ""); |
| command_line->AppendSwitch(switches::kIncognito); |
| } |
| if (GetGuestModeParam() == IN_INCOGNITO) { |
| command_line->AppendSwitch(switches::kIncognito); |
| } |
| ExtensionApiTest::SetUpCommandLine(command_line); |
| } |
| |
| void FileManagerBrowserTestBase::StartTest() { |
| base::FilePath root_path; |
| ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &root_path)); |
| |
| // Launch the extension. |
| const base::FilePath path = |
| root_path.Append(FILE_PATH_LITERAL("ui/file_manager/integration_tests")); |
| const extensions::Extension* const extension = |
| LoadExtensionAsComponentWithManifest(path, GetTestManifestName()); |
| ASSERT_TRUE(extension); |
| |
| RunTestMessageLoop(); |
| } |
| |
| void FileManagerBrowserTestBase::RunTestMessageLoop() { |
| // Handle the messages from JavaScript. |
| // The while loop is break when the test is passed or failed. |
| FileManagerTestListener listener; |
| while (true) { |
| FileManagerTestListener::Message entry = listener.GetNextMessage(); |
| if (entry.type == extensions::NOTIFICATION_EXTENSION_TEST_PASSED) { |
| // Test succeed. |
| break; |
| } else if (entry.type == extensions::NOTIFICATION_EXTENSION_TEST_FAILED) { |
| // Test failed. |
| ADD_FAILURE() << entry.message; |
| break; |
| } |
| |
| // Parse the message value as JSON. |
| const scoped_ptr<const base::Value> value( |
| base::JSONReader::Read(entry.message)); |
| |
| // If the message is not the expected format, just ignore it. |
| const base::DictionaryValue* message_dictionary = NULL; |
| std::string name; |
| if (!value || !value->GetAsDictionary(&message_dictionary) || |
| !message_dictionary->GetString("name", &name)) |
| continue; |
| |
| std::string output; |
| OnMessage(name, *message_dictionary, &output); |
| if (HasFatalFailure()) |
| break; |
| |
| entry.function->Reply(output); |
| } |
| } |
| |
| void FileManagerBrowserTestBase::OnMessage(const std::string& name, |
| const base::DictionaryValue& value, |
| std::string* output) { |
| if (name == "getTestName") { |
| // Pass the test case name. |
| *output = GetTestCaseNameParam(); |
| return; |
| } |
| |
| if (name == "getRootPaths") { |
| // Pass the root paths. |
| const scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); |
| res->SetString("downloads", |
| "/" + util::GetDownloadsMountPointName(profile())); |
| res->SetString("drive", |
| "/" + drive::util::GetDriveMountPointPath(profile() |
| ).BaseName().AsUTF8Unsafe() + "/root"); |
| base::JSONWriter::Write(res.get(), output); |
| return; |
| } |
| |
| if (name == "isInGuestMode") { |
| // Obtain whether the test is in guest mode or not. |
| *output = GetGuestModeParam() != NOT_IN_GUEST_MODE ? "true" : "false"; |
| return; |
| } |
| |
| if (name == "getCwsWidgetContainerMockUrl") { |
| // Obtain whether the test is in guest mode or not. |
| const GURL url = embedded_test_server()->GetURL( |
| "/chromeos/file_manager/cws_container_mock/index.html"); |
| std::string origin = url.GetOrigin().spec(); |
| |
| // Removes trailing a slash. |
| if (*origin.rbegin() == '/') |
| origin.resize(origin.length() - 1); |
| |
| const scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); |
| res->SetString("url", url.spec()); |
| res->SetString("origin", origin); |
| base::JSONWriter::Write(res.get(), output); |
| return; |
| } |
| |
| if (name == "addEntries") { |
| // Add entries to the specified volume. |
| base::JSONValueConverter<AddEntriesMessage> add_entries_message_converter; |
| AddEntriesMessage message; |
| ASSERT_TRUE(add_entries_message_converter.Convert(value, &message)); |
| |
| for (size_t i = 0; i < message.entries.size(); ++i) { |
| switch (message.volume) { |
| case LOCAL_VOLUME: |
| local_volume_->CreateEntry(*message.entries[i]); |
| break; |
| case DRIVE_VOLUME: |
| if (drive_volume_.get()) |
| drive_volume_->CreateEntry(*message.entries[i]); |
| break; |
| case USB_VOLUME: |
| if (usb_volume_) |
| usb_volume_->CreateEntry(*message.entries[i]); |
| break; |
| default: |
| NOTREACHED(); |
| break; |
| } |
| } |
| |
| return; |
| } |
| |
| if (name == "mountFakeUsb") { |
| usb_volume_.reset(new FakeTestVolume("fake-usb", |
| VOLUME_TYPE_REMOVABLE_DISK_PARTITION, |
| chromeos::DEVICE_TYPE_USB)); |
| usb_volume_->Mount(profile()); |
| return; |
| } |
| |
| if (name == "mountFakeMtp") { |
| mtp_volume_.reset(new FakeTestVolume("fake-mtp", |
| VOLUME_TYPE_MTP, |
| chromeos::DEVICE_TYPE_UNKNOWN)); |
| ASSERT_TRUE(mtp_volume_->PrepareTestEntries(profile())); |
| |
| mtp_volume_->Mount(profile()); |
| return; |
| } |
| |
| if (name == "useCellularNetwork") { |
| net::NetworkChangeNotifier::NotifyObserversOfConnectionTypeChangeForTests( |
| net::NetworkChangeNotifier::CONNECTION_3G); |
| return; |
| } |
| |
| if (name == "clickNotificationButton") { |
| std::string extension_id; |
| std::string notification_id; |
| int index; |
| ASSERT_TRUE(value.GetString("extensionId", &extension_id)); |
| ASSERT_TRUE(value.GetString("notificationId", ¬ification_id)); |
| ASSERT_TRUE(value.GetInteger("index", &index)); |
| |
| const std::string delegate_id = extension_id + "-" + notification_id; |
| const Notification* notification = g_browser_process-> |
| notification_ui_manager()->FindById(delegate_id, profile()); |
| ASSERT_TRUE(notification); |
| |
| notification->delegate()->ButtonClick(index); |
| return; |
| } |
| |
| FAIL() << "Unknown test message: " << name; |
| } |
| |
| drive::DriveIntegrationService* |
| FileManagerBrowserTestBase::CreateDriveIntegrationService(Profile* profile) { |
| drive_volumes_[profile->GetOriginalProfile()].reset(new DriveTestVolume()); |
| return drive_volumes_[profile->GetOriginalProfile()]-> |
| CreateDriveIntegrationService(profile); |
| } |
| |
| // Parameter of FileManagerBrowserTest. |
| // The second value is the case name of JavaScript. |
| typedef std::tr1::tuple<GuestMode, const char*> TestParameter; |
| |
| // Test fixture class for normal (not multi-profile related) tests. |
| class FileManagerBrowserTest : |
| public FileManagerBrowserTestBase, |
| public ::testing::WithParamInterface<TestParameter> { |
| GuestMode GetGuestModeParam() const override { |
| return std::tr1::get<0>(GetParam()); |
| } |
| const char* GetTestCaseNameParam() const override { |
| return std::tr1::get<1>(GetParam()); |
| } |
| }; |
| |
| IN_PROC_BROWSER_TEST_P(FileManagerBrowserTest, Test) { |
| StartTest(); |
| } |
| |
| // Unlike TEST/TEST_F, which are macros that expand to further macros, |
| // INSTANTIATE_TEST_CASE_P is a macro that expands directly to code that |
| // stringizes the arguments. As a result, macros passed as parameters (such as |
| // prefix or test_case_name) will not be expanded by the preprocessor. To work |
| // around this, indirect the macro for INSTANTIATE_TEST_CASE_P, so that the |
| // pre-processor will expand macros such as MAYBE_test_name before |
| // instantiating the test. |
| #define WRAPPED_INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \ |
| INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Fails on official build. http://crbug.com/429294 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(OFFICIAL_BUILD) || defined(MEMORY_SANITIZER) |
| #define MAYBE_FileDisplay DISABLED_FileDisplay |
| #else |
| #define MAYBE_FileDisplay FileDisplay |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_FileDisplay, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(NOT_IN_GUEST_MODE, "fileDisplayDownloads"), |
| TestParameter(IN_GUEST_MODE, "fileDisplayDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "fileDisplayDrive"), |
| TestParameter(NOT_IN_GUEST_MODE, "fileDisplayMtp"), |
| TestParameter(NOT_IN_GUEST_MODE, "searchNormal"), |
| TestParameter(NOT_IN_GUEST_MODE, "searchCaseInsensitive"), |
| TestParameter(NOT_IN_GUEST_MODE, "searchNotFound"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Fails on official build. http://crbug.com/429294 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(OFFICIAL_BUILD) || defined(MEMORY_SANITIZER) |
| #define MAYBE_OpenVideoFiles DISABLED_OpenVideoFiles |
| #else |
| #define MAYBE_OpenVideoFiles OpenVideoFiles |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_OpenVideoFiles, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(IN_GUEST_MODE, "videoOpenDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "videoOpenDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "videoOpenDrive"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Fails on official build. http://crbug.com/429294 |
| // Disabled under MSAN, ASAN, and LSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(OFFICIAL_BUILD) || \ |
| defined(MEMORY_SANITIZER) || defined(ADDRESS_SANITIZER) || \ |
| defined(LEAK_SANITIZER) |
| #define MAYBE_OpenAudioFiles DISABLED_OpenAudioFiles |
| #else |
| #define MAYBE_OpenAudioFiles OpenAudioFiles |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_OpenAudioFiles, |
| FileManagerBrowserTest, |
| ::testing::Values( |
| TestParameter(IN_GUEST_MODE, "audioOpenDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "audioOpenDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "audioOpenDrive"), |
| TestParameter(NOT_IN_GUEST_MODE, "audioAutoAdvanceDrive"), |
| TestParameter(NOT_IN_GUEST_MODE, "audioRepeatSingleFileDrive"), |
| TestParameter(NOT_IN_GUEST_MODE, "audioNoRepeatSingleFileDrive"), |
| TestParameter(NOT_IN_GUEST_MODE, "audioRepeatMultipleFileDrive"), |
| TestParameter(NOT_IN_GUEST_MODE, "audioNoRepeatMultipleFileDrive"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Fails on official build. http://crbug.com/429294 |
| // Disabled under MSAN, ASAN, and LSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(OFFICIAL_BUILD) || \ |
| defined(MEMORY_SANITIZER) || defined(ADDRESS_SANITIZER) || \ |
| defined(LEAK_SANITIZER) |
| #define MAYBE_OpenImageFiles DISABLED_OpenImageFiles |
| #else |
| #define MAYBE_OpenImageFiles OpenImageFiles |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_OpenImageFiles, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(IN_GUEST_MODE, "imageOpenDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "imageOpenDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "imageOpenDrive"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(OFFICIAL_BUILD) || defined(MEMORY_SANITIZER) |
| #define MAYBE_CreateNewFolder DISABLED_CreateNewFolder |
| #else |
| #define MAYBE_CreateNewFolder CreateNewFolder |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_CreateNewFolder, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(NOT_IN_GUEST_MODE, |
| "createNewFolderAfterSelectFile"), |
| TestParameter(IN_GUEST_MODE, |
| "createNewFolderDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, |
| "createNewFolderDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, |
| "createNewFolderDrive"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Fails on official build. http://crbug.com/429294 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(OFFICIAL_BUILD) || defined(MEMORY_SANITIZER) |
| #define MAYBE_KeyboardOperations DISABLED_KeyboardOperations |
| #else |
| #define MAYBE_KeyboardOperations KeyboardOperations |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_KeyboardOperations, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(IN_GUEST_MODE, "keyboardDeleteDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, |
| "keyboardDeleteDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "keyboardDeleteDrive"), |
| TestParameter(IN_GUEST_MODE, "keyboardCopyDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "keyboardCopyDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "keyboardCopyDrive"), |
| TestParameter(IN_GUEST_MODE, "renameFileDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "renameFileDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "renameFileDrive"), |
| TestParameter(IN_GUEST_MODE, |
| "renameNewDirectoryDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, |
| "renameNewDirectoryDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, |
| "renameNewDirectoryDrive"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Fails on official build. http://crbug.com/429294 |
| // Disabled under MSAN, ASAN, and LSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(OFFICIAL_BUILD) || \ |
| defined(MEMORY_SANITIZER) || defined(ADDRESS_SANITIZER) || \ |
| defined(LEAK_SANITIZER) |
| #define MAYBE_DriveSpecific DISABLED_DriveSpecific |
| #else |
| #define MAYBE_DriveSpecific DriveSpecific |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_DriveSpecific, |
| FileManagerBrowserTest, |
| ::testing::Values( |
| TestParameter(NOT_IN_GUEST_MODE, "openSidebarRecent"), |
| TestParameter(NOT_IN_GUEST_MODE, "openSidebarOffline"), |
| TestParameter(NOT_IN_GUEST_MODE, "openSidebarSharedWithMe"), |
| TestParameter(NOT_IN_GUEST_MODE, "autocomplete"), |
| TestParameter(NOT_IN_GUEST_MODE, "pinFileOnMobileNetwork"), |
| TestParameter(NOT_IN_GUEST_MODE, "clickFirstSearchResult"), |
| TestParameter(NOT_IN_GUEST_MODE, "pressEnterToSearch"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Fails on official build. http://crbug.com/429294 |
| // Disabled under MSAN, ASAN, and LSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(OFFICIAL_BUILD) || \ |
| defined(MEMORY_SANITIZER) || defined(ADDRESS_SANITIZER) || \ |
| defined(LEAK_SANITIZER) |
| #define MAYBE_Transfer DISABLED_Transfer |
| #else |
| #define MAYBE_Transfer Transfer |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_Transfer, |
| FileManagerBrowserTest, |
| ::testing::Values( |
| TestParameter(NOT_IN_GUEST_MODE, "transferFromDriveToDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "transferFromDownloadsToDrive"), |
| TestParameter(NOT_IN_GUEST_MODE, "transferFromSharedToDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "transferFromSharedToDrive"), |
| TestParameter(NOT_IN_GUEST_MODE, "transferFromRecentToDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "transferFromRecentToDrive"), |
| TestParameter(NOT_IN_GUEST_MODE, "transferFromOfflineToDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "transferFromOfflineToDrive"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Fails on official build. http://crbug.com/429294 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(OFFICIAL_BUILD) || defined(MEMORY_SANITIZER) |
| #define MAYBE_RestorePrefs DISABLED_RestorePrefs |
| #else |
| #define MAYBE_RestorePrefs RestorePrefs |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_RestorePrefs, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(IN_GUEST_MODE, "restoreSortColumn"), |
| TestParameter(NOT_IN_GUEST_MODE, "restoreSortColumn"), |
| TestParameter(IN_GUEST_MODE, "restoreCurrentView"), |
| TestParameter(NOT_IN_GUEST_MODE, "restoreCurrentView"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Disabled under MSAN, ASAN, and LSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(MEMORY_SANITIZER) || \ |
| defined(ADDRESS_SANITIZER) || defined(LEAK_SANITIZER) |
| #define MAYBE_ShareDialog DISABLED_ShareDialog |
| #else |
| #define MAYBE_ShareDialog ShareDialog |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_ShareDialog, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(NOT_IN_GUEST_MODE, "shareFile"), |
| TestParameter(NOT_IN_GUEST_MODE, "shareDirectory"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(MEMORY_SANITIZER) |
| #define MAYBE_RestoreGeometry DISABLED_RestoreGeometry |
| #else |
| #define MAYBE_RestoreGeometry RestoreGeometry |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_RestoreGeometry, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(NOT_IN_GUEST_MODE, "restoreGeometry"), |
| TestParameter(IN_GUEST_MODE, "restoreGeometry"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(MEMORY_SANITIZER) |
| #define MAYBE_Traverse DISABLED_Traverse |
| #else |
| #define MAYBE_Traverse Traverse |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_Traverse, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(IN_GUEST_MODE, "traverseDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "traverseDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "traverseDrive"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(MEMORY_SANITIZER) |
| #define MAYBE_SuggestAppDialog DISABLED_SuggestAppDialog |
| #else |
| #define MAYBE_SuggestAppDialog SuggestAppDialog |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_SuggestAppDialog, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(NOT_IN_GUEST_MODE, "suggestAppDialog"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(MEMORY_SANITIZER) |
| #define MAYBE_ExecuteDefaultTaskOnDownloads \ |
| DISABLED_ExecuteDefaultTaskOnDownloads |
| #else |
| #define MAYBE_ExecuteDefaultTaskOnDownloads ExecuteDefaultTaskOnDownloads |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_ExecuteDefaultTaskOnDownloads, |
| FileManagerBrowserTest, |
| ::testing::Values( |
| TestParameter(NOT_IN_GUEST_MODE, "executeDefaultTaskOnDownloads"), |
| TestParameter(IN_GUEST_MODE, "executeDefaultTaskOnDownloads"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(MEMORY_SANITIZER) |
| #define MAYBE_ExecuteDefaultTaskOnDrive DISABLED_ExecuteDefaultTaskOnDrive |
| #else |
| #define MAYBE_ExecuteDefaultTaskOnDrive ExecuteDefaultTaskOnDrive |
| #endif |
| INSTANTIATE_TEST_CASE_P( |
| MAYBE_ExecuteDefaultTaskOnDrive, |
| FileManagerBrowserTest, |
| ::testing::Values( |
| TestParameter(NOT_IN_GUEST_MODE, "executeDefaultTaskOnDrive"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(MEMORY_SANITIZER) |
| #define MAYBE_DefaultActionDialog DISABLED_DefaultActionDialog |
| #else |
| #define MAYBE_DefaultActionDialog DefaultActionDialog |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_DefaultActionDialog, |
| FileManagerBrowserTest, |
| ::testing::Values( |
| TestParameter(NOT_IN_GUEST_MODE, "defaultActionDialogOnDownloads"), |
| TestParameter(IN_GUEST_MODE, "defaultActionDialogOnDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "defaultActionDialogOnDrive"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(MEMORY_SANITIZER) |
| #define MAYBE_GenericTask DISABLED_GenericTask |
| #else |
| #define MAYBE_GenericTask GenericTask |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_GenericTask, |
| FileManagerBrowserTest, |
| ::testing::Values( |
| TestParameter(NOT_IN_GUEST_MODE, "genericTaskIsNotExecuted"), |
| TestParameter(NOT_IN_GUEST_MODE, "genericAndNonGenericTasksAreMixed"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(MEMORY_SANITIZER) |
| #define MAYBE_FolderShortcuts DISABLED_FolderShortcuts |
| #else |
| #define MAYBE_FolderShortcuts FolderShortcuts |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_FolderShortcuts, |
| FileManagerBrowserTest, |
| ::testing::Values( |
| TestParameter(NOT_IN_GUEST_MODE, "traverseFolderShortcuts"), |
| TestParameter(NOT_IN_GUEST_MODE, "addRemoveFolderShortcuts"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Fails on official build. http://crbug.com/429294 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(OFFICIAL_BUILD) || defined(MEMORY_SANITIZER) |
| #define MAYBE_SortColumns DISABLED_SortColumns |
| #else |
| #define MAYBE_SortColumns SortColumns |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_SortColumns, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(NOT_IN_GUEST_MODE, "sortColumns"), |
| TestParameter(IN_GUEST_MODE, "sortColumns"))); |
| |
| INSTANTIATE_TEST_CASE_P( |
| TabIndex, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(NOT_IN_GUEST_MODE, "searchBoxFocus"))); |
| |
| INSTANTIATE_TEST_CASE_P(TabindexFocus, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(NOT_IN_GUEST_MODE, |
| "tabindexFocus"))); |
| |
| INSTANTIATE_TEST_CASE_P( |
| TabindexFocusDownloads, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(NOT_IN_GUEST_MODE, |
| "tabindexFocusDownloads"), |
| TestParameter(IN_GUEST_MODE, "tabindexFocusDownloads"))); |
| |
| // http://crbug.com/469061 |
| INSTANTIATE_TEST_CASE_P( |
| DISABLED_TabindexFocusDirectorySelected, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(NOT_IN_GUEST_MODE, |
| "tabindexFocusDirectorySelected"))); |
| |
| // http://crbug.com/480491 |
| INSTANTIATE_TEST_CASE_P( |
| DISABLED_TabindexOpenDialog, |
| FileManagerBrowserTest, |
| ::testing::Values( |
| TestParameter(NOT_IN_GUEST_MODE, "tabindexOpenDialogDrive"), |
| TestParameter(NOT_IN_GUEST_MODE, "tabindexOpenDialogDownloads"), |
| TestParameter(IN_GUEST_MODE, "tabindexOpenDialogDownloads"))); |
| |
| // Fails on official build. http://crbug.com/429294 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(OFFICIAL_BUILD) || defined(MEMORY_SANITIZER) |
| #define MAYBE_OpenFileDialog DISABLED_OpenFileDialog |
| #else |
| #define MAYBE_OpenFileDialog OpenFileDialog |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_OpenFileDialog, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(NOT_IN_GUEST_MODE, |
| "openFileDialogOnDownloads"), |
| TestParameter(IN_GUEST_MODE, |
| "openFileDialogOnDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, |
| "openFileDialogOnDrive"), |
| TestParameter(IN_INCOGNITO, |
| "openFileDialogOnDownloads"), |
| TestParameter(IN_INCOGNITO, |
| "openFileDialogOnDrive"), |
| TestParameter(NOT_IN_GUEST_MODE, |
| "unloadFileDialog"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(MEMORY_SANITIZER) |
| #define MAYBE_CopyBetweenWindows DISABLED_CopyBetweenWindows |
| #else |
| #define MAYBE_CopyBetweenWindows CopyBetweenWindows |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_CopyBetweenWindows, |
| FileManagerBrowserTest, |
| ::testing::Values( |
| TestParameter(NOT_IN_GUEST_MODE, "copyBetweenWindowsLocalToDrive"), |
| TestParameter(NOT_IN_GUEST_MODE, "copyBetweenWindowsLocalToUsb"), |
| TestParameter(NOT_IN_GUEST_MODE, "copyBetweenWindowsUsbToDrive"), |
| TestParameter(NOT_IN_GUEST_MODE, "copyBetweenWindowsDriveToLocal"), |
| TestParameter(NOT_IN_GUEST_MODE, "copyBetweenWindowsDriveToUsb"), |
| TestParameter(NOT_IN_GUEST_MODE, "copyBetweenWindowsUsbToLocal"))); |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(MEMORY_SANITIZER) |
| #define MAYBE_ShowGridView DISABLED_ShowGridView |
| #else |
| #define MAYBE_ShowGridView ShowGridView |
| #endif |
| WRAPPED_INSTANTIATE_TEST_CASE_P( |
| MAYBE_ShowGridView, |
| FileManagerBrowserTest, |
| ::testing::Values(TestParameter(NOT_IN_GUEST_MODE, "showGridViewDownloads"), |
| TestParameter(IN_GUEST_MODE, "showGridViewDownloads"), |
| TestParameter(NOT_IN_GUEST_MODE, "showGridViewDrive"))); |
| |
| // Structure to describe an account info. |
| struct TestAccountInfo { |
| const char* const gaia_id; |
| const char* const email; |
| const char* const hash; |
| const char* const display_name; |
| }; |
| |
| enum { |
| DUMMY_ACCOUNT_INDEX = 0, |
| PRIMARY_ACCOUNT_INDEX = 1, |
| SECONDARY_ACCOUNT_INDEX_START = 2, |
| }; |
| |
| static const TestAccountInfo kTestAccounts[] = { |
| {"gaia-id-d", "__dummy__@invalid.domain", "hashdummy", "Dummy Account"}, |
| {"gaia-id-a", "alice@invalid.domain", "hashalice", "Alice"}, |
| {"gaia-id-b", "bob@invalid.domain", "hashbob", "Bob"}, |
| {"gaia-id-c", "charlie@invalid.domain", "hashcharlie", "Charlie"}, |
| }; |
| |
| // Test fixture class for testing multi-profile features. |
| class MultiProfileFileManagerBrowserTest : public FileManagerBrowserTestBase { |
| protected: |
| // Enables multi-profiles. |
| void SetUpCommandLine(base::CommandLine* command_line) override { |
| FileManagerBrowserTestBase::SetUpCommandLine(command_line); |
| // Logs in to a dummy profile (For making MultiProfileWindowManager happy; |
| // browser test creates a default window and the manager tries to assign a |
| // user for it, and we need a profile connected to a user.) |
| command_line->AppendSwitchASCII(chromeos::switches::kLoginUser, |
| kTestAccounts[DUMMY_ACCOUNT_INDEX].email); |
| command_line->AppendSwitchASCII(chromeos::switches::kLoginProfile, |
| kTestAccounts[DUMMY_ACCOUNT_INDEX].hash); |
| } |
| |
| // Logs in to the primary profile of this test. |
| void SetUpOnMainThread() override { |
| const TestAccountInfo& info = kTestAccounts[PRIMARY_ACCOUNT_INDEX]; |
| |
| AddUser(info, true); |
| FileManagerBrowserTestBase::SetUpOnMainThread(); |
| } |
| |
| // Loads all users to the current session and sets up necessary fields. |
| // This is used for preparing all accounts in PRE_ test setup, and for testing |
| // actual login behavior. |
| void AddAllUsers() { |
| for (size_t i = 0; i < arraysize(kTestAccounts); ++i) |
| AddUser(kTestAccounts[i], i >= SECONDARY_ACCOUNT_INDEX_START); |
| } |
| |
| // Returns primary profile (if it is already created.) |
| Profile* profile() override { |
| Profile* const profile = chromeos::ProfileHelper::GetProfileByUserIdHash( |
| kTestAccounts[PRIMARY_ACCOUNT_INDEX].hash); |
| return profile ? profile : FileManagerBrowserTestBase::profile(); |
| } |
| |
| // Sets the test case name (used as a function name in test_cases.js to call.) |
| void set_test_case_name(const std::string& name) { test_case_name_ = name; } |
| |
| // Adds a new user for testing to the current session. |
| void AddUser(const TestAccountInfo& info, bool log_in) { |
| user_manager::UserManager* const user_manager = |
| user_manager::UserManager::Get(); |
| if (log_in) |
| user_manager->UserLoggedIn(info.email, info.hash, false); |
| user_manager->SaveUserDisplayName(info.email, |
| base::UTF8ToUTF16(info.display_name)); |
| SigninManagerFactory::GetForProfile( |
| chromeos::ProfileHelper::GetProfileByUserIdHash(info.hash)) |
| ->SetAuthenticatedAccountInfo(info.gaia_id, info.email); |
| } |
| |
| private: |
| GuestMode GetGuestModeParam() const override { return NOT_IN_GUEST_MODE; } |
| |
| const char* GetTestCaseNameParam() const override { |
| return test_case_name_.c_str(); |
| } |
| |
| std::string test_case_name_; |
| }; |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Fails on official build. http://crbug.com/429294 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(OFFICIAL_BUILD) || defined(MEMORY_SANITIZER) |
| #define MAYBE_PRE_BasicDownloads DISABLED_PRE_BasicDownloads |
| #define MAYBE_BasicDownloads DISABLED_BasicDownloads |
| #else |
| #define MAYBE_PRE_BasicDownloads PRE_BasicDownloads |
| #define MAYBE_BasicDownloads BasicDownloads |
| #endif |
| IN_PROC_BROWSER_TEST_F(MultiProfileFileManagerBrowserTest, |
| MAYBE_PRE_BasicDownloads) { |
| AddAllUsers(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(MultiProfileFileManagerBrowserTest, |
| MAYBE_BasicDownloads) { |
| AddAllUsers(); |
| |
| // Sanity check that normal operations work in multi-profile setting as well. |
| set_test_case_name("keyboardCopyDownloads"); |
| StartTest(); |
| } |
| |
| // Slow tests are disabled on debug build. http://crbug.com/327719 |
| // Fails on official build. http://crbug.com/429294 |
| // Disabled under MSAN as well. http://crbug.com/468980. |
| #if !defined(NDEBUG) || defined(OFFICIAL_BUILD) || defined(MEMORY_SANITIZER) |
| #define MAYBE_PRE_BasicDrive DISABLED_PRE_BasicDrive |
| #define MAYBE_BasicDrive DISABLED_BasicDrive |
| #else |
| #define MAYBE_PRE_BasicDrive PRE_BasicDrive |
| #define MAYBE_BasicDrive BasicDrive |
| #endif |
| IN_PROC_BROWSER_TEST_F(MultiProfileFileManagerBrowserTest, |
| MAYBE_PRE_BasicDrive) { |
| AddAllUsers(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(MultiProfileFileManagerBrowserTest, MAYBE_BasicDrive) { |
| AddAllUsers(); |
| |
| // Sanity check that normal operations work in multi-profile setting as well. |
| set_test_case_name("keyboardCopyDrive"); |
| StartTest(); |
| } |
| |
| template<GuestMode M> |
| class GalleryBrowserTestBase : public FileManagerBrowserTestBase { |
| public: |
| GuestMode GetGuestModeParam() const override { return M; } |
| const char* GetTestCaseNameParam() const override { |
| return test_case_name_.c_str(); |
| } |
| |
| protected: |
| const char* GetTestManifestName() const override { |
| return "gallery_test_manifest.json"; |
| } |
| |
| void set_test_case_name(const std::string& name) { |
| test_case_name_ = name; |
| } |
| |
| private: |
| base::ListValue scripts_; |
| std::string test_case_name_; |
| }; |
| |
| typedef GalleryBrowserTestBase<NOT_IN_GUEST_MODE> GalleryBrowserTest; |
| typedef GalleryBrowserTestBase<IN_GUEST_MODE> GalleryBrowserTestInGuestMode; |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, OpenSingleImageOnDownloads) { |
| set_test_case_name("openSingleImageOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTestInGuestMode, |
| OpenSingleImageOnDownloads) { |
| set_test_case_name("openSingleImageOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, OpenSingleImageOnDrive) { |
| set_test_case_name("openSingleImageOnDrive"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, OpenMultipleImagesOnDownloads) { |
| set_test_case_name("openMultipleImagesOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTestInGuestMode, |
| OpenMultipleImagesOnDownloads) { |
| set_test_case_name("openMultipleImagesOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, OpenMultipleImagesOnDrive) { |
| set_test_case_name("openMultipleImagesOnDrive"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, TraverseSlideImagesOnDownloads) { |
| set_test_case_name("traverseSlideImagesOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTestInGuestMode, |
| TraverseSlideImagesOnDownloads) { |
| set_test_case_name("traverseSlideImagesOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, TraverseSlideImagesOnDrive) { |
| set_test_case_name("traverseSlideImagesOnDrive"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, RenameImageOnDownloads) { |
| set_test_case_name("renameImageOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTestInGuestMode, |
| RenameImageOnDownloads) { |
| set_test_case_name("renameImageOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, RenameImageOnDrive) { |
| set_test_case_name("renameImageOnDrive"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, DeleteImageOnDownloads) { |
| set_test_case_name("deleteImageOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTestInGuestMode, |
| DeleteImageOnDownloads) { |
| set_test_case_name("deleteImageOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, DeleteImageOnDrive) { |
| set_test_case_name("deleteImageOnDrive"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, RotateImageOnDownloads) { |
| set_test_case_name("rotateImageOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTestInGuestMode, |
| RotateImageOnDownloads) { |
| set_test_case_name("rotateImageOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, RotateImageOnDrive) { |
| set_test_case_name("rotateImageOnDrive"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, CropImageOnDownloads) { |
| set_test_case_name("cropImageOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTestInGuestMode, |
| CropImageOnDownloads) { |
| set_test_case_name("cropImageOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, CropImageOnDrive) { |
| set_test_case_name("cropImageOnDrive"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, ExposureImageOnDownloads) { |
| set_test_case_name("exposureImageOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTestInGuestMode, |
| ExposureImageOnDownloads) { |
| set_test_case_name("exposureImageOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, ExposureImageOnDrive) { |
| set_test_case_name("exposureImageOnDrive"); |
| StartTest(); |
| } |
| |
| template<GuestMode M> |
| class VideoPlayerBrowserTestBase : public FileManagerBrowserTestBase { |
| public: |
| GuestMode GetGuestModeParam() const override { return M; } |
| const char* GetTestCaseNameParam() const override { |
| return test_case_name_.c_str(); |
| } |
| |
| protected: |
| void SetUpCommandLine(base::CommandLine* command_line) override { |
| command_line->AppendSwitch( |
| chromeos::switches::kEnableVideoPlayerChromecastSupport); |
| FileManagerBrowserTestBase::SetUpCommandLine(command_line); |
| } |
| |
| const char* GetTestManifestName() const override { |
| return "video_player_test_manifest.json"; |
| } |
| |
| void set_test_case_name(const std::string& name) { |
| test_case_name_ = name; |
| } |
| |
| private: |
| std::string test_case_name_; |
| }; |
| |
| typedef VideoPlayerBrowserTestBase<NOT_IN_GUEST_MODE> VideoPlayerBrowserTest; |
| typedef VideoPlayerBrowserTestBase<IN_GUEST_MODE> |
| VideoPlayerBrowserTestInGuestMode; |
| |
| IN_PROC_BROWSER_TEST_F(VideoPlayerBrowserTest, OpenSingleVideoOnDownloads) { |
| set_test_case_name("openSingleVideoOnDownloads"); |
| StartTest(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(VideoPlayerBrowserTest, OpenSingleVideoOnDrive) { |
| set_test_case_name("openSingleVideoOnDrive"); |
| StartTest(); |
| } |
| |
| } // namespace |
| } // namespace file_manager |