OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "third_party/mojo/src/mojo/edk/system/wait_set_dispatcher.h" | 5 #include "mojo/edk/system/wait_set_dispatcher.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
| 10 #include "mojo/edk/system/message_pipe_dispatcher.h" |
| 11 #include "mojo/edk/system/test_utils.h" |
| 12 #include "mojo/edk/system/waiter.h" |
10 #include "mojo/public/cpp/system/macros.h" | 13 #include "mojo/public/cpp/system/macros.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
12 #include "third_party/mojo/src/mojo/edk/system/message_pipe.h" | |
13 #include "third_party/mojo/src/mojo/edk/system/message_pipe_dispatcher.h" | |
14 #include "third_party/mojo/src/mojo/edk/system/test_utils.h" | |
15 #include "third_party/mojo/src/mojo/edk/system/waiter.h" | |
16 | 15 |
17 namespace mojo { | 16 namespace mojo { |
18 namespace system { | 17 namespace edk { |
19 namespace { | 18 namespace { |
20 | 19 |
21 class WaitSetDispatcherTest : public ::testing::Test { | 20 class WaitSetDispatcherTest : public ::testing::Test { |
22 public: | 21 public: |
23 WaitSetDispatcherTest() {} | 22 WaitSetDispatcherTest() {} |
24 ~WaitSetDispatcherTest() override {} | 23 ~WaitSetDispatcherTest() override {} |
25 | 24 |
26 void SetUp() override { | 25 void SetUp() override { |
27 dispatcher0_ = MessagePipeDispatcher::Create( | 26 CreateMessagePipe(&dispatcher0_, &dispatcher1_); |
28 MessagePipeDispatcher::kDefaultCreateOptions); | |
29 dispatcher1_ = MessagePipeDispatcher::Create( | |
30 MessagePipeDispatcher::kDefaultCreateOptions); | |
31 | |
32 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal()); | |
33 dispatcher0_->Init(mp, 0); | |
34 dispatcher1_->Init(mp, 1); | |
35 | |
36 dispatchers_to_close_.push_back(dispatcher0_); | |
37 dispatchers_to_close_.push_back(dispatcher1_); | |
38 } | 27 } |
39 | 28 |
40 void TearDown() override { | 29 void TearDown() override { |
41 for (auto& d : dispatchers_to_close_) | 30 for (auto& d : dispatchers_to_close_) |
42 d->Close(); | 31 d->Close(); |
43 } | 32 } |
44 | 33 |
45 MojoResult GetOneReadyDispatcher( | 34 MojoResult GetOneReadyDispatcher( |
46 const scoped_refptr<WaitSetDispatcher>& wait_set, | 35 const scoped_refptr<WaitSetDispatcher>& wait_set, |
47 scoped_refptr<Dispatcher>* ready_dispatcher, | 36 scoped_refptr<Dispatcher>* ready_dispatcher, |
48 uintptr_t* context) { | 37 uintptr_t* context) { |
49 uint32_t count = 1; | 38 uint32_t count = 1; |
50 MojoResult dispatcher_result = MOJO_RESULT_UNKNOWN; | 39 MojoResult dispatcher_result = MOJO_RESULT_UNKNOWN; |
51 DispatcherVector dispatchers; | 40 DispatcherVector dispatchers; |
52 MojoResult result = wait_set->GetReadyDispatchers( | 41 MojoResult result = wait_set->GetReadyDispatchers( |
53 MakeUserPointer(&count), | 42 &count, &dispatchers, &dispatcher_result, context); |
54 &dispatchers, | |
55 MakeUserPointer(&dispatcher_result), | |
56 MakeUserPointer(context)); | |
57 if (result == MOJO_RESULT_OK) { | 43 if (result == MOJO_RESULT_OK) { |
58 CHECK_EQ(1u, dispatchers.size()); | 44 CHECK_EQ(1u, dispatchers.size()); |
59 *ready_dispatcher = dispatchers[0]; | 45 *ready_dispatcher = dispatchers[0]; |
60 return dispatcher_result; | 46 return dispatcher_result; |
61 } | 47 } |
62 return result; | 48 return result; |
63 } | 49 } |
64 | 50 |
| 51 void CreateMessagePipe(scoped_refptr<MessagePipeDispatcher>* d0, |
| 52 scoped_refptr<MessagePipeDispatcher>* d1) { |
| 53 *d0 = MessagePipeDispatcher::Create( |
| 54 MessagePipeDispatcher::kDefaultCreateOptions); |
| 55 *d1 = MessagePipeDispatcher::Create( |
| 56 MessagePipeDispatcher::kDefaultCreateOptions); |
| 57 (*d0)->InitNonTransferable(pipe_id_generator_); |
| 58 (*d1)->InitNonTransferable(pipe_id_generator_); |
| 59 pipe_id_generator_++; |
| 60 |
| 61 dispatchers_to_close_.push_back(*d0); |
| 62 dispatchers_to_close_.push_back(*d1); |
| 63 } |
| 64 |
65 void CloseOnShutdown(const scoped_refptr<Dispatcher>& dispatcher) { | 65 void CloseOnShutdown(const scoped_refptr<Dispatcher>& dispatcher) { |
66 dispatchers_to_close_.push_back(dispatcher); | 66 dispatchers_to_close_.push_back(dispatcher); |
67 } | 67 } |
68 | 68 |
69 protected: | 69 protected: |
70 scoped_refptr<MessagePipeDispatcher> dispatcher0_; | 70 scoped_refptr<MessagePipeDispatcher> dispatcher0_; |
71 scoped_refptr<MessagePipeDispatcher> dispatcher1_; | 71 scoped_refptr<MessagePipeDispatcher> dispatcher1_; |
72 | 72 |
| 73 private: |
| 74 static uint64_t pipe_id_generator_; |
73 DispatcherVector dispatchers_to_close_; | 75 DispatcherVector dispatchers_to_close_; |
74 | 76 |
75 DISALLOW_COPY_AND_ASSIGN(WaitSetDispatcherTest); | 77 DISALLOW_COPY_AND_ASSIGN(WaitSetDispatcherTest); |
76 }; | 78 }; |
77 | 79 |
| 80 // static |
| 81 uint64_t WaitSetDispatcherTest::pipe_id_generator_ = 1; |
| 82 |
78 TEST_F(WaitSetDispatcherTest, Basic) { | 83 TEST_F(WaitSetDispatcherTest, Basic) { |
79 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); | 84 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); |
80 CloseOnShutdown(wait_set); | 85 CloseOnShutdown(wait_set); |
81 ASSERT_EQ(MOJO_RESULT_OK, | 86 ASSERT_EQ(MOJO_RESULT_OK, |
82 wait_set->AddWaitingDispatcher(dispatcher0_, | 87 wait_set->AddWaitingDispatcher(dispatcher0_, |
83 MOJO_HANDLE_SIGNAL_READABLE, 1)); | 88 MOJO_HANDLE_SIGNAL_READABLE, 1)); |
84 ASSERT_EQ(MOJO_RESULT_OK, | 89 ASSERT_EQ(MOJO_RESULT_OK, |
85 wait_set->AddWaitingDispatcher(dispatcher1_, | 90 wait_set->AddWaitingDispatcher(dispatcher1_, |
86 MOJO_HANDLE_SIGNAL_WRITABLE, 2)); | 91 MOJO_HANDLE_SIGNAL_WRITABLE, 2)); |
87 | 92 |
(...skipping 29 matching lines...) Expand all Loading... |
117 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); | 122 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
118 EXPECT_FALSE(hss.satisfies(MOJO_HANDLE_SIGNAL_READABLE)); | 123 EXPECT_FALSE(hss.satisfies(MOJO_HANDLE_SIGNAL_READABLE)); |
119 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); | 124 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); |
120 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 125 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
121 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); | 126 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
122 | 127 |
123 // Write to |dispatcher1_|, which should make |dispatcher0_| readable. | 128 // Write to |dispatcher1_|, which should make |dispatcher0_| readable. |
124 char buffer[] = "abcd"; | 129 char buffer[] = "abcd"; |
125 w.Init(); | 130 w.Init(); |
126 ASSERT_EQ(MOJO_RESULT_OK, | 131 ASSERT_EQ(MOJO_RESULT_OK, |
127 dispatcher1_->WriteMessage(UserPointer<const void>(buffer), | 132 dispatcher1_->WriteMessage(buffer, sizeof(buffer), nullptr, |
128 sizeof(buffer), nullptr, | 133 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
129 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 134 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); |
130 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, nullptr)); | |
131 woken_dispatcher = nullptr; | 135 woken_dispatcher = nullptr; |
132 context = 0; | 136 context = 0; |
133 EXPECT_EQ(MOJO_RESULT_OK, | 137 EXPECT_EQ(MOJO_RESULT_OK, |
134 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); | 138 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); |
135 EXPECT_EQ(dispatcher0_, woken_dispatcher); | 139 EXPECT_EQ(dispatcher0_, woken_dispatcher); |
136 EXPECT_EQ(1u, context); | 140 EXPECT_EQ(1u, context); |
137 | 141 |
138 // Again, if a ready dispatcher isn't removed, it will continue to be | 142 // Again, if a ready dispatcher isn't removed, it will continue to be |
139 // returned. | 143 // returned. |
140 woken_dispatcher = nullptr; | 144 woken_dispatcher = nullptr; |
(...skipping 24 matching lines...) Expand all Loading... |
165 scoped_refptr<Dispatcher> woken_dispatcher; | 169 scoped_refptr<Dispatcher> woken_dispatcher; |
166 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 170 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
167 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); | 171 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
168 | 172 |
169 // The tested behaviour below should be repeatable. | 173 // The tested behaviour below should be repeatable. |
170 for (size_t i = 0; i < 3; i++) { | 174 for (size_t i = 0; i < 3; i++) { |
171 // Write to |dispatcher1_|, which should make |dispatcher0_| readable. | 175 // Write to |dispatcher1_|, which should make |dispatcher0_| readable. |
172 char buffer[] = "abcd"; | 176 char buffer[] = "abcd"; |
173 w.Init(); | 177 w.Init(); |
174 ASSERT_EQ(MOJO_RESULT_OK, | 178 ASSERT_EQ(MOJO_RESULT_OK, |
175 dispatcher1_->WriteMessage(UserPointer<const void>(buffer), | 179 dispatcher1_->WriteMessage(buffer, sizeof(buffer), nullptr, |
176 sizeof(buffer), nullptr, | |
177 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 180 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
178 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, nullptr)); | 181 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); |
179 woken_dispatcher = nullptr; | 182 woken_dispatcher = nullptr; |
180 context = 0; | 183 context = 0; |
181 EXPECT_EQ(MOJO_RESULT_OK, | 184 EXPECT_EQ(MOJO_RESULT_OK, |
182 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); | 185 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); |
183 EXPECT_EQ(dispatcher0_, woken_dispatcher); | 186 EXPECT_EQ(dispatcher0_, woken_dispatcher); |
184 EXPECT_EQ(1u, context); | 187 EXPECT_EQ(1u, context); |
185 | 188 |
186 // Read from |dispatcher0_| which should change it's state to non-readable. | 189 // Read from |dispatcher0_| which should change it's state to non-readable. |
187 char read_buffer[sizeof(buffer) + 5]; | 190 char read_buffer[sizeof(buffer) + 5]; |
188 uint32_t num_bytes = sizeof(read_buffer); | 191 uint32_t num_bytes = sizeof(read_buffer); |
189 ASSERT_EQ(MOJO_RESULT_OK, | 192 ASSERT_EQ(MOJO_RESULT_OK, |
190 dispatcher0_->ReadMessage(UserPointer<void>(read_buffer), | 193 dispatcher0_->ReadMessage(read_buffer, &num_bytes, nullptr, |
191 MakeUserPointer(&num_bytes), | 194 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); |
192 nullptr, nullptr, | |
193 MOJO_READ_MESSAGE_FLAG_NONE)); | |
194 EXPECT_EQ(sizeof(buffer), num_bytes); | 195 EXPECT_EQ(sizeof(buffer), num_bytes); |
195 | 196 |
196 // No dispatchers are ready. | 197 // No dispatchers are ready. |
197 w.Init(); | 198 w.Init(); |
198 woken_dispatcher = nullptr; | 199 woken_dispatcher = nullptr; |
199 context = 0; | 200 context = 0; |
200 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 201 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
201 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); | 202 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); |
202 EXPECT_EQ(nullptr, woken_dispatcher); | 203 EXPECT_EQ(nullptr, woken_dispatcher); |
203 EXPECT_EQ(0u, context); | 204 EXPECT_EQ(0u, context); |
204 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); | 205 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); |
205 } | 206 } |
206 | 207 |
207 wait_set->RemoveAwakable(&w, nullptr); | 208 wait_set->RemoveAwakable(&w, nullptr); |
208 } | 209 } |
209 | 210 |
210 TEST_F(WaitSetDispatcherTest, MultipleReady) { | 211 TEST_F(WaitSetDispatcherTest, MultipleReady) { |
211 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); | 212 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); |
212 CloseOnShutdown(wait_set); | 213 CloseOnShutdown(wait_set); |
213 | 214 |
214 scoped_refptr<MessagePipeDispatcher> mp1_dispatcher0 = | 215 scoped_refptr<MessagePipeDispatcher> mp1_dispatcher0; |
215 MessagePipeDispatcher::Create( | 216 scoped_refptr<MessagePipeDispatcher> mp1_dispatcher1; |
216 MessagePipeDispatcher::kDefaultCreateOptions); | 217 CreateMessagePipe(&mp1_dispatcher0, &mp1_dispatcher1); |
217 scoped_refptr<MessagePipeDispatcher> mp1_dispatcher1 = | |
218 MessagePipeDispatcher::Create( | |
219 MessagePipeDispatcher::kDefaultCreateOptions); | |
220 CloseOnShutdown(mp1_dispatcher0); | |
221 CloseOnShutdown(mp1_dispatcher1); | |
222 { | |
223 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal()); | |
224 mp1_dispatcher0->Init(mp, 0); | |
225 mp1_dispatcher1->Init(mp, 1); | |
226 } | |
227 | 218 |
228 ASSERT_EQ(MOJO_RESULT_OK, | 219 ASSERT_EQ(MOJO_RESULT_OK, |
229 wait_set->AddWaitingDispatcher(dispatcher0_, | 220 wait_set->AddWaitingDispatcher(dispatcher0_, |
230 MOJO_HANDLE_SIGNAL_READABLE, 0)); | 221 MOJO_HANDLE_SIGNAL_READABLE, 0)); |
231 ASSERT_EQ(MOJO_RESULT_OK, | 222 ASSERT_EQ(MOJO_RESULT_OK, |
232 wait_set->AddWaitingDispatcher(dispatcher1_, | 223 wait_set->AddWaitingDispatcher(dispatcher1_, |
233 MOJO_HANDLE_SIGNAL_WRITABLE, 0)); | 224 MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
234 ASSERT_EQ(MOJO_RESULT_OK, | 225 ASSERT_EQ(MOJO_RESULT_OK, |
235 wait_set->AddWaitingDispatcher(mp1_dispatcher0, | 226 wait_set->AddWaitingDispatcher(mp1_dispatcher0, |
236 MOJO_HANDLE_SIGNAL_WRITABLE, 0)); | 227 MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
(...skipping 16 matching lines...) Expand all Loading... |
253 // Don't know which dispatcher was returned, just that it was one of the | 244 // Don't know which dispatcher was returned, just that it was one of the |
254 // writable ones. | 245 // writable ones. |
255 EXPECT_TRUE(woken_dispatcher == dispatcher1_ || | 246 EXPECT_TRUE(woken_dispatcher == dispatcher1_ || |
256 woken_dispatcher == mp1_dispatcher0 || | 247 woken_dispatcher == mp1_dispatcher0 || |
257 woken_dispatcher == mp1_dispatcher1); | 248 woken_dispatcher == mp1_dispatcher1); |
258 | 249 |
259 DispatcherVector dispatchers_vector; | 250 DispatcherVector dispatchers_vector; |
260 uint32_t count = 4; | 251 uint32_t count = 4; |
261 MojoResult results[4]; | 252 MojoResult results[4]; |
262 EXPECT_EQ(MOJO_RESULT_OK, | 253 EXPECT_EQ(MOJO_RESULT_OK, |
263 wait_set->GetReadyDispatchers(MakeUserPointer(&count), | 254 wait_set->GetReadyDispatchers(&count, |
264 &dispatchers_vector, | 255 &dispatchers_vector, |
265 MakeUserPointer(results), | 256 results, |
266 MakeUserPointer<uintptr_t>(nullptr))); | 257 nullptr)); |
267 EXPECT_EQ(3u, count); | 258 EXPECT_EQ(3u, count); |
268 std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); | 259 std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); |
269 DispatcherVector expected_dispatchers; | 260 DispatcherVector expected_dispatchers; |
270 expected_dispatchers.push_back(dispatcher1_); | 261 expected_dispatchers.push_back(dispatcher1_); |
271 expected_dispatchers.push_back(mp1_dispatcher0); | 262 expected_dispatchers.push_back(mp1_dispatcher0); |
272 expected_dispatchers.push_back(mp1_dispatcher1); | 263 expected_dispatchers.push_back(mp1_dispatcher1); |
273 std::sort(expected_dispatchers.begin(), expected_dispatchers.end()); | 264 std::sort(expected_dispatchers.begin(), expected_dispatchers.end()); |
274 EXPECT_EQ(expected_dispatchers, dispatchers_vector); | 265 EXPECT_EQ(expected_dispatchers, dispatchers_vector); |
275 | 266 |
276 // If a ready dispatcher isn't removed, it will continue to be returned. | 267 // If a ready dispatcher isn't removed, it will continue to be returned. |
277 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 268 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
278 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); | 269 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
279 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 270 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
280 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 271 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
281 count = 4; | 272 count = 4; |
282 dispatchers_vector.clear(); | 273 dispatchers_vector.clear(); |
283 EXPECT_EQ(MOJO_RESULT_OK, | 274 EXPECT_EQ(MOJO_RESULT_OK, |
284 wait_set->GetReadyDispatchers(MakeUserPointer(&count), | 275 wait_set->GetReadyDispatchers(&count, |
285 &dispatchers_vector, | 276 &dispatchers_vector, |
286 MakeUserPointer(results), | 277 results, |
287 MakeUserPointer<uintptr_t>(nullptr))); | 278 nullptr)); |
288 EXPECT_EQ(3u, count); | 279 EXPECT_EQ(3u, count); |
289 std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); | 280 std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); |
290 EXPECT_EQ(expected_dispatchers, dispatchers_vector); | 281 EXPECT_EQ(expected_dispatchers, dispatchers_vector); |
291 | 282 |
292 // Remove one. It shouldn't be returned any longer. | 283 // Remove one. It shouldn't be returned any longer. |
293 ASSERT_EQ(MOJO_RESULT_OK, | 284 ASSERT_EQ(MOJO_RESULT_OK, |
294 wait_set->RemoveWaitingDispatcher(expected_dispatchers.back())); | 285 wait_set->RemoveWaitingDispatcher(expected_dispatchers.back())); |
295 expected_dispatchers.pop_back(); | 286 expected_dispatchers.pop_back(); |
296 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 287 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
297 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); | 288 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
298 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 289 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
299 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 290 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
300 count = 4; | 291 count = 4; |
301 dispatchers_vector.clear(); | 292 dispatchers_vector.clear(); |
302 EXPECT_EQ(MOJO_RESULT_OK, | 293 EXPECT_EQ(MOJO_RESULT_OK, |
303 wait_set->GetReadyDispatchers(MakeUserPointer(&count), | 294 wait_set->GetReadyDispatchers(&count, |
304 &dispatchers_vector, | 295 &dispatchers_vector, |
305 MakeUserPointer(results), | 296 results, |
306 MakeUserPointer<uintptr_t>(nullptr))); | 297 nullptr)); |
307 EXPECT_EQ(2u, count); | 298 EXPECT_EQ(2u, count); |
308 std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); | 299 std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); |
309 EXPECT_EQ(expected_dispatchers, dispatchers_vector); | 300 EXPECT_EQ(expected_dispatchers, dispatchers_vector); |
310 | 301 |
311 // Write to |dispatcher1_|, which should make |dispatcher0_| readable. | 302 // Write to |dispatcher1_|, which should make |dispatcher0_| readable. |
312 char buffer[] = "abcd"; | 303 char buffer[] = "abcd"; |
313 w.Init(); | 304 w.Init(); |
314 ASSERT_EQ(MOJO_RESULT_OK, | 305 ASSERT_EQ(MOJO_RESULT_OK, |
315 dispatcher1_->WriteMessage(UserPointer<const void>(buffer), | 306 dispatcher1_->WriteMessage(buffer, sizeof(buffer), nullptr, |
316 sizeof(buffer), nullptr, | 307 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
317 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 308 { |
| 309 Waiter mp_w; |
| 310 mp_w.Init(); |
| 311 // Wait for |dispatcher0_| to be readable. |
| 312 if (dispatcher0_->AddAwakable(&mp_w, MOJO_HANDLE_SIGNAL_READABLE, 0, |
| 313 nullptr) == MOJO_RESULT_OK) { |
| 314 EXPECT_EQ(MOJO_RESULT_OK, mp_w.Wait(MOJO_DEADLINE_INDEFINITE, 0)); |
| 315 dispatcher0_->RemoveAwakable(&mp_w, nullptr); |
| 316 } |
| 317 } |
318 expected_dispatchers.push_back(dispatcher0_); | 318 expected_dispatchers.push_back(dispatcher0_); |
319 std::sort(expected_dispatchers.begin(), expected_dispatchers.end()); | 319 std::sort(expected_dispatchers.begin(), expected_dispatchers.end()); |
320 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 320 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
321 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); | 321 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
322 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 322 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
323 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 323 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
324 count = 4; | 324 count = 4; |
325 dispatchers_vector.clear(); | 325 dispatchers_vector.clear(); |
326 EXPECT_EQ(MOJO_RESULT_OK, | 326 EXPECT_EQ(MOJO_RESULT_OK, |
327 wait_set->GetReadyDispatchers(MakeUserPointer(&count), | 327 wait_set->GetReadyDispatchers(&count, |
328 &dispatchers_vector, | 328 &dispatchers_vector, |
329 MakeUserPointer(results), | 329 results, |
330 MakeUserPointer<uintptr_t>(nullptr))); | 330 nullptr)); |
331 EXPECT_EQ(3u, count); | 331 EXPECT_EQ(3u, count); |
332 std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); | 332 std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); |
333 EXPECT_EQ(expected_dispatchers, dispatchers_vector); | 333 EXPECT_EQ(expected_dispatchers, dispatchers_vector); |
334 } | 334 } |
335 | 335 |
336 TEST_F(WaitSetDispatcherTest, InvalidParams) { | 336 TEST_F(WaitSetDispatcherTest, InvalidParams) { |
337 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); | 337 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); |
338 | 338 |
339 // Can't add a wait set to itself. | 339 // Can't add a wait set to itself. |
340 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 340 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 Waiter w; | 387 Waiter w; |
388 w.Init(); | 388 w.Init(); |
389 HandleSignalsState hss; | 389 HandleSignalsState hss; |
390 // A dispatcher that was added and then closed will be cancelled. | 390 // A dispatcher that was added and then closed will be cancelled. |
391 ASSERT_EQ(MOJO_RESULT_OK, | 391 ASSERT_EQ(MOJO_RESULT_OK, |
392 wait_set->AddWaitingDispatcher(dispatcher0_, | 392 wait_set->AddWaitingDispatcher(dispatcher0_, |
393 MOJO_HANDLE_SIGNAL_READABLE, 0)); | 393 MOJO_HANDLE_SIGNAL_READABLE, 0)); |
394 EXPECT_EQ(MOJO_RESULT_OK, | 394 EXPECT_EQ(MOJO_RESULT_OK, |
395 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); | 395 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
396 dispatcher0_->Close(); | 396 dispatcher0_->Close(); |
397 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, nullptr)); | 397 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); |
398 EXPECT_TRUE(wait_set->GetHandleSignalsState().satisfies( | 398 EXPECT_TRUE( |
399 MOJO_HANDLE_SIGNAL_READABLE)); | 399 wait_set->GetHandleSignalsState().satisfies(MOJO_HANDLE_SIGNAL_READABLE)); |
400 scoped_refptr<Dispatcher> woken_dispatcher; | 400 scoped_refptr<Dispatcher> woken_dispatcher; |
401 EXPECT_EQ(MOJO_RESULT_CANCELLED, | 401 EXPECT_EQ(MOJO_RESULT_CANCELLED, |
402 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); | 402 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
403 EXPECT_EQ(dispatcher0_, woken_dispatcher); | 403 EXPECT_EQ(dispatcher0_, woken_dispatcher); |
404 | 404 |
405 // Dispatcher will be implicitly removed because it may be impossible to | 405 // Dispatcher will be implicitly removed because it may be impossible to |
406 // remove explicitly. | 406 // remove explicitly. |
407 woken_dispatcher = nullptr; | 407 woken_dispatcher = nullptr; |
408 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 408 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
409 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); | 409 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
410 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, | 410 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, |
411 wait_set->RemoveWaitingDispatcher(dispatcher0_)); | 411 wait_set->RemoveWaitingDispatcher(dispatcher0_)); |
412 | 412 |
413 // A dispatcher that's not satisfiable should give an error. | 413 // A dispatcher that's not satisfiable should give an error. |
414 w.Init(); | 414 w.Init(); |
415 EXPECT_EQ(MOJO_RESULT_OK, | 415 EXPECT_EQ(MOJO_RESULT_OK, |
416 wait_set->AddWaitingDispatcher(dispatcher1_, | 416 wait_set->AddWaitingDispatcher(dispatcher1_, |
417 MOJO_HANDLE_SIGNAL_READABLE, 0)); | 417 MOJO_HANDLE_SIGNAL_READABLE, 0)); |
418 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, nullptr)); | 418 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); |
419 EXPECT_TRUE(wait_set->GetHandleSignalsState().satisfies( | 419 EXPECT_TRUE( |
420 MOJO_HANDLE_SIGNAL_READABLE)); | 420 wait_set->GetHandleSignalsState().satisfies(MOJO_HANDLE_SIGNAL_READABLE)); |
421 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 421 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
422 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); | 422 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
423 EXPECT_EQ(dispatcher1_, woken_dispatcher); | 423 EXPECT_EQ(dispatcher1_, woken_dispatcher); |
424 | 424 |
425 wait_set->RemoveAwakable(&w, nullptr); | 425 wait_set->RemoveAwakable(&w, nullptr); |
426 } | 426 } |
427 | 427 |
428 TEST_F(WaitSetDispatcherTest, NestedSets) { | 428 TEST_F(WaitSetDispatcherTest, NestedSets) { |
429 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); | 429 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); |
430 CloseOnShutdown(wait_set); | 430 CloseOnShutdown(wait_set); |
(...skipping 17 matching lines...) Expand all Loading... |
448 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, nullptr)); | 448 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, nullptr)); |
449 scoped_refptr<Dispatcher> woken_dispatcher; | 449 scoped_refptr<Dispatcher> woken_dispatcher; |
450 EXPECT_EQ(MOJO_RESULT_OK, | 450 EXPECT_EQ(MOJO_RESULT_OK, |
451 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); | 451 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
452 EXPECT_EQ(nested_wait_set, woken_dispatcher); | 452 EXPECT_EQ(nested_wait_set, woken_dispatcher); |
453 | 453 |
454 wait_set->RemoveAwakable(&w, nullptr); | 454 wait_set->RemoveAwakable(&w, nullptr); |
455 } | 455 } |
456 | 456 |
457 } // namespace | 457 } // namespace |
458 } // namespace system | 458 } // namespace edk |
459 } // namespace mojo | 459 } // namespace mojo |
OLD | NEW |