diff options
author | hirono <hirono@chromium.org> | 2015-06-30 01:35:37 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-06-30 08:36:18 +0000 |
commit | 917537c881d749152267d30b49c5b48431c1bb28 (patch) | |
tree | c844ee1eeae594fe62901159cb0145468f68b4df /chromeos/disks | |
parent | ab22ae465617845df0a95ea3b43ac6830e2f505d (diff) | |
download | chromium_src-917537c881d749152267d30b49c5b48431c1bb28.zip chromium_src-917537c881d749152267d30b49c5b48431c1bb28.tar.gz chromium_src-917537c881d749152267d30b49c5b48431c1bb28.tar.bz2 |
Unmount SD card when the device is suspended.
SuspendUnmountManager unmounts USB devices when the device goes to suspend to
ensure it runs fsync before suspend. The CL let the class unmount SD card as
well.
BUG=434372
TEST=SuspendUnmountManagerTest
Review URL: https://codereview.chromium.org/1208823002
Cr-Commit-Position: refs/heads/master@{#336741}
Diffstat (limited to 'chromeos/disks')
-rw-r--r-- | chromeos/disks/suspend_unmount_manager.cc | 3 | ||||
-rw-r--r-- | chromeos/disks/suspend_unmount_manager_unittest.cc | 69 |
2 files changed, 56 insertions, 16 deletions
diff --git a/chromeos/disks/suspend_unmount_manager.cc b/chromeos/disks/suspend_unmount_manager.cc index dfed1ed..cff1755 100644 --- a/chromeos/disks/suspend_unmount_manager.cc +++ b/chromeos/disks/suspend_unmount_manager.cc @@ -31,7 +31,8 @@ void SuspendUnmountManager::SuspendImminent() { return; std::set<std::string> mount_paths; for (const auto& pair : disk_mount_manager_->disks()) { - if (pair.second->device_type() == DEVICE_TYPE_USB && + if ((pair.second->device_type() == DEVICE_TYPE_USB || + pair.second->device_type() == DEVICE_TYPE_SD) && !pair.second->mount_path().empty()) { mount_paths.insert(pair.second->mount_path()); } diff --git a/chromeos/disks/suspend_unmount_manager_unittest.cc b/chromeos/disks/suspend_unmount_manager_unittest.cc index d6a8ef8..8aba132 100644 --- a/chromeos/disks/suspend_unmount_manager_unittest.cc +++ b/chromeos/disks/suspend_unmount_manager_unittest.cc @@ -2,6 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <algorithm> +#include <string> +#include <vector> + #include "chromeos/dbus/fake_power_manager_client.h" #include "chromeos/disks/disk_mount_manager.h" #include "chromeos/disks/mock_disk_mount_manager.h" @@ -12,10 +16,17 @@ 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 { - callback_.Run(error); + for (const UnmountPathCallback& callback : callbacks_) { + callback.Run(error); + } } const std::vector<std::string>& unmounting_mount_paths() const { @@ -27,10 +38,10 @@ class FakeDiskMountManager : public MockDiskMountManager { UnmountOptions options, const UnmountPathCallback& callback) override { unmounting_mount_paths_.push_back(mount_path); - callback_ = callback; + callbacks_.push_back(callback); } std::vector<std::string> unmounting_mount_paths_; - UnmountPathCallback callback_; + std::vector<UnmountPathCallback> callbacks_; }; class SuspendUnmountManagerTest : public testing::Test { @@ -46,36 +57,63 @@ class SuspendUnmountManagerTest : public testing::Test { }; TEST_F(SuspendUnmountManagerTest, Basic) { - const std::string dummy_mount_path = "/dummy/mount"; + 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", dummy_mount_path, chromeos::MOUNT_TYPE_DEVICE, + "/dummy/device/sd", kDummyMountPathSd, chromeos::MOUNT_TYPE_DEVICE, chromeos::disks::MOUNT_CONDITION_NONE), - "device_id", "device_label", "Vendor", "Product", - chromeos::DEVICE_TYPE_USB, 1024 * 1024, true, true, true, false); + 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()); - ASSERT_EQ(1u, disk_mount_manager_.unmounting_mount_paths().size()); - EXPECT_EQ(dummy_mount_path, disk_mount_manager_.unmounting_mount_paths()[0]); + EXPECT_EQ(2u, disk_mount_manager_.unmounting_mount_paths().size()); + EXPECT_EQ(1u, std::count(disk_mount_manager_.unmounting_mount_paths().begin(), + disk_mount_manager_.unmounting_mount_paths().end(), + kDummyMountPathUsb)); + EXPECT_EQ(1u, std::count(disk_mount_manager_.unmounting_mount_paths().begin(), + disk_mount_manager_.unmounting_mount_paths().end(), + kDummyMountPathSd)); + EXPECT_EQ(0u, 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 dummy_mount_path = "/dummy/mount"; + const std::string kDummyMountPath = "/dummy/mount"; disk_mount_manager_.CreateDiskEntryForMountDevice( chromeos::disks::DiskMountManager::MountPointInfo( - "/dummy/device", dummy_mount_path, chromeos::MOUNT_TYPE_DEVICE, + "/dummy/device", kDummyMountPath, chromeos::MOUNT_TYPE_DEVICE, chromeos::disks::MOUNT_CONDITION_NONE), - "device_id", "device_label", "Vendor", "Product", - chromeos::DEVICE_TYPE_USB, 1024 * 1024, true, true, true, false); + 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(dummy_mount_path, disk_mount_manager_.unmounting_mount_paths()[0]); + EXPECT_EQ(kDummyMountPath, + disk_mount_manager_.unmounting_mount_paths().front()); // Suspend cancelled. fake_power_client_.SendSuspendDone(); @@ -83,7 +121,8 @@ TEST_F(SuspendUnmountManagerTest, CancelAndSuspendAgain) { // Suspend again. fake_power_client_.SendSuspendImminent(); ASSERT_EQ(2u, disk_mount_manager_.unmounting_mount_paths().size()); - EXPECT_EQ(dummy_mount_path, disk_mount_manager_.unmounting_mount_paths()[1]); + EXPECT_EQ(kDummyMountPath, + disk_mount_manager_.unmounting_mount_paths().front()); } } // namespace |