OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 // NOTE(vtl): Some of these tests are inherently flaky (e.g., if run on a | 5 // NOTE(vtl): Some of these tests are inherently flaky (e.g., if run on a |
6 // heavily-loaded system). Sorry. |test::EpsilonTimeout()| may be increased to | 6 // heavily-loaded system). Sorry. |test::EpsilonTimeout()| may be increased to |
7 // increase tolerance and reduce observed flakiness (though doing so reduces the | 7 // increase tolerance and reduce observed flakiness (though doing so reduces the |
8 // meaningfulness of the test). | 8 // meaningfulness of the test). |
9 | 9 |
10 #include "mojo/system/message_pipe_dispatcher.h" | 10 #include "mojo/system/message_pipe_dispatcher.h" |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); | 58 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); |
59 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 59 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
60 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 60 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
61 hss.satisfiable_signals); | 61 hss.satisfiable_signals); |
62 // Shouldn't need to remove the waiter (it was not added). | 62 // Shouldn't need to remove the waiter (it was not added). |
63 | 63 |
64 // Add a readable waiter to |d0|, then make it readable (by writing to | 64 // Add a readable waiter to |d0|, then make it readable (by writing to |
65 // |d1|), then wait. | 65 // |d1|), then wait. |
66 w.Init(); | 66 w.Init(); |
67 ASSERT_EQ(MOJO_RESULT_OK, | 67 ASSERT_EQ(MOJO_RESULT_OK, |
68 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, NULL)); | 68 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); |
69 buffer[0] = 123456789; | 69 buffer[0] = 123456789; |
70 EXPECT_EQ(MOJO_RESULT_OK, | 70 EXPECT_EQ(MOJO_RESULT_OK, |
71 d1->WriteMessage(UserPointer<const void>(buffer), | 71 d1->WriteMessage(UserPointer<const void>(buffer), |
72 kBufferSize, | 72 kBufferSize, |
73 NULL, | 73 nullptr, |
74 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 74 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
75 stopwatch.Start(); | 75 stopwatch.Start(); |
76 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 76 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
77 EXPECT_EQ(1u, context); | 77 EXPECT_EQ(1u, context); |
78 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 78 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
79 hss = HandleSignalsState(); | 79 hss = HandleSignalsState(); |
80 d0->RemoveWaiter(&w, &hss); | 80 d0->RemoveWaiter(&w, &hss); |
81 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 81 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
82 hss.satisfied_signals); | 82 hss.satisfied_signals); |
83 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 83 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
(...skipping 10 matching lines...) Expand all Loading... |
94 hss.satisfiable_signals); | 94 hss.satisfiable_signals); |
95 // Shouldn't need to remove the waiter (it was not added). | 95 // Shouldn't need to remove the waiter (it was not added). |
96 | 96 |
97 // Make |d0| no longer readable (by reading from it). | 97 // Make |d0| no longer readable (by reading from it). |
98 buffer[0] = 0; | 98 buffer[0] = 0; |
99 buffer_size = kBufferSize; | 99 buffer_size = kBufferSize; |
100 EXPECT_EQ(MOJO_RESULT_OK, | 100 EXPECT_EQ(MOJO_RESULT_OK, |
101 d0->ReadMessage(UserPointer<void>(buffer), | 101 d0->ReadMessage(UserPointer<void>(buffer), |
102 MakeUserPointer(&buffer_size), | 102 MakeUserPointer(&buffer_size), |
103 0, | 103 0, |
104 NULL, | 104 nullptr, |
105 MOJO_READ_MESSAGE_FLAG_NONE)); | 105 MOJO_READ_MESSAGE_FLAG_NONE)); |
106 EXPECT_EQ(kBufferSize, buffer_size); | 106 EXPECT_EQ(kBufferSize, buffer_size); |
107 EXPECT_EQ(123456789, buffer[0]); | 107 EXPECT_EQ(123456789, buffer[0]); |
108 | 108 |
109 // Wait for zero time for readability on |d0| (will time out). | 109 // Wait for zero time for readability on |d0| (will time out). |
110 w.Init(); | 110 w.Init(); |
111 ASSERT_EQ(MOJO_RESULT_OK, | 111 ASSERT_EQ(MOJO_RESULT_OK, |
112 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, NULL)); | 112 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); |
113 stopwatch.Start(); | 113 stopwatch.Start(); |
114 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, NULL)); | 114 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); |
115 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 115 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
116 hss = HandleSignalsState(); | 116 hss = HandleSignalsState(); |
117 d0->RemoveWaiter(&w, &hss); | 117 d0->RemoveWaiter(&w, &hss); |
118 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 118 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
119 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 119 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
120 hss.satisfiable_signals); | 120 hss.satisfiable_signals); |
121 | 121 |
122 // Wait for non-zero, finite time for readability on |d0| (will time out). | 122 // Wait for non-zero, finite time for readability on |d0| (will time out). |
123 w.Init(); | 123 w.Init(); |
124 ASSERT_EQ(MOJO_RESULT_OK, | 124 ASSERT_EQ(MOJO_RESULT_OK, |
125 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, NULL)); | 125 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); |
126 stopwatch.Start(); | 126 stopwatch.Start(); |
127 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 127 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
128 w.Wait(2 * test::EpsilonTimeout().InMicroseconds(), NULL)); | 128 w.Wait(2 * test::EpsilonTimeout().InMicroseconds(), nullptr)); |
129 base::TimeDelta elapsed = stopwatch.Elapsed(); | 129 base::TimeDelta elapsed = stopwatch.Elapsed(); |
130 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); | 130 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); |
131 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); | 131 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); |
132 hss = HandleSignalsState(); | 132 hss = HandleSignalsState(); |
133 d0->RemoveWaiter(&w, &hss); | 133 d0->RemoveWaiter(&w, &hss); |
134 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 134 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
135 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 135 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
136 hss.satisfiable_signals); | 136 hss.satisfiable_signals); |
137 | 137 |
138 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); | 138 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
(...skipping 12 matching lines...) Expand all Loading... |
151 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal()); | 151 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal()); |
152 d0->Init(mp, 0); | 152 d0->Init(mp, 0); |
153 d1->Init(mp, 1); | 153 d1->Init(mp, 1); |
154 } | 154 } |
155 | 155 |
156 // |WriteMessage|: | 156 // |WriteMessage|: |
157 // Huge buffer size. | 157 // Huge buffer size. |
158 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 158 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
159 d0->WriteMessage(UserPointer<const void>(buffer), | 159 d0->WriteMessage(UserPointer<const void>(buffer), |
160 std::numeric_limits<uint32_t>::max(), | 160 std::numeric_limits<uint32_t>::max(), |
161 NULL, | 161 nullptr, |
162 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 162 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
163 | 163 |
164 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); | 164 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
165 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 165 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
166 } | 166 } |
167 | 167 |
168 // These test invalid arguments that should cause death if we're being paranoid | 168 // These test invalid arguments that should cause death if we're being paranoid |
169 // about checking arguments (which we would want to do if, e.g., we were in a | 169 // about checking arguments (which we would want to do if, e.g., we were in a |
170 // true "kernel" situation, but we might not want to do otherwise for | 170 // true "kernel" situation, but we might not want to do otherwise for |
171 // performance reasons). Probably blatant errors like passing in null pointers | 171 // performance reasons). Probably blatant errors like passing in null pointers |
172 // (for required pointer arguments) will still cause death, but perhaps not | 172 // (for required pointer arguments) will still cause death, but perhaps not |
173 // predictably. | 173 // predictably. |
174 TEST(MessagePipeDispatcherTest, InvalidParamsDeath) { | 174 TEST(MessagePipeDispatcherTest, InvalidParamsDeath) { |
175 const char kMemoryCheckFailedRegex[] = "Check failed"; | 175 const char kMemoryCheckFailedRegex[] = "Check failed"; |
176 | 176 |
177 scoped_refptr<MessagePipeDispatcher> d0( | 177 scoped_refptr<MessagePipeDispatcher> d0( |
178 new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions)); | 178 new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions)); |
179 scoped_refptr<MessagePipeDispatcher> d1( | 179 scoped_refptr<MessagePipeDispatcher> d1( |
180 new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions)); | 180 new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions)); |
181 { | 181 { |
182 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal()); | 182 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal()); |
183 d0->Init(mp, 0); | 183 d0->Init(mp, 0); |
184 d1->Init(mp, 1); | 184 d1->Init(mp, 1); |
185 } | 185 } |
186 | 186 |
187 // |WriteMessage|: | 187 // |WriteMessage|: |
188 // Null buffer with nonzero buffer size. | 188 // Null buffer with nonzero buffer size. |
189 EXPECT_DEATH_IF_SUPPORTED( | 189 EXPECT_DEATH_IF_SUPPORTED( |
190 d0->WriteMessage( | 190 d0->WriteMessage( |
191 NullUserPointer(), 1, NULL, MOJO_WRITE_MESSAGE_FLAG_NONE), | 191 NullUserPointer(), 1, nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE), |
192 kMemoryCheckFailedRegex); | 192 kMemoryCheckFailedRegex); |
193 | 193 |
194 // |ReadMessage|: | 194 // |ReadMessage|: |
195 // Null buffer with nonzero buffer size. | 195 // Null buffer with nonzero buffer size. |
196 // First write something so that we actually have something to read. | 196 // First write something so that we actually have something to read. |
197 EXPECT_EQ( | 197 EXPECT_EQ(MOJO_RESULT_OK, |
198 MOJO_RESULT_OK, | 198 d1->WriteMessage(UserPointer<const void>("x"), |
199 d1->WriteMessage( | 199 1, |
200 UserPointer<const void>("x"), 1, NULL, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 200 nullptr, |
| 201 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
201 uint32_t buffer_size = 1; | 202 uint32_t buffer_size = 1; |
202 EXPECT_DEATH_IF_SUPPORTED(d0->ReadMessage(NullUserPointer(), | 203 EXPECT_DEATH_IF_SUPPORTED(d0->ReadMessage(NullUserPointer(), |
203 MakeUserPointer(&buffer_size), | 204 MakeUserPointer(&buffer_size), |
204 0, | 205 0, |
205 NULL, | 206 nullptr, |
206 MOJO_READ_MESSAGE_FLAG_NONE), | 207 MOJO_READ_MESSAGE_FLAG_NONE), |
207 kMemoryCheckFailedRegex); | 208 kMemoryCheckFailedRegex); |
208 | 209 |
209 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); | 210 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
210 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 211 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
211 } | 212 } |
212 | 213 |
213 // Test what happens when one end is closed (single-threaded test). | 214 // Test what happens when one end is closed (single-threaded test). |
214 TEST(MessagePipeDispatcherTest, BasicClosed) { | 215 TEST(MessagePipeDispatcherTest, BasicClosed) { |
215 int32_t buffer[1]; | 216 int32_t buffer[1]; |
(...skipping 12 matching lines...) Expand all Loading... |
228 d1->Init(mp, i ^ 1); // 1, 0. | 229 d1->Init(mp, i ^ 1); // 1, 0. |
229 } | 230 } |
230 Waiter w; | 231 Waiter w; |
231 HandleSignalsState hss; | 232 HandleSignalsState hss; |
232 | 233 |
233 // Write (twice) to |d1|. | 234 // Write (twice) to |d1|. |
234 buffer[0] = 123456789; | 235 buffer[0] = 123456789; |
235 EXPECT_EQ(MOJO_RESULT_OK, | 236 EXPECT_EQ(MOJO_RESULT_OK, |
236 d1->WriteMessage(UserPointer<const void>(buffer), | 237 d1->WriteMessage(UserPointer<const void>(buffer), |
237 kBufferSize, | 238 kBufferSize, |
238 NULL, | 239 nullptr, |
239 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 240 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
240 buffer[0] = 234567890; | 241 buffer[0] = 234567890; |
241 EXPECT_EQ(MOJO_RESULT_OK, | 242 EXPECT_EQ(MOJO_RESULT_OK, |
242 d1->WriteMessage(UserPointer<const void>(buffer), | 243 d1->WriteMessage(UserPointer<const void>(buffer), |
243 kBufferSize, | 244 kBufferSize, |
244 NULL, | 245 nullptr, |
245 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 246 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
246 | 247 |
247 // Try waiting for readable on |d0|; should fail (already satisfied). | 248 // Try waiting for readable on |d0|; should fail (already satisfied). |
248 w.Init(); | 249 w.Init(); |
249 hss = HandleSignalsState(); | 250 hss = HandleSignalsState(); |
250 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 251 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
251 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); | 252 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
252 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 253 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
253 hss.satisfied_signals); | 254 hss.satisfied_signals); |
254 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 255 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
255 hss.satisfiable_signals); | 256 hss.satisfiable_signals); |
256 | 257 |
257 // Try reading from |d1|; should fail (nothing to read). | 258 // Try reading from |d1|; should fail (nothing to read). |
258 buffer[0] = 0; | 259 buffer[0] = 0; |
259 buffer_size = kBufferSize; | 260 buffer_size = kBufferSize; |
260 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 261 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
261 d1->ReadMessage(UserPointer<void>(buffer), | 262 d1->ReadMessage(UserPointer<void>(buffer), |
262 MakeUserPointer(&buffer_size), | 263 MakeUserPointer(&buffer_size), |
263 0, | 264 0, |
264 NULL, | 265 nullptr, |
265 MOJO_READ_MESSAGE_FLAG_NONE)); | 266 MOJO_READ_MESSAGE_FLAG_NONE)); |
266 | 267 |
267 // Close |d1|. | 268 // Close |d1|. |
268 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 269 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
269 | 270 |
270 // Try waiting for readable on |d0|; should fail (already satisfied). | 271 // Try waiting for readable on |d0|; should fail (already satisfied). |
271 w.Init(); | 272 w.Init(); |
272 hss = HandleSignalsState(); | 273 hss = HandleSignalsState(); |
273 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 274 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
274 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, &hss)); | 275 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, &hss)); |
275 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 276 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
276 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 277 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
277 | 278 |
278 // Read from |d0|. | 279 // Read from |d0|. |
279 buffer[0] = 0; | 280 buffer[0] = 0; |
280 buffer_size = kBufferSize; | 281 buffer_size = kBufferSize; |
281 EXPECT_EQ(MOJO_RESULT_OK, | 282 EXPECT_EQ(MOJO_RESULT_OK, |
282 d0->ReadMessage(UserPointer<void>(buffer), | 283 d0->ReadMessage(UserPointer<void>(buffer), |
283 MakeUserPointer(&buffer_size), | 284 MakeUserPointer(&buffer_size), |
284 0, | 285 0, |
285 NULL, | 286 nullptr, |
286 MOJO_READ_MESSAGE_FLAG_NONE)); | 287 MOJO_READ_MESSAGE_FLAG_NONE)); |
287 EXPECT_EQ(kBufferSize, buffer_size); | 288 EXPECT_EQ(kBufferSize, buffer_size); |
288 EXPECT_EQ(123456789, buffer[0]); | 289 EXPECT_EQ(123456789, buffer[0]); |
289 | 290 |
290 // Try waiting for readable on |d0|; should fail (already satisfied). | 291 // Try waiting for readable on |d0|; should fail (already satisfied). |
291 w.Init(); | 292 w.Init(); |
292 hss = HandleSignalsState(); | 293 hss = HandleSignalsState(); |
293 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 294 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
294 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss)); | 295 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss)); |
295 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 296 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
296 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 297 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
297 | 298 |
298 // Read again from |d0|. | 299 // Read again from |d0|. |
299 buffer[0] = 0; | 300 buffer[0] = 0; |
300 buffer_size = kBufferSize; | 301 buffer_size = kBufferSize; |
301 EXPECT_EQ(MOJO_RESULT_OK, | 302 EXPECT_EQ(MOJO_RESULT_OK, |
302 d0->ReadMessage(UserPointer<void>(buffer), | 303 d0->ReadMessage(UserPointer<void>(buffer), |
303 MakeUserPointer(&buffer_size), | 304 MakeUserPointer(&buffer_size), |
304 0, | 305 0, |
305 NULL, | 306 nullptr, |
306 MOJO_READ_MESSAGE_FLAG_NONE)); | 307 MOJO_READ_MESSAGE_FLAG_NONE)); |
307 EXPECT_EQ(kBufferSize, buffer_size); | 308 EXPECT_EQ(kBufferSize, buffer_size); |
308 EXPECT_EQ(234567890, buffer[0]); | 309 EXPECT_EQ(234567890, buffer[0]); |
309 | 310 |
310 // Try waiting for readable on |d0|; should fail (unsatisfiable). | 311 // Try waiting for readable on |d0|; should fail (unsatisfiable). |
311 w.Init(); | 312 w.Init(); |
312 hss = HandleSignalsState(); | 313 hss = HandleSignalsState(); |
313 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 314 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
314 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss)); | 315 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss)); |
315 EXPECT_EQ(0u, hss.satisfied_signals); | 316 EXPECT_EQ(0u, hss.satisfied_signals); |
316 EXPECT_EQ(0u, hss.satisfiable_signals); | 317 EXPECT_EQ(0u, hss.satisfiable_signals); |
317 | 318 |
318 // Try waiting for writable on |d0|; should fail (unsatisfiable). | 319 // Try waiting for writable on |d0|; should fail (unsatisfiable). |
319 w.Init(); | 320 w.Init(); |
320 hss = HandleSignalsState(); | 321 hss = HandleSignalsState(); |
321 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 322 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
322 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss)); | 323 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss)); |
323 EXPECT_EQ(0u, hss.satisfied_signals); | 324 EXPECT_EQ(0u, hss.satisfied_signals); |
324 EXPECT_EQ(0u, hss.satisfiable_signals); | 325 EXPECT_EQ(0u, hss.satisfiable_signals); |
325 | 326 |
326 // Try reading from |d0|; should fail (nothing to read and other end | 327 // Try reading from |d0|; should fail (nothing to read and other end |
327 // closed). | 328 // closed). |
328 buffer[0] = 0; | 329 buffer[0] = 0; |
329 buffer_size = kBufferSize; | 330 buffer_size = kBufferSize; |
330 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 331 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
331 d0->ReadMessage(UserPointer<void>(buffer), | 332 d0->ReadMessage(UserPointer<void>(buffer), |
332 MakeUserPointer(&buffer_size), | 333 MakeUserPointer(&buffer_size), |
333 0, | 334 0, |
334 NULL, | 335 nullptr, |
335 MOJO_READ_MESSAGE_FLAG_NONE)); | 336 MOJO_READ_MESSAGE_FLAG_NONE)); |
336 | 337 |
337 // Try writing to |d0|; should fail (other end closed). | 338 // Try writing to |d0|; should fail (other end closed). |
338 buffer[0] = 345678901; | 339 buffer[0] = 345678901; |
339 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 340 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
340 d0->WriteMessage(UserPointer<const void>(buffer), | 341 d0->WriteMessage(UserPointer<const void>(buffer), |
341 kBufferSize, | 342 kBufferSize, |
342 NULL, | 343 nullptr, |
343 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 344 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
344 | 345 |
345 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); | 346 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
346 } | 347 } |
347 } | 348 } |
348 | 349 |
349 #if defined(OS_WIN) | 350 #if defined(OS_WIN) |
350 // http://crbug.com/396386 | 351 // http://crbug.com/396386 |
351 #define MAYBE_BasicThreaded DISABLED_BasicThreaded | 352 #define MAYBE_BasicThreaded DISABLED_BasicThreaded |
352 #else | 353 #else |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 &context, | 387 &context, |
387 &hss); | 388 &hss); |
388 stopwatch.Start(); | 389 stopwatch.Start(); |
389 thread.Start(); | 390 thread.Start(); |
390 base::PlatformThread::Sleep(2 * test::EpsilonTimeout()); | 391 base::PlatformThread::Sleep(2 * test::EpsilonTimeout()); |
391 // Wake it up by writing to |d0|. | 392 // Wake it up by writing to |d0|. |
392 buffer[0] = 123456789; | 393 buffer[0] = 123456789; |
393 EXPECT_EQ(MOJO_RESULT_OK, | 394 EXPECT_EQ(MOJO_RESULT_OK, |
394 d0->WriteMessage(UserPointer<const void>(buffer), | 395 d0->WriteMessage(UserPointer<const void>(buffer), |
395 kBufferSize, | 396 kBufferSize, |
396 NULL, | 397 nullptr, |
397 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 398 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
398 } // Joins the thread. | 399 } // Joins the thread. |
399 elapsed = stopwatch.Elapsed(); | 400 elapsed = stopwatch.Elapsed(); |
400 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); | 401 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); |
401 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); | 402 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); |
402 EXPECT_TRUE(did_wait); | 403 EXPECT_TRUE(did_wait); |
403 EXPECT_EQ(MOJO_RESULT_OK, result); | 404 EXPECT_EQ(MOJO_RESULT_OK, result); |
404 EXPECT_EQ(1u, context); | 405 EXPECT_EQ(1u, context); |
405 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 406 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
406 hss.satisfied_signals); | 407 hss.satisfied_signals); |
(...skipping 21 matching lines...) Expand all Loading... |
428 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 429 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
429 hss.satisfiable_signals); | 430 hss.satisfiable_signals); |
430 | 431 |
431 // Consume what we wrote to |d0|. | 432 // Consume what we wrote to |d0|. |
432 buffer[0] = 0; | 433 buffer[0] = 0; |
433 buffer_size = kBufferSize; | 434 buffer_size = kBufferSize; |
434 EXPECT_EQ(MOJO_RESULT_OK, | 435 EXPECT_EQ(MOJO_RESULT_OK, |
435 d1->ReadMessage(UserPointer<void>(buffer), | 436 d1->ReadMessage(UserPointer<void>(buffer), |
436 MakeUserPointer(&buffer_size), | 437 MakeUserPointer(&buffer_size), |
437 0, | 438 0, |
438 NULL, | 439 nullptr, |
439 MOJO_READ_MESSAGE_FLAG_NONE)); | 440 MOJO_READ_MESSAGE_FLAG_NONE)); |
440 EXPECT_EQ(kBufferSize, buffer_size); | 441 EXPECT_EQ(kBufferSize, buffer_size); |
441 EXPECT_EQ(123456789, buffer[0]); | 442 EXPECT_EQ(123456789, buffer[0]); |
442 | 443 |
443 // Wait for readable on |d1| and close |d0| after some time, which should | 444 // Wait for readable on |d1| and close |d0| after some time, which should |
444 // cancel that wait. | 445 // cancel that wait. |
445 { | 446 { |
446 test::WaiterThread thread(d1, | 447 test::WaiterThread thread(d1, |
447 MOJO_HANDLE_SIGNAL_READABLE, | 448 MOJO_HANDLE_SIGNAL_READABLE, |
448 MOJO_DEADLINE_INDEFINITE, | 449 MOJO_DEADLINE_INDEFINITE, |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 // Number of messages to write. | 540 // Number of messages to write. |
540 *messages_written_ = static_cast<size_t>(base::RandInt(1000, 6000)); | 541 *messages_written_ = static_cast<size_t>(base::RandInt(1000, 6000)); |
541 | 542 |
542 // Write messages. | 543 // Write messages. |
543 for (size_t i = 0; i < *messages_written_; i++) { | 544 for (size_t i = 0; i < *messages_written_; i++) { |
544 uint32_t bytes_to_write = static_cast<uint32_t>( | 545 uint32_t bytes_to_write = static_cast<uint32_t>( |
545 base::RandInt(1, static_cast<int>(kMaxMessageSize))); | 546 base::RandInt(1, static_cast<int>(kMaxMessageSize))); |
546 EXPECT_EQ(MOJO_RESULT_OK, | 547 EXPECT_EQ(MOJO_RESULT_OK, |
547 write_dispatcher_->WriteMessage(UserPointer<const void>(buffer), | 548 write_dispatcher_->WriteMessage(UserPointer<const void>(buffer), |
548 bytes_to_write, | 549 bytes_to_write, |
549 NULL, | 550 nullptr, |
550 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 551 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
551 *bytes_written_ += bytes_to_write; | 552 *bytes_written_ += bytes_to_write; |
552 } | 553 } |
553 | 554 |
554 // Write one last "quit" message. | 555 // Write one last "quit" message. |
555 EXPECT_EQ(MOJO_RESULT_OK, | 556 EXPECT_EQ(MOJO_RESULT_OK, |
556 write_dispatcher_->WriteMessage(UserPointer<const void>("quit"), | 557 write_dispatcher_->WriteMessage(UserPointer<const void>("quit"), |
557 4, | 558 4, |
558 NULL, | 559 nullptr, |
559 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 560 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
560 } | 561 } |
561 | 562 |
562 const scoped_refptr<Dispatcher> write_dispatcher_; | 563 const scoped_refptr<Dispatcher> write_dispatcher_; |
563 size_t* const messages_written_; | 564 size_t* const messages_written_; |
564 size_t* const bytes_written_; | 565 size_t* const bytes_written_; |
565 | 566 |
566 DISALLOW_COPY_AND_ASSIGN(WriterThread); | 567 DISALLOW_COPY_AND_ASSIGN(WriterThread); |
567 }; | 568 }; |
568 | 569 |
(...skipping 25 matching lines...) Expand all Loading... |
594 // Wait for it to be readable. | 595 // Wait for it to be readable. |
595 w.Init(); | 596 w.Init(); |
596 hss = HandleSignalsState(); | 597 hss = HandleSignalsState(); |
597 result = | 598 result = |
598 read_dispatcher_->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss); | 599 read_dispatcher_->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss); |
599 EXPECT_TRUE(result == MOJO_RESULT_OK || | 600 EXPECT_TRUE(result == MOJO_RESULT_OK || |
600 result == MOJO_RESULT_ALREADY_EXISTS) | 601 result == MOJO_RESULT_ALREADY_EXISTS) |
601 << "result: " << result; | 602 << "result: " << result; |
602 if (result == MOJO_RESULT_OK) { | 603 if (result == MOJO_RESULT_OK) { |
603 // Actually need to wait. | 604 // Actually need to wait. |
604 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, NULL)); | 605 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); |
605 read_dispatcher_->RemoveWaiter(&w, &hss); | 606 read_dispatcher_->RemoveWaiter(&w, &hss); |
606 } | 607 } |
607 // We may not actually be readable, since we're racing with other threads. | 608 // We may not actually be readable, since we're racing with other threads. |
608 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 609 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
609 | 610 |
610 // Now, try to do the read. | 611 // Now, try to do the read. |
611 // Clear the buffer so that we can check the result. | 612 // Clear the buffer so that we can check the result. |
612 memset(buffer, 0, sizeof(buffer)); | 613 memset(buffer, 0, sizeof(buffer)); |
613 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 614 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
614 result = read_dispatcher_->ReadMessage(UserPointer<void>(buffer), | 615 result = read_dispatcher_->ReadMessage(UserPointer<void>(buffer), |
615 MakeUserPointer(&buffer_size), | 616 MakeUserPointer(&buffer_size), |
616 0, | 617 0, |
617 NULL, | 618 nullptr, |
618 MOJO_READ_MESSAGE_FLAG_NONE); | 619 MOJO_READ_MESSAGE_FLAG_NONE); |
619 EXPECT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT) | 620 EXPECT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT) |
620 << "result: " << result; | 621 << "result: " << result; |
621 // We're racing with others to read, so maybe we failed. | 622 // We're racing with others to read, so maybe we failed. |
622 if (result == MOJO_RESULT_SHOULD_WAIT) | 623 if (result == MOJO_RESULT_SHOULD_WAIT) |
623 continue; // In which case, try again. | 624 continue; // In which case, try again. |
624 // Check for quit. | 625 // Check for quit. |
625 if (buffer_size == 4 && memcmp("quit", buffer, 4) == 0) | 626 if (buffer_size == 4 && memcmp("quit", buffer, 4) == 0) |
626 return; | 627 return; |
627 EXPECT_GE(buffer_size, 1u); | 628 EXPECT_GE(buffer_size, 1u); |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 EXPECT_EQ(total_messages_written, total_messages_read); | 720 EXPECT_EQ(total_messages_written, total_messages_read); |
720 EXPECT_EQ(total_bytes_written, total_bytes_read); | 721 EXPECT_EQ(total_bytes_written, total_bytes_read); |
721 | 722 |
722 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); | 723 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); |
723 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); | 724 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); |
724 } | 725 } |
725 | 726 |
726 } // namespace | 727 } // namespace |
727 } // namespace system | 728 } // namespace system |
728 } // namespace mojo | 729 } // namespace mojo |
OLD | NEW |