1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/strings/stringprintf.h"
6 #include "base/strings/utf_string_conversions.h"
7 #include "chrome/browser/extensions/api/media_galleries_private/media_galleries_private_api.h"
8 #include "chrome/browser/extensions/extension_apitest.h"
9 #include "chrome/browser/extensions/extension_service.h"
10 #include "chrome/browser/extensions/extension_test_message_listener.h"
11 #include "chrome/browser/ui/browser.h"
12 #include "chrome/common/chrome_switches.h"
13 #include "chrome/test/base/ui_test_utils.h"
14 #include "components/storage_monitor/storage_info.h"
15 #include "components/storage_monitor/storage_monitor.h"
16 #include "components/storage_monitor/test_storage_monitor.h"
17 #include "content/public/browser/render_view_host.h"
18 #include "content/public/browser/web_contents.h"
19 #include "content/public/test/browser_test_utils.h"
20 #include "extensions/browser/extension_system.h"
21 #include "extensions/common/extension.h"
26 // Id of test extension from
27 // chrome/test/data/extensions/api_test/|kTestExtensionPath|
28 const char kTestExtensionId[] = "lkegdcleigedmkiikoijjgfchobofdbe";
29 const char kTestExtensionPath[] = "media_galleries_private/attachdetach";
32 const char kAddAttachListenerCmd[] = "addAttachListener()";
33 const char kAddDetachListenerCmd[] = "addDetachListener()";
34 const char kAddDummyDetachListenerCmd[] = "addDummyDetachListener()";
35 const char kRemoveAttachListenerCmd[] = "removeAttachListener()";
36 const char kRemoveDummyDetachListenerCmd[] = "removeDummyDetachListener()";
38 // And JS reply messages.
39 const char kAddAttachListenerOk[] = "add_attach_ok";
40 const char kAddDetachListenerOk[] = "add_detach_ok";
41 const char kAddDummyDetachListenerOk[] = "add_dummy_detach_ok";
42 const char kRemoveAttachListenerOk[] = "remove_attach_ok";
43 const char kRemoveDummyDetachListenerOk[] = "remove_dummy_detach_ok";
45 // Test reply messages.
46 const char kAttachTestOk[] = "attach_test_ok";
47 const char kDetachTestOk[] = "detach_test_ok";
49 // Dummy device properties.
50 const char kDeviceId[] = "testDeviceId";
51 const char kDeviceName[] = "foobar";
52 base::FilePath::CharType kDevicePath[] = FILE_PATH_LITERAL("/qux");
56 class MediaGalleriesPrivateApiTest : public ExtensionApiTest {
58 MediaGalleriesPrivateApiTest() {}
59 virtual ~MediaGalleriesPrivateApiTest() {}
61 // ExtensionApiTest overrides.
62 virtual void SetUp() OVERRIDE {
63 device_id_ = StorageInfo::MakeDeviceId(
64 StorageInfo::REMOVABLE_MASS_STORAGE_WITH_DCIM, kDeviceId);
65 ExtensionApiTest::SetUp();
69 // ExtensionApiTest overrides.
70 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
71 ExtensionApiTest::SetUpCommandLine(command_line);
72 command_line->AppendSwitchASCII(switches::kWhitelistedExtensionID,
76 void ChangeListener(content::RenderViewHost* host,
77 const std::string& js_command,
78 const std::string& ok_message) {
79 ExtensionTestMessageListener listener(ok_message, false /* no reply */);
80 host->ExecuteJavascriptInWebFrame(base::string16(),
81 base::ASCIIToUTF16(js_command));
82 EXPECT_TRUE(listener.WaitUntilSatisfied());
91 DCHECK(StorageMonitor::GetInstance()->IsInitialized());
92 StorageInfo info(device_id_, base::ASCIIToUTF16(kDeviceName), kDevicePath,
93 base::string16(), base::string16(), base::string16(), 0);
94 StorageMonitor::GetInstance()->receiver()->ProcessAttach(info);
95 content::RunAllPendingInMessageLoop();
99 DCHECK(StorageMonitor::GetInstance()->IsInitialized());
100 StorageMonitor::GetInstance()->receiver()->ProcessDetach(device_id_);
101 content::RunAllPendingInMessageLoop();
105 std::string device_id_;
107 DISALLOW_COPY_AND_ASSIGN(MediaGalleriesPrivateApiTest);
110 // Fails on official Linux bot. See http://crbug.com/315276
111 // Flaky on Mac trybots. See http://crbug.com/326324
112 #if (defined(GOOGLE_CHROME_BUILD) && defined(OS_LINUX)) || defined(OS_MACOSX)
113 #define MAYBE_DeviceAttachDetachEvents DISABLED_DeviceAttachDetachEvents
115 #define MAYBE_DeviceAttachDetachEvents DeviceAttachDetachEvents
117 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateApiTest,
118 MAYBE_DeviceAttachDetachEvents) {
120 TestStorageMonitor::SyncInitialize();
121 const extensions::Extension* extension =
122 LoadExtension(test_data_dir_.AppendASCII(kTestExtensionPath));
123 ASSERT_TRUE(extension);
125 content::RenderViewHost* host =
126 extensions::ExtensionSystem::Get(browser()->profile())->
127 process_manager()->GetBackgroundHostForExtension(extension->id())->
131 // No listeners, attach and detach a couple times.
135 // Add attach listener.
136 ChangeListener(host, kAddAttachListenerCmd, kAddAttachListenerOk);
139 const std::string expect_attach_msg =
140 base::StringPrintf("%s,%s", kAttachTestOk, kDeviceName);
141 ExtensionTestMessageListener attach_finished_listener(expect_attach_msg,
142 false /* no reply */);
144 EXPECT_TRUE(attach_finished_listener.WaitUntilSatisfied());
149 EXPECT_TRUE(attach_finished_listener.WaitUntilSatisfied());
153 // Remove attach listener.
154 ChangeListener(host, kRemoveAttachListenerCmd, kRemoveAttachListenerOk);
156 // No listeners, attach and detach a couple times.
160 // Add detach listener.
161 ChangeListener(host, kAddDummyDetachListenerCmd, kAddDummyDetachListenerOk);
166 ExtensionTestMessageListener detach_finished_listener(kDetachTestOk,
167 false /* no reply */);
169 EXPECT_TRUE(detach_finished_listener.WaitUntilSatisfied());
174 EXPECT_TRUE(detach_finished_listener.WaitUntilSatisfied());
176 // Switch ok dummy detach listener for the regular one.
177 ChangeListener(host, kRemoveDummyDetachListenerCmd,
178 kRemoveDummyDetachListenerOk);
179 ChangeListener(host, kAddDetachListenerCmd, kAddDetachListenerOk);
181 // Add attach listener.
182 ChangeListener(host, kAddAttachListenerCmd, kAddAttachListenerOk);
185 EXPECT_TRUE(attach_finished_listener.WaitUntilSatisfied());
187 EXPECT_TRUE(detach_finished_listener.WaitUntilSatisfied());
190 EXPECT_TRUE(attach_finished_listener.WaitUntilSatisfied());
192 EXPECT_TRUE(detach_finished_listener.WaitUntilSatisfied());