blob: e5817e87574ee5016b7b2c1e024bb161e04a09e6 [file] [log] [blame]
// Copyright (c) 2012 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.
//
// MediaGalleriesPrivate gallery watch API browser tests.
#include "base/files/file_path.h"
#include "base/files/file_path_watcher.h"
#include "base/files/file_util.h"
#include "base/path_service.h"
#include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/media_galleries/media_file_system_registry.h"
#include "chrome/browser/media_galleries/media_galleries_preferences.h"
#include "chrome/browser/media_galleries/media_galleries_test_util.h"
#include "chrome/common/chrome_paths.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_view_host.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/extension.h"
#include "extensions/common/switches.h"
#include "extensions/test/extension_test_message_listener.h"
namespace {
// Id of test extension from
// chrome/test/data/extensions/api_test/|kTestExtensionPath|
const char kTestExtensionId[] = "gceegfkgibmgpfopknlcgleimclbknie";
const char kTestExtensionPath[] = "media_galleries_private/gallerywatch";
// JS commands.
const char kGetAllWatchedGalleryIdsCmd[] = "getAllWatchedGalleryIds()";
const char kGetMediaFileSystemsCmd[] = "getMediaFileSystems()";
const char kSetupWatchOnValidGalleriesCmd[] = "setupWatchOnValidGalleries()";
const char kAddGalleryChangedListenerCmd[] = "addGalleryChangedListener()";
const char kRemoveAllGalleryWatchCmd[] = "removeAllGalleryWatch()";
const char kRemoveGalleryChangedListenerCmd[] =
"removeGalleryChangedListener()";
const char kRemoveGalleryWatchCmd[] = "removeGalleryWatch()";
const char kSetupWatchOnInvalidGalleryCmd[] = "setupWatchOnInvalidGallery()";
// And JS reply messages.
const char kAddGalleryWatchOK[] = "add_gallery_watch_ok";
const char kGetAllGalleryWatchOK[] = "get_all_gallery_watch_ok";
const char kGetMediaFileSystemsCallbackOK[] =
"get_media_file_systems_callback_ok";
const char kGetMediaFileSystemsOK[] = "get_media_file_systems_ok";
const char kAddGalleryChangedListenerOK[] = "add_gallery_changed_listener_ok";
const char kRemoveAllGalleryWatchOK[] = "remove_all_gallery_watch_ok";
const char kRemoveGalleryChangedListenerOK[] =
"remove_gallery_changed_listener_ok";
const char kRemoveGalleryWatchOK[] = "remove_gallery_watch_ok";
// Test reply messages.
const char kNoGalleryWatchesInstalled[] = "gallery_watchers_does_not_exists";
const char kAddGalleryWatchRequestFailed[] = "add_watch_request_failed";
const char kAddGalleryWatchRequestSucceeded[] = "add_watch_request_succeeded";
const char kGalleryChangedEventReceived[] = "gallery_changed_event_received";
const char kGalleryWatchesCheck[] = "gallery_watcher_checks";
} // namespace
///////////////////////////////////////////////////////////////////////////////
// MediaGalleriesPrivateGalleryWatchApiTest //
///////////////////////////////////////////////////////////////////////////////
class MediaGalleriesPrivateGalleryWatchApiTest : public ExtensionApiTest {
public:
MediaGalleriesPrivateGalleryWatchApiTest()
: extension_(NULL),
background_host_(NULL) {
}
virtual ~MediaGalleriesPrivateGalleryWatchApiTest() {}
protected:
// ExtensionApiTest overrides.
void SetUpCommandLine(CommandLine* command_line) override {
ExtensionApiTest::SetUpCommandLine(command_line);
command_line->AppendSwitchASCII(
extensions::switches::kWhitelistedExtensionID,
kTestExtensionId);
}
void SetUpOnMainThread() override {
ExtensionApiTest::SetUpOnMainThread();
ensure_media_directories_exists_.reset(new EnsureMediaDirectoriesExists);
extension_ = LoadExtension(test_data_dir_.AppendASCII(kTestExtensionPath));
GetBackgroundHostForTestExtension();
CreateTestGallery();
FetchMediaGalleriesList();
}
void TearDownOnMainThread() override {
extension_ = NULL;
background_host_ = NULL;
ensure_media_directories_exists_.reset();
ExtensionApiTest::TearDownOnMainThread();
}
bool GalleryWatchesSupported() {
return base::FilePathWatcher::RecursiveWatchAvailable();
}
void ExecuteCmdAndCheckReply(const std::string& js_command,
const std::string& ok_message) {
ExtensionTestMessageListener listener(ok_message, false);
background_host_->GetMainFrame()->ExecuteJavaScript(
base::ASCIIToUTF16(js_command));
EXPECT_TRUE(listener.WaitUntilSatisfied());
}
bool AddNewFileInTestGallery() {
base::FilePath gallery_file =
test_gallery_.path().Append(FILE_PATH_LITERAL("test1.txt"));
std::string content("new content");
int write_size = base::WriteFile(gallery_file, content.c_str(),
content.length());
return (write_size == static_cast<int>(content.length()));
}
void SetupGalleryWatches() {
std::string expected_result = GalleryWatchesSupported() ?
kAddGalleryWatchRequestSucceeded : kAddGalleryWatchRequestFailed;
ExtensionTestMessageListener add_gallery_watch_finished(
expected_result, false /* no reply */);
ExecuteCmdAndCheckReply(kSetupWatchOnValidGalleriesCmd, kAddGalleryWatchOK);
EXPECT_TRUE(add_gallery_watch_finished.WaitUntilSatisfied());
}
private:
void GetBackgroundHostForTestExtension() {
ASSERT_TRUE(extension_);
extensions::ExtensionSystem* extension_system =
extensions::ExtensionSystem::Get(browser()->profile());
background_host_ =
extension_system->process_manager()->GetBackgroundHostForExtension(
extension_->id())->render_view_host();
ASSERT_TRUE(background_host_);
}
void CreateTestGallery() {
MediaGalleriesPreferences* preferences =
g_browser_process->media_file_system_registry()->GetPreferences(
browser()->profile());
base::RunLoop runloop;
preferences->EnsureInitialized(runloop.QuitClosure());
runloop.Run();
ASSERT_TRUE(test_gallery_.CreateUniqueTempDir());
MediaGalleryPrefInfo gallery_info;
ASSERT_FALSE(preferences->LookUpGalleryByPath(test_gallery_.path(),
&gallery_info));
MediaGalleryPrefId id = preferences->AddGallery(
gallery_info.device_id,
gallery_info.path,
MediaGalleryPrefInfo::kAutoDetected,
gallery_info.volume_label,
gallery_info.vendor_name,
gallery_info.model_name,
gallery_info.total_size_in_bytes,
gallery_info.last_attach_time,
0, 0, 0);
preferences->SetGalleryPermissionForExtension(*extension_, id, true);
}
void FetchMediaGalleriesList() {
ExtensionTestMessageListener get_media_systems_finished(
kGetMediaFileSystemsCallbackOK, false /* no reply */);
ExecuteCmdAndCheckReply(kGetMediaFileSystemsCmd, kGetMediaFileSystemsOK);
EXPECT_TRUE(get_media_systems_finished.WaitUntilSatisfied());
}
scoped_ptr<EnsureMediaDirectoriesExists> ensure_media_directories_exists_;
base::ScopedTempDir test_gallery_;
const extensions::Extension* extension_;
content::RenderViewHost* background_host_;
DISALLOW_COPY_AND_ASSIGN(MediaGalleriesPrivateGalleryWatchApiTest);
};
// Crashing on OSX.
#if defined(OS_MACOSX)
#define MAYBE_BasicGalleryWatch DISABLED_BasicGalleryWatch
#else
#define MAYBE_BasicGalleryWatch BasicGalleryWatch
#endif
IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
MAYBE_BasicGalleryWatch) {
SetupGalleryWatches();
// Add gallery watch listener.
ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
kAddGalleryChangedListenerOK);
// Modify gallery contents.
ExtensionTestMessageListener gallery_change_event_received(
kGalleryChangedEventReceived, false /* no reply */);
ASSERT_TRUE(AddNewFileInTestGallery());
if (GalleryWatchesSupported())
EXPECT_TRUE(gallery_change_event_received.WaitUntilSatisfied());
// Remove gallery watch listener.
ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
kRemoveGalleryChangedListenerOK);
// Remove gallery watch request.
if (GalleryWatchesSupported())
ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
}
// http://crbug.com/390979
IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
DISABLED_RemoveListenerAndModifyGallery) {
if (!GalleryWatchesSupported())
return;
SetupGalleryWatches();
// Add a gallery watch listener.
ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
kAddGalleryChangedListenerOK);
// Modify gallery contents.
ExtensionTestMessageListener gallery_change_event_received(
kGalleryChangedEventReceived, false /* no reply */);
ASSERT_TRUE(AddNewFileInTestGallery());
EXPECT_TRUE(gallery_change_event_received.WaitUntilSatisfied());
// Remove gallery watch listener.
ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
kRemoveGalleryChangedListenerOK);
// No listener, modify gallery contents.
ASSERT_TRUE(AddNewFileInTestGallery());
// Remove gallery watch.
ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
}
IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
SetupGalleryWatchWithoutListeners) {
if (!GalleryWatchesSupported())
return;
SetupGalleryWatches();
// No listeners, modify gallery contents.
ExtensionTestMessageListener gallery_change_event_received(
kGalleryChangedEventReceived, false /* no reply */);
ASSERT_TRUE(AddNewFileInTestGallery());
// Remove gallery watch.
ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
}
IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
SetupGalleryChangedListenerWithoutWatchers) {
// Add gallery watch listener.
ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
kAddGalleryChangedListenerOK);
// Modify gallery contents. Listener should not get called because add watch
// request was not called.
ExtensionTestMessageListener gallery_change_event_received(
kGalleryChangedEventReceived, false /* no reply */);
ASSERT_TRUE(AddNewFileInTestGallery());
// Remove gallery watch listener.
ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
kRemoveGalleryChangedListenerOK);
}
IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
SetupWatchOnInvalidGallery) {
// Set up a invalid gallery watch.
ExtensionTestMessageListener invalid_gallery_watch_request_finished(
kAddGalleryWatchRequestFailed, false /* no reply */);
ExecuteCmdAndCheckReply(kSetupWatchOnInvalidGalleryCmd, kAddGalleryWatchOK);
EXPECT_TRUE(invalid_gallery_watch_request_finished.WaitUntilSatisfied());
}
IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
GetAllGalleryWatch) {
// Gallery watchers are not yet added.
// chrome.mediaGalleriesPrivate.getAllGalleryWatch should return an empty
// list.
ExtensionTestMessageListener initial_get_all_check_finished(
kNoGalleryWatchesInstalled, false /* no reply */);
ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
EXPECT_TRUE(initial_get_all_check_finished.WaitUntilSatisfied());
if (!GalleryWatchesSupported())
return;
SetupGalleryWatches();
// chrome.mediaGalleriesPrivate.getAllGalleryWatch should return the
// gallery identifiers.
ExtensionTestMessageListener get_all_watched_galleries_finished(
kGalleryWatchesCheck, false /* no reply */);
ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
EXPECT_TRUE(get_all_watched_galleries_finished.WaitUntilSatisfied());
// Remove gallery watch request.
ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
// Gallery watchers removed.
// chrome.mediaGalleriesPrivate.getAllGalleryWatch() should return an empty
// list.
ExtensionTestMessageListener final_get_all_check_finished(
kNoGalleryWatchesInstalled, false /* no reply */);
ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
EXPECT_TRUE(final_get_all_check_finished.WaitUntilSatisfied());
}
IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
RemoveAllGalleryWatch) {
if (!GalleryWatchesSupported())
return;
SetupGalleryWatches();
// chrome.mediaGalleriesPrivate.getAllGalleryWatch should return the watched
// gallery identifiers.
ExtensionTestMessageListener get_all_watched_galleries_finished(
kGalleryWatchesCheck, false /* no reply */);
ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
EXPECT_TRUE(get_all_watched_galleries_finished.WaitUntilSatisfied());
// Remove all gallery watchers.
ExecuteCmdAndCheckReply(kRemoveAllGalleryWatchCmd, kRemoveAllGalleryWatchOK);
// Gallery watchers removed. chrome.mediaGalleriesPrivate.getAllGalleryWatch
// should return an empty list.
ExtensionTestMessageListener final_get_all_check_finished(
kNoGalleryWatchesInstalled, false /* no reply */);
ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
EXPECT_TRUE(final_get_all_check_finished.WaitUntilSatisfied());
}