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/path_service.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "build/build_config.h"
12 #include "chrome/browser/extensions/extension_apitest.h"
13 #include "chrome/browser/extensions/extension_service.h"
14 #include "chrome/browser/extensions/extension_system.h"
15 #include "chrome/browser/extensions/extension_test_message_listener.h"
16 #include "chrome/browser/media_galleries/media_galleries_test_util.h"
17 #include "chrome/common/chrome_paths.h"
18 #include "chrome/common/chrome_switches.h"
19 #include "content/public/browser/render_view_host.h"
20 #include "extensions/common/extension.h"
24 // Id of test extension from
25 // chrome/test/data/extensions/api_test/|kTestExtensionPath|
26 const char kTestExtensionId[] = "gceegfkgibmgpfopknlcgleimclbknie";
27 const char kTestExtensionPath[] = "media_galleries_private/gallerywatch";
29 #if !defined(OS_CHROMEOS)
31 const char kGetAllWatchedGalleryIdsCmd[] = "getAllWatchedGalleryIds()";
32 const char kGetMediaFileSystemsCmd[] = "getMediaFileSystems()";
33 const char kSetupWatchOnValidGalleriesCmd[] = "setupWatchOnValidGalleries()";
35 const char kAddGalleryChangedListenerCmd[] = "addGalleryChangedListener()";
36 const char kRemoveAllGalleryWatchCmd[] = "removeAllGalleryWatch()";
37 const char kRemoveGalleryChangedListenerCmd[] =
38 "removeGalleryChangedListener()";
39 const char kRemoveGalleryWatchCmd[] = "removeGalleryWatch()";
40 const char kSetupWatchOnInvalidGalleryCmd[] = "setupWatchOnInvalidGallery()";
41 #endif // defined(OS_WIN)
43 // And JS reply messages.
44 const char kAddGalleryWatchOK[] = "add_gallery_watch_ok";
45 const char kGetAllGalleryWatchOK[] = "get_all_gallery_watch_ok";
46 const char kGetMediaFileSystemsCallbackOK[] =
47 "get_media_file_systems_callback_ok";
48 const char kGetMediaFileSystemsOK[] = "get_media_file_systems_ok";
50 const char kAddGalleryChangedListenerOK[] = "add_gallery_changed_listener_ok";
51 const char kRemoveAllGalleryWatchOK[] = "remove_all_gallery_watch_ok";
52 const char kRemoveGalleryChangedListenerOK[] =
53 "remove_gallery_changed_listener_ok";
54 const char kRemoveGalleryWatchOK[] = "remove_gallery_watch_ok";
55 #endif // defined(OS_WIN)
57 // Test reply messages.
58 const char kGetAllGalleryWatchResultA[] = "gallery_watchers_does_not_exists";
59 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 kGetAllGalleryWatchResultB[] =
64 "watchers_for_galleries_{1, 2, 3}_found";
65 #endif // defined(OS_WIN)
66 #endif // !defined(OS_CHROMEOS)
71 ///////////////////////////////////////////////////////////////////////////////
72 // MediaGalleriesPrivateGalleryWatchApiTest //
73 ///////////////////////////////////////////////////////////////////////////////
75 class MediaGalleriesPrivateGalleryWatchApiTest : public ExtensionApiTest {
77 MediaGalleriesPrivateGalleryWatchApiTest() {}
78 virtual ~MediaGalleriesPrivateGalleryWatchApiTest() {}
81 // ExtensionApiTest overrides.
82 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
83 ExtensionApiTest::SetUpCommandLine(command_line);
84 command_line->AppendSwitchASCII(switches::kWhitelistedExtensionID,
88 void ExecuteCmdAndCheckReply(content::RenderViewHost* host,
89 const std::string& js_command,
90 const std::string& ok_message) {
91 ExtensionTestMessageListener listener(ok_message, false);
92 host->ExecuteJavascriptInWebFrame(base::string16(),
93 base::ASCIIToUTF16(js_command));
94 EXPECT_TRUE(listener.WaitUntilSatisfied());
97 bool AddNewFileInGallery(int gallery_directory_key) {
98 if ((gallery_directory_key != chrome::DIR_USER_MUSIC) &&
99 (gallery_directory_key != chrome::DIR_USER_PICTURES) &&
100 (gallery_directory_key != chrome::DIR_USER_VIDEOS))
103 base::FilePath gallery_dir;
104 if (!PathService::Get(gallery_directory_key, &gallery_dir))
106 base::FilePath gallery_file =
107 gallery_dir.Append(FILE_PATH_LITERAL("test1.txt"));
108 std::string content("new content");
109 int write_size = file_util::WriteFile(gallery_file, content.c_str(),
111 return (write_size == static_cast<int>(content.length()));
114 // Loads the test extension and returns the RenderViewHost of the extension.
115 // Returns NULL if the extension load operation failed.
116 content::RenderViewHost* GetBackgroundHostForTestExtension() {
117 const extensions::Extension* extension =
118 LoadExtension(test_data_dir_.AppendASCII(kTestExtensionPath));
121 return extensions::ExtensionSystem::Get(browser()->profile())->
122 process_manager()->GetBackgroundHostForExtension(extension->id())->
127 DISALLOW_COPY_AND_ASSIGN(MediaGalleriesPrivateGalleryWatchApiTest);
131 ///////////////////////////////////////////////////////////////////////////////
133 ///////////////////////////////////////////////////////////////////////////////
135 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
137 EnsureMediaDirectoriesExists media_directories;
138 content::RenderViewHost* host = GetBackgroundHostForTestExtension();
141 // Get media file systems.
142 ExtensionTestMessageListener get_media_systems_finished(
143 kGetMediaFileSystemsCallbackOK, false /* no reply */);
144 ExecuteCmdAndCheckReply(host, kGetMediaFileSystemsCmd,
145 kGetMediaFileSystemsOK);
146 EXPECT_TRUE(get_media_systems_finished.WaitUntilSatisfied());
148 // Set up gallery watch.
149 ExtensionTestMessageListener add_gallery_watch_finished(
150 kAddGalleryWatchRequestSucceeded, false /* no reply */);
151 ExecuteCmdAndCheckReply(host, kSetupWatchOnValidGalleriesCmd,
153 EXPECT_TRUE(add_gallery_watch_finished.WaitUntilSatisfied());
155 // Add gallery watch listener.
156 ExecuteCmdAndCheckReply(host, kAddGalleryChangedListenerCmd,
157 kAddGalleryChangedListenerOK);
159 // Modify gallery contents.
160 ExtensionTestMessageListener music_gallery_change_event_received(
161 kGalleryChangedEventReceived, false /* no reply */);
162 ASSERT_TRUE(AddNewFileInGallery(chrome::DIR_USER_MUSIC));
163 EXPECT_TRUE(music_gallery_change_event_received.WaitUntilSatisfied());
165 ExtensionTestMessageListener pictures_gallery_change_event_received(
166 kGalleryChangedEventReceived, false /* no reply */);
167 ASSERT_TRUE(AddNewFileInGallery(chrome::DIR_USER_PICTURES));
168 EXPECT_TRUE(pictures_gallery_change_event_received.WaitUntilSatisfied());
170 ExtensionTestMessageListener videos_gallery_change_event_received(
171 kGalleryChangedEventReceived, false /* no reply */);
172 ASSERT_TRUE(AddNewFileInGallery(chrome::DIR_USER_VIDEOS));
173 EXPECT_TRUE(videos_gallery_change_event_received.WaitUntilSatisfied());
175 // Remove gallery watch listener.
176 ExecuteCmdAndCheckReply(host, kRemoveGalleryChangedListenerCmd,
177 kRemoveGalleryChangedListenerOK);
179 // Remove gallery watch request.
180 ExecuteCmdAndCheckReply(host, kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
183 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
184 RemoveListenerAndModifyGallery) {
185 EnsureMediaDirectoriesExists media_directories;
186 content::RenderViewHost* host = GetBackgroundHostForTestExtension();
189 // Get media file systems.
190 ExtensionTestMessageListener get_media_systems_finished(
191 kGetMediaFileSystemsCallbackOK, false /* no reply */);
192 ExecuteCmdAndCheckReply(host, kGetMediaFileSystemsCmd,
193 kGetMediaFileSystemsOK);
194 EXPECT_TRUE(get_media_systems_finished.WaitUntilSatisfied());
196 // Set up gallery watch.
197 ExtensionTestMessageListener add_gallery_watch_finished(
198 kAddGalleryWatchRequestSucceeded, false /* no reply */);
199 ExecuteCmdAndCheckReply(host, kSetupWatchOnValidGalleriesCmd,
201 EXPECT_TRUE(add_gallery_watch_finished.WaitUntilSatisfied());
203 // Add a gallery watch listener.
204 ExecuteCmdAndCheckReply(host, kAddGalleryChangedListenerCmd,
205 kAddGalleryChangedListenerOK);
206 // Modify gallery contents.
207 ExtensionTestMessageListener music_gallery_change_event_received(
208 kGalleryChangedEventReceived, false /* no reply */);
209 ASSERT_TRUE(AddNewFileInGallery(chrome::DIR_USER_MUSIC));
210 EXPECT_TRUE(music_gallery_change_event_received.WaitUntilSatisfied());
212 // Remove gallery watch listener.
213 ExecuteCmdAndCheckReply(host, kRemoveGalleryChangedListenerCmd,
214 kRemoveGalleryChangedListenerOK);
216 // No listener, modify gallery contents.
217 ASSERT_TRUE(AddNewFileInGallery(chrome::DIR_USER_MUSIC));
219 // Remove gallery watch.
220 ExecuteCmdAndCheckReply(host, kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
223 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
224 SetupGalleryWatchWithoutListeners) {
225 EnsureMediaDirectoriesExists media_directories;
226 content::RenderViewHost* host = GetBackgroundHostForTestExtension();
229 // Get media file systems.
230 ExtensionTestMessageListener get_media_systems_finished(
231 kGetMediaFileSystemsCallbackOK, false /* no reply */);
232 ExecuteCmdAndCheckReply(host, kGetMediaFileSystemsCmd,
233 kGetMediaFileSystemsOK);
234 EXPECT_TRUE(get_media_systems_finished.WaitUntilSatisfied());
236 // Set up gallery watch.
237 ExecuteCmdAndCheckReply(host, kSetupWatchOnValidGalleriesCmd,
240 // No listeners, modify gallery contents.
241 ExtensionTestMessageListener music_gallery_change_event_received(
242 kGalleryChangedEventReceived, false /* no reply */);
243 ASSERT_TRUE(AddNewFileInGallery(chrome::DIR_USER_MUSIC));
245 // Remove gallery watch.
246 ExecuteCmdAndCheckReply(host, kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
249 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
250 SetupGalleryChangedListenerWithoutWatchers) {
251 EnsureMediaDirectoriesExists media_directories;
252 content::RenderViewHost* host = GetBackgroundHostForTestExtension();
255 // Get media file systems.
256 ExtensionTestMessageListener get_media_systems_finished(
257 kGetMediaFileSystemsCallbackOK, false /* no reply */);
258 ExecuteCmdAndCheckReply(host, kGetMediaFileSystemsCmd,
259 kGetMediaFileSystemsOK);
260 EXPECT_TRUE(get_media_systems_finished.WaitUntilSatisfied());
262 // Add gallery watch listener.
263 ExecuteCmdAndCheckReply(host, kAddGalleryChangedListenerCmd,
264 kAddGalleryChangedListenerOK);
266 // Modify gallery contents. Listener should not get called because add watch
267 // request was not called.
268 ExtensionTestMessageListener music_gallery_change_event_received(
269 kGalleryChangedEventReceived, false /* no reply */);
270 ASSERT_TRUE(AddNewFileInGallery(chrome::DIR_USER_MUSIC));
272 // Remove gallery watch listener.
273 ExecuteCmdAndCheckReply(host, kRemoveGalleryChangedListenerCmd,
274 kRemoveGalleryChangedListenerOK);
277 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
278 SetupWatchOnInvalidGallery) {
279 content::RenderViewHost* host = GetBackgroundHostForTestExtension();
282 // Set up a invalid gallery watch.
283 ExtensionTestMessageListener invalid_gallery_watch_request_finished(
284 kAddGalleryWatchRequestFailed, false /* no reply */);
285 ExecuteCmdAndCheckReply(host, kSetupWatchOnInvalidGalleryCmd,
287 EXPECT_TRUE(invalid_gallery_watch_request_finished.WaitUntilSatisfied());
290 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
291 GetAllGalleryWatch) {
292 EnsureMediaDirectoriesExists media_directories;
293 content::RenderViewHost* host = GetBackgroundHostForTestExtension();
296 // Get media file systems.
297 ExtensionTestMessageListener get_media_systems_finished(
298 kGetMediaFileSystemsCallbackOK, false /* no reply */);
299 ExecuteCmdAndCheckReply(host, kGetMediaFileSystemsCmd,
300 kGetMediaFileSystemsOK);
301 EXPECT_TRUE(get_media_systems_finished.WaitUntilSatisfied());
303 // Gallery watchers are not yet added.
304 // chrome.mediaGalleriesPrivate.getAllGalleryWatch should return an empty
306 ExtensionTestMessageListener initial_get_all_check_finished(
307 kGetAllGalleryWatchResultA, false /* no reply */);
308 ExecuteCmdAndCheckReply(host, kGetAllWatchedGalleryIdsCmd,
309 kGetAllGalleryWatchOK);
310 EXPECT_TRUE(initial_get_all_check_finished.WaitUntilSatisfied());
312 // Set up gallery watchers.
313 ExtensionTestMessageListener add_gallery_watch_finished(
314 kAddGalleryWatchRequestSucceeded, false /* no reply */);
315 ExecuteCmdAndCheckReply(host, kSetupWatchOnValidGalleriesCmd,
317 EXPECT_TRUE(add_gallery_watch_finished.WaitUntilSatisfied());
319 // chrome.mediaGalleriesPrivate.getAllGalleryWatch should return the
320 // gallery identifiers.
321 ExtensionTestMessageListener get_all_watched_galleries_finished(
322 kGetAllGalleryWatchResultB, false /* no reply */);
323 ExecuteCmdAndCheckReply(host, kGetAllWatchedGalleryIdsCmd,
324 kGetAllGalleryWatchOK);
325 EXPECT_TRUE(get_all_watched_galleries_finished.WaitUntilSatisfied());
327 // Remove gallery watch request.
328 ExecuteCmdAndCheckReply(host, kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
330 // Gallery watchers removed.
331 // chrome.mediaGalleriesPrivate.getAllGalleryWatch() should return an empty
333 ExtensionTestMessageListener final_get_all_check_finished(
334 kGetAllGalleryWatchResultA, false /* no reply */);
335 ExecuteCmdAndCheckReply(host, kGetAllWatchedGalleryIdsCmd,
336 kGetAllGalleryWatchOK);
337 EXPECT_TRUE(final_get_all_check_finished.WaitUntilSatisfied());
340 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
341 RemoveAllGalleryWatch) {
342 EnsureMediaDirectoriesExists media_directories;
343 content::RenderViewHost* host = GetBackgroundHostForTestExtension();
346 // Get media file systems.
347 ExtensionTestMessageListener get_media_systems_finished(
348 kGetMediaFileSystemsCallbackOK, false /* no reply */);
349 ExecuteCmdAndCheckReply(host, kGetMediaFileSystemsCmd,
350 kGetMediaFileSystemsOK);
351 EXPECT_TRUE(get_media_systems_finished.WaitUntilSatisfied());
353 // Set up gallery watchers.
354 ExtensionTestMessageListener add_gallery_watch_finished(
355 kAddGalleryWatchRequestSucceeded, false /* no reply */);
356 ExecuteCmdAndCheckReply(host, kSetupWatchOnValidGalleriesCmd,
358 EXPECT_TRUE(add_gallery_watch_finished.WaitUntilSatisfied());
360 // chrome.mediaGalleriesPrivate.getAllGalleryWatch should return the watched
361 // gallery identifiers.
362 ExtensionTestMessageListener get_all_watched_galleries_finished(
363 kGetAllGalleryWatchResultB, false /* no reply */);
364 ExecuteCmdAndCheckReply(host, kGetAllWatchedGalleryIdsCmd,
365 kGetAllGalleryWatchOK);
366 EXPECT_TRUE(get_all_watched_galleries_finished.WaitUntilSatisfied());
368 // Remove all gallery watchers.
369 ExecuteCmdAndCheckReply(host, kRemoveAllGalleryWatchCmd,
370 kRemoveAllGalleryWatchOK);
372 // Gallery watchers removed. chrome.mediaGalleriesPrivate.getAllGalleryWatch
373 // should return an empty list.
374 ExtensionTestMessageListener final_get_all_check_finished(
375 kGetAllGalleryWatchResultA, false /* no reply */);
376 ExecuteCmdAndCheckReply(host, kGetAllWatchedGalleryIdsCmd,
377 kGetAllGalleryWatchOK);
378 EXPECT_TRUE(final_get_all_check_finished.WaitUntilSatisfied());
382 #if !defined(OS_WIN) && !defined(OS_CHROMEOS)
383 // Gallery watch request is not enabled on non-windows platforms.
384 // Please refer to crbug.com/144491.
385 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
387 EnsureMediaDirectoriesExists media_directories;
388 content::RenderViewHost* host = GetBackgroundHostForTestExtension();
391 // Get media file systems.
392 ExtensionTestMessageListener get_media_systems_finished(
393 kGetMediaFileSystemsCallbackOK, false /* no reply */);
394 ExecuteCmdAndCheckReply(host, kGetMediaFileSystemsCmd,
395 kGetMediaFileSystemsOK);
396 EXPECT_TRUE(get_media_systems_finished.WaitUntilSatisfied());
398 // Set up a invalid gallery watch.
399 ExtensionTestMessageListener gallery_watch_request_finished(
400 kAddGalleryWatchRequestFailed, false /* no reply */);
401 // Set up gallery watch.
402 ExecuteCmdAndCheckReply(host, kSetupWatchOnValidGalleriesCmd,
404 EXPECT_TRUE(gallery_watch_request_finished.WaitUntilSatisfied());
407 // Gallery watch request is not enabled on non-windows platforms.
408 // Please refer to crbug.com/144491.
409 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
410 GetAllGalleryWatch) {
411 EnsureMediaDirectoriesExists media_directories;
412 content::RenderViewHost* host = GetBackgroundHostForTestExtension();
415 // Get media file systems.
416 ExtensionTestMessageListener get_media_systems_finished(
417 kGetMediaFileSystemsCallbackOK, false /* no reply */);
418 ExecuteCmdAndCheckReply(host, kGetMediaFileSystemsCmd,
419 kGetMediaFileSystemsOK);
420 EXPECT_TRUE(get_media_systems_finished.WaitUntilSatisfied());
422 // Set up gallery watch.
423 ExecuteCmdAndCheckReply(host, kSetupWatchOnValidGalleriesCmd,
426 // Gallery watchers does not exists.
427 // chrome.mediaGalleriesPrivate.getAllGalleryWatch should return an empty
429 ExtensionTestMessageListener get_all_gallery_watch_finished(
430 kGetAllGalleryWatchResultA, false /* no reply */);
431 ExecuteCmdAndCheckReply(host, kGetAllWatchedGalleryIdsCmd,
432 kGetAllGalleryWatchOK);
433 EXPECT_TRUE(get_all_gallery_watch_finished.WaitUntilSatisfied());