15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
59ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/synchronization/waitable_event.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/mock_removable_storage_observer.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/storage_monitor.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/test_storage_monitor.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace {
14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid SetLatch(bool* called) {
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  *called = true;
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace
20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace storage_monitor {
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(StorageMonitorTest, TestInitialize) {
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestStorageMonitor::Destroy();
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TestStorageMonitor monitor;
26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(monitor.init_called());
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool initialized = false;
29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  monitor.EnsureInitialized(base::Bind(&SetLatch, &initialized));
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(monitor.init_called());
31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_FALSE(initialized);
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  monitor.MarkInitialized();
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_TRUE(initialized);
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(StorageMonitorTest, DeviceAttachDetachNotifications) {
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestStorageMonitor::Destroy();
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop;
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const std::string kDeviceId1 = "dcim:UUID:FFF0-0001";
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const std::string kDeviceId2 = "dcim:UUID:FFF0-0002";
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockRemovableStorageObserver observer1;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockRemovableStorageObserver observer2;
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TestStorageMonitor monitor;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  monitor.AddObserver(&observer1);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  monitor.AddObserver(&observer2);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  StorageInfo info(kDeviceId1, FILE_PATH_LITERAL("path"), base::string16(),
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   base::string16(), base::string16(), 0);
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  monitor.receiver()->ProcessAttach(info);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop.RunUntilIdle();
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kDeviceId1, observer1.last_attached().device_id());
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_PATH_LITERAL("path"), observer1.last_attached().location());
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kDeviceId1, observer2.last_attached().device_id());
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_PATH_LITERAL("path"), observer2.last_attached().location());
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer1.attach_calls());
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, observer1.detach_calls());
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  monitor.receiver()->ProcessDetach(kDeviceId1);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  monitor.receiver()->ProcessDetach(kDeviceId2);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop.RunUntilIdle();
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kDeviceId1, observer1.last_detached().device_id());
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_PATH_LITERAL("path"), observer1.last_detached().location());
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kDeviceId1, observer2.last_detached().device_id());
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(FILE_PATH_LITERAL("path"), observer2.last_detached().location());
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer1.attach_calls());
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer2.attach_calls());
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The kDeviceId2 won't be notified since it was never attached.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer1.detach_calls());
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer2.detach_calls());
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  monitor.RemoveObserver(&observer1);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  monitor.RemoveObserver(&observer2);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(StorageMonitorTest, GetAllAvailableStoragesEmpty) {
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestStorageMonitor::Destroy();
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop;
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TestStorageMonitor monitor;
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::vector<StorageInfo> devices = monitor.GetAllAvailableStorages();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, devices.size());
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(StorageMonitorTest, GetAllAvailableStorageAttachDetach) {
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestStorageMonitor::Destroy();
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop;
90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TestStorageMonitor monitor;
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const std::string kDeviceId1 = "dcim:UUID:FFF0-0042";
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath kDevicePath1(FILE_PATH_LITERAL("/testfoo"));
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  StorageInfo info1(kDeviceId1, kDevicePath1.value(), base::string16(),
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    base::string16(), base::string16(), 0);
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  monitor.receiver()->ProcessAttach(info1);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop.RunUntilIdle();
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::vector<StorageInfo> devices = monitor.GetAllAvailableStorages();
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1U, devices.size());
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kDeviceId1, devices[0].device_id());
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kDevicePath1.value(), devices[0].location());
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const std::string kDeviceId2 = "dcim:UUID:FFF0-0044";
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath kDevicePath2(FILE_PATH_LITERAL("/testbar"));
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  StorageInfo info2(kDeviceId2, kDevicePath2.value(), base::string16(),
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    base::string16(), base::string16(), 0);
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  monitor.receiver()->ProcessAttach(info2);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop.RunUntilIdle();
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  devices = monitor.GetAllAvailableStorages();
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2U, devices.size());
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kDeviceId1, devices[0].device_id());
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kDevicePath1.value(), devices[0].location());
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kDeviceId2, devices[1].device_id());
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kDevicePath2.value(), devices[1].location());
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  monitor.receiver()->ProcessDetach(kDeviceId1);
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop.RunUntilIdle();
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  devices = monitor.GetAllAvailableStorages();
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1U, devices.size());
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kDeviceId2, devices[0].device_id());
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(kDevicePath2.value(), devices[0].location());
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  monitor.receiver()->ProcessDetach(kDeviceId2);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_loop.RunUntilIdle();
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  devices = monitor.GetAllAvailableStorages();
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0U, devices.size());
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace storage_monitor
129