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 // MediaGalleriesPrivate gallery watch API browser tests.
7 #include "base/file_util.h"
8 #include "base/files/file_path.h"
9 #include "base/files/file_path_watcher.h"
10 #include "base/path_service.h"
11 #include "base/run_loop.h"
12 #include "base/strings/utf_string_conversions.h"
13 #include "build/build_config.h"
14 #include "chrome/browser/browser_process.h"
15 #include "chrome/browser/extensions/extension_apitest.h"
16 #include "chrome/browser/extensions/extension_service.h"
17 #include "chrome/browser/extensions/extension_test_message_listener.h"
18 #include "chrome/browser/media_galleries/media_file_system_registry.h"
19 #include "chrome/browser/media_galleries/media_galleries_preferences.h"
20 #include "chrome/browser/media_galleries/media_galleries_test_util.h"
21 #include "chrome/common/chrome_paths.h"
22 #include "content/public/browser/render_frame_host.h"
23 #include "content/public/browser/render_view_host.h"
24 #include "extensions/browser/extension_system.h"
25 #include "extensions/common/extension.h"
26 #include "extensions/common/switches.h"
30 // Id of test extension from
31 // chrome/test/data/extensions/api_test/|kTestExtensionPath|
32 const char kTestExtensionId[] = "gceegfkgibmgpfopknlcgleimclbknie";
33 const char kTestExtensionPath[] = "media_galleries_private/gallerywatch";
36 const char kGetAllWatchedGalleryIdsCmd[] = "getAllWatchedGalleryIds()";
37 const char kGetMediaFileSystemsCmd[] = "getMediaFileSystems()";
38 const char kSetupWatchOnValidGalleriesCmd[] = "setupWatchOnValidGalleries()";
39 const char kAddGalleryChangedListenerCmd[] = "addGalleryChangedListener()";
40 const char kRemoveAllGalleryWatchCmd[] = "removeAllGalleryWatch()";
41 const char kRemoveGalleryChangedListenerCmd[] =
42 "removeGalleryChangedListener()";
43 const char kRemoveGalleryWatchCmd[] = "removeGalleryWatch()";
44 const char kSetupWatchOnInvalidGalleryCmd[] = "setupWatchOnInvalidGallery()";
46 // And JS reply messages.
47 const char kAddGalleryWatchOK[] = "add_gallery_watch_ok";
48 const char kGetAllGalleryWatchOK[] = "get_all_gallery_watch_ok";
49 const char kGetMediaFileSystemsCallbackOK[] =
50 "get_media_file_systems_callback_ok";
51 const char kGetMediaFileSystemsOK[] = "get_media_file_systems_ok";
52 const char kAddGalleryChangedListenerOK[] = "add_gallery_changed_listener_ok";
53 const char kRemoveAllGalleryWatchOK[] = "remove_all_gallery_watch_ok";
54 const char kRemoveGalleryChangedListenerOK[] =
55 "remove_gallery_changed_listener_ok";
56 const char kRemoveGalleryWatchOK[] = "remove_gallery_watch_ok";
58 // Test reply messages.
59 const char kNoGalleryWatchesInstalled[] = "gallery_watchers_does_not_exists";
60 const char kAddGalleryWatchRequestFailed[] = "add_watch_request_failed";
61 const char kAddGalleryWatchRequestSucceeded[] = "add_watch_request_succeeded";
62 const char kGalleryChangedEventReceived[] = "gallery_changed_event_received";
63 const char kGalleryWatchesCheck[] = "gallery_watcher_checks";
68 ///////////////////////////////////////////////////////////////////////////////
69 // MediaGalleriesPrivateGalleryWatchApiTest //
70 ///////////////////////////////////////////////////////////////////////////////
72 class MediaGalleriesPrivateGalleryWatchApiTest : public ExtensionApiTest {
74 MediaGalleriesPrivateGalleryWatchApiTest()
76 background_host_(NULL) {
78 virtual ~MediaGalleriesPrivateGalleryWatchApiTest() {}
81 // ExtensionApiTest overrides.
82 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
83 ExtensionApiTest::SetUpCommandLine(command_line);
84 command_line->AppendSwitchASCII(
85 extensions::switches::kWhitelistedExtensionID,
88 virtual void SetUpOnMainThread() OVERRIDE {
89 ExtensionApiTest::SetUpOnMainThread();
90 ensure_media_directories_exists_.reset(new EnsureMediaDirectoriesExists);
91 extension_ = LoadExtension(test_data_dir_.AppendASCII(kTestExtensionPath));
92 GetBackgroundHostForTestExtension();
94 FetchMediaGalleriesList();
96 virtual void TearDownOnMainThread() OVERRIDE {
98 background_host_ = NULL;
99 ensure_media_directories_exists_.reset();
100 ExtensionApiTest::TearDownOnMainThread();
103 bool GalleryWatchesSupported() {
104 return base::FilePathWatcher::RecursiveWatchAvailable();
107 void ExecuteCmdAndCheckReply(const std::string& js_command,
108 const std::string& ok_message) {
109 ExtensionTestMessageListener listener(ok_message, false);
110 background_host_->GetMainFrame()->ExecuteJavaScript(
111 base::ASCIIToUTF16(js_command));
112 EXPECT_TRUE(listener.WaitUntilSatisfied());
115 bool AddNewFileInTestGallery() {
116 base::FilePath gallery_file =
117 test_gallery_.path().Append(FILE_PATH_LITERAL("test1.txt"));
118 std::string content("new content");
119 int write_size = base::WriteFile(gallery_file, content.c_str(),
121 return (write_size == static_cast<int>(content.length()));
124 void SetupGalleryWatches() {
125 std::string expected_result = GalleryWatchesSupported() ?
126 kAddGalleryWatchRequestSucceeded : kAddGalleryWatchRequestFailed;
128 ExtensionTestMessageListener add_gallery_watch_finished(
129 expected_result, false /* no reply */);
130 ExecuteCmdAndCheckReply(kSetupWatchOnValidGalleriesCmd, kAddGalleryWatchOK);
131 EXPECT_TRUE(add_gallery_watch_finished.WaitUntilSatisfied());
135 void GetBackgroundHostForTestExtension() {
136 ASSERT_TRUE(extension_);
137 extensions::ExtensionSystem* extension_system =
138 extensions::ExtensionSystem::Get(browser()->profile());
140 extension_system->process_manager()->GetBackgroundHostForExtension(
141 extension_->id())->render_view_host();
142 ASSERT_TRUE(background_host_);
145 void CreateTestGallery() {
146 MediaGalleriesPreferences* preferences =
147 g_browser_process->media_file_system_registry()->GetPreferences(
148 browser()->profile());
149 base::RunLoop runloop;
150 preferences->EnsureInitialized(runloop.QuitClosure());
153 ASSERT_TRUE(test_gallery_.CreateUniqueTempDir());
154 MediaGalleryPrefInfo gallery_info;
155 ASSERT_FALSE(preferences->LookUpGalleryByPath(test_gallery_.path(),
157 MediaGalleryPrefId id = preferences->AddGallery(
158 gallery_info.device_id,
160 MediaGalleryPrefInfo::kAutoDetected,
161 gallery_info.volume_label,
162 gallery_info.vendor_name,
163 gallery_info.model_name,
164 gallery_info.total_size_in_bytes,
165 gallery_info.last_attach_time,
168 preferences->SetGalleryPermissionForExtension(*extension_, id, true);
171 void FetchMediaGalleriesList() {
172 ExtensionTestMessageListener get_media_systems_finished(
173 kGetMediaFileSystemsCallbackOK, false /* no reply */);
174 ExecuteCmdAndCheckReply(kGetMediaFileSystemsCmd, kGetMediaFileSystemsOK);
175 EXPECT_TRUE(get_media_systems_finished.WaitUntilSatisfied());
178 scoped_ptr<EnsureMediaDirectoriesExists> ensure_media_directories_exists_;
180 base::ScopedTempDir test_gallery_;
182 const extensions::Extension* extension_;
184 content::RenderViewHost* background_host_;
186 DISALLOW_COPY_AND_ASSIGN(MediaGalleriesPrivateGalleryWatchApiTest);
190 #if defined(OS_MACOSX)
191 #define MAYBE_BasicGalleryWatch DISABLED_BasicGalleryWatch
193 #define MAYBE_BasicGalleryWatch BasicGalleryWatch
195 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
196 MAYBE_BasicGalleryWatch) {
197 SetupGalleryWatches();
199 // Add gallery watch listener.
200 ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
201 kAddGalleryChangedListenerOK);
203 // Modify gallery contents.
204 ExtensionTestMessageListener gallery_change_event_received(
205 kGalleryChangedEventReceived, false /* no reply */);
206 ASSERT_TRUE(AddNewFileInTestGallery());
207 if (GalleryWatchesSupported())
208 EXPECT_TRUE(gallery_change_event_received.WaitUntilSatisfied());
210 // Remove gallery watch listener.
211 ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
212 kRemoveGalleryChangedListenerOK);
214 // Remove gallery watch request.
215 if (GalleryWatchesSupported())
216 ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
219 // http://crbug.com/390979
220 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
221 DISABLED_RemoveListenerAndModifyGallery) {
222 if (!GalleryWatchesSupported())
225 SetupGalleryWatches();
227 // Add a gallery watch listener.
228 ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
229 kAddGalleryChangedListenerOK);
230 // Modify gallery contents.
231 ExtensionTestMessageListener gallery_change_event_received(
232 kGalleryChangedEventReceived, false /* no reply */);
233 ASSERT_TRUE(AddNewFileInTestGallery());
234 EXPECT_TRUE(gallery_change_event_received.WaitUntilSatisfied());
236 // Remove gallery watch listener.
237 ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
238 kRemoveGalleryChangedListenerOK);
240 // No listener, modify gallery contents.
241 ASSERT_TRUE(AddNewFileInTestGallery());
243 // Remove gallery watch.
244 ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
247 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
248 SetupGalleryWatchWithoutListeners) {
249 if (!GalleryWatchesSupported())
252 SetupGalleryWatches();
254 // No listeners, modify gallery contents.
255 ExtensionTestMessageListener gallery_change_event_received(
256 kGalleryChangedEventReceived, false /* no reply */);
257 ASSERT_TRUE(AddNewFileInTestGallery());
259 // Remove gallery watch.
260 ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
263 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
264 SetupGalleryChangedListenerWithoutWatchers) {
265 // Add gallery watch listener.
266 ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
267 kAddGalleryChangedListenerOK);
269 // Modify gallery contents. Listener should not get called because add watch
270 // request was not called.
271 ExtensionTestMessageListener gallery_change_event_received(
272 kGalleryChangedEventReceived, false /* no reply */);
273 ASSERT_TRUE(AddNewFileInTestGallery());
275 // Remove gallery watch listener.
276 ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
277 kRemoveGalleryChangedListenerOK);
280 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
281 SetupWatchOnInvalidGallery) {
282 // Set up a invalid gallery watch.
283 ExtensionTestMessageListener invalid_gallery_watch_request_finished(
284 kAddGalleryWatchRequestFailed, false /* no reply */);
285 ExecuteCmdAndCheckReply(kSetupWatchOnInvalidGalleryCmd, kAddGalleryWatchOK);
286 EXPECT_TRUE(invalid_gallery_watch_request_finished.WaitUntilSatisfied());
289 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
290 GetAllGalleryWatch) {
291 // Gallery watchers are not yet added.
292 // chrome.mediaGalleriesPrivate.getAllGalleryWatch should return an empty
294 ExtensionTestMessageListener initial_get_all_check_finished(
295 kNoGalleryWatchesInstalled, false /* no reply */);
296 ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
297 EXPECT_TRUE(initial_get_all_check_finished.WaitUntilSatisfied());
299 if (!GalleryWatchesSupported())
302 SetupGalleryWatches();
304 // chrome.mediaGalleriesPrivate.getAllGalleryWatch should return the
305 // gallery identifiers.
306 ExtensionTestMessageListener get_all_watched_galleries_finished(
307 kGalleryWatchesCheck, false /* no reply */);
308 ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
309 EXPECT_TRUE(get_all_watched_galleries_finished.WaitUntilSatisfied());
311 // Remove gallery watch request.
312 ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
314 // Gallery watchers removed.
315 // chrome.mediaGalleriesPrivate.getAllGalleryWatch() should return an empty
317 ExtensionTestMessageListener final_get_all_check_finished(
318 kNoGalleryWatchesInstalled, false /* no reply */);
319 ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
320 EXPECT_TRUE(final_get_all_check_finished.WaitUntilSatisfied());
323 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
324 RemoveAllGalleryWatch) {
325 if (!GalleryWatchesSupported())
328 SetupGalleryWatches();
330 // chrome.mediaGalleriesPrivate.getAllGalleryWatch should return the watched
331 // gallery identifiers.
332 ExtensionTestMessageListener get_all_watched_galleries_finished(
333 kGalleryWatchesCheck, false /* no reply */);
334 ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
335 EXPECT_TRUE(get_all_watched_galleries_finished.WaitUntilSatisfied());
337 // Remove all gallery watchers.
338 ExecuteCmdAndCheckReply(kRemoveAllGalleryWatchCmd, kRemoveAllGalleryWatchOK);
340 // Gallery watchers removed. chrome.mediaGalleriesPrivate.getAllGalleryWatch
341 // should return an empty list.
342 ExtensionTestMessageListener final_get_all_check_finished(
343 kNoGalleryWatchesInstalled, false /* no reply */);
344 ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
345 EXPECT_TRUE(final_get_all_check_finished.WaitUntilSatisfied());