blob: 13496acc94c6fef3315b0b4280338d50e6a58f4b [file] [log] [blame]
Ben Chan6e726922011-06-28 15:54:32 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Alex Deymo4527b9c2014-11-10 19:55:35 -08005#include "cros-disks/device_event_queue.h"
6
Ben Chan6e726922011-06-28 15:54:32 -07007#include <algorithm>
Ben Chan6e726922011-06-28 15:54:32 -07008
9#include <gtest/gtest.h>
10
Ben Chan5ccd9fe2013-11-13 18:28:27 -080011#include "cros-disks/device_event.h"
Ben Chan6e726922011-06-28 15:54:32 -070012
13namespace cros_disks {
14
15class DeviceEventQueueTest : public ::testing::Test {
16 protected:
17 // Returns true if two device event objects have the same event type
18 // and device path.
19 static bool CompareDeviceEvent(const DeviceEvent& event1,
Ben Chande0e3f62017-09-26 06:28:39 -070020 const DeviceEvent& event2) {
Ben Chan6e726922011-06-28 15:54:32 -070021 return (event1.event_type == event2.event_type) &&
Ben Chande0e3f62017-09-26 06:28:39 -070022 (event1.device_path == event2.device_path);
Ben Chan6e726922011-06-28 15:54:32 -070023 }
24
25 // Returns true if the device event queue under test has the expected
26 // events.
27 bool VerifyDeviceEventQueue() {
28 return std::equal(expected_events_.begin(), expected_events_.end(),
Ben Chande0e3f62017-09-26 06:28:39 -070029 queue_.events().begin(), CompareDeviceEvent);
Ben Chan6e726922011-06-28 15:54:32 -070030 }
31
32 DeviceEventQueue queue_;
Ben Chan7599f992011-12-13 16:04:34 -080033 DeviceEventList expected_events_;
Ben Chan6e726922011-06-28 15:54:32 -070034};
35
36TEST_F(DeviceEventQueueTest, Constructor) {
37 EXPECT_TRUE(queue_.events().empty());
38}
39
40TEST_F(DeviceEventQueueTest, Remove) {
41 queue_.Remove();
42 EXPECT_TRUE(queue_.events().empty());
43
44 DeviceEvent event1(DeviceEvent::kDiskAdded, "d1");
45 DeviceEvent event2(DeviceEvent::kDiskAdded, "d2");
46 DeviceEvent event3(DeviceEvent::kDiskAdded, "d3");
47
48 queue_.Add(event1);
49 queue_.Add(event2);
50 expected_events_.push_front(event1);
51 expected_events_.push_front(event2);
52
53 queue_.Remove();
54 expected_events_.pop_back();
55 EXPECT_TRUE(VerifyDeviceEventQueue());
56
57 queue_.Add(event3);
58 expected_events_.push_front(event3);
59
60 queue_.Remove();
61 expected_events_.pop_back();
62 EXPECT_TRUE(VerifyDeviceEventQueue());
63
64 queue_.Remove();
65 expected_events_.pop_back();
66 EXPECT_TRUE(VerifyDeviceEventQueue());
67}
68
69TEST_F(DeviceEventQueueTest, AddIgored) {
70 // An Ignored event is discarded
71 queue_.Add(DeviceEvent(DeviceEvent::kIgnored, "d1"));
72 EXPECT_TRUE(VerifyDeviceEventQueue());
73}
74
75TEST_F(DeviceEventQueueTest, AddDeviceAdded) {
76 // A DeviceAdded event is added
77 queue_.Add(DeviceEvent(DeviceEvent::kDeviceAdded, "d1"));
78 expected_events_.push_front(DeviceEvent(DeviceEvent::kDeviceAdded, "d1"));
79 EXPECT_TRUE(VerifyDeviceEventQueue());
80}
81
82TEST_F(DeviceEventQueueTest, AddDeviceScanned) {
83 // A DeviceScanned event is discarded
84 queue_.Add(DeviceEvent(DeviceEvent::kDeviceScanned, "d1"));
85 EXPECT_TRUE(VerifyDeviceEventQueue());
86}
87
88TEST_F(DeviceEventQueueTest, AddDeviceRemoved) {
89 // A DeviceRemoved event is added
90 queue_.Add(DeviceEvent(DeviceEvent::kDeviceRemoved, "d1"));
91 expected_events_.push_front(DeviceEvent(DeviceEvent::kDeviceRemoved, "d1"));
92 EXPECT_TRUE(VerifyDeviceEventQueue());
93}
94
95TEST_F(DeviceEventQueueTest, AddDeviceAddedAndDeviceRemoved) {
96 // A DeviceAdded event followed by a DeviceRemoved event of the same
Ben Chan9ed09e32011-11-22 16:24:06 -080097 // device path are both discarded
Ben Chan6e726922011-06-28 15:54:32 -070098 queue_.Add(DeviceEvent(DeviceEvent::kDeviceAdded, "d1"));
99 queue_.Add(DeviceEvent(DeviceEvent::kDeviceRemoved, "d1"));
100 EXPECT_TRUE(VerifyDeviceEventQueue());
101
102 queue_.Add(DeviceEvent(DeviceEvent::kDeviceAdded, "d1"));
103 queue_.Add(DeviceEvent(DeviceEvent::kDeviceRemoved, "d2"));
104 queue_.Add(DeviceEvent(DeviceEvent::kDeviceRemoved, "d1"));
105 expected_events_.push_front(DeviceEvent(DeviceEvent::kDeviceRemoved, "d2"));
106 EXPECT_TRUE(VerifyDeviceEventQueue());
107}
108
109TEST_F(DeviceEventQueueTest, AddDeviceRemovedAndDeviceAdded) {
110 queue_.Add(DeviceEvent(DeviceEvent::kDeviceRemoved, "d1"));
111 queue_.Add(DeviceEvent(DeviceEvent::kDeviceAdded, "d1"));
112 expected_events_.push_front(DeviceEvent(DeviceEvent::kDeviceRemoved, "d1"));
113 expected_events_.push_front(DeviceEvent(DeviceEvent::kDeviceAdded, "d1"));
114 EXPECT_TRUE(VerifyDeviceEventQueue());
115}
116
117TEST_F(DeviceEventQueueTest, AddDiskAdded) {
118 // A DiskAdded event is added
119 queue_.Add(DeviceEvent(DeviceEvent::kDiskAdded, "d1"));
120 expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskAdded, "d1"));
121 EXPECT_TRUE(VerifyDeviceEventQueue());
122}
123
124TEST_F(DeviceEventQueueTest, AddDiskChanged) {
125 // A DiskChanged event is added if no DiskAdded event has been added
126 queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d1"));
127 expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskChanged, "d1"));
128 EXPECT_TRUE(VerifyDeviceEventQueue());
129
130 // Further DiskChanged events are combined and the latest one is kept
131 queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d1"));
132 EXPECT_TRUE(VerifyDeviceEventQueue());
133
134 queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d2"));
135 queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d1"));
136 expected_events_.clear();
137 expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskChanged, "d2"));
138 expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskChanged, "d1"));
139 EXPECT_TRUE(VerifyDeviceEventQueue());
140}
141
142TEST_F(DeviceEventQueueTest, AddDiskRemoved) {
143 // A DiskRemoved event is added
144 queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d1"));
145 expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskRemoved, "d1"));
146 EXPECT_TRUE(VerifyDeviceEventQueue());
147}
148
149TEST_F(DeviceEventQueueTest, AddDiskAddedAndDiskRemoved) {
150 // A DiskAdded event followed by a DiskRemoved event
Ben Chan9ed09e32011-11-22 16:24:06 -0800151 // of the same device path are both discarded
Ben Chan6e726922011-06-28 15:54:32 -0700152 queue_.Add(DeviceEvent(DeviceEvent::kDiskAdded, "d1"));
153 queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d1"));
154 EXPECT_TRUE(VerifyDeviceEventQueue());
155
156 queue_.Add(DeviceEvent(DeviceEvent::kDiskAdded, "d1"));
157 queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d2"));
158 queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d1"));
159 expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskRemoved, "d2"));
160 EXPECT_TRUE(VerifyDeviceEventQueue());
161}
162
163TEST_F(DeviceEventQueueTest, AddDiskAddedAndDiskChanged) {
164 // A DiskChanged event is discarded if a DiskAdded event of the same
165 // same device path is in the queue
166 queue_.Add(DeviceEvent(DeviceEvent::kDiskAdded, "d1"));
167 queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d1"));
168 expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskAdded, "d1"));
169 EXPECT_TRUE(VerifyDeviceEventQueue());
170
171 queue_.Add(DeviceEvent(DeviceEvent::kDiskAdded, "d2"));
172 queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d1"));
173 expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskAdded, "d2"));
174 EXPECT_TRUE(VerifyDeviceEventQueue());
175}
176
Ben Chan6e726922011-06-28 15:54:32 -0700177TEST_F(DeviceEventQueueTest, AddDiskChangedAndDiskRemoved) {
178 // A DiskChanged event followed by a DiskRemoved event
Ben Chan9ed09e32011-11-22 16:24:06 -0800179 // of the same device path are both discarded
Ben Chan6e726922011-06-28 15:54:32 -0700180 queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d1"));
181 queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d1"));
182 EXPECT_TRUE(VerifyDeviceEventQueue());
183
184 queue_.Add(DeviceEvent(DeviceEvent::kDiskChanged, "d1"));
185 queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d2"));
186 queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d1"));
187 expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskRemoved, "d2"));
188 EXPECT_TRUE(VerifyDeviceEventQueue());
189}
190
191TEST_F(DeviceEventQueueTest, AddDiskRemovedAndDiskAdded) {
192 // A DiskRemoved event followed by a DiskAdded event of the same
193 // device path are both added to the queue
194 queue_.Add(DeviceEvent(DeviceEvent::kDiskRemoved, "d1"));
195 queue_.Add(DeviceEvent(DeviceEvent::kDiskAdded, "d1"));
196 expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskRemoved, "d1"));
197 expected_events_.push_front(DeviceEvent(DeviceEvent::kDiskAdded, "d1"));
198 EXPECT_TRUE(VerifyDeviceEventQueue());
199}
200
Ben Chan6e726922011-06-28 15:54:32 -0700201TEST_F(DeviceEventQueueTest, Head) {
Ben Chan44e7ea62014-08-29 18:13:37 -0700202 EXPECT_EQ(nullptr, queue_.Head());
Ben Chan6e726922011-06-28 15:54:32 -0700203
204 DeviceEvent event1(DeviceEvent::kDiskAdded, "d1");
205 DeviceEvent event2(DeviceEvent::kDiskAdded, "d2");
206 DeviceEvent event3(DeviceEvent::kDiskAdded, "d3");
207
208 queue_.Add(event1);
Ben Chan44e7ea62014-08-29 18:13:37 -0700209 EXPECT_NE(nullptr, queue_.Head());
Ben Chan6e726922011-06-28 15:54:32 -0700210 EXPECT_TRUE(CompareDeviceEvent(event1, *queue_.Head()));
211
212 queue_.Add(event2);
Ben Chan44e7ea62014-08-29 18:13:37 -0700213 EXPECT_NE(nullptr, queue_.Head());
Ben Chan6e726922011-06-28 15:54:32 -0700214 EXPECT_TRUE(CompareDeviceEvent(event1, *queue_.Head()));
215
216 queue_.Remove();
Ben Chan44e7ea62014-08-29 18:13:37 -0700217 EXPECT_NE(nullptr, queue_.Head());
Ben Chan6e726922011-06-28 15:54:32 -0700218 EXPECT_TRUE(CompareDeviceEvent(event2, *queue_.Head()));
219
220 queue_.Add(event3);
Ben Chan44e7ea62014-08-29 18:13:37 -0700221 EXPECT_NE(nullptr, queue_.Head());
Ben Chan6e726922011-06-28 15:54:32 -0700222 EXPECT_TRUE(CompareDeviceEvent(event2, *queue_.Head()));
223
224 queue_.Remove();
Ben Chan44e7ea62014-08-29 18:13:37 -0700225 EXPECT_NE(nullptr, queue_.Head());
Ben Chan6e726922011-06-28 15:54:32 -0700226 EXPECT_TRUE(CompareDeviceEvent(event3, *queue_.Head()));
227
228 queue_.Remove();
Ben Chan44e7ea62014-08-29 18:13:37 -0700229 EXPECT_EQ(nullptr, queue_.Head());
Ben Chan6e726922011-06-28 15:54:32 -0700230}
231
232} // namespace cros_disks