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