Home | History | Annotate | Download | only in media_galleries_private
      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 }
    340