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.
7 #include "base/message_loop/message_loop.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "chrome/browser/extensions/api/system_storage/storage_api_test_util.h"
10 #include "chrome/browser/extensions/api/system_storage/storage_info_provider.h"
11 #include "chrome/browser/extensions/extension_apitest.h"
12 #include "chrome/browser/extensions/extension_test_message_listener.h"
13 #include "components/storage_monitor/storage_info.h"
14 #include "components/storage_monitor/storage_monitor.h"
15 #include "components/storage_monitor/test_storage_monitor.h"
19 using extensions::StorageUnitInfoList;
20 using extensions::test::TestStorageUnitInfo;
21 using extensions::test::kRemovableStorageData;
23 const struct TestStorageUnitInfo kTestingData[] = {
24 {"dcim:device:001", "0xbeaf", 4098, 1},
25 {"path:device:002", "/home", 4098, 2},
26 {"path:device:003", "/data", 10000, 3}
31 class TestStorageInfoProvider : public extensions::StorageInfoProvider {
33 TestStorageInfoProvider(const struct TestStorageUnitInfo* testing_data,
37 virtual ~TestStorageInfoProvider();
39 // StorageInfoProvider implementations.
40 virtual double GetStorageFreeSpaceFromTransientIdOnFileThread(
41 const std::string& transient_id) OVERRIDE;
43 std::vector<struct TestStorageUnitInfo> testing_data_;
46 TestStorageInfoProvider::TestStorageInfoProvider(
47 const struct TestStorageUnitInfo* testing_data, size_t n)
48 : testing_data_(testing_data, testing_data + n) {
51 TestStorageInfoProvider::~TestStorageInfoProvider() {
54 double TestStorageInfoProvider::GetStorageFreeSpaceFromTransientIdOnFileThread(
55 const std::string& transient_id) {
56 std::string device_id =
57 StorageMonitor::GetInstance()->GetDeviceIdForTransientId(
59 for (size_t i = 0; i < testing_data_.size(); ++i) {
60 if (testing_data_[i].device_id == device_id) {
61 return static_cast<double>(testing_data_[i].available_capacity);
67 class SystemStorageApiTest : public ExtensionApiTest {
69 SystemStorageApiTest() {}
70 virtual ~SystemStorageApiTest() {}
72 virtual void SetUpOnMainThread() OVERRIDE {
73 TestStorageMonitor::CreateForBrowserTests();
76 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
77 ExtensionApiTest::SetUpInProcessBrowserTestFixture();
78 message_loop_.reset(new base::MessageLoopForUI);
81 void SetUpAllMockStorageDevices() {
82 for (size_t i = 0; i < arraysize(kTestingData); ++i) {
83 AttachRemovableStorage(kTestingData[i]);
87 void AttachRemovableStorage(
88 const struct TestStorageUnitInfo& removable_storage_info) {
89 StorageMonitor::GetInstance()->receiver()->ProcessAttach(
90 extensions::test::BuildStorageInfoFromTestStorageUnitInfo(
91 removable_storage_info));
94 void DetachRemovableStorage(const std::string& id) {
95 StorageMonitor::GetInstance()->receiver()->ProcessDetach(id);
99 scoped_ptr<base::MessageLoop> message_loop_;
102 IN_PROC_BROWSER_TEST_F(SystemStorageApiTest, Storage) {
103 SetUpAllMockStorageDevices();
104 TestStorageInfoProvider* provider =
105 new TestStorageInfoProvider(kTestingData,
106 arraysize(kTestingData));
107 extensions::StorageInfoProvider::InitializeForTesting(provider);
108 std::vector<linked_ptr<ExtensionTestMessageListener> > device_ids_listeners;
109 for (size_t i = 0; i < arraysize(kTestingData); ++i) {
110 linked_ptr<ExtensionTestMessageListener> listener(
111 new ExtensionTestMessageListener(
112 StorageMonitor::GetInstance()->GetTransientIdForDeviceId(
113 kTestingData[i].device_id),
115 device_ids_listeners.push_back(listener);
117 ASSERT_TRUE(RunPlatformAppTest("system/storage")) << message_;
118 for (size_t i = 0; i < device_ids_listeners.size(); ++i)
119 EXPECT_TRUE(device_ids_listeners[i]->WaitUntilSatisfied());
122 IN_PROC_BROWSER_TEST_F(SystemStorageApiTest, StorageAttachment) {
123 ResultCatcher catcher;
124 ExtensionTestMessageListener attach_listener("attach", false);
125 ExtensionTestMessageListener detach_listener("detach", false);
127 EXPECT_TRUE(LoadExtension(
128 test_data_dir_.AppendASCII("system/storage_attachment")));
129 // Simulate triggering onAttached event.
130 ASSERT_TRUE(attach_listener.WaitUntilSatisfied());
132 AttachRemovableStorage(kRemovableStorageData);
134 std::string removable_storage_transient_id =
135 StorageMonitor::GetInstance()->GetTransientIdForDeviceId(
136 kRemovableStorageData.device_id);
137 ExtensionTestMessageListener detach_device_id_listener(
138 removable_storage_transient_id, false);
140 // Simulate triggering onDetached event.
141 ASSERT_TRUE(detach_listener.WaitUntilSatisfied());
142 DetachRemovableStorage(kRemovableStorageData.device_id);
144 ASSERT_TRUE(detach_device_id_listener.WaitUntilSatisfied());
146 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();