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 // SystemStorage eject API browser tests. 6 7 #include "base/files/file_path.h" 8 #include "base/strings/stringprintf.h" 9 #include "base/strings/utf_string_conversions.h" 10 #include "chrome/browser/extensions/api/system_storage/storage_api_test_util.h" 11 #include "chrome/browser/extensions/api/system_storage/storage_info_provider.h" 12 #include "chrome/browser/extensions/extension_apitest.h" 13 #include "chrome/browser/extensions/extension_process_manager.h" 14 #include "chrome/browser/extensions/extension_system.h" 15 #include "chrome/browser/extensions/extension_test_message_listener.h" 16 #include "chrome/browser/storage_monitor/storage_info.h" 17 #include "chrome/browser/storage_monitor/storage_monitor.h" 18 #include "chrome/browser/storage_monitor/test_storage_monitor.h" 19 #include "chrome/common/extensions/extension.h" 20 #include "content/public/browser/render_view_host.h" 21 #include "content/public/test/test_utils.h" 22 23 namespace { 24 25 using extensions::test::TestStorageUnitInfo; 26 using extensions::test::kRemovableStorageData; 27 28 } // namespace 29 30 class SystemStorageEjectApiTest : public ExtensionApiTest { 31 public: 32 SystemStorageEjectApiTest() : monitor_(NULL) {} 33 virtual ~SystemStorageEjectApiTest() {} 34 35 protected: 36 virtual void SetUpOnMainThread() OVERRIDE { 37 monitor_ = chrome::test::TestStorageMonitor::CreateForBrowserTests(); 38 ExtensionApiTest::SetUpOnMainThread(); 39 } 40 41 content::RenderViewHost* GetHost() { 42 const extensions::Extension* extension = 43 LoadExtension(test_data_dir_.AppendASCII("system/storage_eject")); 44 return extensions::ExtensionSystem::Get(browser()->profile())-> 45 process_manager()->GetBackgroundHostForExtension(extension->id())-> 46 render_view_host(); 47 } 48 49 void ExecuteCmdAndCheckReply(content::RenderViewHost* host, 50 const std::string& js_command, 51 const std::string& ok_message) { 52 ExtensionTestMessageListener listener(ok_message, false); 53 host->ExecuteJavascriptInWebFrame(string16(), ASCIIToUTF16(js_command)); 54 EXPECT_TRUE(listener.WaitUntilSatisfied()); 55 } 56 57 void Attach() { 58 DCHECK(chrome::StorageMonitor::GetInstance()->IsInitialized()); 59 chrome::StorageMonitor::GetInstance()->receiver()->ProcessAttach( 60 extensions::test::BuildStorageInfoFromTestStorageUnitInfo( 61 kRemovableStorageData)); 62 content::RunAllPendingInMessageLoop(); 63 } 64 65 void Detach() { 66 DCHECK(chrome::StorageMonitor::GetInstance()->IsInitialized()); 67 chrome::StorageMonitor::GetInstance()->receiver()->ProcessDetach( 68 kRemovableStorageData.device_id); 69 content::RunAllPendingInMessageLoop(); 70 } 71 72 protected: 73 chrome::test::TestStorageMonitor* monitor_; 74 75 private: 76 DISALLOW_COPY_AND_ASSIGN(SystemStorageEjectApiTest); 77 }; 78 79 80 IN_PROC_BROWSER_TEST_F(SystemStorageEjectApiTest, EjectTest) { 81 content::RenderViewHost* host = GetHost(); 82 ExecuteCmdAndCheckReply(host, "addAttachListener()", "add_attach_ok"); 83 84 // Attach / detach 85 const std::string expect_attach_msg = 86 base::StringPrintf("%s,%s", "attach_test_ok", 87 kRemovableStorageData.name); 88 ExtensionTestMessageListener attach_finished_listener(expect_attach_msg, 89 false /* no reply */); 90 Attach(); 91 EXPECT_TRUE(attach_finished_listener.WaitUntilSatisfied()); 92 93 ExecuteCmdAndCheckReply(host, "ejectTest()", "eject_ok"); 94 EXPECT_EQ(kRemovableStorageData.device_id, monitor_->ejected_device()); 95 96 Detach(); 97 } 98 99 IN_PROC_BROWSER_TEST_F(SystemStorageEjectApiTest, EjectBadDeviceTest) { 100 ExecuteCmdAndCheckReply(GetHost(), "ejectFailTest()", "eject_no_such_device"); 101 102 EXPECT_EQ("", monitor_->ejected_device()); 103 } 104