// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include #include #include "chromeos/dbus/fake_power_manager_client.h" #include "chromeos/disks/disk_mount_manager.h" #include "chromeos/disks/mock_disk_mount_manager.h" #include "chromeos/disks/suspend_unmount_manager.h" #include "testing/gtest/include/gtest/gtest.h" namespace chromeos { namespace disks { namespace { const char kDeviceId[] = "device_id"; const char kDeviceLabel[] = "device_label"; const char kVendor[] = "vendor"; const char kProduct[] = "product"; class FakeDiskMountManager : public MockDiskMountManager { public: void NotifyUnmountDeviceComplete(MountError error) const { for (const UnmountPathCallback& callback : callbacks_) { callback.Run(error); } } const std::vector& unmounting_mount_paths() const { return unmounting_mount_paths_; } private: void UnmountPath(const std::string& mount_path, UnmountOptions options, const UnmountPathCallback& callback) override { unmounting_mount_paths_.push_back(mount_path); callbacks_.push_back(callback); } std::vector unmounting_mount_paths_; std::vector callbacks_; }; class SuspendUnmountManagerTest : public testing::Test { public: SuspendUnmountManagerTest() : suspend_unmount_manager_(&disk_mount_manager_, &fake_power_client_) {} ~SuspendUnmountManagerTest() override {} protected: FakeDiskMountManager disk_mount_manager_; FakePowerManagerClient fake_power_client_; SuspendUnmountManager suspend_unmount_manager_; }; TEST_F(SuspendUnmountManagerTest, Basic) { const std::string kDummyMountPathUsb = "/dummy/mount/usb"; const std::string kDummyMountPathSd = "/dummy/mount/sd"; const std::string kDummyMountPathUnknown = "/dummy/mount/unknown"; disk_mount_manager_.CreateDiskEntryForMountDevice( chromeos::disks::DiskMountManager::MountPointInfo( "/dummy/device/usb", kDummyMountPathUsb, chromeos::MOUNT_TYPE_DEVICE, chromeos::disks::MOUNT_CONDITION_NONE), kDeviceId, kDeviceLabel, kVendor, kProduct, chromeos::DEVICE_TYPE_USB, 1024 * 1024, false /* is_parent */, false /* has_media */, false /* on_boot_device */, true /* on_removable_device */); disk_mount_manager_.CreateDiskEntryForMountDevice( chromeos::disks::DiskMountManager::MountPointInfo( "/dummy/device/sd", kDummyMountPathSd, chromeos::MOUNT_TYPE_DEVICE, chromeos::disks::MOUNT_CONDITION_NONE), kDeviceId, kDeviceLabel, kVendor, kProduct, chromeos::DEVICE_TYPE_SD, 1024 * 1024, false /* is_parent */, false /* has_media */, false /* on_boot_device */, true /* on_removable_device */); disk_mount_manager_.CreateDiskEntryForMountDevice( chromeos::disks::DiskMountManager::MountPointInfo( "/dummy/device/unknown", kDummyMountPathUnknown, chromeos::MOUNT_TYPE_DEVICE, chromeos::disks::MOUNT_CONDITION_NONE), kDeviceId, kDeviceLabel, kVendor, kProduct, chromeos::DEVICE_TYPE_UNKNOWN, 1024 * 1024, false /* is_parent */, false /* has_media */, false /* on_boot_device */, true /* on_removable_device */); disk_mount_manager_.SetupDefaultReplies(); fake_power_client_.SendSuspendImminent(); EXPECT_EQ(1, fake_power_client_.GetNumPendingSuspendReadinessCallbacks()); EXPECT_EQ(2u, disk_mount_manager_.unmounting_mount_paths().size()); EXPECT_EQ(1, std::count(disk_mount_manager_.unmounting_mount_paths().begin(), disk_mount_manager_.unmounting_mount_paths().end(), kDummyMountPathUsb)); EXPECT_EQ(1, std::count(disk_mount_manager_.unmounting_mount_paths().begin(), disk_mount_manager_.unmounting_mount_paths().end(), kDummyMountPathSd)); EXPECT_EQ(0, std::count(disk_mount_manager_.unmounting_mount_paths().begin(), disk_mount_manager_.unmounting_mount_paths().end(), kDummyMountPathUnknown)); disk_mount_manager_.NotifyUnmountDeviceComplete(MOUNT_ERROR_NONE); EXPECT_EQ(0, fake_power_client_.GetNumPendingSuspendReadinessCallbacks()); } TEST_F(SuspendUnmountManagerTest, CancelAndSuspendAgain) { const std::string kDummyMountPath = "/dummy/mount"; disk_mount_manager_.CreateDiskEntryForMountDevice( chromeos::disks::DiskMountManager::MountPointInfo( "/dummy/device", kDummyMountPath, chromeos::MOUNT_TYPE_DEVICE, chromeos::disks::MOUNT_CONDITION_NONE), kDeviceId, kDeviceLabel, kVendor, kProduct, chromeos::DEVICE_TYPE_USB, 1024 * 1024, false /* is_parent */, false /* has_media */, false /* on_boot_device */, true /* on_removable_device */); disk_mount_manager_.SetupDefaultReplies(); fake_power_client_.SendSuspendImminent(); EXPECT_EQ(1, fake_power_client_.GetNumPendingSuspendReadinessCallbacks()); ASSERT_EQ(1u, disk_mount_manager_.unmounting_mount_paths().size()); EXPECT_EQ(kDummyMountPath, disk_mount_manager_.unmounting_mount_paths().front()); // Suspend cancelled. fake_power_client_.SendSuspendDone(); // Suspend again. fake_power_client_.SendSuspendImminent(); ASSERT_EQ(2u, disk_mount_manager_.unmounting_mount_paths().size()); EXPECT_EQ(kDummyMountPath, disk_mount_manager_.unmounting_mount_paths().front()); } } // namespace } // namespace chromeos } // namespace disks