Update To 11.40.268.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/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"
25
26 namespace {
27
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";
32
33 // JS commands.
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()";
43
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";
55
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";
62
63 }  // namespace
64
65
66 ///////////////////////////////////////////////////////////////////////////////
67 //                 MediaGalleriesPrivateGalleryWatchApiTest                  //
68 ///////////////////////////////////////////////////////////////////////////////
69
70 class MediaGalleriesPrivateGalleryWatchApiTest : public ExtensionApiTest {
71  public:
72   MediaGalleriesPrivateGalleryWatchApiTest()
73       : extension_(NULL),
74         background_host_(NULL) {
75   }
76   ~MediaGalleriesPrivateGalleryWatchApiTest() override {}
77
78  protected:
79   // ExtensionApiTest overrides.
80   void SetUpCommandLine(CommandLine* command_line) override {
81     ExtensionApiTest::SetUpCommandLine(command_line);
82     command_line->AppendSwitchASCII(
83         extensions::switches::kWhitelistedExtensionID,
84         kTestExtensionId);
85   }
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();
91     CreateTestGallery();
92     FetchMediaGalleriesList();
93   }
94   void TearDownOnMainThread() override {
95     extension_ = NULL;
96     background_host_ = NULL;
97     ensure_media_directories_exists_.reset();
98     ExtensionApiTest::TearDownOnMainThread();
99   }
100
101   bool GalleryWatchesSupported() {
102     return base::FilePathWatcher::RecursiveWatchAvailable();
103   }
104
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());
111   }
112
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(),
118                                      content.length());
119     return (write_size == static_cast<int>(content.length()));
120   }
121
122   void SetupGalleryWatches() {
123     std::string expected_result = GalleryWatchesSupported() ?
124         kAddGalleryWatchRequestSucceeded : kAddGalleryWatchRequestFailed;
125
126     ExtensionTestMessageListener add_gallery_watch_finished(
127         expected_result, false  /* no reply */);
128     ExecuteCmdAndCheckReply(kSetupWatchOnValidGalleriesCmd, kAddGalleryWatchOK);
129     EXPECT_TRUE(add_gallery_watch_finished.WaitUntilSatisfied());
130   }
131
132  private:
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_);
139   }
140
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());
147     runloop.Run();
148
149     ASSERT_TRUE(test_gallery_.CreateUniqueTempDir());
150     MediaGalleryPrefInfo gallery_info;
151     ASSERT_FALSE(preferences->LookUpGalleryByPath(test_gallery_.path(),
152                                                   &gallery_info));
153     MediaGalleryPrefId id = preferences->AddGallery(
154         gallery_info.device_id,
155         gallery_info.path,
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,
162         0, 0, 0);
163
164     preferences->SetGalleryPermissionForExtension(*extension_, id, true);
165   }
166
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());
172   }
173
174   scoped_ptr<EnsureMediaDirectoriesExists> ensure_media_directories_exists_;
175
176   base::ScopedTempDir test_gallery_;
177
178   const extensions::Extension* extension_;
179
180   content::RenderViewHost* background_host_;
181
182   DISALLOW_COPY_AND_ASSIGN(MediaGalleriesPrivateGalleryWatchApiTest);
183 };
184
185 // Crashing on OSX.
186 #if defined(OS_MACOSX)
187 #define MAYBE_BasicGalleryWatch DISABLED_BasicGalleryWatch
188 #else
189 #define MAYBE_BasicGalleryWatch BasicGalleryWatch
190 #endif
191 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
192                        MAYBE_BasicGalleryWatch) {
193   SetupGalleryWatches();
194
195   // Add gallery watch listener.
196   ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
197                           kAddGalleryChangedListenerOK);
198
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());
205
206   // Remove gallery watch listener.
207   ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
208                           kRemoveGalleryChangedListenerOK);
209
210   // Remove gallery watch request.
211   if (GalleryWatchesSupported())
212     ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
213 }
214
215 // http://crbug.com/390979
216 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
217                        DISABLED_RemoveListenerAndModifyGallery) {
218   if (!GalleryWatchesSupported())
219     return;
220
221   SetupGalleryWatches();
222
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());
231
232   // Remove gallery watch listener.
233   ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
234                           kRemoveGalleryChangedListenerOK);
235
236   // No listener, modify gallery contents.
237   ASSERT_TRUE(AddNewFileInTestGallery());
238
239   // Remove gallery watch.
240   ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
241 }
242
243 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
244                        SetupGalleryWatchWithoutListeners) {
245   if (!GalleryWatchesSupported())
246     return;
247
248   SetupGalleryWatches();
249
250   // No listeners, modify gallery contents.
251   ExtensionTestMessageListener gallery_change_event_received(
252       kGalleryChangedEventReceived, false  /* no reply */);
253   ASSERT_TRUE(AddNewFileInTestGallery());
254
255   // Remove gallery watch.
256   ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
257 }
258
259 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
260                        SetupGalleryChangedListenerWithoutWatchers) {
261   // Add gallery watch listener.
262   ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
263                           kAddGalleryChangedListenerOK);
264
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());
270
271   // Remove gallery watch listener.
272   ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
273                           kRemoveGalleryChangedListenerOK);
274 }
275
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());
283 }
284
285 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
286                        GetAllGalleryWatch) {
287   // Gallery watchers are not yet added.
288   // chrome.mediaGalleriesPrivate.getAllGalleryWatch should return an empty
289   // list.
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());
294
295   if (!GalleryWatchesSupported())
296     return;
297
298   SetupGalleryWatches();
299
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());
306
307   // Remove gallery watch request.
308   ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
309
310   // Gallery watchers removed.
311   // chrome.mediaGalleriesPrivate.getAllGalleryWatch() should return an empty
312   // list.
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());
317 }
318
319 IN_PROC_BROWSER_TEST_F(MediaGalleriesPrivateGalleryWatchApiTest,
320                        RemoveAllGalleryWatch) {
321   if (!GalleryWatchesSupported())
322     return;
323
324   SetupGalleryWatches();
325
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());
332
333   // Remove all gallery watchers.
334   ExecuteCmdAndCheckReply(kRemoveAllGalleryWatchCmd, kRemoveAllGalleryWatchOK);
335
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());
342 }