Home | History | Annotate | Download | only in media_galleries
      1 // Copyright 2014 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 // MediaGalleries 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/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/media_galleries/media_file_system_registry.h"
     18 #include "chrome/browser/media_galleries/media_galleries_preferences.h"
     19 #include "chrome/browser/media_galleries/media_galleries_test_util.h"
     20 #include "chrome/common/chrome_paths.h"
     21 #include "content/public/browser/render_frame_host.h"
     22 #include "content/public/browser/render_view_host.h"
     23 #include "extensions/browser/extension_system.h"
     24 #include "extensions/common/extension.h"
     25 #include "extensions/common/switches.h"
     26 #include "extensions/test/extension_test_message_listener.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/gallerywatch";
     34 
     35 // JS commands.
     36 const char kGetAllWatchedGalleryIdsCmd[] = "getAllWatchedGalleryIds()";
     37 const char kGetMediaFileSystemsCmd[] = "getMediaFileSystems()";
     38 const char kSetupWatchOnValidGalleriesCmd[] = "setupWatchOnValidGalleries()";
     39 const char kSetupWatchOnUnlistenedValidGalleriesCmd[] =
     40     "setupWatchOnUnlistenedValidGalleries()";
     41 const char kAddGalleryChangedListenerCmd[] = "addGalleryChangedListener()";
     42 const char kAddCheckingGalleryChangedListenerCmd[] =
     43     "addCheckingGalleryChangedListener()";
     44 const char kRemoveAllGalleryWatchCmd[] = "removeAllGalleryWatch()";
     45 const char kRemoveGalleryChangedListenerCmd[] =
     46     "removeGalleryChangedListener()";
     47 const char kRemoveGalleryWatchCmd[] = "removeGalleryWatch()";
     48 const char kSetupWatchOnInvalidGalleryCmd[] = "setupWatchOnInvalidGallery()";
     49 
     50 // And JS reply messages.
     51 const char kAddGalleryWatchOK[] = "add_gallery_watch_ok";
     52 const char kGetAllGalleryWatchOK[] = "get_all_gallery_watch_ok";
     53 const char kGetMediaFileSystemsCallbackOK[] =
     54     "get_media_file_systems_callback_ok";
     55 const char kGetMediaFileSystemsOK[] = "get_media_file_systems_ok";
     56 const char kAddGalleryChangedListenerOK[] = "add_gallery_changed_listener_ok";
     57 const char kRemoveAllGalleryWatchOK[] = "remove_all_gallery_watch_ok";
     58 const char kRemoveGalleryChangedListenerOK[] =
     59     "remove_gallery_changed_listener_ok";
     60 const char kRemoveGalleryWatchOK[] = "remove_gallery_watch_ok";
     61 const char kOnGalleryChangedCheckingOK[] = "on_gallery_changed_checking_ok";
     62 
     63 // Test reply messages.
     64 const char kNoGalleryWatchesInstalled[] = "gallery_watchers_does_not_exists";
     65 const char kAddGalleryWatchRequestFailed[] = "add_watch_request_failed";
     66 const char kAddGalleryWatchRequestRuntimeError[] =
     67     "add_watch_request_runtime_error";
     68 const char kAddGalleryWatchRequestSucceeded[] = "add_watch_request_succeeded";
     69 const char kGalleryChangedEventReceived[] = "gallery_changed_event_received";
     70 const char kGalleryWatchesCheck[] = "gallery_watcher_checks";
     71 
     72 }  // namespace
     73 
     74 ///////////////////////////////////////////////////////////////////////////////
     75 //                 MediaGalleriesGalleryWatchApiTest                         //
     76 ///////////////////////////////////////////////////////////////////////////////
     77 
     78 class MediaGalleriesGalleryWatchApiTest : public ExtensionApiTest {
     79  public:
     80   MediaGalleriesGalleryWatchApiTest()
     81       : extension_(NULL), background_host_(NULL) {}
     82   virtual ~MediaGalleriesGalleryWatchApiTest() {}
     83 
     84  protected:
     85   // ExtensionApiTest overrides.
     86   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
     87     ExtensionApiTest::SetUpCommandLine(command_line);
     88     command_line->AppendSwitchASCII(
     89         extensions::switches::kWhitelistedExtensionID, kTestExtensionId);
     90   }
     91   virtual void SetUpOnMainThread() OVERRIDE {
     92     ExtensionApiTest::SetUpOnMainThread();
     93     ensure_media_directories_exists_.reset(new EnsureMediaDirectoriesExists);
     94     extension_ = LoadExtension(test_data_dir_.AppendASCII(kTestExtensionPath));
     95     GetBackgroundHostForTestExtension();
     96     CreateTestGallery();
     97     FetchMediaGalleriesList();
     98   }
     99   virtual void TearDownOnMainThread() OVERRIDE {
    100     extension_ = NULL;
    101     background_host_ = NULL;
    102     ensure_media_directories_exists_.reset();
    103     ExtensionApiTest::TearDownOnMainThread();
    104   }
    105 
    106   bool GalleryWatchesSupported() {
    107     return base::FilePathWatcher::RecursiveWatchAvailable();
    108   }
    109 
    110   void ExecuteCmdAndCheckReply(const std::string& js_command,
    111                                const std::string& ok_message) {
    112     ExtensionTestMessageListener listener(ok_message, false);
    113     background_host_->GetMainFrame()->ExecuteJavaScript(
    114         base::ASCIIToUTF16(js_command));
    115     EXPECT_TRUE(listener.WaitUntilSatisfied());
    116   }
    117 
    118   bool AddNewFileInTestGallery() {
    119     base::FilePath gallery_file =
    120         test_gallery_.path().Append(FILE_PATH_LITERAL("test1.txt"));
    121     std::string content("new content");
    122     int write_size =
    123         base::WriteFile(gallery_file, content.c_str(), content.length());
    124     return (write_size == static_cast<int>(content.length()));
    125   }
    126 
    127   void SetupGalleryWatches() {
    128     std::string expected_result = GalleryWatchesSupported()
    129                                       ? kAddGalleryWatchRequestSucceeded
    130                                       : kAddGalleryWatchRequestFailed;
    131 
    132     ExtensionTestMessageListener add_gallery_watch_finished(
    133         expected_result, false /* no reply */);
    134     ExecuteCmdAndCheckReply(kSetupWatchOnValidGalleriesCmd, kAddGalleryWatchOK);
    135     EXPECT_TRUE(add_gallery_watch_finished.WaitUntilSatisfied());
    136   }
    137 
    138  private:
    139   void GetBackgroundHostForTestExtension() {
    140     ASSERT_TRUE(extension_);
    141     extensions::ExtensionSystem* extension_system =
    142         extensions::ExtensionSystem::Get(browser()->profile());
    143     background_host_ = extension_system->process_manager()
    144                            ->GetBackgroundHostForExtension(extension_->id())
    145                            ->render_view_host();
    146     ASSERT_TRUE(background_host_);
    147   }
    148 
    149   void CreateTestGallery() {
    150     MediaGalleriesPreferences* preferences =
    151         g_browser_process->media_file_system_registry()->GetPreferences(
    152             browser()->profile());
    153     base::RunLoop runloop;
    154     preferences->EnsureInitialized(runloop.QuitClosure());
    155     runloop.Run();
    156 
    157     ASSERT_TRUE(test_gallery_.CreateUniqueTempDir());
    158     MediaGalleryPrefInfo gallery_info;
    159     ASSERT_FALSE(
    160         preferences->LookUpGalleryByPath(test_gallery_.path(), &gallery_info));
    161     MediaGalleryPrefId id =
    162         preferences->AddGallery(gallery_info.device_id,
    163                                 gallery_info.path,
    164                                 MediaGalleryPrefInfo::kAutoDetected,
    165                                 gallery_info.volume_label,
    166                                 gallery_info.vendor_name,
    167                                 gallery_info.model_name,
    168                                 gallery_info.total_size_in_bytes,
    169                                 gallery_info.last_attach_time,
    170                                 0,
    171                                 0,
    172                                 0);
    173 
    174     preferences->SetGalleryPermissionForExtension(*extension_, id, true);
    175   }
    176 
    177   void FetchMediaGalleriesList() {
    178     ExtensionTestMessageListener get_media_systems_finished(
    179         kGetMediaFileSystemsCallbackOK, false /* no reply */);
    180     ExecuteCmdAndCheckReply(kGetMediaFileSystemsCmd, kGetMediaFileSystemsOK);
    181     EXPECT_TRUE(get_media_systems_finished.WaitUntilSatisfied());
    182   }
    183 
    184   scoped_ptr<EnsureMediaDirectoriesExists> ensure_media_directories_exists_;
    185 
    186   base::ScopedTempDir test_gallery_;
    187 
    188   const extensions::Extension* extension_;
    189 
    190   content::RenderViewHost* background_host_;
    191 
    192   DISALLOW_COPY_AND_ASSIGN(MediaGalleriesGalleryWatchApiTest);
    193 };
    194 
    195 IN_PROC_BROWSER_TEST_F(MediaGalleriesGalleryWatchApiTest, BasicGalleryWatch) {
    196   // Add gallery watch listener.
    197   ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
    198                           kAddGalleryChangedListenerOK);
    199 
    200   SetupGalleryWatches();
    201 
    202   // Modify gallery contents.
    203   ExtensionTestMessageListener gallery_change_event_received(
    204       kGalleryChangedEventReceived, false /* no reply */);
    205 
    206   ASSERT_TRUE(AddNewFileInTestGallery());
    207   if (GalleryWatchesSupported())
    208     EXPECT_TRUE(gallery_change_event_received.WaitUntilSatisfied());
    209 
    210   // Remove gallery watch listener.
    211   ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
    212                           kRemoveGalleryChangedListenerOK);
    213 
    214   // Remove gallery watch request.
    215   if (GalleryWatchesSupported())
    216     ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
    217 }
    218 
    219 IN_PROC_BROWSER_TEST_F(MediaGalleriesGalleryWatchApiTest,
    220                        CorrectResponseOnModifyingWatchedGallery) {
    221   if (!GalleryWatchesSupported())
    222     return;
    223 
    224   // Add gallery watch listener.
    225   ExecuteCmdAndCheckReply(kAddCheckingGalleryChangedListenerCmd,
    226                           kAddGalleryChangedListenerOK);
    227   SetupGalleryWatches();
    228 
    229 
    230   // Modify gallery contents; expect correct details.
    231   ExtensionTestMessageListener got_correct_details(
    232       kOnGalleryChangedCheckingOK, false);
    233   ASSERT_TRUE(AddNewFileInTestGallery());
    234   EXPECT_TRUE(got_correct_details.WaitUntilSatisfied());
    235 }
    236 
    237 IN_PROC_BROWSER_TEST_F(MediaGalleriesGalleryWatchApiTest,
    238                        RemoveListenerAndModifyGallery) {
    239   if (!GalleryWatchesSupported())
    240     return;
    241 
    242   // Add a gallery watch listener.
    243   ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
    244                           kAddGalleryChangedListenerOK);
    245   SetupGalleryWatches();
    246 
    247   // Modify gallery contents.
    248   ExtensionTestMessageListener gallery_change_event_received(
    249       kGalleryChangedEventReceived, false /* no reply */);
    250   ASSERT_TRUE(AddNewFileInTestGallery());
    251   EXPECT_TRUE(gallery_change_event_received.WaitUntilSatisfied());
    252 
    253   // Remove gallery watch listener.
    254   ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
    255                           kRemoveGalleryChangedListenerOK);
    256 
    257   // No listener, modify gallery contents.
    258   ASSERT_TRUE(AddNewFileInTestGallery());
    259 
    260   // Remove gallery watch.
    261   ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
    262 }
    263 
    264 IN_PROC_BROWSER_TEST_F(MediaGalleriesGalleryWatchApiTest,
    265                        SetupGalleryWatchWithoutListeners) {
    266   if (!GalleryWatchesSupported())
    267     return;
    268 
    269   ExecuteCmdAndCheckReply(kSetupWatchOnUnlistenedValidGalleriesCmd,
    270                           kAddGalleryWatchRequestRuntimeError);
    271 }
    272 
    273 IN_PROC_BROWSER_TEST_F(MediaGalleriesGalleryWatchApiTest,
    274                        SetupGalleryChangedListenerWithoutWatchers) {
    275   // Add gallery watch listener.
    276   ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
    277                           kAddGalleryChangedListenerOK);
    278 
    279   // Modify gallery contents. Listener should not get called because add watch
    280   // request was not called.
    281   ExtensionTestMessageListener gallery_change_event_received(
    282       kGalleryChangedEventReceived, false /* no reply */);
    283   ASSERT_TRUE(AddNewFileInTestGallery());
    284 
    285   // Remove gallery watch listener.
    286   ExecuteCmdAndCheckReply(kRemoveGalleryChangedListenerCmd,
    287                           kRemoveGalleryChangedListenerOK);
    288 }
    289 
    290 IN_PROC_BROWSER_TEST_F(MediaGalleriesGalleryWatchApiTest,
    291                        SetupWatchOnInvalidGallery) {
    292   // Add gallery watch listener.
    293   ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
    294                           kAddGalleryChangedListenerOK);
    295   // Set up a invalid gallery watch.
    296   ExecuteCmdAndCheckReply(
    297       kSetupWatchOnInvalidGalleryCmd, kAddGalleryWatchRequestFailed);
    298 }
    299 
    300 IN_PROC_BROWSER_TEST_F(MediaGalleriesGalleryWatchApiTest, GetAllGalleryWatch) {
    301   // Add gallery watch listener.
    302   ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
    303                           kAddGalleryChangedListenerOK);
    304 
    305   // Gallery watchers are not yet added.
    306   // chrome.mediaGalleries.getAllGalleryWatch should return an empty
    307   // list.
    308   ExtensionTestMessageListener initial_get_all_check_finished(
    309       kNoGalleryWatchesInstalled, false /* no reply */);
    310   ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
    311   EXPECT_TRUE(initial_get_all_check_finished.WaitUntilSatisfied());
    312 
    313   if (!GalleryWatchesSupported())
    314     return;
    315 
    316   SetupGalleryWatches();
    317 
    318   // chrome.mediaGalleries.getAllGalleryWatch should return the
    319   // gallery identifiers.
    320   ExtensionTestMessageListener get_all_watched_galleries_finished(
    321       kGalleryWatchesCheck, false /* no reply */);
    322   ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
    323   EXPECT_TRUE(get_all_watched_galleries_finished.WaitUntilSatisfied());
    324 
    325   // Remove gallery watch request.
    326   ExecuteCmdAndCheckReply(kRemoveGalleryWatchCmd, kRemoveGalleryWatchOK);
    327 
    328   // Gallery watchers removed.
    329   // chrome.mediaGalleries.getAllGalleryWatch() should return an empty
    330   // list.
    331   ExtensionTestMessageListener final_get_all_check_finished(
    332       kNoGalleryWatchesInstalled, false /* no reply */);
    333   ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
    334   EXPECT_TRUE(final_get_all_check_finished.WaitUntilSatisfied());
    335 }
    336 
    337 IN_PROC_BROWSER_TEST_F(MediaGalleriesGalleryWatchApiTest,
    338                        RemoveAllGalleryWatch) {
    339   // Add gallery watch listener.
    340   ExecuteCmdAndCheckReply(kAddGalleryChangedListenerCmd,
    341                           kAddGalleryChangedListenerOK);
    342 
    343   if (!GalleryWatchesSupported())
    344     return;
    345 
    346   SetupGalleryWatches();
    347 
    348   // chrome.mediaGalleries.getAllGalleryWatch should return the watched
    349   // gallery identifiers.
    350   ExtensionTestMessageListener get_all_watched_galleries_finished(
    351       kGalleryWatchesCheck, false /* no reply */);
    352   ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
    353   EXPECT_TRUE(get_all_watched_galleries_finished.WaitUntilSatisfied());
    354 
    355   // Remove all gallery watchers.
    356   ExecuteCmdAndCheckReply(kRemoveAllGalleryWatchCmd, kRemoveAllGalleryWatchOK);
    357 
    358   // Gallery watchers removed. chrome.mediaGalleries.getAllGalleryWatch
    359   // should return an empty list.
    360   ExtensionTestMessageListener final_get_all_check_finished(
    361       kNoGalleryWatchesInstalled, false /* no reply */);
    362   ExecuteCmdAndCheckReply(kGetAllWatchedGalleryIdsCmd, kGetAllGalleryWatchOK);
    363   EXPECT_TRUE(final_get_all_check_finished.WaitUntilSatisfied());
    364 }
    365