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/files/file_path.h"
8 #include "base/files/file_path_watcher.h"
9 #include "base/files/file_util.h"
10 #include "base/run_loop.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "build/build_config.h"
13 #include "chrome/browser/browser_process.h"
14 #include "chrome/browser/extensions/extension_apitest.h"
15 #include "chrome/browser/media_galleries/media_file_system_registry.h"
16 #include "chrome/browser/media_galleries/media_galleries_preferences.h"
17 #include "chrome/browser/media_galleries/media_galleries_test_util.h"
18 #include "chrome/common/chrome_paths.h"
19 #include "content/public/browser/render_frame_host.h"
20 #include "content/public/browser/render_view_host.h"
21 #include "extensions/browser/process_manager.h"
22 #include "extensions/common/extension.h"
23 #include "extensions/common/switches.h"
24 #include "extensions/test/extension_test_message_listener.h"
28 // Id of test extension from
29 // chrome/test/data/extensions/api_test/|kTestExtensionPath|
30 const char kTestExtensionId[] = "gceegfkgibmgpfopknlcgleimclbknie";
31 const char kTestExtensionPath[] = "media_galleries_private/gallerywatch";
34 const char kGetAllWatchedGalleryIdsCmd[] = "getAllWatchedGalleryIds()";
35 const char kGetMediaFileSystemsCmd[] = "getMediaFileSystems()";
36 const char kSetupWatchOnValidGalleriesCmd[] = "setupWatchOnValidGalleries()";
37 const char kAddGalleryChangedListenerCmd[] = "addGalleryChangedListener()";
38 const char kRemoveAllGalleryWatchCmd[] = "removeAllGalleryWatch()";
39 const char kRemoveGalleryChangedListenerCmd[] =
40 "removeGalleryChangedListener()";
41 const char kRemoveGalleryWatchCmd[] = "removeGalleryWatch()";
42 const char kSetupWatchOnInvalidGalleryCmd[] = "setupWatchOnInvalidGallery()";
44 // And JS reply messages.
45 const char kAddGalleryWatchOK[] = "add_gallery_watch_ok";
46 const char kGetAllGalleryWatchOK[] = "get_all_gallery_watch_ok";
47 const char kGetMediaFileSystemsCallbackOK[] =
48 "get_media_file_systems_callback_ok";
49 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";
56 // Test reply messages.
57 const char kNoGalleryWatchesInstalled[] = "gallery_watchers_does_not_exists";
58 const char kAddGalleryWatchRequestFailed[] = "add_watch_request_failed";
59 const char kAddGalleryWatchRequestSucceeded[] = "add_watch_request_succeeded";
60 const char kGalleryChangedEventReceived[] = "gallery_changed_event_received";
61 const char kGalleryWatchesCheck[] = "gallery_watcher_checks";
66 ///////////////////////////////////////////////////////////////////////////////
67 // MediaGalleriesPrivateGalleryWatchApiTest //
68 ///////////////////////////////////////////////////////////////////////////////
70 class MediaGalleriesPrivateGalleryWatchApiTest : public ExtensionApiTest {
72 MediaGalleriesPrivateGalleryWatchApiTest()
74 background_host_(NULL) {
76 ~MediaGalleriesPrivateGalleryWatchApiTest() override {}
79 // ExtensionApiTest overrides.
80 void SetUpCommandLine(CommandLine* command_line) override {
81 ExtensionApiTest::SetUpCommandLine(command_line);
82 command_line->AppendSwitchASCII(
83 extensions::switches::kWhitelistedExtensionID,
86 void SetUpOnMainThread() override {
87 ExtensionApiTest::SetUpOnMainThread();
88 ensure_media_directories_exists_.reset(new EnsureMediaDirectoriesExists);
89 extension_ = LoadExtension(test_data_dir_.AppendASCII(kTestExtensionPath));
90 GetBackgroundHostForTestExtension();
92 FetchMediaGalleriesList();
94 void TearDownOnMainThread() override {
96 background_host_ = NULL;
97 ensure_media_directories_exists_.reset();
98 ExtensionApiTest::TearDownOnMainThread();
101 bool GalleryWatchesSupported() {
102 return base::FilePathWatcher::RecursiveWatchAvailable();
105 void ExecuteCmdAndCheckReply(const std::string& js_command,
106 const std::string& ok_message) {
107 ExtensionTestMessageListener listener(ok_message, false);
108 background_host_->GetMainFrame()->ExecuteJavaScript(
109 base::ASCIIToUTF16(js_command));
110 EXPECT_TRUE(listener.WaitUntilSatisfied());
113 bool AddNewFileInTestGallery() {
114 base::FilePath gallery_file =
115 test_gallery_.path().Append(FILE_PATH_LITERAL("test1.txt"));
116 std::string content("new content");
117 int write_size = base::WriteFile(gallery_file, content.c_str(),
119 return (write_size == static_cast<int>(content.length()));
122 void SetupGalleryWatches() {
123 std::string expected_result = GalleryWatchesSupported() ?
124 kAddGalleryWatchRequestSucceeded : kAddGalleryWatchRequestFailed;
126 ExtensionTestMessageListener add_gallery_watch_finished(
127 expected_result, false /* no reply */);
128 ExecuteCmdAndCheckReply(kSetupWatchOnValidGalleriesCmd, kAddGalleryWatchOK);
129 EXPECT_TRUE(add_gallery_watch_finished.WaitUntilSatisfied());
133 void GetBackgroundHostForTestExtension() {
134 ASSERT_TRUE(extension_);
135 background_host_ = extensions::ProcessManager::Get(browser()->profile())
136 ->GetBackgroundHostForExtension(extension_->id())
137 ->render_view_host();
138 ASSERT_TRUE(background_host_);
141 void CreateTestGallery() {
142 MediaGalleriesPreferences* preferences =
143 g_browser_process->media_file_system_registry()->GetPreferences(
144 browser()->profile());
145 base::RunLoop runloop;
146 preferences->EnsureInitialized(runloop.QuitClosure());
149 ASSERT_TRUE(test_gallery_.CreateUniqueTempDir());
150 MediaGalleryPrefInfo gallery_info;
151 ASSERT_FALSE(preferences->LookUpGalleryByPath(test_gallery_.path(),
153 MediaGalleryPrefId id = preferences->AddGallery(
154 gallery_info.device_id,
156 MediaGalleryPrefInfo::kAutoDetected,
157 gallery_info.volume_label,
158 gallery_info.vendor_name,
159 gallery_info.model_name,
160 gallery_info.total_size_in_bytes,
161 gallery_info.last_attach_time,
164 preferences->SetGalleryPermissionForExtension(*extension_, id, true);
167 void FetchMediaGalleriesList() {
168 ExtensionTestMessageListener get_media_systems_finished(
169 kGetMediaFileSystemsCallbackOK, false /* no reply */);
170 ExecuteCmdAndCheckReply(kGetMediaFileSystemsCmd, kGetMediaFileSystemsOK);
171 EXPECT_TRUE(get_media_systems_finished.WaitUntilSatisfied());
174 scoped_ptr<EnsureMediaDirectoriesExists> ensure_media_directories_exists_;
176 base::ScopedTempDir test_gallery_;
178 const extensions::Extension* extension_;
180 content::RenderViewHost* background_host_;
182 DISALLOW_COPY_AND_ASSIGN(MediaGalleriesPrivateGalleryWatchApiTest);
186 #if defined(OS_MACOSX)
187 #define MAYBE_BasicGalleryWatch DISABLED_BasicGalleryWatch
189 #define MAYBE_BasicGalleryWatch BasicGalleryWatch
191 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
192 MAYBE_BasicGalleryWatch) {
193 SetupGalleryWatches();
195 // Add gallery watch listener.
196 ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
197 kAddGalleryChangedListenerOK);
199 // Modify gallery contents.
200 ExtensionTestMessageListener gallery_change_event_received(
201 kGalleryChangedEventReceived, false /* no reply */);
202 ASSERT_TRUE(AddNewFileInTestGallery());
203 if (GalleryWatchesSupported())
204 EXPECT_TRUE(gallery_change_event_received.WaitUntilSatisfied());
206 // Remove gallery watch listener.
207 ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
208 kRemoveGalleryChangedListenerOK);
210 // Remove gallery watch request.
211 if (GalleryWatchesSupported())
212 ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
215 // http://crbug.com/390979
216 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
217 DISABLED_RemoveListenerAndModifyGallery) {
218 if (!GalleryWatchesSupported())
221 SetupGalleryWatches();
223 // Add a gallery watch listener.
224 ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
225 kAddGalleryChangedListenerOK);
226 // Modify gallery contents.
227 ExtensionTestMessageListener gallery_change_event_received(
228 kGalleryChangedEventReceived, false /* no reply */);
229 ASSERT_TRUE(AddNewFileInTestGallery());
230 EXPECT_TRUE(gallery_change_event_received.WaitUntilSatisfied());
232 // Remove gallery watch listener.
233 ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
234 kRemoveGalleryChangedListenerOK);
236 // No listener, modify gallery contents.
237 ASSERT_TRUE(AddNewFileInTestGallery());
239 // Remove gallery watch.
240 ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
243 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
244 SetupGalleryWatchWithoutListeners) {
245 if (!GalleryWatchesSupported())
248 SetupGalleryWatches();
250 // No listeners, modify gallery contents.
251 ExtensionTestMessageListener gallery_change_event_received(
252 kGalleryChangedEventReceived, false /* no reply */);
253 ASSERT_TRUE(AddNewFileInTestGallery());
255 // Remove gallery watch.
256 ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
259 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
260 SetupGalleryChangedListenerWithoutWatchers) {
261 // Add gallery watch listener.
262 ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
263 kAddGalleryChangedListenerOK);
265 // Modify gallery contents. Listener should not get called because add watch
266 // request was not called.
267 ExtensionTestMessageListener gallery_change_event_received(
268 kGalleryChangedEventReceived, false /* no reply */);
269 ASSERT_TRUE(AddNewFileInTestGallery());
271 // Remove gallery watch listener.
272 ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
273 kRemoveGalleryChangedListenerOK);
276 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
277 SetupWatchOnInvalidGallery) {
278 // Set up a invalid gallery watch.
279 ExtensionTestMessageListener invalid_gallery_watch_request_finished(
280 kAddGalleryWatchRequestFailed, false /* no reply */);
281 ExecuteCmdAndCheckReply(kSetupWatchOnInvalidGalleryCmd, kAddGalleryWatchOK);
282 EXPECT_TRUE(invalid_gallery_watch_request_finished.WaitUntilSatisfied());
285 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
286 GetAllGalleryWatch) {
287 // Gallery watchers are not yet added.
288 // chrome.mediaGalleriesPrivate.getAllGalleryWatch should return an empty
290 ExtensionTestMessageListener initial_get_all_check_finished(
291 kNoGalleryWatchesInstalled, false /* no reply */);
292 ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
293 EXPECT_TRUE(initial_get_all_check_finished.WaitUntilSatisfied());
295 if (!GalleryWatchesSupported())
298 SetupGalleryWatches();
300 // chrome.mediaGalleriesPrivate.getAllGalleryWatch should return the
301 // gallery identifiers.
302 ExtensionTestMessageListener get_all_watched_galleries_finished(
303 kGalleryWatchesCheck, false /* no reply */);
304 ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
305 EXPECT_TRUE(get_all_watched_galleries_finished.WaitUntilSatisfied());
307 // Remove gallery watch request.
308 ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
310 // Gallery watchers removed.
311 // chrome.mediaGalleriesPrivate.getAllGalleryWatch() should return an empty
313 ExtensionTestMessageListener final_get_all_check_finished(
314 kNoGalleryWatchesInstalled, false /* no reply */);
315 ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
316 EXPECT_TRUE(final_get_all_check_finished.WaitUntilSatisfied());
319 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
320 RemoveAllGalleryWatch) {
321 if (!GalleryWatchesSupported())
324 SetupGalleryWatches();
326 // chrome.mediaGalleriesPrivate.getAllGalleryWatch should return the watched
327 // gallery identifiers.
328 ExtensionTestMessageListener get_all_watched_galleries_finished(
329 kGalleryWatchesCheck, false /* no reply */);
330 ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
331 EXPECT_TRUE(get_all_watched_galleries_finished.WaitUntilSatisfied());
333 // Remove all gallery watchers.
334 ExecuteCmdAndCheckReply(kRemoveAllGalleryWatchCmd, kRemoveAllGalleryWatchOK);
336 // Gallery watchers removed. chrome.mediaGalleriesPrivate.getAllGalleryWatch
337 // should return an empty list.
338 ExtensionTestMessageListener final_get_all_check_finished(
339 kNoGalleryWatchesInstalled, false /* no reply */);
340 ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
341 EXPECT_TRUE(final_get_all_check_finished.WaitUntilSatisfied());