Home | History | Annotate | Download | only in win
      1 // Copyright 2013 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 #include <vector>
      6 
      7 #include "base/command_line.h"
      8 #include "base/files/file_path.h"
      9 #include "base/message_loop/message_loop.h"
     10 #include "base/run_loop.h"
     11 #include "base/stl_util.h"
     12 #include "chrome/browser/browser_process.h"
     13 #include "chrome/browser/extensions/extension_service.h"
     14 #include "chrome/browser/extensions/test_extension_system.h"
     15 #include "chrome/browser/media_galleries/media_file_system_registry.h"
     16 #include "chrome/browser/media_galleries/media_galleries_test_util.h"
     17 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
     18 #include "chrome/test/base/testing_browser_process.h"
     19 #include "chrome/test/base/testing_profile.h"
     20 #include "components/storage_monitor/storage_info.h"
     21 #include "components/storage_monitor/storage_monitor.h"
     22 #include "components/storage_monitor/test_portable_device_watcher_win.h"
     23 #include "components/storage_monitor/test_storage_monitor.h"
     24 #include "components/storage_monitor/test_storage_monitor_win.h"
     25 #include "components/storage_monitor/test_volume_mount_watcher_win.h"
     26 #include "content/public/browser/render_view_host.h"
     27 #include "content/public/browser/web_contents.h"
     28 #include "extensions/browser/extension_system.h"
     29 #include "testing/gtest/include/gtest/gtest.h"
     30 
     31 using storage_monitor::PortableDeviceWatcherWin;
     32 using storage_monitor::StorageInfo;
     33 using storage_monitor::StorageMonitor;
     34 using storage_monitor::TestPortableDeviceWatcherWin;
     35 using storage_monitor::TestStorageMonitor;
     36 using storage_monitor::TestStorageMonitorWin;
     37 using storage_monitor::TestVolumeMountWatcherWin;
     38 
     39 namespace {
     40 
     41 typedef std::map<MediaGalleryPrefId, MediaFileSystemInfo> FSInfoMap;
     42 
     43 void GetGalleryInfoCallback(
     44     FSInfoMap* results,
     45     const std::vector<MediaFileSystemInfo>& file_systems) {
     46   for (size_t i = 0; i < file_systems.size(); ++i) {
     47     ASSERT_FALSE(ContainsKey(*results, file_systems[i].pref_id));
     48     (*results)[file_systems[i].pref_id] = file_systems[i];
     49   }
     50 }
     51 
     52 }  // namespace
     53 
     54 class MTPDeviceDelegateImplWinTest : public ChromeRenderViewHostTestHarness {
     55  protected:
     56   void SetUp() OVERRIDE;
     57   void TearDown() OVERRIDE;
     58 
     59   void ProcessAttach(const std::string& id,
     60                      const base::string16& name,
     61                      const base::FilePath::StringType& location);
     62   std::string AttachDevice(StorageInfo::Type type,
     63                            const std::string& unique_id,
     64                            const base::FilePath& location);
     65   void CheckGalleryInfo(const MediaFileSystemInfo& info,
     66                         const base::string16& name,
     67                         const base::FilePath& path,
     68                         bool removable,
     69                         bool media_device);
     70 
     71   // Pointer to the storage monitor. Owned by TestingBrowserProcess.
     72   TestStorageMonitorWin* monitor_;
     73   scoped_refptr<extensions::Extension> extension_;
     74 
     75   EnsureMediaDirectoriesExists media_directories_;
     76 };
     77 
     78 void MTPDeviceDelegateImplWinTest::SetUp() {
     79   ChromeRenderViewHostTestHarness::SetUp();
     80 
     81   TestStorageMonitor::Destroy();
     82   TestPortableDeviceWatcherWin* portable_device_watcher =
     83       new TestPortableDeviceWatcherWin;
     84   TestVolumeMountWatcherWin* mount_watcher = new TestVolumeMountWatcherWin;
     85   portable_device_watcher->set_use_dummy_mtp_storage_info(true);
     86   scoped_ptr<TestStorageMonitorWin> monitor(
     87       new TestStorageMonitorWin(mount_watcher, portable_device_watcher));
     88   TestingBrowserProcess* browser_process = TestingBrowserProcess::GetGlobal();
     89   DCHECK(browser_process);
     90   monitor_ = monitor.get();
     91   StorageMonitor::SetStorageMonitorForTesting(monitor.Pass());
     92 
     93   base::RunLoop runloop;
     94   browser_process->media_file_system_registry()->GetPreferences(profile())->
     95       EnsureInitialized(runloop.QuitClosure());
     96   runloop.Run();
     97 
     98   extensions::TestExtensionSystem* extension_system(
     99       static_cast<extensions::TestExtensionSystem*>(
    100           extensions::ExtensionSystem::Get(profile())));
    101   extension_system->CreateExtensionService(
    102       CommandLine::ForCurrentProcess(), base::FilePath(), false);
    103 
    104   std::vector<std::string> all_permissions;
    105   all_permissions.push_back("allAutoDetected");
    106   all_permissions.push_back("read");
    107   extension_ = AddMediaGalleriesApp("all", all_permissions, profile());
    108 }
    109 
    110 void MTPDeviceDelegateImplWinTest::TearDown() {
    111   // Windows storage monitor must be destroyed on the same thread
    112   // as construction.
    113   TestStorageMonitor::Destroy();
    114 
    115   ChromeRenderViewHostTestHarness::TearDown();
    116 }
    117 
    118 void MTPDeviceDelegateImplWinTest::ProcessAttach(
    119     const std::string& id,
    120     const base::string16& label,
    121     const base::FilePath::StringType& location) {
    122   StorageInfo info(id, location, label, base::string16(), base::string16(), 0);
    123   monitor_->receiver()->ProcessAttach(info);
    124 }
    125 
    126 std::string MTPDeviceDelegateImplWinTest::AttachDevice(
    127     StorageInfo::Type type,
    128     const std::string& unique_id,
    129     const base::FilePath& location) {
    130   std::string device_id = StorageInfo::MakeDeviceId(type, unique_id);
    131   DCHECK(StorageInfo::IsRemovableDevice(device_id));
    132   base::string16 label = location.LossyDisplayName();
    133   ProcessAttach(device_id, label, location.value());
    134   base::RunLoop().RunUntilIdle();
    135   return device_id;
    136 }
    137 
    138 void MTPDeviceDelegateImplWinTest::CheckGalleryInfo(
    139     const MediaFileSystemInfo& info,
    140     const base::string16& name,
    141     const base::FilePath& path,
    142     bool removable,
    143     bool media_device) {
    144   EXPECT_EQ(name, info.name);
    145   EXPECT_EQ(path, info.path);
    146   EXPECT_EQ(removable, info.removable);
    147   EXPECT_EQ(media_device, info.media_device);
    148   EXPECT_NE(0UL, info.pref_id);
    149 
    150   if (removable)
    151     EXPECT_NE(0UL, info.transient_device_id.size());
    152   else
    153     EXPECT_EQ(0UL, info.transient_device_id.size());
    154 }
    155 
    156 TEST_F(MTPDeviceDelegateImplWinTest, GalleryNameMTP) {
    157   base::FilePath location(
    158       PortableDeviceWatcherWin::GetStoragePathFromStorageId(
    159           TestPortableDeviceWatcherWin::kStorageUniqueIdA));
    160   AttachDevice(StorageInfo::MTP_OR_PTP, "mtp_fake_id", location);
    161 
    162   content::RenderViewHost* rvh = web_contents()->GetRenderViewHost();
    163   FSInfoMap results;
    164   MediaFileSystemRegistry* registry =
    165       g_browser_process->media_file_system_registry();
    166   registry->GetMediaFileSystemsForExtension(
    167       rvh, extension_.get(),
    168       base::Bind(&GetGalleryInfoCallback, base::Unretained(&results)));
    169   base::RunLoop().RunUntilIdle();
    170 
    171   ASSERT_EQ(media_directories_.num_galleries() + 1, results.size());
    172   bool checked = false;
    173   for (FSInfoMap::iterator i = results.begin(); i != results.end(); ++i) {
    174     MediaFileSystemInfo info = i->second;
    175     if (info.path == location) {
    176       CheckGalleryInfo(info, location.LossyDisplayName(), location, true, true);
    177       checked = true;
    178       break;
    179     }
    180   }
    181   EXPECT_TRUE(checked);
    182 }
    183