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