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/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 "chrome/browser/storage_monitor/storage_info.h" 14 #include "chrome/browser/storage_monitor/storage_monitor.h" 15 #include "chrome/browser/storage_monitor/test_storage_monitor.h" 16 17 namespace { 18 19 using chrome::StorageMonitor; 20 using extensions::StorageUnitInfoList; 21 using extensions::test::TestStorageUnitInfo; 22 using extensions::test::kRemovableStorageData; 23 24 const struct TestStorageUnitInfo kTestingData[] = { 25 {"dcim:device:001", "0xbeaf", 4098, 1000}, 26 {"path:device:002", "/home", 4098, 1000}, 27 {"path:device:003", "/data", 10000, 1000} 28 }; 29 30 } // namespace 31 32 class SystemStorageApiTest : public ExtensionApiTest { 33 public: 34 SystemStorageApiTest() {} 35 virtual ~SystemStorageApiTest() {} 36 37 virtual void SetUpOnMainThread() OVERRIDE { 38 chrome::test::TestStorageMonitor::CreateForBrowserTests(); 39 } 40 41 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 42 ExtensionApiTest::SetUpInProcessBrowserTestFixture(); 43 message_loop_.reset(new base::MessageLoop(base::MessageLoop::TYPE_UI)); 44 } 45 46 void SetUpAllMockStorageDevices() { 47 for (size_t i = 0; i < arraysize(kTestingData); ++i) { 48 AttachRemovableStorage(kTestingData[i]); 49 } 50 } 51 52 void AttachRemovableStorage( 53 const struct TestStorageUnitInfo& removable_storage_info) { 54 StorageMonitor::GetInstance()->receiver()->ProcessAttach( 55 extensions::test::BuildStorageInfoFromTestStorageUnitInfo( 56 removable_storage_info)); 57 } 58 59 void DetachRemovableStorage(const std::string& id) { 60 StorageMonitor::GetInstance()->receiver()->ProcessDetach(id); 61 } 62 63 private: 64 scoped_ptr<base::MessageLoop> message_loop_; 65 }; 66 67 IN_PROC_BROWSER_TEST_F(SystemStorageApiTest, Storage) { 68 SetUpAllMockStorageDevices(); 69 std::vector<linked_ptr<ExtensionTestMessageListener> > device_ids_listeners; 70 for (size_t i = 0; i < arraysize(kTestingData); ++i) { 71 linked_ptr<ExtensionTestMessageListener> listener( 72 new ExtensionTestMessageListener( 73 StorageMonitor::GetInstance()->GetTransientIdForDeviceId( 74 kTestingData[i].device_id), 75 false)); 76 device_ids_listeners.push_back(listener); 77 } 78 ASSERT_TRUE(RunPlatformAppTest("system/storage")) << message_; 79 for (size_t i = 0; i < device_ids_listeners.size(); ++i) 80 EXPECT_TRUE(device_ids_listeners[i]->WaitUntilSatisfied()); 81 } 82 83 IN_PROC_BROWSER_TEST_F(SystemStorageApiTest, StorageAttachment) { 84 ResultCatcher catcher; 85 ExtensionTestMessageListener attach_listener("attach", false); 86 ExtensionTestMessageListener detach_listener("detach", false); 87 88 EXPECT_TRUE(LoadExtension( 89 test_data_dir_.AppendASCII("system/storage_attachment"))); 90 // Simulate triggering onAttached event. 91 ASSERT_TRUE(attach_listener.WaitUntilSatisfied()); 92 93 AttachRemovableStorage(kRemovableStorageData); 94 95 std::string removable_storage_transient_id = 96 StorageMonitor::GetInstance()->GetTransientIdForDeviceId( 97 kRemovableStorageData.device_id); 98 ExtensionTestMessageListener detach_device_id_listener( 99 removable_storage_transient_id, false); 100 101 // Simulate triggering onDetached event. 102 ASSERT_TRUE(detach_listener.WaitUntilSatisfied()); 103 DetachRemovableStorage(kRemovableStorageData.device_id); 104 105 ASSERT_TRUE(detach_device_id_listener.WaitUntilSatisfied()); 106 107 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 108 } 109