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