Home | History | Annotate | Download | only in system_storage
      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