blob: 447fcda418a7f24310c5c5c33afed04438502e9b [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.
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/api/media_galleries_private/media_galleries_private_api.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_system.h"
#include "chrome/browser/extensions/extension_test_message_listener.h"
#include "chrome/browser/storage_monitor/storage_info.h"
#include "chrome/browser/storage_monitor/storage_monitor.h"
#include "chrome/browser/storage_monitor/test_storage_monitor.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test_utils.h"
#include "extensions/common/extension.h"
#include "url/gurl.h"
namespace {
// Id of test extension from
// chrome/test/data/extensions/api_test/|kTestExtensionPath|
const char kTestExtensionId[] = "lkegdcleigedmkiikoijjgfchobofdbe";
const char kTestExtensionPath[] = "media_galleries_private/attachdetach";
// JS commands.
const char kAddAttachListenerCmd[] = "addAttachListener()";
const char kAddDetachListenerCmd[] = "addDetachListener()";
const char kAddDummyDetachListenerCmd[] = "addDummyDetachListener()";
const char kRemoveAttachListenerCmd[] = "removeAttachListener()";
const char kRemoveDummyDetachListenerCmd[] = "removeDummyDetachListener()";
// And JS reply messages.
const char kAddAttachListenerOk[] = "add_attach_ok";
const char kAddDetachListenerOk[] = "add_detach_ok";
const char kAddDummyDetachListenerOk[] = "add_dummy_detach_ok";
const char kRemoveAttachListenerOk[] = "remove_attach_ok";
const char kRemoveDummyDetachListenerOk[] = "remove_dummy_detach_ok";
// Test reply messages.
const char kAttachTestOk[] = "attach_test_ok";
const char kDetachTestOk[] = "detach_test_ok";
// Dummy device properties.
const char kDeviceId[] = "testDeviceId";
const char kDeviceName[] = "foobar";
base::FilePath::CharType kDevicePath[] = FILE_PATH_LITERAL("/qux");
} // namespace
class MediaGalleriesPrivateApiTest : public ExtensionApiTest {
public:
MediaGalleriesPrivateApiTest() {}
virtual ~MediaGalleriesPrivateApiTest() {}
// ExtensionApiTest overrides.
virtual void SetUp() OVERRIDE {
device_id_ = StorageInfo::MakeDeviceId(
StorageInfo::REMOVABLE_MASS_STORAGE_WITH_DCIM, kDeviceId);
ExtensionApiTest::SetUp();
}
protected:
// ExtensionApiTest overrides.
virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
ExtensionApiTest::SetUpCommandLine(command_line);
command_line->AppendSwitchASCII(switches::kWhitelistedExtensionID,
kTestExtensionId);
}
void ChangeListener(content::RenderViewHost* host,
const std::string& js_command,
const std::string& ok_message) {
ExtensionTestMessageListener listener(ok_message, false /* no reply */);
host->ExecuteJavascriptInWebFrame(string16(), ASCIIToUTF16(js_command));
EXPECT_TRUE(listener.WaitUntilSatisfied());
}
void AttachDetach() {
Attach();
Detach();
}
void Attach() {
DCHECK(StorageMonitor::GetInstance()->IsInitialized());
StorageInfo info(device_id_, ASCIIToUTF16(kDeviceName), kDevicePath,
base::string16(), base::string16(), base::string16(), 0);
StorageMonitor::GetInstance()->receiver()->ProcessAttach(info);
content::RunAllPendingInMessageLoop();
}
void Detach() {
DCHECK(StorageMonitor::GetInstance()->IsInitialized());
StorageMonitor::GetInstance()->receiver()->ProcessDetach(device_id_);
content::RunAllPendingInMessageLoop();
}
private:
std::string device_id_;
DISALLOW_COPY_AND_ASSIGN(MediaGalleriesPrivateApiTest);
};
// Fails on official Linux bot. See http://crbug.com/315276
// Flaky on Mac trybots. See http://crbug.com/326324
#if (defined(GOOGLE_CHROME_BUILD) && defined(OS_LINUX)) || defined(OS_MACOSX)
#define MAYBE_DeviceAttachDetachEvents DISABLED_DeviceAttachDetachEvents
#else
#define MAYBE_DeviceAttachDetachEvents DeviceAttachDetachEvents
#endif
IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateApiTest,
MAYBE_DeviceAttachDetachEvents) {
// Setup.
TestStorageMonitor::SyncInitialize();
const extensions::Extension* extension =
LoadExtension(test_data_dir_.AppendASCII(kTestExtensionPath));
ASSERT_TRUE(extension);
content::RenderViewHost* host =
extensions::ExtensionSystem::Get(browser()->profile())->
process_manager()->GetBackgroundHostForExtension(extension->id())->
render_view_host();
ASSERT_TRUE(host);
// No listeners, attach and detach a couple times.
AttachDetach();
AttachDetach();
// Add attach listener.
ChangeListener(host, kAddAttachListenerCmd, kAddAttachListenerOk);
// Attach / detach
const std::string expect_attach_msg =
base::StringPrintf("%s,%s", kAttachTestOk, kDeviceName);
ExtensionTestMessageListener attach_finished_listener(expect_attach_msg,
false /* no reply */);
Attach();
EXPECT_TRUE(attach_finished_listener.WaitUntilSatisfied());
Detach();
// Attach / detach
Attach();
EXPECT_TRUE(attach_finished_listener.WaitUntilSatisfied());
// Detach
Detach();
// Remove attach listener.
ChangeListener(host, kRemoveAttachListenerCmd, kRemoveAttachListenerOk);
// No listeners, attach and detach a couple times.
AttachDetach();
AttachDetach();
// Add detach listener.
ChangeListener(host, kAddDummyDetachListenerCmd, kAddDummyDetachListenerOk);
// Attach / detach
Attach();
ExtensionTestMessageListener detach_finished_listener(kDetachTestOk,
false /* no reply */);
Detach();
EXPECT_TRUE(detach_finished_listener.WaitUntilSatisfied());
// Attach / detach
Attach();
Detach();
EXPECT_TRUE(detach_finished_listener.WaitUntilSatisfied());
// Switch ok dummy detach listener for the regular one.
ChangeListener(host, kRemoveDummyDetachListenerCmd,
kRemoveDummyDetachListenerOk);
ChangeListener(host, kAddDetachListenerCmd, kAddDetachListenerOk);
// Add attach listener.
ChangeListener(host, kAddAttachListenerCmd, kAddAttachListenerOk);
Attach();
EXPECT_TRUE(attach_finished_listener.WaitUntilSatisfied());
Detach();
EXPECT_TRUE(detach_finished_listener.WaitUntilSatisfied());
Attach();
EXPECT_TRUE(attach_finished_listener.WaitUntilSatisfied());
Detach();
EXPECT_TRUE(detach_finished_listener.WaitUntilSatisfied());
}