Upstream version 8.37.180.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / media_galleries_private / media_galleries_watch_apitest.cc
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.
4 //
5 // MediaGalleriesPrivate gallery watch API browser tests.
6
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"
27
28 namespace {
29
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";
34
35 // JS commands.
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()";
45
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";
57
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";
64
65 }  // namespace
66
67
68 ///////////////////////////////////////////////////////////////////////////////
69 //                 MediaGalleriesPrivateGalleryWatchApiTest                  //
70 ///////////////////////////////////////////////////////////////////////////////
71
72 class MediaGalleriesPrivateGalleryWatchApiTest : public ExtensionApiTest {
73  public:
74   MediaGalleriesPrivateGalleryWatchApiTest()
75       : extension_(NULL),
76         background_host_(NULL) {
77   }
78   virtual ~MediaGalleriesPrivateGalleryWatchApiTest() {}
79
80  protected:
81   // ExtensionApiTest overrides.
82   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
83     ExtensionApiTest::SetUpCommandLine(command_line);
84     command_line->AppendSwitchASCII(
85         extensions::switches::kWhitelistedExtensionID,
86         kTestExtensionId);
87   }
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();
93     CreateTestGallery();
94     FetchMediaGalleriesList();
95   }
96   virtual void TearDownOnMainThread() OVERRIDE {
97     extension_ = NULL;
98     background_host_ = NULL;
99     ensure_media_directories_exists_.reset();
100     ExtensionApiTest::TearDownOnMainThread();
101   }
102
103   bool GalleryWatchesSupported() {
104     return base::FilePathWatcher::RecursiveWatchAvailable();
105   }
106
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());
113   }
114
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(),
120                                      content.length());
121     return (write_size == static_cast<int>(content.length()));
122   }
123
124   void SetupGalleryWatches() {
125     std::string expected_result = GalleryWatchesSupported() ?
126         kAddGalleryWatchRequestSucceeded : kAddGalleryWatchRequestFailed;
127
128     ExtensionTestMessageListener add_gallery_watch_finished(
129         expected_result, false  /* no reply */);
130     ExecuteCmdAndCheckReply(kSetupWatchOnValidGalleriesCmd, kAddGalleryWatchOK);
131     EXPECT_TRUE(add_gallery_watch_finished.WaitUntilSatisfied());
132   }
133
134  private:
135   void GetBackgroundHostForTestExtension() {
136     ASSERT_TRUE(extension_);
137     extensions::ExtensionSystem* extension_system =
138         extensions::ExtensionSystem::Get(browser()->profile());
139     background_host_ =
140         extension_system->process_manager()->GetBackgroundHostForExtension(
141             extension_->id())->render_view_host();
142     ASSERT_TRUE(background_host_);
143   }
144
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());
151     runloop.Run();
152
153     ASSERT_TRUE(test_gallery_.CreateUniqueTempDir());
154     MediaGalleryPrefInfo gallery_info;
155     ASSERT_FALSE(preferences->LookUpGalleryByPath(test_gallery_.path(),
156                                                   &gallery_info));
157     MediaGalleryPrefId id = preferences->AddGallery(
158         gallery_info.device_id,
159         gallery_info.path,
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,
166         0, 0, 0);
167
168     preferences->SetGalleryPermissionForExtension(*extension_, id, true);
169   }
170
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());
176   }
177
178   scoped_ptr<EnsureMediaDirectoriesExists> ensure_media_directories_exists_;
179
180   base::ScopedTempDir test_gallery_;
181
182   const extensions::Extension* extension_;
183
184   content::RenderViewHost* background_host_;
185
186   DISALLOW_COPY_AND_ASSIGN(MediaGalleriesPrivateGalleryWatchApiTest);
187 };
188
189 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
190                        BasicGalleryWatch) {
191   SetupGalleryWatches();
192
193   // Add gallery watch listener.
194   ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
195                           kAddGalleryChangedListenerOK);
196
197   // Modify gallery contents.
198   ExtensionTestMessageListener gallery_change_event_received(
199       kGalleryChangedEventReceived, false  /* no reply */);
200   ASSERT_TRUE(AddNewFileInTestGallery());
201   if (GalleryWatchesSupported())
202     EXPECT_TRUE(gallery_change_event_received.WaitUntilSatisfied());
203
204   // Remove gallery watch listener.
205   ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
206                           kRemoveGalleryChangedListenerOK);
207
208   // Remove gallery watch request.
209   if (GalleryWatchesSupported())
210     ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
211 }
212
213 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
214                        RemoveListenerAndModifyGallery) {
215   if (!GalleryWatchesSupported())
216     return;
217
218   SetupGalleryWatches();
219
220   // Add a gallery watch listener.
221   ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
222                           kAddGalleryChangedListenerOK);
223   // Modify gallery contents.
224   ExtensionTestMessageListener gallery_change_event_received(
225       kGalleryChangedEventReceived, false  /* no reply */);
226   ASSERT_TRUE(AddNewFileInTestGallery());
227   EXPECT_TRUE(gallery_change_event_received.WaitUntilSatisfied());
228
229   // Remove gallery watch listener.
230   ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
231                           kRemoveGalleryChangedListenerOK);
232
233   // No listener, modify gallery contents.
234   ASSERT_TRUE(AddNewFileInTestGallery());
235
236   // Remove gallery watch.
237   ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
238 }
239
240 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
241                        SetupGalleryWatchWithoutListeners) {
242   if (!GalleryWatchesSupported())
243     return;
244
245   SetupGalleryWatches();
246
247   // No listeners, modify gallery contents.
248   ExtensionTestMessageListener gallery_change_event_received(
249       kGalleryChangedEventReceived, false  /* no reply */);
250   ASSERT_TRUE(AddNewFileInTestGallery());
251
252   // Remove gallery watch.
253   ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
254 }
255
256 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
257                        SetupGalleryChangedListenerWithoutWatchers) {
258   // Add gallery watch listener.
259   ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
260                           kAddGalleryChangedListenerOK);
261
262   // Modify gallery contents. Listener should not get called because add watch
263   // request was not called.
264   ExtensionTestMessageListener gallery_change_event_received(
265       kGalleryChangedEventReceived, false  /* no reply */);
266   ASSERT_TRUE(AddNewFileInTestGallery());
267
268   // Remove gallery watch listener.
269   ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
270                           kRemoveGalleryChangedListenerOK);
271 }
272
273 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
274                        SetupWatchOnInvalidGallery) {
275   // Set up a invalid gallery watch.
276   ExtensionTestMessageListener invalid_gallery_watch_request_finished(
277       kAddGalleryWatchRequestFailed, false  /* no reply */);
278   ExecuteCmdAndCheckReply(kSetupWatchOnInvalidGalleryCmd, kAddGalleryWatchOK);
279   EXPECT_TRUE(invalid_gallery_watch_request_finished.WaitUntilSatisfied());
280 }
281
282 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
283                        GetAllGalleryWatch) {
284   // Gallery watchers are not yet added.
285   // chrome.mediaGalleriesPrivate.getAllGalleryWatch should return an empty
286   // list.
287   ExtensionTestMessageListener initial_get_all_check_finished(
288       kNoGalleryWatchesInstalled, false  /* no reply */);
289   ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
290   EXPECT_TRUE(initial_get_all_check_finished.WaitUntilSatisfied());
291
292   if (!GalleryWatchesSupported())
293     return;
294
295   SetupGalleryWatches();
296
297   // chrome.mediaGalleriesPrivate.getAllGalleryWatch should return the
298   // gallery identifiers.
299   ExtensionTestMessageListener get_all_watched_galleries_finished(
300       kGalleryWatchesCheck, false  /* no reply */);
301   ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
302   EXPECT_TRUE(get_all_watched_galleries_finished.WaitUntilSatisfied());
303
304   // Remove gallery watch request.
305   ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
306
307   // Gallery watchers removed.
308   // chrome.mediaGalleriesPrivate.getAllGalleryWatch() should return an empty
309   // list.
310   ExtensionTestMessageListener final_get_all_check_finished(
311       kNoGalleryWatchesInstalled, false  /* no reply */);
312   ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
313   EXPECT_TRUE(final_get_all_check_finished.WaitUntilSatisfied());
314 }
315
316 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
317                        RemoveAllGalleryWatch) {
318   if (!GalleryWatchesSupported())
319     return;
320
321   SetupGalleryWatches();
322
323   // chrome.mediaGalleriesPrivate.getAllGalleryWatch should return the watched
324   // gallery identifiers.
325   ExtensionTestMessageListener get_all_watched_galleries_finished(
326       kGalleryWatchesCheck, false  /* no reply */);
327   ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
328   EXPECT_TRUE(get_all_watched_galleries_finished.WaitUntilSatisfied());
329
330   // Remove all gallery watchers.
331   ExecuteCmdAndCheckReply(kRemoveAllGalleryWatchCmd, kRemoveAllGalleryWatchOK);
332
333   // Gallery watchers removed. chrome.mediaGalleriesPrivate.getAllGalleryWatch
334   // should return an empty list.
335   ExtensionTestMessageListener final_get_all_check_finished(
336       kNoGalleryWatchesInstalled, false  /* no reply */);
337   ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
338   EXPECT_TRUE(final_get_all_check_finished.WaitUntilSatisfied());
339 }