Commit 15f51e3e authored by Naoki Fukino's avatar Naoki Fukino Committed by Commit Bot

Files app: Add an integration test for DocumentsProvider.

This adds an integration test to check that DocumentsProvider
implementation correctly interact with ARC-related services in
Chrome side by marking ARC as available for testing and mocking
FileSystemInstance (Mojo interface to interact with ARC container).

Bug: 923991
Test: Run browset_tests --gtest_filter=QuickView/FilesAppBrowserTest.Test/openQuickView*
Change-Id: I72cf99449880aea0acc33cc7f679656ea4e396f8
Reviewed-on: https://chromium-review.googlesource.com/c/1483697
Commit-Queue: Naoki Fukino <fukino@chromium.org>
Reviewed-by: default avatarNoel Gordon <noel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#634958}
parent 6579c2b9
...@@ -60,6 +60,16 @@ struct TestCase { ...@@ -60,6 +60,16 @@ struct TestCase {
return *this; return *this;
} }
TestCase& EnableDocumentsProvider() {
enable_documents_provider.emplace(true);
return *this;
}
TestCase& DisableDocumentsProvider() {
enable_documents_provider.emplace(false);
return *this;
}
TestCase& Offline() { TestCase& Offline() {
offline = true; offline = true;
return *this; return *this;
...@@ -108,6 +118,9 @@ struct TestCase { ...@@ -108,6 +118,9 @@ struct TestCase {
if (test.enable_myfiles_volume.value_or(false)) if (test.enable_myfiles_volume.value_or(false))
name.append("_MyFilesVolume"); name.append("_MyFilesVolume");
if (test.enable_documents_provider.value_or(false))
name.append("_DocumentsProvider");
return name; return name;
} }
...@@ -116,6 +129,7 @@ struct TestCase { ...@@ -116,6 +129,7 @@ struct TestCase {
bool tablet_mode = false; bool tablet_mode = false;
base::Optional<bool> enable_drivefs; base::Optional<bool> enable_drivefs;
base::Optional<bool> enable_myfiles_volume; base::Optional<bool> enable_myfiles_volume;
base::Optional<bool> enable_documents_provider;
bool with_browser = false; bool with_browser = false;
bool needs_zip = false; bool needs_zip = false;
bool offline = false; bool offline = false;
...@@ -171,6 +185,11 @@ class FilesAppBrowserTest : public FileManagerBrowserTestBase, ...@@ -171,6 +185,11 @@ class FilesAppBrowserTest : public FileManagerBrowserTestBase,
FileManagerBrowserTestBase::GetEnableDriveFs()); FileManagerBrowserTestBase::GetEnableDriveFs());
} }
bool GetEnableDocumentsProvider() const override {
return GetParam().enable_documents_provider.value_or(
FileManagerBrowserTestBase::GetEnableDocumentsProvider());
}
bool GetRequiresStartupBrowser() const override { bool GetRequiresStartupBrowser() const override {
return GetParam().with_browser; return GetParam().with_browser;
} }
...@@ -481,32 +500,34 @@ WRAPPED_INSTANTIATE_TEST_SUITE_P( ...@@ -481,32 +500,34 @@ WRAPPED_INSTANTIATE_TEST_SUITE_P(
WRAPPED_INSTANTIATE_TEST_SUITE_P( WRAPPED_INSTANTIATE_TEST_SUITE_P(
QuickView, /* quick_view.js */ QuickView, /* quick_view.js */
FilesAppBrowserTest, FilesAppBrowserTest,
::testing::Values(TestCase("openQuickView"), ::testing::Values(
TestCase("openQuickView").InGuestMode(), TestCase("openQuickView"),
TestCase("openQuickView").TabletMode(), TestCase("openQuickView").InGuestMode(),
TestCase("openQuickViewAudio"), TestCase("openQuickView").TabletMode(),
TestCase("openQuickViewImage"), TestCase("openQuickViewAudio"),
TestCase("openQuickViewVideo"), TestCase("openQuickViewImage"),
TestCase("openQuickViewVideo"),
// QuickView PDF test fails on MSAN, crbug.com/768070 // QuickView PDF test fails on MSAN, crbug.com/768070
#if !defined(MEMORY_SANITIZER) #if !defined(MEMORY_SANITIZER)
TestCase("openQuickViewPdf"), TestCase("openQuickViewPdf"),
#endif #endif
TestCase("openQuickViewKeyboardUpDownChangesView"), TestCase("openQuickViewKeyboardUpDownChangesView"),
TestCase("openQuickViewKeyboardLeftRightChangesView"), TestCase("openQuickViewKeyboardLeftRightChangesView"),
TestCase("openQuickViewScrollText"), TestCase("openQuickViewScrollText"),
TestCase("openQuickViewScrollHtml"), TestCase("openQuickViewScrollHtml"),
TestCase("openQuickViewBackgroundColorText"), TestCase("openQuickViewBackgroundColorText"),
TestCase("openQuickViewBackgroundColorHtml"), TestCase("openQuickViewBackgroundColorHtml"),
TestCase("openQuickViewDrive").DisableDriveFs(), TestCase("openQuickViewDrive").DisableDriveFs(),
TestCase("openQuickViewDrive").EnableDriveFs(), TestCase("openQuickViewDrive").EnableDriveFs(),
TestCase("openQuickViewAndroid"), TestCase("openQuickViewAndroid"),
TestCase("openQuickViewCrostini"), TestCase("openQuickViewDocumentsProvider").EnableDocumentsProvider(),
TestCase("openQuickViewUsb"), TestCase("openQuickViewCrostini"),
TestCase("openQuickViewRemovablePartitions"), TestCase("openQuickViewUsb"),
TestCase("openQuickViewMtp"), TestCase("openQuickViewRemovablePartitions"),
TestCase("pressEnterOnInfoBoxToOpenClose"), TestCase("openQuickViewMtp"),
TestCase("closeQuickView"), TestCase("pressEnterOnInfoBoxToOpenClose"),
TestCase("cantOpenQuickViewWithMultipleFiles"))); TestCase("closeQuickView"),
TestCase("cantOpenQuickViewWithMultipleFiles")));
WRAPPED_INSTANTIATE_TEST_SUITE_P( WRAPPED_INSTANTIATE_TEST_SUITE_P(
DirectoryTreeContextMenu, /* directory_tree_context_menu.js */ DirectoryTreeContextMenu, /* directory_tree_context_menu.js */
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "base/threading/thread_restrictions.h" #include "base/threading/thread_restrictions.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_util.h"
#include "chrome/browser/chromeos/crostini/crostini_manager.h" #include "chrome/browser/chromeos/crostini/crostini_manager.h"
#include "chrome/browser/chromeos/crostini/crostini_pref_names.h" #include "chrome/browser/chromeos/crostini/crostini_pref_names.h"
#include "chrome/browser/chromeos/crostini/crostini_util.h" #include "chrome/browser/chromeos/crostini/crostini_util.h"
...@@ -55,6 +56,12 @@ ...@@ -55,6 +56,12 @@
#include "chromeos/dbus/concierge/service.pb.h" #include "chromeos/dbus/concierge/service.pb.h"
#include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/fake_cros_disks_client.h" #include "chromeos/dbus/fake_cros_disks_client.h"
#include "components/arc/arc_bridge_service.h"
#include "components/arc/arc_features.h"
#include "components/arc/arc_service_manager.h"
#include "components/arc/arc_util.h"
#include "components/arc/test/connection_holder_util.h"
#include "components/arc/test/fake_file_system_instance.h"
#include "components/drive/chromeos/file_system_interface.h" #include "components/drive/chromeos/file_system_interface.h"
#include "components/drive/drive_pref_names.h" #include "components/drive/drive_pref_names.h"
#include "components/drive/service/fake_drive_service.h" #include "components/drive/service/fake_drive_service.h"
...@@ -153,7 +160,8 @@ struct AddEntriesMessage { ...@@ -153,7 +160,8 @@ struct AddEntriesMessage {
DRIVE_VOLUME, DRIVE_VOLUME,
CROSTINI_VOLUME, CROSTINI_VOLUME,
USB_VOLUME, USB_VOLUME,
ANDROID_FILES_VOLUME ANDROID_FILES_VOLUME,
DOCUMENTS_PROVIDER_VOLUME
}; };
// Represents the different types of entries (e.g. file, folder). // Represents the different types of entries (e.g. file, folder).
...@@ -199,6 +207,8 @@ struct AddEntriesMessage { ...@@ -199,6 +207,8 @@ struct AddEntriesMessage {
*volume = USB_VOLUME; *volume = USB_VOLUME;
else if (value == "android_files") else if (value == "android_files")
*volume = ANDROID_FILES_VOLUME; *volume = ANDROID_FILES_VOLUME;
else if (value == "documents_provider")
*volume = DOCUMENTS_PROVIDER_VOLUME;
else else
return false; return false;
return true; return true;
...@@ -1263,6 +1273,64 @@ class DriveFsTestVolume : public DriveTestVolume { ...@@ -1263,6 +1273,64 @@ class DriveFsTestVolume : public DriveTestVolume {
DISALLOW_COPY_AND_ASSIGN(DriveFsTestVolume); DISALLOW_COPY_AND_ASSIGN(DriveFsTestVolume);
}; };
// DocumentsProviderTestVolume: test volume for Android DocumentsProvider.
class DocumentsProviderTestVolume : public TestVolume {
public:
DocumentsProviderTestVolume(
arc::FakeFileSystemInstance* const file_system_instance,
const std::string& authority,
const std::string& root_document_id)
: TestVolume("DocumentsProvider"),
file_system_instance_(file_system_instance),
authority_(authority),
root_document_id_(root_document_id) {}
~DocumentsProviderTestVolume() override = default;
virtual void CreateEntry(const AddEntriesMessage::TestEntryInfo& entry) {
// Register a document to the fake FileSystemInstance.
arc::FakeFileSystemInstance::Document document(
authority_, entry.name_text, root_document_id_, entry.name_text,
GetMimeType(entry), GetFileSize(entry),
entry.last_modified_time.ToJavaTime());
file_system_instance_->AddDocument(document);
}
bool Mount(Profile* profile) {
// Register a root document of this volume.
arc::FakeFileSystemInstance::Document document(
authority_, root_document_id_, "", "", arc::kAndroidDirectoryMimeType,
0, 0);
file_system_instance_->AddDocument(document);
// Tell VolumeManager that a new DocumentsProvider volume is added.
VolumeManager::Get(profile)->OnDocumentsProviderRootAdded(
authority_, root_document_id_, root_document_id_, name(), "", GURL());
return true;
}
private:
arc::FakeFileSystemInstance* const file_system_instance_;
std::string authority_;
std::string root_document_id_;
int64_t GetFileSize(const AddEntriesMessage::TestEntryInfo& entry) {
if (entry.type != AddEntriesMessage::FILE)
return 0;
int64_t file_size = 0;
const base::FilePath source_path =
TestVolume::GetTestDataFilePath(entry.source_file_name);
bool success = base::GetFileSize(source_path, &file_size);
return success ? file_size : 0;
}
std::string GetMimeType(const AddEntriesMessage::TestEntryInfo& entry) {
return entry.type == AddEntriesMessage::FILE
? entry.mime_type
: arc::kAndroidDirectoryMimeType;
}
};
FileManagerBrowserTestBase::FileManagerBrowserTestBase() = default; FileManagerBrowserTestBase::FileManagerBrowserTestBase() = default;
FileManagerBrowserTestBase::~FileManagerBrowserTestBase() = default; FileManagerBrowserTestBase::~FileManagerBrowserTestBase() = default;
...@@ -1329,6 +1397,15 @@ void FileManagerBrowserTestBase::SetUpCommandLine( ...@@ -1329,6 +1397,15 @@ void FileManagerBrowserTestBase::SetUpCommandLine(
disabled_features.emplace_back(chromeos::features::kMyFilesVolume); disabled_features.emplace_back(chromeos::features::kMyFilesVolume);
} }
if (IsDocumentsProviderTest()) {
arc::SetArcAvailableCommandLineForTesting(command_line);
enabled_features.emplace_back(
arc::kEnableDocumentsProviderInFilesAppFeature);
} else {
disabled_features.emplace_back(
arc::kEnableDocumentsProviderInFilesAppFeature);
}
feature_list_.InitWithFeatures(enabled_features, disabled_features); feature_list_.InitWithFeatures(enabled_features, disabled_features);
extensions::ExtensionApiTest::SetUpCommandLine(command_line); extensions::ExtensionApiTest::SetUpCommandLine(command_line);
...@@ -1406,9 +1483,35 @@ void FileManagerBrowserTestBase::SetUpOnMainThread() { ...@@ -1406,9 +1483,35 @@ void FileManagerBrowserTestBase::SetUpOnMainThread() {
base::BindRepeating(&FileManagerBrowserTestBase::MaybeMountCrostini, base::BindRepeating(&FileManagerBrowserTestBase::MaybeMountCrostini,
base::Unretained(this))); base::Unretained(this)));
android_files_volume_ = std::make_unique<AndroidFilesTestVolume>(); if (arc::IsArcAvailable()) {
if (!DoesTestStartWithNoVolumesMounted()) { // When ARC is marked as available, we create fake FileSystemInstance and
android_files_volume_->Mount(profile()); // register it so that ARC-related services can work without real ARC
// container.
arc_file_system_instance_ =
std::make_unique<arc::FakeFileSystemInstance>();
arc::ArcServiceManager::Get()
->arc_bridge_service()
->file_system()
->SetInstance(arc_file_system_instance_.get());
arc::WaitForInstanceReady(
arc::ArcServiceManager::Get()->arc_bridge_service()->file_system());
ASSERT_TRUE(arc_file_system_instance_->InitCalled());
// Though we can have multiple DocumentsProvider volumes, only one volume
// is created and mounted for now.
documents_provider_volume_ =
std::make_unique<DocumentsProviderTestVolume>(
arc_file_system_instance_.get(), "com.example.documents", "root");
if (!DoesTestStartWithNoVolumesMounted()) {
documents_provider_volume_->Mount(profile());
}
} else {
// When ARC is not available, "Android Files" will not be mounted.
// We need to mount testing volume here.
android_files_volume_ = std::make_unique<AndroidFilesTestVolume>();
if (!DoesTestStartWithNoVolumesMounted()) {
android_files_volume_->Mount(profile());
}
} }
} }
...@@ -1456,6 +1559,10 @@ bool FileManagerBrowserTestBase::GetEnableDriveFs() const { ...@@ -1456,6 +1559,10 @@ bool FileManagerBrowserTestBase::GetEnableDriveFs() const {
return true; return true;
} }
bool FileManagerBrowserTestBase::GetEnableDocumentsProvider() const {
return false;
}
bool FileManagerBrowserTestBase::GetRequiresStartupBrowser() const { bool FileManagerBrowserTestBase::GetRequiresStartupBrowser() const {
return false; return false;
} }
...@@ -1662,6 +1769,13 @@ void FileManagerBrowserTestBase::OnCommand(const std::string& name, ...@@ -1662,6 +1769,13 @@ void FileManagerBrowserTestBase::OnCommand(const std::string& name,
LOG(FATAL) << "Add entry: but no Android files volume."; LOG(FATAL) << "Add entry: but no Android files volume.";
} }
break; break;
case AddEntriesMessage::DOCUMENTS_PROVIDER_VOLUME:
if (documents_provider_volume_) {
documents_provider_volume_->CreateEntry(*message.entries[i]);
} else {
LOG(FATAL) << "Add entry: but no DocumentsProvider volume.";
}
break;
} }
} }
......
...@@ -19,6 +19,10 @@ ...@@ -19,6 +19,10 @@
class NotificationDisplayServiceTester; class NotificationDisplayServiceTester;
class SelectFileDialogExtensionTestFactory; class SelectFileDialogExtensionTestFactory;
namespace arc {
class FakeFileSystemInstance;
} // namespace arc
namespace file_manager { namespace file_manager {
enum GuestMode { NOT_IN_GUEST_MODE, IN_GUEST_MODE, IN_INCOGNITO }; enum GuestMode { NOT_IN_GUEST_MODE, IN_GUEST_MODE, IN_INCOGNITO };
...@@ -29,6 +33,7 @@ class DownloadsTestVolume; ...@@ -29,6 +33,7 @@ class DownloadsTestVolume;
class CrostiniTestVolume; class CrostiniTestVolume;
class AndroidFilesTestVolume; class AndroidFilesTestVolume;
class RemovableTestVolume; class RemovableTestVolume;
class DocumentsProviderTestVolume;
class FileManagerBrowserTestBase : public extensions::ExtensionApiTest { class FileManagerBrowserTestBase : public extensions::ExtensionApiTest {
protected: protected:
...@@ -53,6 +58,7 @@ class FileManagerBrowserTestBase : public extensions::ExtensionApiTest { ...@@ -53,6 +58,7 @@ class FileManagerBrowserTestBase : public extensions::ExtensionApiTest {
virtual bool GetTabletMode() const; virtual bool GetTabletMode() const;
virtual bool GetEnableDriveFs() const; virtual bool GetEnableDriveFs() const;
virtual bool GetEnableMyFilesVolume() const; virtual bool GetEnableMyFilesVolume() const;
virtual bool GetEnableDocumentsProvider() const;
virtual bool GetRequiresStartupBrowser() const; virtual bool GetRequiresStartupBrowser() const;
virtual bool GetNeedsZipSupport() const; virtual bool GetNeedsZipSupport() const;
virtual bool GetIsOffline() const; virtual bool GetIsOffline() const;
...@@ -77,6 +83,9 @@ class FileManagerBrowserTestBase : public extensions::ExtensionApiTest { ...@@ -77,6 +83,9 @@ class FileManagerBrowserTestBase : public extensions::ExtensionApiTest {
// Returns true if the test requires DriveFS. // Returns true if the test requires DriveFS.
bool IsDriveFsTest() const { return GetEnableDriveFs(); } bool IsDriveFsTest() const { return GetEnableDriveFs(); }
// Returns true if the test requires Android documents providers.
bool IsDocumentsProviderTest() const { return GetEnableDocumentsProvider(); }
// Returns true if the test MyFilesVolume feature is enabled. // Returns true if the test MyFilesVolume feature is enabled.
bool IsMyFilesVolume() const { return GetEnableMyFilesVolume(); } bool IsMyFilesVolume() const { return GetEnableMyFilesVolume(); }
...@@ -138,6 +147,7 @@ class FileManagerBrowserTestBase : public extensions::ExtensionApiTest { ...@@ -138,6 +147,7 @@ class FileManagerBrowserTestBase : public extensions::ExtensionApiTest {
std::unique_ptr<FakeTestVolume> mtp_volume_; std::unique_ptr<FakeTestVolume> mtp_volume_;
std::unique_ptr<RemovableTestVolume> partition_1_; std::unique_ptr<RemovableTestVolume> partition_1_;
std::unique_ptr<RemovableTestVolume> partition_2_; std::unique_ptr<RemovableTestVolume> partition_2_;
std::unique_ptr<DocumentsProviderTestVolume> documents_provider_volume_;
drive::DriveIntegrationServiceFactory::FactoryCallback drive::DriveIntegrationServiceFactory::FactoryCallback
create_drive_integration_service_; create_drive_integration_service_;
...@@ -145,6 +155,7 @@ class FileManagerBrowserTestBase : public extensions::ExtensionApiTest { ...@@ -145,6 +155,7 @@ class FileManagerBrowserTestBase : public extensions::ExtensionApiTest {
service_factory_for_test_; service_factory_for_test_;
std::unique_ptr<NotificationDisplayServiceTester> display_service_; std::unique_ptr<NotificationDisplayServiceTester> display_service_;
std::unique_ptr<arc::FakeFileSystemInstance> arc_file_system_instance_;
// Not owned. // Not owned.
SelectFileDialogExtensionTestFactory* select_factory_; SelectFileDialogExtensionTestFactory* select_factory_;
......
...@@ -63,6 +63,7 @@ QuickViewUma.VolumeType = [ ...@@ -63,6 +63,7 @@ QuickViewUma.VolumeType = [
VolumeManagerCommon.VolumeType.MEDIA_VIEW, VolumeManagerCommon.VolumeType.MEDIA_VIEW,
VolumeManagerCommon.VolumeType.CROSTINI, VolumeManagerCommon.VolumeType.CROSTINI,
VolumeManagerCommon.VolumeType.ANDROID_FILES, VolumeManagerCommon.VolumeType.ANDROID_FILES,
VolumeManagerCommon.VolumeType.DOCUMENTS_PROVIDER,
]; ];
/** /**
......
...@@ -290,6 +290,36 @@ testcase.openQuickViewAndroid = async function() { ...@@ -290,6 +290,36 @@ testcase.openQuickViewAndroid = async function() {
await openQuickView(appId, documentsFileName); await openQuickView(appId, documentsFileName);
}; };
/**
* Tests opening Quick View on a DocumentsProvider root.
*/
testcase.openQuickViewDocumentsProvider = async function() {
const DOCUMENTS_PROVIDER_VOLUME_QUERY =
'[has-children="true"] [volume-type-icon="documents_provider"]';
// Open Files app.
const appId = await openNewWindow(RootPath.DOWNLOADS);
// Add files to the DocumentsProvider volume.
await addEntries(['documents_provider'], BASIC_LOCAL_ENTRY_SET);
// Wait for the DocumentsProvider volume to mount.
await remoteCall.waitForElement(appId, DOCUMENTS_PROVIDER_VOLUME_QUERY);
// Click to open the DocumentsProvider volume.
chrome.test.assertTrue(
!!await remoteCall.callRemoteTestUtil(
'fakeMouseClick', appId, [DOCUMENTS_PROVIDER_VOLUME_QUERY]),
'fakeMouseClick failed');
// Check: the DocumentsProvider files should appear in the file list.
const files = TestEntryInfo.getExpectedRows(BASIC_LOCAL_ENTRY_SET);
await remoteCall.waitForFiles(appId, files, {ignoreLastModifiedTime: true});
// Open a DocumentsProvider file in Quick View.
await openQuickView(appId, ENTRIES.hello.nameText);
};
/** /**
* Tests opening Quick View and scrolling its <webview> which contains a tall * Tests opening Quick View and scrolling its <webview> which contains a tall
* text document. * text document.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment