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#include "components/storage_monitor/test_storage_monitor.h"
6
7#include "base/run_loop.h"
8#include "base/synchronization/waitable_event.h"
9#include "components/storage_monitor/storage_info.h"
10
11#if defined(OS_LINUX)
12#include "components/storage_monitor/test_media_transfer_protocol_manager_linux.h"
13#include "device/media_transfer_protocol/media_transfer_protocol_manager.h"
14#endif
15
16namespace storage_monitor {
17
18TestStorageMonitor::TestStorageMonitor()
19    : StorageMonitor(),
20      init_called_(false) {
21#if defined(OS_LINUX)
22  media_transfer_protocol_manager_.reset(
23      new TestMediaTransferProtocolManagerLinux());
24#endif
25}
26
27TestStorageMonitor::~TestStorageMonitor() {}
28
29// static
30TestStorageMonitor* TestStorageMonitor::CreateAndInstall() {
31  TestStorageMonitor* monitor = new TestStorageMonitor();
32  scoped_ptr<StorageMonitor> pass_monitor(monitor);
33  monitor->Init();
34  monitor->MarkInitialized();
35
36  if (StorageMonitor::GetInstance() == NULL) {
37    StorageMonitor::SetStorageMonitorForTesting(pass_monitor.Pass());
38    return monitor;
39  }
40
41  return NULL;
42}
43
44// static
45TestStorageMonitor* TestStorageMonitor::CreateForBrowserTests() {
46  TestStorageMonitor* monitor = new TestStorageMonitor();
47  monitor->Init();
48  monitor->MarkInitialized();
49
50  scoped_ptr<StorageMonitor> pass_monitor(monitor);
51  StorageMonitor::SetStorageMonitorForTesting(pass_monitor.Pass());
52
53  return monitor;
54}
55
56// static
57void TestStorageMonitor::SyncInitialize() {
58  StorageMonitor* monitor = StorageMonitor::GetInstance();
59  if (monitor->IsInitialized())
60    return;
61
62  base::WaitableEvent event(true, false);
63  monitor->EnsureInitialized(base::Bind(&base::WaitableEvent::Signal,
64                             base::Unretained(&event)));
65  while (!event.IsSignaled()) {
66    base::RunLoop().RunUntilIdle();
67  }
68  DCHECK(monitor->IsInitialized());
69}
70
71void TestStorageMonitor::Init() {
72  init_called_ = true;
73}
74
75void TestStorageMonitor::MarkInitialized() {
76  StorageMonitor::MarkInitialized();
77}
78
79bool TestStorageMonitor::GetStorageInfoForPath(
80    const base::FilePath& path,
81    StorageInfo* device_info) const {
82  DCHECK(device_info);
83
84  if (!path.IsAbsolute())
85    return false;
86
87  std::string device_id = StorageInfo::MakeDeviceId(
88      StorageInfo::FIXED_MASS_STORAGE, path.AsUTF8Unsafe());
89  *device_info =
90      StorageInfo(device_id, path.value(), base::string16(), base::string16(),
91                  base::string16(), 0);
92  return true;
93}
94
95#if defined(OS_WIN)
96bool TestStorageMonitor::GetMTPStorageInfoFromDeviceId(
97    const std::string& storage_device_id,
98    base::string16* device_location,
99    base::string16* storage_object_id) const {
100  return false;
101}
102#endif
103
104#if defined(OS_LINUX)
105device::MediaTransferProtocolManager*
106TestStorageMonitor::media_transfer_protocol_manager() {
107  return media_transfer_protocol_manager_.get();
108}
109#endif
110
111StorageMonitor::Receiver* TestStorageMonitor::receiver() const {
112  return StorageMonitor::receiver();
113}
114
115void TestStorageMonitor::EjectDevice(
116    const std::string& device_id,
117    base::Callback<void(EjectStatus)> callback) {
118  ejected_device_ = device_id;
119  callback.Run(EJECT_OK);
120}
121
122}  // namespace storage_monitor
123