| // Copyright (c) 2011 The Chromium OS 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 "cros-disks/device_event_queue.h" |
| |
| #include <algorithm> |
| |
| #include <gtest/gtest.h> |
| |
| #include "cros-disks/device_event.h" |
| |
| namespace cros_disks { |
| |
| class DeviceEventQueueTest : public ::testing::Test { |
| protected: |
| // Returns true if two device event objects have the same event type |
| // and device path. |
| static bool CompareDeviceEvent(const DeviceEvent& event1, |
| const DeviceEvent& event2) { |
| return (event1.event_type == event2.event_type) && |
| (event1.device_path == event2.device_path); |
| } |
| |
| // Returns true if the device event queue under test has the expected |
| // events. |
| bool VerifyDeviceEventQueue() { |
| return std::equal(expected_events_.begin(), expected_events_.end(), |
| queue_.events().begin(), CompareDeviceEvent); |
| } |
| |
| DeviceEventQueue queue_; |
| DeviceEventList expected_events_; |
| }; |
| |
| TEST_F(DeviceEventQueueTest, Constructor) { |
| EXPECT_TRUE(queue_.events().empty()); |
| } |
| |
| TEST_F(DeviceEventQueueTest, Remove) { |
| queue_.Remove(); |
| EXPECT_TRUE(queue_.events().empty()); |
| |
| DeviceEvent event1(DeviceEvent::kDiskAdded, "d1"); |
| DeviceEvent event2(DeviceEvent::kDiskAdded, "d2"); |
| DeviceEvent event3(DeviceEvent::kDiskAdded, "d3"); |
| |
| queue_.Add(event1); |
| queue_.Add(event2); |
| expected_events_.push_front(event1); |
| expected_events_.push_front(event2); |
| |
| queue_.Remove(); |
| expected_events_.pop_back(); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| |
| queue_.Add(event3); |
| expected_events_.push_front(event3); |
| |
| queue_.Remove(); |
| expected_events_.pop_back(); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| |
| queue_.Remove(); |
| expected_events_.pop_back(); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| } |
| |
| TEST_F(DeviceEventQueueTest, AddIgored) { |
| // An Ignored event is discarded |
| queue_.Add(DeviceEvent(DeviceEvent::kIgnored, "d1")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| } |
| |
| TEST_F(DeviceEventQueueTest, AddDeviceAdded) { |
| // A DeviceAdded event is added |
| queue_.Add(DeviceEvent(DeviceEvent::kDeviceAdded, "d1")); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDeviceAdded, "d1")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| } |
| |
| TEST_F(DeviceEventQueueTest, AddDeviceScanned) { |
| // A DeviceScanned event is discarded |
| queue_.Add(DeviceEvent(DeviceEvent::kDeviceScanned, "d1")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| } |
| |
| TEST_F(DeviceEventQueueTest, AddDeviceRemoved) { |
| // A DeviceRemoved event is added |
| queue_.Add(DeviceEvent(DeviceEvent::kDeviceRemoved, "d1")); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDeviceRemoved, "d1")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| } |
| |
| TEST_F(DeviceEventQueueTest, AddDeviceAddedAndDeviceRemoved) { |
| // A DeviceAdded event followed by a DeviceRemoved event of the same |
| // device path are both discarded |
| queue_.Add(DeviceEvent(DeviceEvent::kDeviceAdded, "d1")); |
| queue_.Add(DeviceEvent(DeviceEvent::kDeviceRemoved, "d1")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| |
| queue_.Add(DeviceEvent(DeviceEvent::kDeviceAdded, "d1")); |
| queue_.Add(DeviceEvent(DeviceEvent::kDeviceRemoved, "d2")); |
| queue_.Add(DeviceEvent(DeviceEvent::kDeviceRemoved, "d1")); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDeviceRemoved, "d2")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| } |
| |
| TEST_F(DeviceEventQueueTest, AddDeviceRemovedAndDeviceAdded) { |
| queue_.Add(DeviceEvent(DeviceEvent::kDeviceRemoved, "d1")); |
| queue_.Add(DeviceEvent(DeviceEvent::kDeviceAdded, "d1")); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDeviceRemoved, "d1")); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDeviceAdded, "d1")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| } |
| |
| TEST_F(DeviceEventQueueTest, AddDiskAdded) { |
| // A DiskAdded event is added |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskAdded, "d1")); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskAdded, "d1")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| } |
| |
| TEST_F(DeviceEventQueueTest, AddDiskChanged) { |
| // A DiskChanged event is added if no DiskAdded event has been added |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d1")); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskChanged, "d1")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| |
| // Further DiskChanged events are combined and the latest one is kept |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d1")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d2")); |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d1")); |
| expected_events_.clear(); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskChanged, "d2")); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskChanged, "d1")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| } |
| |
| TEST_F(DeviceEventQueueTest, AddDiskRemoved) { |
| // A DiskRemoved event is added |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d1")); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskRemoved, "d1")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| } |
| |
| TEST_F(DeviceEventQueueTest, AddDiskAddedAndDiskRemoved) { |
| // A DiskAdded event followed by a DiskRemoved event |
| // of the same device path are both discarded |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskAdded, "d1")); |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d1")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskAdded, "d1")); |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d2")); |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d1")); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskRemoved, "d2")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| } |
| |
| TEST_F(DeviceEventQueueTest, AddDiskAddedAndDiskChanged) { |
| // A DiskChanged event is discarded if a DiskAdded event of the same |
| // same device path is in the queue |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskAdded, "d1")); |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d1")); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskAdded, "d1")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskAdded, "d2")); |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d1")); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskAdded, "d2")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| } |
| |
| TEST_F(DeviceEventQueueTest, AddDiskChangedAndDiskRemoved) { |
| // A DiskChanged event followed by a DiskRemoved event |
| // of the same device path are both discarded |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d1")); |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d1")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d1")); |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d2")); |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d1")); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskRemoved, "d2")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| } |
| |
| TEST_F(DeviceEventQueueTest, AddDiskRemovedAndDiskAdded) { |
| // A DiskRemoved event followed by a DiskAdded event of the same |
| // device path are both added to the queue |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d1")); |
| queue_.Add(DeviceEvent(DeviceEvent::kDiskAdded, "d1")); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskRemoved, "d1")); |
| expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskAdded, "d1")); |
| EXPECT_TRUE(VerifyDeviceEventQueue()); |
| } |
| |
| TEST_F(DeviceEventQueueTest, Head) { |
| EXPECT_EQ(nullptr, queue_.Head()); |
| |
| DeviceEvent event1(DeviceEvent::kDiskAdded, "d1"); |
| DeviceEvent event2(DeviceEvent::kDiskAdded, "d2"); |
| DeviceEvent event3(DeviceEvent::kDiskAdded, "d3"); |
| |
| queue_.Add(event1); |
| EXPECT_NE(nullptr, queue_.Head()); |
| EXPECT_TRUE(CompareDeviceEvent(event1, *queue_.Head())); |
| |
| queue_.Add(event2); |
| EXPECT_NE(nullptr, queue_.Head()); |
| EXPECT_TRUE(CompareDeviceEvent(event1, *queue_.Head())); |
| |
| queue_.Remove(); |
| EXPECT_NE(nullptr, queue_.Head()); |
| EXPECT_TRUE(CompareDeviceEvent(event2, *queue_.Head())); |
| |
| queue_.Add(event3); |
| EXPECT_NE(nullptr, queue_.Head()); |
| EXPECT_TRUE(CompareDeviceEvent(event2, *queue_.Head())); |
| |
| queue_.Remove(); |
| EXPECT_NE(nullptr, queue_.Head()); |
| EXPECT_TRUE(CompareDeviceEvent(event3, *queue_.Head())); |
| |
| queue_.Remove(); |
| EXPECT_EQ(nullptr, queue_.Head()); |
| } |
| |
| } // namespace cros_disks |