This source file includes following definitions.
- MapStringToEntryType
- MapStringToSharedOption
- MapStringToTargetVolume
- MapStringToTime
- RegisterJSONConverter
- RegisterJSONConverter
- CreateRootDirectory
- name
- root_path
- CreateEntry
- UpdateModifiedTime
- Mount
- Mount
- integration_service_
- CreateEntry
- CreateDirectory
- CreateFile
- CheckForUpdates
- ConfigureShareUrlBase
- CreateDriveIntegrationService
- GetNextMessage
- Observe
- SetUpInProcessBrowserTestFixture
- SetUpOnMainThread
- SetUpCommandLine
- StartTest
- OnMessage
- CreateDriveIntegrationService
- GetGuestModeParam
- GetTestCaseNameParam
- IN_PROC_BROWSER_TEST_P
- SetUpCommandLine
- SetUpOnMainThread
- AddAllUsers
- AddExtraUsersForStressTesting
- profile
- set_test_case_name
- AddUser
- GetGuestModeParam
- GetTestCaseNameParam
- OnMessage
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
#include <deque>
#include <string>
#include "apps/app_window.h"
#include "apps/app_window_registry.h"
#include "ash/session_state_delegate.h"
#include "ash/shell.h"
#include "base/bind.h"
#include "base/callback.h"
#include "base/file_util.h"
#include "base/files/file_path.h"
#include "base/json/json_reader.h"
#include "base/json/json_value_converter.h"
#include "base/json/json_writer.h"
#include "base/prefs/pref_service.h"
#include "base/strings/string_piece.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_notification_types.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/login/user_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/extensions/extension_test_message_listener.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.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 "content/public/browser/browser_context.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/common/extension.h"
#include "google_apis/drive/gdata_wapi_parser.h"
#include "google_apis/drive/test_util.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "webkit/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,
};
std::ostream& operator<<(std::ostream& os, const GuestMode& guest_mode) {
return os << (guest_mode == IN_GUEST_MODE ?
"IN_GUEST_MODE" : "NOT_IN_GUEST_MODE");
}
bool MapStringToEntryType(const base::StringPiece& value, EntryType* output) {
if (value == "file")
*output = FILE;
else if (value == "directory")
*output = DIRECTORY;
else
return false;
return true;
}
bool MapStringToSharedOption(const base::StringPiece& value,
SharedOption* output) {
if (value == "shared")
*output = SHARED;
else if (value == "none")
*output = NONE;
else
return false;
return true;
}
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;
}
bool MapStringToTime(const base::StringPiece& value, base::Time* time) {
return base::Time::FromString(value.as_string().c_str(), time);
}
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;
std::string target_path;
std::string mime_type;
SharedOption shared_option;
base::Time last_modified_time;
static void RegisterJSONConverter(
base::JSONValueConverter<TestEntryInfo>* converter);
};
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);
}
struct AddEntriesMessage {
TargetVolume volume;
ScopedVector<TestEntryInfo> entries;
static void RegisterJSONConverter(
base::JSONValueConverter<AddEntriesMessage>* converter);
};
void AddEntriesMessage::RegisterJSONConverter(
base::JSONValueConverter<AddEntriesMessage>* converter) {
converter->RegisterCustomField("volume",
&AddEntriesMessage::volume,
&MapStringToTargetVolume);
converter->RegisterRepeatedMessage<TestEntryInfo>(
"entries",
&AddEntriesMessage::entries);
}
class TestVolume {
protected:
explicit TestVolume(const std::string& name) : name_(name) {}
virtual ~TestVolume() {}
bool CreateRootDirectory(const Profile* profile) {
return root_.Set(profile->GetPath().Append(name_));
}
const std::string& name() { return name_; }
const base::FilePath root_path() { return root_.path(); }
private:
std::string name_;
base::ScopedTempDir root_;
};
class LocalTestVolume : public TestVolume {
public:
explicit LocalTestVolume(const std::string& name) : TestVolume(name) {}
virtual ~LocalTestVolume() {}
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:
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;
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") {}
virtual ~DownloadsTestVolume() {}
virtual bool Mount(Profile* profile) OVERRIDE {
return CreateRootDirectory(profile) &&
VolumeManager::Get(profile)
->RegisterDownloadsDirectoryForTesting(root_path());
}
};
class FakeUsbTestVolume : public LocalTestVolume {
public:
FakeUsbTestVolume() : LocalTestVolume("fake-usb") {}
virtual ~FakeUsbTestVolume() {}
virtual bool Mount(Profile* profile) OVERRIDE {
if (!CreateRootDirectory(profile))
return false;
fileapi::ExternalMountPoints* const mount_points =
fileapi::ExternalMountPoints::GetSystemInstance();
mount_points->RevokeFileSystem(name());
const bool result =
mount_points->RegisterFileSystem(name(),
fileapi::kFileSystemTypeNativeLocal,
fileapi::FileSystemMountOption(),
root_path());
if (!result)
return false;
VolumeManager::Get(profile)
->AddVolumeInfoForTesting(root_path(),
VOLUME_TYPE_REMOVABLE_DISK_PARTITION,
chromeos::DEVICE_TYPE_USB);
return true;
}
};
class DriveTestVolume : public TestVolume {
public:
DriveTestVolume() : TestVolume("drive"), integration_service_(NULL) {}
virtual ~DriveTestVolume() {}
void CreateEntry(const TestEntryInfo& entry) {
const base::FilePath path =
base::FilePath::FromUTF8Unsafe(entry.target_path);
const std::string target_name = path.BaseName().AsUTF8Unsafe();
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));
drive::test_util::RunBlockingPoolTask();
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;
}
}
void CreateDirectory(const std::string& parent_id,
const std::string& target_name,
const base::Time& modification_time) {
google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR;
scoped_ptr<google_apis::ResourceEntry> resource_entry;
fake_drive_service_->AddNewDirectory(
parent_id,
target_name,
drive::DriveServiceInterface::AddNewDirectoryOptions(),
google_apis::test_util::CreateCopyResultCallback(&error,
&resource_entry));
base::MessageLoop::current()->RunUntilIdle();
ASSERT_EQ(google_apis::HTTP_CREATED, error);
ASSERT_TRUE(resource_entry);
fake_drive_service_->SetLastModifiedTime(
resource_entry->resource_id(),
modification_time,
google_apis::test_util::CreateCopyResultCallback(&error,
&resource_entry));
base::MessageLoop::current()->RunUntilIdle();
ASSERT_TRUE(error == google_apis::HTTP_SUCCESS);
ASSERT_TRUE(resource_entry);
CheckForUpdates();
}
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::GDataErrorCode error = google_apis::GDATA_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::ResourceEntry> resource_entry;
fake_drive_service_->AddNewFile(
mime_type,
content_data,
parent_id,
target_name,
shared_with_me,
google_apis::test_util::CreateCopyResultCallback(&error,
&resource_entry));
base::MessageLoop::current()->RunUntilIdle();
ASSERT_EQ(google_apis::HTTP_CREATED, error);
ASSERT_TRUE(resource_entry);
fake_drive_service_->SetLastModifiedTime(
resource_entry->resource_id(),
modification_time,
google_apis::test_util::CreateCopyResultCallback(&error,
&resource_entry));
base::MessageLoop::current()->RunUntilIdle();
ASSERT_EQ(google_apis::HTTP_SUCCESS, error);
ASSERT_TRUE(resource_entry);
CheckForUpdates();
}
void CheckForUpdates() {
if (integration_service_ && integration_service_->file_system()) {
integration_service_->file_system()->CheckForUpdates();
}
}
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_;
};
class FileManagerTestListener : public content::NotificationObserver {
public:
struct Message {
int type;
std::string message;
scoped_refptr<extensions::TestSendMessageFunction> function;
};
FileManagerTestListener() {
registrar_.Add(this,
chrome::NOTIFICATION_EXTENSION_TEST_PASSED,
content::NotificationService::AllSources());
registrar_.Add(this,
chrome::NOTIFICATION_EXTENSION_TEST_FAILED,
content::NotificationService::AllSources());
registrar_.Add(this,
chrome::NOTIFICATION_EXTENSION_TEST_MESSAGE,
content::NotificationService::AllSources());
}
Message GetNextMessage() {
if (messages_.empty())
content::RunMessageLoop();
const Message entry = messages_.front();
messages_.pop_front();
return entry;
}
virtual void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE {
Message entry;
entry.type = type;
entry.message = type != chrome::NOTIFICATION_EXTENSION_TEST_PASSED ?
*content::Details<std::string>(details).ptr() :
std::string();
entry.function = type == chrome::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_;
};
class FileManagerBrowserTestBase : public ExtensionApiTest {
protected:
virtual void SetUpInProcessBrowserTestFixture() OVERRIDE;
virtual void SetUpOnMainThread() OVERRIDE;
virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE;
void StartTest();
virtual GuestMode GetGuestModeParam() const = 0;
virtual const char* GetTestCaseNameParam() const = 0;
virtual std::string OnMessage(const std::string& name,
const base::Value* value);
scoped_ptr<LocalTestVolume> local_volume_;
linked_ptr<DriveTestVolume> drive_volume_;
std::map<Profile*, linked_ptr<DriveTestVolume> > drive_volumes_;
scoped_ptr<LocalTestVolume> usb_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) {
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()];
drive_volume_->ConfigureShareUrlBase(share_url_base);
test_util::WaitUntilDriveMountPointIsAdded(profile());
}
}
void FileManagerBrowserTestBase::SetUpCommandLine(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);
}
ExtensionApiTest::SetUpCommandLine(command_line);
}
void FileManagerBrowserTestBase::StartTest() {
base::FilePath path = test_data_dir_.AppendASCII("file_manager_browsertest");
const extensions::Extension* extension = LoadExtensionAsComponent(path);
ASSERT_TRUE(extension);
FileManagerTestListener listener;
while (true) {
FileManagerTestListener::Message entry = listener.GetNextMessage();
if (entry.type == chrome::NOTIFICATION_EXTENSION_TEST_PASSED) {
break;
} else if (entry.type == chrome::NOTIFICATION_EXTENSION_TEST_FAILED) {
ADD_FAILURE() << entry.message;
break;
}
const scoped_ptr<const base::Value> value(
base::JSONReader::Read(entry.message));
const base::DictionaryValue* message_dictionary = NULL;
std::string name;
if (!value || !value->GetAsDictionary(&message_dictionary) ||
!message_dictionary->GetString("name", &name))
continue;
entry.function->Reply(OnMessage(name, value.get()));
}
}
std::string FileManagerBrowserTestBase::OnMessage(const std::string& name,
const base::Value* value) {
if (name == "getTestName") {
return GetTestCaseNameParam();
} else if (name == "getRootPaths") {
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");
std::string jsonString;
base::JSONWriter::Write(res.get(), &jsonString);
return jsonString;
} else if (name == "isInGuestMode") {
return GetGuestModeParam() ? "true" : "false";
} else if (name == "getCwsWidgetContainerMockUrl") {
const GURL url = embedded_test_server()->GetURL(
"/chromeos/file_manager/cws_container_mock/index.html");
std::string origin = url.GetOrigin().spec();
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);
std::string jsonString;
base::JSONWriter::Write(res.get(), &jsonString);
return jsonString;
} else if (name == "addEntries") {
base::JSONValueConverter<AddEntriesMessage> add_entries_message_converter;
AddEntriesMessage message;
if (!add_entries_message_converter.Convert(*value, &message))
return "onError";
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 "onEntryAdded";
} else if (name == "mountFakeUsb") {
usb_volume_.reset(new FakeUsbTestVolume());
usb_volume_->Mount(profile());
return "true";
}
return "unknownMessage";
}
drive::DriveIntegrationService*
FileManagerBrowserTestBase::CreateDriveIntegrationService(Profile* profile) {
drive_volumes_[profile].reset(new DriveTestVolume());
return drive_volumes_[profile]->CreateDriveIntegrationService(profile);
}
typedef std::tr1::tuple<GuestMode, const char*> TestParameter;
class FileManagerBrowserTest :
public FileManagerBrowserTestBase,
public ::testing::WithParamInterface<TestParameter> {
virtual GuestMode GetGuestModeParam() const OVERRIDE {
return std::tr1::get<0>(GetParam());
}
virtual const char* GetTestCaseNameParam() const OVERRIDE {
return std::tr1::get<1>(GetParam());
}
};
IN_PROC_BROWSER_TEST_P(FileManagerBrowserTest, Test) {
StartTest();
}
INSTANTIATE_TEST_CASE_P(
FileDisplay,
FileManagerBrowserTest,
::testing::Values(TestParameter(NOT_IN_GUEST_MODE, "fileDisplayDownloads"),
TestParameter(IN_GUEST_MODE, "fileDisplayDownloads"),
TestParameter(NOT_IN_GUEST_MODE, "fileDisplayDrive")));
INSTANTIATE_TEST_CASE_P(
OpenSpecialTypes,
FileManagerBrowserTest,
::testing::Values(TestParameter(IN_GUEST_MODE, "galleryOpenDownloads"),
TestParameter(NOT_IN_GUEST_MODE, "galleryOpenDownloads"),
TestParameter(NOT_IN_GUEST_MODE, "galleryOpenDrive"),
TestParameter(IN_GUEST_MODE, "zipOpenDownloads"),
TestParameter(NOT_IN_GUEST_MODE, "zipOpenDownloads")));
INSTANTIATE_TEST_CASE_P(
OpenVideoFiles,
FileManagerBrowserTest,
::testing::Values(TestParameter(IN_GUEST_MODE, "videoOpenDownloads"),
TestParameter(NOT_IN_GUEST_MODE, "videoOpenDownloads"),
TestParameter(NOT_IN_GUEST_MODE, "videoOpenDrive")));
INSTANTIATE_TEST_CASE_P(
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")));
INSTANTIATE_TEST_CASE_P(
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,
"createNewFolderDownloads"),
TestParameter(NOT_IN_GUEST_MODE,
"createNewFolderDownloads"),
TestParameter(NOT_IN_GUEST_MODE,
"createNewFolderDrive")));
INSTANTIATE_TEST_CASE_P(
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")));
INSTANTIATE_TEST_CASE_P(
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")));
INSTANTIATE_TEST_CASE_P(
HideSearchBox,
FileManagerBrowserTest,
::testing::Values(TestParameter(IN_GUEST_MODE, "hideSearchBox"),
TestParameter(NOT_IN_GUEST_MODE, "hideSearchBox")));
INSTANTIATE_TEST_CASE_P(
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")));
INSTANTIATE_TEST_CASE_P(
ShareDialog,
FileManagerBrowserTest,
::testing::Values(TestParameter(NOT_IN_GUEST_MODE, "shareFile"),
TestParameter(NOT_IN_GUEST_MODE, "shareDirectory")));
INSTANTIATE_TEST_CASE_P(
RestoreGeometry,
FileManagerBrowserTest,
::testing::Values(TestParameter(NOT_IN_GUEST_MODE, "restoreGeometry"),
TestParameter(IN_GUEST_MODE, "restoreGeometry")));
INSTANTIATE_TEST_CASE_P(
Traverse,
FileManagerBrowserTest,
::testing::Values(TestParameter(IN_GUEST_MODE, "traverseDownloads"),
TestParameter(NOT_IN_GUEST_MODE, "traverseDownloads"),
TestParameter(NOT_IN_GUEST_MODE, "traverseDrive")));
INSTANTIATE_TEST_CASE_P(
SuggestAppDialog,
FileManagerBrowserTest,
::testing::Values(TestParameter(NOT_IN_GUEST_MODE, "suggestAppDialog")));
INSTANTIATE_TEST_CASE_P(
ExecuteDefaultTaskOnDownloads,
FileManagerBrowserTest,
::testing::Values(
TestParameter(NOT_IN_GUEST_MODE, "executeDefaultTaskOnDownloads"),
TestParameter(IN_GUEST_MODE, "executeDefaultTaskOnDownloads")));
INSTANTIATE_TEST_CASE_P(
ExecuteDefaultTaskOnDrive,
FileManagerBrowserTest,
::testing::Values(
TestParameter(NOT_IN_GUEST_MODE, "executeDefaultTaskOnDrive")));
INSTANTIATE_TEST_CASE_P(
NavigationList,
FileManagerBrowserTest,
::testing::Values(TestParameter(NOT_IN_GUEST_MODE,
"traverseNavigationList")));
INSTANTIATE_TEST_CASE_P(
TabIndex,
FileManagerBrowserTest,
::testing::Values(TestParameter(NOT_IN_GUEST_MODE, "searchBoxFocus")));
INSTANTIATE_TEST_CASE_P(
Thumbnails,
FileManagerBrowserTest,
::testing::Values(TestParameter(NOT_IN_GUEST_MODE, "thumbnailsDownloads"),
TestParameter(IN_GUEST_MODE, "thumbnailsDownloads")));
INSTANTIATE_TEST_CASE_P(
CopyBetweenWindows,
FileManagerBrowserTest,
::testing::Values(
TestParameter(NOT_IN_GUEST_MODE, "copyBetweenWindowsLocalToDrive"),
TestParameter(NOT_IN_GUEST_MODE, "copyBetweenWindowsLocalToUsb"),
TestParameter(NOT_IN_GUEST_MODE, "copyBetweenWindowsUsbToDrive")));
struct TestAccountInfo {
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[] = {
{"__dummy__@invalid.domain", "hashdummy", "Dummy Account"},
{"alice@invalid.domain", "hashalice", "Alice"},
{"bob@invalid.domain", "hashbob", "Bob"},
{"charlie@invalid.domain", "hashcharlie", "Charlie"},
};
class MultiProfileFileManagerBrowserTest : public FileManagerBrowserTestBase {
protected:
virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
FileManagerBrowserTestBase::SetUpCommandLine(command_line);
command_line->AppendSwitch(switches::kMultiProfiles);
command_line->AppendSwitchASCII(chromeos::switches::kLoginUser,
kTestAccounts[DUMMY_ACCOUNT_INDEX].email);
command_line->AppendSwitchASCII(chromeos::switches::kLoginProfile,
kTestAccounts[DUMMY_ACCOUNT_INDEX].hash);
}
virtual void SetUpOnMainThread() OVERRIDE {
const TestAccountInfo& info = kTestAccounts[PRIMARY_ACCOUNT_INDEX];
AddUser(info, true);
chromeos::UserManager* const user_manager = chromeos::UserManager::Get();
if (user_manager->GetActiveUser() != user_manager->FindUser(info.email))
chromeos::UserManager::Get()->SwitchActiveUser(info.email);
FileManagerBrowserTestBase::SetUpOnMainThread();
}
void AddAllUsers() {
for (size_t i = 0; i < arraysize(kTestAccounts); ++i)
AddUser(kTestAccounts[i], i >= SECONDARY_ACCOUNT_INDEX_START);
}
void AddExtraUsersForStressTesting() {
ash::Shell* const shell = ash::Shell::GetInstance();
const size_t maxLogin =
shell->session_state_delegate()->GetMaximumNumberOfLoggedInUsers();
for (int i = 0; i + arraysize(kTestAccounts) < maxLogin; ++i) {
const std::string email = base::StringPrintf("user%d@invalid.domain", i);
const std::string hash = base::StringPrintf("hashuser%d", i);
const std::string name = base::StringPrintf("Additional User %d", i);
const TestAccountInfo info = {email.c_str(), hash.c_str(), name.c_str()};
AddUser(info, true);
}
}
virtual Profile* profile() OVERRIDE {
Profile* const profile = chromeos::ProfileHelper::GetProfileByUserIdHash(
kTestAccounts[PRIMARY_ACCOUNT_INDEX].hash);
return profile ? profile : FileManagerBrowserTestBase::profile();
}
void set_test_case_name(const std::string& name) { test_case_name_ = name; }
void AddUser(const TestAccountInfo& info, bool log_in) {
chromeos::UserManager* const user_manager = chromeos::UserManager::Get();
if (log_in)
user_manager->UserLoggedIn(info.email, info.hash, false);
user_manager->SaveUserDisplayName(info.email,
base::UTF8ToUTF16(info.display_name));
chromeos::ProfileHelper::GetProfileByUserIdHash(info.hash)->GetPrefs()->
SetString(prefs::kGoogleServicesUsername, info.email);
}
private:
virtual GuestMode GetGuestModeParam() const OVERRIDE {
return NOT_IN_GUEST_MODE;
}
virtual const char* GetTestCaseNameParam() const OVERRIDE {
return test_case_name_.c_str();
}
virtual std::string OnMessage(const std::string& name,
const base::Value* value) OVERRIDE {
if (name == "addAllUsers") {
AddAllUsers();
return "true";
} else if (name == "getWindowOwnerId") {
chrome::MultiUserWindowManager* const window_manager =
chrome::MultiUserWindowManager::GetInstance();
apps::AppWindowRegistry* const app_window_registry =
apps::AppWindowRegistry::Get(profile());
DCHECK(window_manager);
DCHECK(app_window_registry);
const apps::AppWindowRegistry::AppWindowList& list =
app_window_registry->GetAppWindowsForApp(
file_manager::kFileManagerAppId);
return list.size() == 1u ?
window_manager->GetUserPresentingWindow(
list.front()->GetNativeWindow()) : "";
}
return FileManagerBrowserTestBase::OnMessage(name, value);
}
std::string test_case_name_;
};
IN_PROC_BROWSER_TEST_F(MultiProfileFileManagerBrowserTest, PRE_BasicDownloads) {
AddAllUsers();
}
IN_PROC_BROWSER_TEST_F(MultiProfileFileManagerBrowserTest, BasicDownloads) {
AddAllUsers();
set_test_case_name("keyboardCopyDownloads");
StartTest();
}
IN_PROC_BROWSER_TEST_F(MultiProfileFileManagerBrowserTest, PRE_BasicDrive) {
AddAllUsers();
}
IN_PROC_BROWSER_TEST_F(MultiProfileFileManagerBrowserTest, BasicDrive) {
AddAllUsers();
set_test_case_name("keyboardCopyDrive");
StartTest();
}
IN_PROC_BROWSER_TEST_F(MultiProfileFileManagerBrowserTest, PRE_Badge) {
AddAllUsers();
}
IN_PROC_BROWSER_TEST_F(MultiProfileFileManagerBrowserTest, Badge) {
set_test_case_name("multiProfileBadge");
StartTest();
}
IN_PROC_BROWSER_TEST_F(MultiProfileFileManagerBrowserTest,
PRE_VisitDesktopMenu) {
AddAllUsers();
}
IN_PROC_BROWSER_TEST_F(MultiProfileFileManagerBrowserTest, VisitDesktopMenu) {
set_test_case_name("multiProfileVisitDesktopMenu");
StartTest();
}
IN_PROC_BROWSER_TEST_F(MultiProfileFileManagerBrowserTest,
DISABLED_PRE_MaxUser) {
AddAllUsers();
AddExtraUsersForStressTesting();
}
IN_PROC_BROWSER_TEST_F(MultiProfileFileManagerBrowserTest,
DISABLED_MaxUser) {
AddExtraUsersForStressTesting();
set_test_case_name("multiProfileVisitDesktopMenu");
StartTest();
}
}
}