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 #include "mojo/system/core.h" | 5 #include "mojo/system/core.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <limits> | 9 #include <limits> |
10 | 10 |
11 #include "base/threading/platform_thread.h" | 11 #include "base/threading/platform_thread.h" |
12 #include "base/time/time.h" | 12 #include "base/time/time.h" |
13 #include "mojo/system/core_test_base.h" | 13 #include "mojo/system/core_test_base.h" |
14 | 14 |
15 namespace mojo { | 15 namespace mojo { |
16 namespace system { | 16 namespace system { |
17 namespace { | 17 namespace { |
18 | 18 |
| 19 const MojoHandleSignalsState kEmptyMojoHandleSignalsState = {0u, 0u}; |
| 20 const MojoHandleSignalsState kFullMojoHandleSignalsState = {~0u, ~0u}; |
| 21 |
19 typedef test::CoreTestBase CoreTest; | 22 typedef test::CoreTestBase CoreTest; |
20 | 23 |
21 TEST_F(CoreTest, GetTimeTicksNow) { | 24 TEST_F(CoreTest, GetTimeTicksNow) { |
22 const MojoTimeTicks start = core()->GetTimeTicksNow(); | 25 const MojoTimeTicks start = core()->GetTimeTicksNow(); |
23 EXPECT_NE(static_cast<MojoTimeTicks>(0), start) | 26 EXPECT_NE(static_cast<MojoTimeTicks>(0), start) |
24 << "GetTimeTicksNow should return nonzero value"; | 27 << "GetTimeTicksNow should return nonzero value"; |
25 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(15)); | 28 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(15)); |
26 const MojoTimeTicks finish = core()->GetTimeTicksNow(); | 29 const MojoTimeTicks finish = core()->GetTimeTicksNow(); |
27 // Allow for some fuzz in sleep. | 30 // Allow for some fuzz in sleep. |
28 EXPECT_GE((finish - start), static_cast<MojoTimeTicks>(8000)) | 31 EXPECT_GE((finish - start), static_cast<MojoTimeTicks>(8000)) |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 MOJO_RESULT_UNIMPLEMENTED, | 99 MOJO_RESULT_UNIMPLEMENTED, |
97 core()->BeginReadData( | 100 core()->BeginReadData( |
98 h, NullUserPointer(), NullUserPointer(), MOJO_READ_DATA_FLAG_NONE)); | 101 h, NullUserPointer(), NullUserPointer(), MOJO_READ_DATA_FLAG_NONE)); |
99 EXPECT_EQ(1u, info.GetBeginReadDataCallCount()); | 102 EXPECT_EQ(1u, info.GetBeginReadDataCallCount()); |
100 | 103 |
101 EXPECT_EQ(0u, info.GetEndReadDataCallCount()); | 104 EXPECT_EQ(0u, info.GetEndReadDataCallCount()); |
102 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndReadData(h, 0)); | 105 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndReadData(h, 0)); |
103 EXPECT_EQ(1u, info.GetEndReadDataCallCount()); | 106 EXPECT_EQ(1u, info.GetEndReadDataCallCount()); |
104 | 107 |
105 EXPECT_EQ(0u, info.GetAddWaiterCallCount()); | 108 EXPECT_EQ(0u, info.GetAddWaiterCallCount()); |
| 109 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 110 core()->Wait(h, |
| 111 ~MOJO_HANDLE_SIGNAL_NONE, |
| 112 MOJO_DEADLINE_INDEFINITE, |
| 113 NullUserPointer())); |
| 114 EXPECT_EQ(1u, info.GetAddWaiterCallCount()); |
| 115 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 116 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 0, NullUserPointer())); |
| 117 EXPECT_EQ(2u, info.GetAddWaiterCallCount()); |
| 118 MojoHandleSignalsState hss = kFullMojoHandleSignalsState; |
| 119 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 120 core()->Wait(h, |
| 121 ~MOJO_HANDLE_SIGNAL_NONE, |
| 122 MOJO_DEADLINE_INDEFINITE, |
| 123 MakeUserPointer(&hss))); |
| 124 EXPECT_EQ(3u, info.GetAddWaiterCallCount()); |
| 125 EXPECT_EQ(0u, hss.satisfied_signals); |
| 126 EXPECT_EQ(0u, hss.satisfiable_signals); |
106 EXPECT_EQ( | 127 EXPECT_EQ( |
107 MOJO_RESULT_FAILED_PRECONDITION, | 128 MOJO_RESULT_FAILED_PRECONDITION, |
108 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE)); | 129 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000, NullUserPointer())); |
109 EXPECT_EQ(1u, info.GetAddWaiterCallCount()); | 130 EXPECT_EQ(4u, info.GetAddWaiterCallCount()); |
| 131 hss = kFullMojoHandleSignalsState; |
110 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 132 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
111 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 0)); | 133 core()->Wait( |
112 EXPECT_EQ(2u, info.GetAddWaiterCallCount()); | 134 h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000, MakeUserPointer(&hss))); |
113 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 135 EXPECT_EQ(5u, info.GetAddWaiterCallCount()); |
114 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000)); | 136 EXPECT_EQ(0u, hss.satisfied_signals); |
115 EXPECT_EQ(3u, info.GetAddWaiterCallCount()); | 137 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 138 |
116 MojoHandleSignals handle_signals = ~MOJO_HANDLE_SIGNAL_NONE; | 139 MojoHandleSignals handle_signals = ~MOJO_HANDLE_SIGNAL_NONE; |
117 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 140 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
118 core()->WaitMany(MakeUserPointer(&h), | 141 core()->WaitMany(MakeUserPointer(&h), |
119 MakeUserPointer(&handle_signals), | 142 MakeUserPointer(&handle_signals), |
120 1, | 143 1, |
121 MOJO_DEADLINE_INDEFINITE)); | 144 MOJO_DEADLINE_INDEFINITE, |
122 EXPECT_EQ(4u, info.GetAddWaiterCallCount()); | 145 NullUserPointer(), |
| 146 NullUserPointer())); |
| 147 EXPECT_EQ(6u, info.GetAddWaiterCallCount()); |
| 148 uint32_t result_index = static_cast<uint32_t>(-1); |
| 149 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 150 core()->WaitMany(MakeUserPointer(&h), |
| 151 MakeUserPointer(&handle_signals), |
| 152 1, |
| 153 MOJO_DEADLINE_INDEFINITE, |
| 154 MakeUserPointer(&result_index), |
| 155 NullUserPointer())); |
| 156 EXPECT_EQ(7u, info.GetAddWaiterCallCount()); |
| 157 EXPECT_EQ(0u, result_index); |
| 158 hss = kFullMojoHandleSignalsState; |
| 159 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 160 core()->WaitMany(MakeUserPointer(&h), |
| 161 MakeUserPointer(&handle_signals), |
| 162 1, |
| 163 MOJO_DEADLINE_INDEFINITE, |
| 164 NullUserPointer(), |
| 165 MakeUserPointer(&hss))); |
| 166 EXPECT_EQ(8u, info.GetAddWaiterCallCount()); |
| 167 EXPECT_EQ(0u, hss.satisfied_signals); |
| 168 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 169 result_index = static_cast<uint32_t>(-1); |
| 170 hss = kFullMojoHandleSignalsState; |
| 171 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 172 core()->WaitMany(MakeUserPointer(&h), |
| 173 MakeUserPointer(&handle_signals), |
| 174 1, |
| 175 MOJO_DEADLINE_INDEFINITE, |
| 176 MakeUserPointer(&result_index), |
| 177 MakeUserPointer(&hss))); |
| 178 EXPECT_EQ(9u, info.GetAddWaiterCallCount()); |
| 179 EXPECT_EQ(0u, result_index); |
| 180 EXPECT_EQ(0u, hss.satisfied_signals); |
| 181 EXPECT_EQ(0u, hss.satisfiable_signals); |
123 | 182 |
124 EXPECT_EQ(0u, info.GetDtorCallCount()); | 183 EXPECT_EQ(0u, info.GetDtorCallCount()); |
125 EXPECT_EQ(0u, info.GetCloseCallCount()); | 184 EXPECT_EQ(0u, info.GetCloseCallCount()); |
126 EXPECT_EQ(0u, info.GetCancelAllWaitersCallCount()); | 185 EXPECT_EQ(0u, info.GetCancelAllWaitersCallCount()); |
127 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 186 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
128 EXPECT_EQ(1u, info.GetCancelAllWaitersCallCount()); | 187 EXPECT_EQ(1u, info.GetCancelAllWaitersCallCount()); |
129 EXPECT_EQ(1u, info.GetCloseCallCount()); | 188 EXPECT_EQ(1u, info.GetCloseCallCount()); |
130 EXPECT_EQ(1u, info.GetDtorCallCount()); | 189 EXPECT_EQ(1u, info.GetDtorCallCount()); |
131 | 190 |
132 // No waiters should ever have ever been added. | 191 // No waiters should ever have ever been added. |
(...skipping 14 matching lines...) Expand all Loading... |
147 EXPECT_EQ(1u, info.GetCloseCallCount()); | 206 EXPECT_EQ(1u, info.GetCloseCallCount()); |
148 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h)); | 207 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h)); |
149 EXPECT_EQ(1u, info.GetCloseCallCount()); | 208 EXPECT_EQ(1u, info.GetCloseCallCount()); |
150 } | 209 } |
151 | 210 |
152 // |Wait()|: | 211 // |Wait()|: |
153 { | 212 { |
154 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 213 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
155 core()->Wait(MOJO_HANDLE_INVALID, | 214 core()->Wait(MOJO_HANDLE_INVALID, |
156 ~MOJO_HANDLE_SIGNAL_NONE, | 215 ~MOJO_HANDLE_SIGNAL_NONE, |
157 MOJO_DEADLINE_INDEFINITE)); | 216 MOJO_DEADLINE_INDEFINITE, |
158 EXPECT_EQ( | 217 NullUserPointer())); |
159 MOJO_RESULT_INVALID_ARGUMENT, | 218 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
160 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE)); | 219 core()->Wait(10, |
| 220 ~MOJO_HANDLE_SIGNAL_NONE, |
| 221 MOJO_DEADLINE_INDEFINITE, |
| 222 NullUserPointer())); |
| 223 |
| 224 MojoHandleSignalsState hss = kFullMojoHandleSignalsState; |
| 225 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 226 core()->Wait(MOJO_HANDLE_INVALID, |
| 227 ~MOJO_HANDLE_SIGNAL_NONE, |
| 228 MOJO_DEADLINE_INDEFINITE, |
| 229 MakeUserPointer(&hss))); |
| 230 // On invalid argument, it shouldn't modify the handle signals state. |
| 231 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals, |
| 232 hss.satisfied_signals); |
| 233 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals, |
| 234 hss.satisfiable_signals); |
| 235 hss = kFullMojoHandleSignalsState; |
| 236 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 237 core()->Wait(10, |
| 238 ~MOJO_HANDLE_SIGNAL_NONE, |
| 239 MOJO_DEADLINE_INDEFINITE, |
| 240 MakeUserPointer(&hss))); |
| 241 // On invalid argument, it shouldn't modify the handle signals state. |
| 242 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals, |
| 243 hss.satisfied_signals); |
| 244 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals, |
| 245 hss.satisfiable_signals); |
161 } | 246 } |
162 | 247 |
163 // |WaitMany()|: | 248 // |WaitMany()|: |
164 { | 249 { |
165 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID}; | 250 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID}; |
166 MojoHandleSignals signals[2] = {~MOJO_HANDLE_SIGNAL_NONE, | 251 MojoHandleSignals signals[2] = {~MOJO_HANDLE_SIGNAL_NONE, |
167 ~MOJO_HANDLE_SIGNAL_NONE}; | 252 ~MOJO_HANDLE_SIGNAL_NONE}; |
168 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 253 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
169 core()->WaitMany(MakeUserPointer(handles), | 254 core()->WaitMany(MakeUserPointer(handles), |
170 MakeUserPointer(signals), | 255 MakeUserPointer(signals), |
171 0, | 256 0, |
172 MOJO_DEADLINE_INDEFINITE)); | 257 MOJO_DEADLINE_INDEFINITE, |
| 258 NullUserPointer(), |
| 259 NullUserPointer())); |
173 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 260 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
174 core()->WaitMany(NullUserPointer(), | 261 core()->WaitMany(NullUserPointer(), |
175 MakeUserPointer(signals), | 262 MakeUserPointer(signals), |
176 0, | 263 0, |
177 MOJO_DEADLINE_INDEFINITE)); | 264 MOJO_DEADLINE_INDEFINITE, |
| 265 NullUserPointer(), |
| 266 NullUserPointer())); |
| 267 // If |num_handles| is invalid, it should leave |result_index| and |
| 268 // |signals_states| alone. |
| 269 // (We use -1 internally; make sure that doesn't leak.) |
| 270 uint32_t result_index = 123; |
| 271 MojoHandleSignalsState hss = kFullMojoHandleSignalsState; |
| 272 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 273 core()->WaitMany(NullUserPointer(), |
| 274 MakeUserPointer(signals), |
| 275 0, |
| 276 MOJO_DEADLINE_INDEFINITE, |
| 277 MakeUserPointer(&result_index), |
| 278 MakeUserPointer(&hss))); |
| 279 EXPECT_EQ(123u, result_index); |
| 280 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals, |
| 281 hss.satisfied_signals); |
| 282 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals, |
| 283 hss.satisfiable_signals); |
| 284 |
178 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 285 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
179 core()->WaitMany(MakeUserPointer(handles), | 286 core()->WaitMany(MakeUserPointer(handles), |
180 NullUserPointer(), | 287 NullUserPointer(), |
181 0, | 288 0, |
182 MOJO_DEADLINE_INDEFINITE)); | 289 MOJO_DEADLINE_INDEFINITE, |
| 290 NullUserPointer(), |
| 291 NullUserPointer())); |
183 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 292 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
184 core()->WaitMany(MakeUserPointer(handles), | 293 core()->WaitMany(MakeUserPointer(handles), |
185 MakeUserPointer(signals), | 294 MakeUserPointer(signals), |
186 1, | 295 1, |
187 MOJO_DEADLINE_INDEFINITE)); | 296 MOJO_DEADLINE_INDEFINITE, |
| 297 NullUserPointer(), |
| 298 NullUserPointer())); |
| 299 // But if a handle is bad, then it should set |result_index| but still leave |
| 300 // |signals_states| alone. |
| 301 result_index = static_cast<uint32_t>(-1); |
| 302 hss = kFullMojoHandleSignalsState; |
| 303 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 304 core()->WaitMany(MakeUserPointer(handles), |
| 305 MakeUserPointer(signals), |
| 306 1, |
| 307 MOJO_DEADLINE_INDEFINITE, |
| 308 MakeUserPointer(&result_index), |
| 309 MakeUserPointer(&hss))); |
| 310 EXPECT_EQ(0u, result_index); |
| 311 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals, |
| 312 hss.satisfied_signals); |
| 313 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals, |
| 314 hss.satisfiable_signals); |
188 | 315 |
189 MockHandleInfo info[2]; | 316 MockHandleInfo info[2]; |
190 handles[0] = CreateMockHandle(&info[0]); | 317 handles[0] = CreateMockHandle(&info[0]); |
191 | 318 |
| 319 result_index = static_cast<uint32_t>(-1); |
| 320 hss = kFullMojoHandleSignalsState; |
192 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 321 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
193 core()->WaitMany(MakeUserPointer(handles), | 322 core()->WaitMany(MakeUserPointer(handles), |
194 MakeUserPointer(signals), | 323 MakeUserPointer(signals), |
195 1, | 324 1, |
196 MOJO_DEADLINE_INDEFINITE)); | 325 MOJO_DEADLINE_INDEFINITE, |
| 326 MakeUserPointer(&result_index), |
| 327 MakeUserPointer(&hss))); |
| 328 EXPECT_EQ(0u, result_index); |
| 329 EXPECT_EQ(0u, hss.satisfied_signals); |
| 330 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 331 |
| 332 // On invalid argument, it'll leave |signals_states| alone. |
| 333 result_index = static_cast<uint32_t>(-1); |
| 334 hss = kFullMojoHandleSignalsState; |
197 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 335 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
198 core()->WaitMany(MakeUserPointer(handles), | 336 core()->WaitMany(MakeUserPointer(handles), |
199 MakeUserPointer(signals), | 337 MakeUserPointer(signals), |
200 2, | 338 2, |
201 MOJO_DEADLINE_INDEFINITE)); | 339 MOJO_DEADLINE_INDEFINITE, |
| 340 MakeUserPointer(&result_index), |
| 341 MakeUserPointer(&hss))); |
| 342 EXPECT_EQ(1u, result_index); |
| 343 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals, |
| 344 hss.satisfied_signals); |
| 345 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals, |
| 346 hss.satisfiable_signals); |
202 handles[1] = handles[0] + 1; // Invalid handle. | 347 handles[1] = handles[0] + 1; // Invalid handle. |
203 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 348 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
204 core()->WaitMany(MakeUserPointer(handles), | 349 core()->WaitMany(MakeUserPointer(handles), |
205 MakeUserPointer(signals), | 350 MakeUserPointer(signals), |
206 2, | 351 2, |
207 MOJO_DEADLINE_INDEFINITE)); | 352 MOJO_DEADLINE_INDEFINITE, |
| 353 NullUserPointer(), |
| 354 NullUserPointer())); |
208 handles[1] = CreateMockHandle(&info[1]); | 355 handles[1] = CreateMockHandle(&info[1]); |
209 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 356 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
210 core()->WaitMany(MakeUserPointer(handles), | 357 core()->WaitMany(MakeUserPointer(handles), |
211 MakeUserPointer(signals), | 358 MakeUserPointer(signals), |
212 2, | 359 2, |
213 MOJO_DEADLINE_INDEFINITE)); | 360 MOJO_DEADLINE_INDEFINITE, |
| 361 NullUserPointer(), |
| 362 NullUserPointer())); |
| 363 |
| 364 // TODO(vtl): Test one where we get "failed precondition" only for the |
| 365 // second handle (and the first one is valid to wait on). |
214 | 366 |
215 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0])); | 367 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0])); |
216 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1])); | 368 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1])); |
217 } | 369 } |
218 | 370 |
219 // |CreateMessagePipe()|: Nothing to check (apart from things that cause | 371 // |CreateMessagePipe()|: Nothing to check (apart from things that cause |
220 // death). | 372 // death). |
221 | 373 |
222 // |WriteMessage()|: | 374 // |WriteMessage()|: |
223 // Only check arguments checked by |Core|, namely |handle|, |handles|, and | 375 // Only check arguments checked by |Core|, namely |handle|, |handles|, and |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 // about checking arguments (which we would want to do if, e.g., we were in a | 531 // about checking arguments (which we would want to do if, e.g., we were in a |
380 // true "kernel" situation, but we might not want to do otherwise for | 532 // true "kernel" situation, but we might not want to do otherwise for |
381 // performance reasons). Probably blatant errors like passing in null pointers | 533 // performance reasons). Probably blatant errors like passing in null pointers |
382 // (for required pointer arguments) will still cause death, but perhaps not | 534 // (for required pointer arguments) will still cause death, but perhaps not |
383 // predictably. | 535 // predictably. |
384 TEST_F(CoreTest, InvalidArgumentsDeath) { | 536 TEST_F(CoreTest, InvalidArgumentsDeath) { |
385 const char kMemoryCheckFailedRegex[] = "Check failed"; | 537 const char kMemoryCheckFailedRegex[] = "Check failed"; |
386 | 538 |
387 // |WaitMany()|: | 539 // |WaitMany()|: |
388 { | 540 { |
389 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID}; | 541 MojoHandle handle = MOJO_HANDLE_INVALID; |
390 MojoHandleSignals signals[2] = {~MOJO_HANDLE_SIGNAL_NONE, | 542 MojoHandleSignals signals = ~MOJO_HANDLE_SIGNAL_NONE; |
391 ~MOJO_HANDLE_SIGNAL_NONE}; | |
392 EXPECT_DEATH_IF_SUPPORTED(core()->WaitMany(NullUserPointer(), | 543 EXPECT_DEATH_IF_SUPPORTED(core()->WaitMany(NullUserPointer(), |
393 MakeUserPointer(signals), | 544 MakeUserPointer(&signals), |
394 1, | 545 1, |
395 MOJO_DEADLINE_INDEFINITE), | 546 MOJO_DEADLINE_INDEFINITE, |
| 547 NullUserPointer(), |
| 548 NullUserPointer()), |
396 kMemoryCheckFailedRegex); | 549 kMemoryCheckFailedRegex); |
397 EXPECT_DEATH_IF_SUPPORTED(core()->WaitMany(MakeUserPointer(handles), | 550 EXPECT_DEATH_IF_SUPPORTED(core()->WaitMany(MakeUserPointer(&handle), |
398 NullUserPointer(), | 551 NullUserPointer(), |
399 1, | 552 1, |
400 MOJO_DEADLINE_INDEFINITE), | 553 MOJO_DEADLINE_INDEFINITE, |
| 554 NullUserPointer(), |
| 555 NullUserPointer()), |
401 kMemoryCheckFailedRegex); | 556 kMemoryCheckFailedRegex); |
| 557 // TODO(vtl): |result_index| and |signals_states| are optional. Test them |
| 558 // with non-null invalid pointers? |
402 } | 559 } |
403 | 560 |
404 // |CreateMessagePipe()|: | 561 // |CreateMessagePipe()|: |
405 { | 562 { |
406 MojoHandle h; | 563 MojoHandle h; |
407 EXPECT_DEATH_IF_SUPPORTED( | 564 EXPECT_DEATH_IF_SUPPORTED( |
408 core()->CreateMessagePipe( | 565 core()->CreateMessagePipe( |
409 NullUserPointer(), NullUserPointer(), NullUserPointer()), | 566 NullUserPointer(), NullUserPointer(), NullUserPointer()), |
410 kMemoryCheckFailedRegex); | 567 kMemoryCheckFailedRegex); |
411 EXPECT_DEATH_IF_SUPPORTED( | 568 EXPECT_DEATH_IF_SUPPORTED( |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 615 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
459 } | 616 } |
460 } | 617 } |
461 | 618 |
462 // TODO(vtl): test |Wait()| and |WaitMany()| properly | 619 // TODO(vtl): test |Wait()| and |WaitMany()| properly |
463 // - including |WaitMany()| with the same handle more than once (with | 620 // - including |WaitMany()| with the same handle more than once (with |
464 // same/different signals) | 621 // same/different signals) |
465 | 622 |
466 TEST_F(CoreTest, MessagePipe) { | 623 TEST_F(CoreTest, MessagePipe) { |
467 MojoHandle h[2]; | 624 MojoHandle h[2]; |
| 625 MojoHandleSignalsState hss[2]; |
| 626 uint32_t result_index; |
468 | 627 |
469 EXPECT_EQ( | 628 EXPECT_EQ( |
470 MOJO_RESULT_OK, | 629 MOJO_RESULT_OK, |
471 core()->CreateMessagePipe( | 630 core()->CreateMessagePipe( |
472 NullUserPointer(), MakeUserPointer(&h[0]), MakeUserPointer(&h[1]))); | 631 NullUserPointer(), MakeUserPointer(&h[0]), MakeUserPointer(&h[1]))); |
473 // Should get two distinct, valid handles. | 632 // Should get two distinct, valid handles. |
474 EXPECT_NE(h[0], MOJO_HANDLE_INVALID); | 633 EXPECT_NE(h[0], MOJO_HANDLE_INVALID); |
475 EXPECT_NE(h[1], MOJO_HANDLE_INVALID); | 634 EXPECT_NE(h[1], MOJO_HANDLE_INVALID); |
476 EXPECT_NE(h[0], h[1]); | 635 EXPECT_NE(h[0], h[1]); |
477 | 636 |
478 // Neither should be readable. | 637 // Neither should be readable. |
479 MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE, | 638 MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE, |
480 MOJO_HANDLE_SIGNAL_READABLE}; | 639 MOJO_HANDLE_SIGNAL_READABLE}; |
481 EXPECT_EQ( | 640 result_index = static_cast<uint32_t>(-1); |
482 MOJO_RESULT_DEADLINE_EXCEEDED, | 641 hss[0] = kEmptyMojoHandleSignalsState; |
483 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2, 0)); | 642 hss[1] = kEmptyMojoHandleSignalsState; |
| 643 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 644 core()->WaitMany(MakeUserPointer(h), |
| 645 MakeUserPointer(signals), |
| 646 2, |
| 647 0, |
| 648 MakeUserPointer(&result_index), |
| 649 MakeUserPointer(hss))); |
| 650 EXPECT_EQ(static_cast<uint32_t>(-1), result_index); |
| 651 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals); |
| 652 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 653 hss[0].satisfiable_signals); |
| 654 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals); |
| 655 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 656 hss[1].satisfiable_signals); |
484 | 657 |
485 // Try to read anyway. | 658 // Try to read anyway. |
486 char buffer[1] = {'a'}; | 659 char buffer[1] = {'a'}; |
487 uint32_t buffer_size = 1; | 660 uint32_t buffer_size = 1; |
488 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 661 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
489 core()->ReadMessage(h[0], | 662 core()->ReadMessage(h[0], |
490 UserPointer<void>(buffer), | 663 UserPointer<void>(buffer), |
491 MakeUserPointer(&buffer_size), | 664 MakeUserPointer(&buffer_size), |
492 NullUserPointer(), | 665 NullUserPointer(), |
493 NullUserPointer(), | 666 NullUserPointer(), |
494 MOJO_READ_MESSAGE_FLAG_NONE)); | 667 MOJO_READ_MESSAGE_FLAG_NONE)); |
495 // Check that it left its inputs alone. | 668 // Check that it left its inputs alone. |
496 EXPECT_EQ('a', buffer[0]); | 669 EXPECT_EQ('a', buffer[0]); |
497 EXPECT_EQ(1u, buffer_size); | 670 EXPECT_EQ(1u, buffer_size); |
498 | 671 |
499 // Both should be writable. | 672 // Both should be writable. |
| 673 hss[0] = kEmptyMojoHandleSignalsState; |
500 EXPECT_EQ(MOJO_RESULT_OK, | 674 EXPECT_EQ(MOJO_RESULT_OK, |
501 core()->Wait(h[0], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000)); | 675 core()->Wait(h[0], |
| 676 MOJO_HANDLE_SIGNAL_WRITABLE, |
| 677 1000000000, |
| 678 MakeUserPointer(&hss[0]))); |
| 679 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals); |
| 680 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 681 hss[0].satisfiable_signals); |
| 682 hss[0] = kEmptyMojoHandleSignalsState; |
502 EXPECT_EQ(MOJO_RESULT_OK, | 683 EXPECT_EQ(MOJO_RESULT_OK, |
503 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000)); | 684 core()->Wait(h[1], |
| 685 MOJO_HANDLE_SIGNAL_WRITABLE, |
| 686 1000000000, |
| 687 MakeUserPointer(&hss[0]))); |
| 688 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals); |
| 689 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 690 hss[0].satisfiable_signals); |
504 | 691 |
505 // Also check that |h[1]| is writable using |WaitMany()|. | 692 // Also check that |h[1]| is writable using |WaitMany()|. |
506 signals[0] = MOJO_HANDLE_SIGNAL_READABLE; | 693 signals[0] = MOJO_HANDLE_SIGNAL_READABLE; |
507 signals[1] = MOJO_HANDLE_SIGNAL_WRITABLE; | 694 signals[1] = MOJO_HANDLE_SIGNAL_WRITABLE; |
508 EXPECT_EQ(1, | 695 result_index = static_cast<uint32_t>(-1); |
| 696 hss[0] = kEmptyMojoHandleSignalsState; |
| 697 hss[1] = kEmptyMojoHandleSignalsState; |
| 698 EXPECT_EQ(MOJO_RESULT_OK, |
509 core()->WaitMany(MakeUserPointer(h), | 699 core()->WaitMany(MakeUserPointer(h), |
510 MakeUserPointer(signals), | 700 MakeUserPointer(signals), |
511 2, | 701 2, |
512 MOJO_DEADLINE_INDEFINITE)); | 702 MOJO_DEADLINE_INDEFINITE, |
| 703 MakeUserPointer(&result_index), |
| 704 MakeUserPointer(hss))); |
| 705 EXPECT_EQ(1u, result_index); |
| 706 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals); |
| 707 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 708 hss[0].satisfiable_signals); |
| 709 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals); |
| 710 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 711 hss[1].satisfiable_signals); |
513 | 712 |
514 // Write to |h[1]|. | 713 // Write to |h[1]|. |
515 buffer[0] = 'b'; | 714 buffer[0] = 'b'; |
516 EXPECT_EQ(MOJO_RESULT_OK, | 715 EXPECT_EQ(MOJO_RESULT_OK, |
517 core()->WriteMessage(h[1], | 716 core()->WriteMessage(h[1], |
518 UserPointer<const void>(buffer), | 717 UserPointer<const void>(buffer), |
519 1, | 718 1, |
520 NullUserPointer(), | 719 NullUserPointer(), |
521 0, | 720 0, |
522 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 721 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
523 | 722 |
524 // Check that |h[0]| is now readable. | 723 // Check that |h[0]| is now readable. |
525 signals[0] = MOJO_HANDLE_SIGNAL_READABLE; | 724 signals[0] = MOJO_HANDLE_SIGNAL_READABLE; |
526 signals[1] = MOJO_HANDLE_SIGNAL_READABLE; | 725 signals[1] = MOJO_HANDLE_SIGNAL_READABLE; |
527 EXPECT_EQ(0, | 726 result_index = static_cast<uint32_t>(-1); |
| 727 hss[0] = kEmptyMojoHandleSignalsState; |
| 728 hss[1] = kEmptyMojoHandleSignalsState; |
| 729 EXPECT_EQ(MOJO_RESULT_OK, |
528 core()->WaitMany(MakeUserPointer(h), | 730 core()->WaitMany(MakeUserPointer(h), |
529 MakeUserPointer(signals), | 731 MakeUserPointer(signals), |
530 2, | 732 2, |
531 MOJO_DEADLINE_INDEFINITE)); | 733 MOJO_DEADLINE_INDEFINITE, |
| 734 MakeUserPointer(&result_index), |
| 735 MakeUserPointer(hss))); |
| 736 EXPECT_EQ(0u, result_index); |
| 737 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 738 hss[0].satisfied_signals); |
| 739 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 740 hss[0].satisfiable_signals); |
| 741 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals); |
| 742 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 743 hss[1].satisfiable_signals); |
532 | 744 |
533 // Read from |h[0]|. | 745 // Read from |h[0]|. |
534 // First, get only the size. | 746 // First, get only the size. |
535 buffer_size = 0; | 747 buffer_size = 0; |
536 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 748 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
537 core()->ReadMessage(h[0], | 749 core()->ReadMessage(h[0], |
538 NullUserPointer(), | 750 NullUserPointer(), |
539 MakeUserPointer(&buffer_size), | 751 MakeUserPointer(&buffer_size), |
540 NullUserPointer(), | 752 NullUserPointer(), |
541 NullUserPointer(), | 753 NullUserPointer(), |
542 MOJO_READ_MESSAGE_FLAG_NONE)); | 754 MOJO_READ_MESSAGE_FLAG_NONE)); |
543 EXPECT_EQ(1u, buffer_size); | 755 EXPECT_EQ(1u, buffer_size); |
544 // Then actually read it. | 756 // Then actually read it. |
545 buffer[0] = 'c'; | 757 buffer[0] = 'c'; |
546 buffer_size = 1; | 758 buffer_size = 1; |
547 EXPECT_EQ(MOJO_RESULT_OK, | 759 EXPECT_EQ(MOJO_RESULT_OK, |
548 core()->ReadMessage(h[0], | 760 core()->ReadMessage(h[0], |
549 UserPointer<void>(buffer), | 761 UserPointer<void>(buffer), |
550 MakeUserPointer(&buffer_size), | 762 MakeUserPointer(&buffer_size), |
551 NullUserPointer(), | 763 NullUserPointer(), |
552 NullUserPointer(), | 764 NullUserPointer(), |
553 MOJO_READ_MESSAGE_FLAG_NONE)); | 765 MOJO_READ_MESSAGE_FLAG_NONE)); |
554 EXPECT_EQ('b', buffer[0]); | 766 EXPECT_EQ('b', buffer[0]); |
555 EXPECT_EQ(1u, buffer_size); | 767 EXPECT_EQ(1u, buffer_size); |
556 | 768 |
557 // |h[0]| should no longer be readable. | 769 // |h[0]| should no longer be readable. |
558 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 770 hss[0] = kEmptyMojoHandleSignalsState; |
559 core()->Wait(h[0], MOJO_HANDLE_SIGNAL_READABLE, 0)); | 771 EXPECT_EQ( |
| 772 MOJO_RESULT_DEADLINE_EXCEEDED, |
| 773 core()->Wait( |
| 774 h[0], MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss[0]))); |
| 775 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals); |
| 776 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 777 hss[0].satisfiable_signals); |
560 | 778 |
561 // Write to |h[0]|. | 779 // Write to |h[0]|. |
562 buffer[0] = 'd'; | 780 buffer[0] = 'd'; |
563 EXPECT_EQ(MOJO_RESULT_OK, | 781 EXPECT_EQ(MOJO_RESULT_OK, |
564 core()->WriteMessage(h[0], | 782 core()->WriteMessage(h[0], |
565 UserPointer<const void>(buffer), | 783 UserPointer<const void>(buffer), |
566 1, | 784 1, |
567 NullUserPointer(), | 785 NullUserPointer(), |
568 0, | 786 0, |
569 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 787 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
570 | 788 |
571 // Close |h[0]|. | 789 // Close |h[0]|. |
572 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0])); | 790 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0])); |
573 | 791 |
574 // Check that |h[1]| is no longer writable (and will never be). | 792 // Check that |h[1]| is no longer writable (and will never be). |
| 793 hss[0] = kEmptyMojoHandleSignalsState; |
575 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 794 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
576 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000)); | 795 core()->Wait(h[1], |
| 796 MOJO_HANDLE_SIGNAL_WRITABLE, |
| 797 1000000000, |
| 798 MakeUserPointer(&hss[0]))); |
| 799 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss[0].satisfied_signals); |
| 800 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss[0].satisfiable_signals); |
577 | 801 |
578 // Check that |h[1]| is still readable (for the moment). | 802 // Check that |h[1]| is still readable (for the moment). |
| 803 hss[0] = kEmptyMojoHandleSignalsState; |
579 EXPECT_EQ(MOJO_RESULT_OK, | 804 EXPECT_EQ(MOJO_RESULT_OK, |
580 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 805 core()->Wait(h[1], |
| 806 MOJO_HANDLE_SIGNAL_READABLE, |
| 807 1000000000, |
| 808 MakeUserPointer(&hss[0]))); |
| 809 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss[0].satisfied_signals); |
| 810 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss[0].satisfiable_signals); |
581 | 811 |
582 // Discard a message from |h[1]|. | 812 // Discard a message from |h[1]|. |
583 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 813 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
584 core()->ReadMessage(h[1], | 814 core()->ReadMessage(h[1], |
585 NullUserPointer(), | 815 NullUserPointer(), |
586 NullUserPointer(), | 816 NullUserPointer(), |
587 NullUserPointer(), | 817 NullUserPointer(), |
588 NullUserPointer(), | 818 NullUserPointer(), |
589 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 819 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
590 | 820 |
591 // |h[1]| is no longer readable (and will never be). | 821 // |h[1]| is no longer readable (and will never be). |
| 822 hss[0] = kFullMojoHandleSignalsState; |
592 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 823 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
593 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 824 core()->Wait(h[1], |
| 825 MOJO_HANDLE_SIGNAL_READABLE, |
| 826 1000000000, |
| 827 MakeUserPointer(&hss[0]))); |
| 828 EXPECT_EQ(0u, hss[0].satisfied_signals); |
| 829 EXPECT_EQ(0u, hss[0].satisfiable_signals); |
594 | 830 |
595 // Try writing to |h[1]|. | 831 // Try writing to |h[1]|. |
596 buffer[0] = 'e'; | 832 buffer[0] = 'e'; |
597 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 833 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
598 core()->WriteMessage(h[1], | 834 core()->WriteMessage(h[1], |
599 UserPointer<const void>(buffer), | 835 UserPointer<const void>(buffer), |
600 1, | 836 1, |
601 NullUserPointer(), | 837 NullUserPointer(), |
602 0, | 838 0, |
603 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 839 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
604 | 840 |
605 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1])); | 841 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1])); |
606 } | 842 } |
607 | 843 |
608 // Tests passing a message pipe handle. | 844 // Tests passing a message pipe handle. |
609 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) { | 845 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) { |
610 const char kHello[] = "hello"; | 846 const char kHello[] = "hello"; |
611 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); | 847 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); |
612 const char kWorld[] = "world!!!"; | 848 const char kWorld[] = "world!!!"; |
613 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); | 849 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); |
614 char buffer[100]; | 850 char buffer[100]; |
615 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 851 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
616 uint32_t num_bytes; | 852 uint32_t num_bytes; |
617 MojoHandle handles[10]; | 853 MojoHandle handles[10]; |
618 uint32_t num_handles; | 854 uint32_t num_handles; |
| 855 MojoHandleSignalsState hss; |
619 MojoHandle h_received; | 856 MojoHandle h_received; |
620 | 857 |
621 MojoHandle h_passing[2]; | 858 MojoHandle h_passing[2]; |
622 EXPECT_EQ(MOJO_RESULT_OK, | 859 EXPECT_EQ(MOJO_RESULT_OK, |
623 core()->CreateMessagePipe(NullUserPointer(), | 860 core()->CreateMessagePipe(NullUserPointer(), |
624 MakeUserPointer(&h_passing[0]), | 861 MakeUserPointer(&h_passing[0]), |
625 MakeUserPointer(&h_passing[1]))); | 862 MakeUserPointer(&h_passing[1]))); |
626 | 863 |
627 // Make sure that |h_passing[]| work properly. | 864 // Make sure that |h_passing[]| work properly. |
628 EXPECT_EQ(MOJO_RESULT_OK, | 865 EXPECT_EQ(MOJO_RESULT_OK, |
629 core()->WriteMessage(h_passing[0], | 866 core()->WriteMessage(h_passing[0], |
630 UserPointer<const void>(kHello), | 867 UserPointer<const void>(kHello), |
631 kHelloSize, | 868 kHelloSize, |
632 NullUserPointer(), | 869 NullUserPointer(), |
633 0, | 870 0, |
634 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 871 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
635 EXPECT_EQ( | 872 hss = kEmptyMojoHandleSignalsState; |
636 MOJO_RESULT_OK, | 873 EXPECT_EQ(MOJO_RESULT_OK, |
637 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 874 core()->Wait(h_passing[1], |
| 875 MOJO_HANDLE_SIGNAL_READABLE, |
| 876 1000000000, |
| 877 MakeUserPointer(&hss))); |
| 878 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 879 hss.satisfied_signals); |
| 880 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 881 hss.satisfiable_signals); |
638 num_bytes = kBufferSize; | 882 num_bytes = kBufferSize; |
639 num_handles = arraysize(handles); | 883 num_handles = arraysize(handles); |
640 EXPECT_EQ(MOJO_RESULT_OK, | 884 EXPECT_EQ(MOJO_RESULT_OK, |
641 core()->ReadMessage(h_passing[1], | 885 core()->ReadMessage(h_passing[1], |
642 UserPointer<void>(buffer), | 886 UserPointer<void>(buffer), |
643 MakeUserPointer(&num_bytes), | 887 MakeUserPointer(&num_bytes), |
644 MakeUserPointer(handles), | 888 MakeUserPointer(handles), |
645 MakeUserPointer(&num_handles), | 889 MakeUserPointer(&num_handles), |
646 MOJO_READ_MESSAGE_FLAG_NONE)); | 890 MOJO_READ_MESSAGE_FLAG_NONE)); |
647 EXPECT_EQ(kHelloSize, num_bytes); | 891 EXPECT_EQ(kHelloSize, num_bytes); |
(...skipping 24 matching lines...) Expand all Loading... |
672 MakeUserPointer(&h_passed[1]))); | 916 MakeUserPointer(&h_passed[1]))); |
673 | 917 |
674 // Make sure that |h_passed[]| work properly. | 918 // Make sure that |h_passed[]| work properly. |
675 EXPECT_EQ(MOJO_RESULT_OK, | 919 EXPECT_EQ(MOJO_RESULT_OK, |
676 core()->WriteMessage(h_passed[0], | 920 core()->WriteMessage(h_passed[0], |
677 UserPointer<const void>(kHello), | 921 UserPointer<const void>(kHello), |
678 kHelloSize, | 922 kHelloSize, |
679 NullUserPointer(), | 923 NullUserPointer(), |
680 0, | 924 0, |
681 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 925 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 926 hss = kEmptyMojoHandleSignalsState; |
682 EXPECT_EQ(MOJO_RESULT_OK, | 927 EXPECT_EQ(MOJO_RESULT_OK, |
683 core()->Wait(h_passed[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 928 core()->Wait(h_passed[1], |
| 929 MOJO_HANDLE_SIGNAL_READABLE, |
| 930 1000000000, |
| 931 MakeUserPointer(&hss))); |
| 932 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 933 hss.satisfied_signals); |
| 934 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 935 hss.satisfiable_signals); |
684 num_bytes = kBufferSize; | 936 num_bytes = kBufferSize; |
685 num_handles = arraysize(handles); | 937 num_handles = arraysize(handles); |
686 EXPECT_EQ(MOJO_RESULT_OK, | 938 EXPECT_EQ(MOJO_RESULT_OK, |
687 core()->ReadMessage(h_passed[1], | 939 core()->ReadMessage(h_passed[1], |
688 UserPointer<void>(buffer), | 940 UserPointer<void>(buffer), |
689 MakeUserPointer(&num_bytes), | 941 MakeUserPointer(&num_bytes), |
690 MakeUserPointer(handles), | 942 MakeUserPointer(handles), |
691 MakeUserPointer(&num_handles), | 943 MakeUserPointer(&num_handles), |
692 MOJO_READ_MESSAGE_FLAG_NONE)); | 944 MOJO_READ_MESSAGE_FLAG_NONE)); |
693 EXPECT_EQ(kHelloSize, num_bytes); | 945 EXPECT_EQ(kHelloSize, num_bytes); |
694 EXPECT_STREQ(kHello, buffer); | 946 EXPECT_STREQ(kHello, buffer); |
695 EXPECT_EQ(0u, num_handles); | 947 EXPECT_EQ(0u, num_handles); |
696 | 948 |
697 // Send |h_passed[1]| from |h_passing[0]| to |h_passing[1]|. | 949 // Send |h_passed[1]| from |h_passing[0]| to |h_passing[1]|. |
698 EXPECT_EQ(MOJO_RESULT_OK, | 950 EXPECT_EQ(MOJO_RESULT_OK, |
699 core()->WriteMessage(h_passing[0], | 951 core()->WriteMessage(h_passing[0], |
700 UserPointer<const void>(kWorld), | 952 UserPointer<const void>(kWorld), |
701 kWorldSize, | 953 kWorldSize, |
702 MakeUserPointer(&h_passed[1]), | 954 MakeUserPointer(&h_passed[1]), |
703 1, | 955 1, |
704 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 956 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
705 EXPECT_EQ( | 957 hss = kEmptyMojoHandleSignalsState; |
706 MOJO_RESULT_OK, | 958 EXPECT_EQ(MOJO_RESULT_OK, |
707 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 959 core()->Wait(h_passing[1], |
| 960 MOJO_HANDLE_SIGNAL_READABLE, |
| 961 1000000000, |
| 962 MakeUserPointer(&hss))); |
| 963 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 964 hss.satisfied_signals); |
| 965 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 966 hss.satisfiable_signals); |
708 num_bytes = kBufferSize; | 967 num_bytes = kBufferSize; |
709 num_handles = arraysize(handles); | 968 num_handles = arraysize(handles); |
710 EXPECT_EQ(MOJO_RESULT_OK, | 969 EXPECT_EQ(MOJO_RESULT_OK, |
711 core()->ReadMessage(h_passing[1], | 970 core()->ReadMessage(h_passing[1], |
712 UserPointer<void>(buffer), | 971 UserPointer<void>(buffer), |
713 MakeUserPointer(&num_bytes), | 972 MakeUserPointer(&num_bytes), |
714 MakeUserPointer(handles), | 973 MakeUserPointer(handles), |
715 MakeUserPointer(&num_handles), | 974 MakeUserPointer(&num_handles), |
716 MOJO_READ_MESSAGE_FLAG_NONE)); | 975 MOJO_READ_MESSAGE_FLAG_NONE)); |
717 EXPECT_EQ(kWorldSize, num_bytes); | 976 EXPECT_EQ(kWorldSize, num_bytes); |
(...skipping 13 matching lines...) Expand all Loading... |
731 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h_passed[1])); | 990 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h_passed[1])); |
732 | 991 |
733 // Write to |h_passed[0]|. Should receive on |h_received|. | 992 // Write to |h_passed[0]|. Should receive on |h_received|. |
734 EXPECT_EQ(MOJO_RESULT_OK, | 993 EXPECT_EQ(MOJO_RESULT_OK, |
735 core()->WriteMessage(h_passed[0], | 994 core()->WriteMessage(h_passed[0], |
736 UserPointer<const void>(kHello), | 995 UserPointer<const void>(kHello), |
737 kHelloSize, | 996 kHelloSize, |
738 NullUserPointer(), | 997 NullUserPointer(), |
739 0, | 998 0, |
740 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 999 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 1000 hss = kEmptyMojoHandleSignalsState; |
741 EXPECT_EQ(MOJO_RESULT_OK, | 1001 EXPECT_EQ(MOJO_RESULT_OK, |
742 core()->Wait(h_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 1002 core()->Wait(h_received, |
| 1003 MOJO_HANDLE_SIGNAL_READABLE, |
| 1004 1000000000, |
| 1005 MakeUserPointer(&hss))); |
| 1006 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1007 hss.satisfied_signals); |
| 1008 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1009 hss.satisfiable_signals); |
743 num_bytes = kBufferSize; | 1010 num_bytes = kBufferSize; |
744 num_handles = arraysize(handles); | 1011 num_handles = arraysize(handles); |
745 EXPECT_EQ(MOJO_RESULT_OK, | 1012 EXPECT_EQ(MOJO_RESULT_OK, |
746 core()->ReadMessage(h_received, | 1013 core()->ReadMessage(h_received, |
747 UserPointer<void>(buffer), | 1014 UserPointer<void>(buffer), |
748 MakeUserPointer(&num_bytes), | 1015 MakeUserPointer(&num_bytes), |
749 MakeUserPointer(handles), | 1016 MakeUserPointer(handles), |
750 MakeUserPointer(&num_handles), | 1017 MakeUserPointer(&num_handles), |
751 MOJO_READ_MESSAGE_FLAG_NONE)); | 1018 MOJO_READ_MESSAGE_FLAG_NONE)); |
752 EXPECT_EQ(kHelloSize, num_bytes); | 1019 EXPECT_EQ(kHelloSize, num_bytes); |
753 EXPECT_STREQ(kHello, buffer); | 1020 EXPECT_STREQ(kHello, buffer); |
754 EXPECT_EQ(0u, num_handles); | 1021 EXPECT_EQ(0u, num_handles); |
755 | 1022 |
756 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0])); | 1023 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0])); |
757 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); | 1024 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); |
758 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0])); | 1025 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0])); |
759 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_received)); | 1026 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_received)); |
760 } | 1027 } |
761 | 1028 |
762 TEST_F(CoreTest, DataPipe) { | 1029 TEST_F(CoreTest, DataPipe) { |
763 MojoHandle ph, ch; // p is for producer and c is for consumer. | 1030 MojoHandle ph, ch; // p is for producer and c is for consumer. |
| 1031 MojoHandleSignalsState hss; |
764 | 1032 |
765 EXPECT_EQ(MOJO_RESULT_OK, | 1033 EXPECT_EQ(MOJO_RESULT_OK, |
766 core()->CreateDataPipe( | 1034 core()->CreateDataPipe( |
767 NullUserPointer(), MakeUserPointer(&ph), MakeUserPointer(&ch))); | 1035 NullUserPointer(), MakeUserPointer(&ph), MakeUserPointer(&ch))); |
768 // Should get two distinct, valid handles. | 1036 // Should get two distinct, valid handles. |
769 EXPECT_NE(ph, MOJO_HANDLE_INVALID); | 1037 EXPECT_NE(ph, MOJO_HANDLE_INVALID); |
770 EXPECT_NE(ch, MOJO_HANDLE_INVALID); | 1038 EXPECT_NE(ch, MOJO_HANDLE_INVALID); |
771 EXPECT_NE(ph, ch); | 1039 EXPECT_NE(ph, ch); |
772 | 1040 |
773 // Producer should be never-readable, but already writable. | 1041 // Producer should be never-readable, but already writable. |
774 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1042 hss = kEmptyMojoHandleSignalsState; |
775 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0)); | 1043 EXPECT_EQ( |
776 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ph, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); | 1044 MOJO_RESULT_FAILED_PRECONDITION, |
| 1045 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); |
| 1046 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 1047 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); |
| 1048 hss = kEmptyMojoHandleSignalsState; |
| 1049 EXPECT_EQ( |
| 1050 MOJO_RESULT_OK, |
| 1051 core()->Wait(ph, MOJO_HANDLE_SIGNAL_WRITABLE, 0, MakeUserPointer(&hss))); |
| 1052 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 1053 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); |
777 | 1054 |
778 // Consumer should be never-writable, and not yet readable. | 1055 // Consumer should be never-writable, and not yet readable. |
779 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1056 hss = kFullMojoHandleSignalsState; |
780 core()->Wait(ch, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); | 1057 EXPECT_EQ( |
781 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 1058 MOJO_RESULT_FAILED_PRECONDITION, |
782 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0)); | 1059 core()->Wait(ch, MOJO_HANDLE_SIGNAL_WRITABLE, 0, MakeUserPointer(&hss))); |
| 1060 EXPECT_EQ(0u, hss.satisfied_signals); |
| 1061 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 1062 hss = kFullMojoHandleSignalsState; |
| 1063 EXPECT_EQ( |
| 1064 MOJO_RESULT_DEADLINE_EXCEEDED, |
| 1065 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); |
| 1066 EXPECT_EQ(0u, hss.satisfied_signals); |
| 1067 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
783 | 1068 |
784 // Write. | 1069 // Write. |
785 char elements[2] = {'A', 'B'}; | 1070 char elements[2] = {'A', 'B'}; |
786 uint32_t num_bytes = 2u; | 1071 uint32_t num_bytes = 2u; |
787 EXPECT_EQ(MOJO_RESULT_OK, | 1072 EXPECT_EQ(MOJO_RESULT_OK, |
788 core()->WriteData(ph, | 1073 core()->WriteData(ph, |
789 UserPointer<const void>(elements), | 1074 UserPointer<const void>(elements), |
790 MakeUserPointer(&num_bytes), | 1075 MakeUserPointer(&num_bytes), |
791 MOJO_WRITE_DATA_FLAG_NONE)); | 1076 MOJO_WRITE_DATA_FLAG_NONE)); |
792 EXPECT_EQ(2u, num_bytes); | 1077 EXPECT_EQ(2u, num_bytes); |
793 | 1078 |
794 // Consumer should now be readable. | 1079 // Consumer should now be readable. |
795 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0)); | 1080 hss = kEmptyMojoHandleSignalsState; |
| 1081 EXPECT_EQ( |
| 1082 MOJO_RESULT_OK, |
| 1083 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); |
| 1084 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 1085 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
796 | 1086 |
797 // Read one character. | 1087 // Read one character. |
798 elements[0] = -1; | 1088 elements[0] = -1; |
799 elements[1] = -1; | 1089 elements[1] = -1; |
800 num_bytes = 1u; | 1090 num_bytes = 1u; |
801 EXPECT_EQ(MOJO_RESULT_OK, | 1091 EXPECT_EQ(MOJO_RESULT_OK, |
802 core()->ReadData(ch, | 1092 core()->ReadData(ch, |
803 UserPointer<void>(elements), | 1093 UserPointer<void>(elements), |
804 MakeUserPointer(&num_bytes), | 1094 MakeUserPointer(&num_bytes), |
805 MOJO_READ_DATA_FLAG_NONE)); | 1095 MOJO_READ_DATA_FLAG_NONE)); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
877 NullUserPointer(), | 1167 NullUserPointer(), |
878 MakeUserPointer(&num_bytes), | 1168 MakeUserPointer(&num_bytes), |
879 MOJO_READ_DATA_FLAG_DISCARD)); | 1169 MOJO_READ_DATA_FLAG_DISCARD)); |
880 | 1170 |
881 // Actually check our data and end the two-phase read. | 1171 // Actually check our data and end the two-phase read. |
882 EXPECT_EQ('D', static_cast<const char*>(read_ptr)[0]); | 1172 EXPECT_EQ('D', static_cast<const char*>(read_ptr)[0]); |
883 EXPECT_EQ('E', static_cast<const char*>(read_ptr)[1]); | 1173 EXPECT_EQ('E', static_cast<const char*>(read_ptr)[1]); |
884 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 2u)); | 1174 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 2u)); |
885 | 1175 |
886 // Consumer should now be no longer readable. | 1176 // Consumer should now be no longer readable. |
887 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 1177 hss = kFullMojoHandleSignalsState; |
888 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0)); | 1178 EXPECT_EQ( |
| 1179 MOJO_RESULT_DEADLINE_EXCEEDED, |
| 1180 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); |
| 1181 EXPECT_EQ(0u, hss.satisfied_signals); |
| 1182 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
889 | 1183 |
890 // TODO(vtl): More. | 1184 // TODO(vtl): More. |
891 | 1185 |
892 // Close the producer. | 1186 // Close the producer. |
893 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); | 1187 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); |
894 | 1188 |
895 // The consumer should now be never-readable. | 1189 // The consumer should now be never-readable. |
896 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1190 hss = kFullMojoHandleSignalsState; |
897 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0)); | 1191 EXPECT_EQ( |
| 1192 MOJO_RESULT_FAILED_PRECONDITION, |
| 1193 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); |
| 1194 EXPECT_EQ(0u, hss.satisfied_signals); |
| 1195 EXPECT_EQ(0u, hss.satisfiable_signals); |
898 | 1196 |
899 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); | 1197 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); |
900 } | 1198 } |
901 | 1199 |
902 // Tests passing data pipe producer and consumer handles. | 1200 // Tests passing data pipe producer and consumer handles. |
903 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) { | 1201 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) { |
904 const char kHello[] = "hello"; | 1202 const char kHello[] = "hello"; |
905 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); | 1203 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); |
906 const char kWorld[] = "world!!!"; | 1204 const char kWorld[] = "world!!!"; |
907 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); | 1205 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); |
908 char buffer[100]; | 1206 char buffer[100]; |
909 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 1207 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
910 uint32_t num_bytes; | 1208 uint32_t num_bytes; |
911 MojoHandle handles[10]; | 1209 MojoHandle handles[10]; |
912 uint32_t num_handles; | 1210 uint32_t num_handles; |
| 1211 MojoHandleSignalsState hss; |
913 | 1212 |
914 MojoHandle h_passing[2]; | 1213 MojoHandle h_passing[2]; |
915 EXPECT_EQ(MOJO_RESULT_OK, | 1214 EXPECT_EQ(MOJO_RESULT_OK, |
916 core()->CreateMessagePipe(NullUserPointer(), | 1215 core()->CreateMessagePipe(NullUserPointer(), |
917 MakeUserPointer(&h_passing[0]), | 1216 MakeUserPointer(&h_passing[0]), |
918 MakeUserPointer(&h_passing[1]))); | 1217 MakeUserPointer(&h_passing[1]))); |
919 | 1218 |
920 MojoHandle ph, ch; | 1219 MojoHandle ph, ch; |
921 EXPECT_EQ(MOJO_RESULT_OK, | 1220 EXPECT_EQ(MOJO_RESULT_OK, |
922 core()->CreateDataPipe( | 1221 core()->CreateDataPipe( |
923 NullUserPointer(), MakeUserPointer(&ph), MakeUserPointer(&ch))); | 1222 NullUserPointer(), MakeUserPointer(&ph), MakeUserPointer(&ch))); |
924 | 1223 |
925 // Send |ch| from |h_passing[0]| to |h_passing[1]|. | 1224 // Send |ch| from |h_passing[0]| to |h_passing[1]|. |
926 EXPECT_EQ(MOJO_RESULT_OK, | 1225 EXPECT_EQ(MOJO_RESULT_OK, |
927 core()->WriteMessage(h_passing[0], | 1226 core()->WriteMessage(h_passing[0], |
928 UserPointer<const void>(kHello), | 1227 UserPointer<const void>(kHello), |
929 kHelloSize, | 1228 kHelloSize, |
930 MakeUserPointer(&ch), | 1229 MakeUserPointer(&ch), |
931 1, | 1230 1, |
932 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1231 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
933 EXPECT_EQ( | 1232 hss = kEmptyMojoHandleSignalsState; |
934 MOJO_RESULT_OK, | 1233 EXPECT_EQ(MOJO_RESULT_OK, |
935 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 1234 core()->Wait(h_passing[1], |
| 1235 MOJO_HANDLE_SIGNAL_READABLE, |
| 1236 1000000000, |
| 1237 MakeUserPointer(&hss))); |
| 1238 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1239 hss.satisfied_signals); |
| 1240 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1241 hss.satisfiable_signals); |
936 num_bytes = kBufferSize; | 1242 num_bytes = kBufferSize; |
937 num_handles = arraysize(handles); | 1243 num_handles = arraysize(handles); |
938 EXPECT_EQ(MOJO_RESULT_OK, | 1244 EXPECT_EQ(MOJO_RESULT_OK, |
939 core()->ReadMessage(h_passing[1], | 1245 core()->ReadMessage(h_passing[1], |
940 UserPointer<void>(buffer), | 1246 UserPointer<void>(buffer), |
941 MakeUserPointer(&num_bytes), | 1247 MakeUserPointer(&num_bytes), |
942 MakeUserPointer(handles), | 1248 MakeUserPointer(handles), |
943 MakeUserPointer(&num_handles), | 1249 MakeUserPointer(&num_handles), |
944 MOJO_READ_MESSAGE_FLAG_NONE)); | 1250 MOJO_READ_MESSAGE_FLAG_NONE)); |
945 EXPECT_EQ(kHelloSize, num_bytes); | 1251 EXPECT_EQ(kHelloSize, num_bytes); |
(...skipping 12 matching lines...) Expand all Loading... |
958 // above note. | 1264 // above note. |
959 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ch)); | 1265 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ch)); |
960 | 1266 |
961 // Write to |ph|. Should receive on |ch_received|. | 1267 // Write to |ph|. Should receive on |ch_received|. |
962 num_bytes = kWorldSize; | 1268 num_bytes = kWorldSize; |
963 EXPECT_EQ(MOJO_RESULT_OK, | 1269 EXPECT_EQ(MOJO_RESULT_OK, |
964 core()->WriteData(ph, | 1270 core()->WriteData(ph, |
965 UserPointer<const void>(kWorld), | 1271 UserPointer<const void>(kWorld), |
966 MakeUserPointer(&num_bytes), | 1272 MakeUserPointer(&num_bytes), |
967 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)); | 1273 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)); |
| 1274 hss = kEmptyMojoHandleSignalsState; |
968 EXPECT_EQ(MOJO_RESULT_OK, | 1275 EXPECT_EQ(MOJO_RESULT_OK, |
969 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 1276 core()->Wait(ch_received, |
| 1277 MOJO_HANDLE_SIGNAL_READABLE, |
| 1278 1000000000, |
| 1279 MakeUserPointer(&hss))); |
| 1280 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 1281 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
970 num_bytes = kBufferSize; | 1282 num_bytes = kBufferSize; |
971 EXPECT_EQ(MOJO_RESULT_OK, | 1283 EXPECT_EQ(MOJO_RESULT_OK, |
972 core()->ReadData(ch_received, | 1284 core()->ReadData(ch_received, |
973 UserPointer<void>(buffer), | 1285 UserPointer<void>(buffer), |
974 MakeUserPointer(&num_bytes), | 1286 MakeUserPointer(&num_bytes), |
975 MOJO_READ_MESSAGE_FLAG_NONE)); | 1287 MOJO_READ_MESSAGE_FLAG_NONE)); |
976 EXPECT_EQ(kWorldSize, num_bytes); | 1288 EXPECT_EQ(kWorldSize, num_bytes); |
977 EXPECT_STREQ(kWorld, buffer); | 1289 EXPECT_STREQ(kWorld, buffer); |
978 | 1290 |
979 // Now pass |ph| in the same direction. | 1291 // Now pass |ph| in the same direction. |
980 EXPECT_EQ(MOJO_RESULT_OK, | 1292 EXPECT_EQ(MOJO_RESULT_OK, |
981 core()->WriteMessage(h_passing[0], | 1293 core()->WriteMessage(h_passing[0], |
982 UserPointer<const void>(kWorld), | 1294 UserPointer<const void>(kWorld), |
983 kWorldSize, | 1295 kWorldSize, |
984 MakeUserPointer(&ph), | 1296 MakeUserPointer(&ph), |
985 1, | 1297 1, |
986 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1298 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
987 EXPECT_EQ( | 1299 hss = kEmptyMojoHandleSignalsState; |
988 MOJO_RESULT_OK, | 1300 EXPECT_EQ(MOJO_RESULT_OK, |
989 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 1301 core()->Wait(h_passing[1], |
| 1302 MOJO_HANDLE_SIGNAL_READABLE, |
| 1303 1000000000, |
| 1304 MakeUserPointer(&hss))); |
| 1305 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1306 hss.satisfied_signals); |
| 1307 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1308 hss.satisfiable_signals); |
990 num_bytes = kBufferSize; | 1309 num_bytes = kBufferSize; |
991 num_handles = arraysize(handles); | 1310 num_handles = arraysize(handles); |
992 EXPECT_EQ(MOJO_RESULT_OK, | 1311 EXPECT_EQ(MOJO_RESULT_OK, |
993 core()->ReadMessage(h_passing[1], | 1312 core()->ReadMessage(h_passing[1], |
994 UserPointer<void>(buffer), | 1313 UserPointer<void>(buffer), |
995 MakeUserPointer(&num_bytes), | 1314 MakeUserPointer(&num_bytes), |
996 MakeUserPointer(handles), | 1315 MakeUserPointer(handles), |
997 MakeUserPointer(&num_handles), | 1316 MakeUserPointer(&num_handles), |
998 MOJO_READ_MESSAGE_FLAG_NONE)); | 1317 MOJO_READ_MESSAGE_FLAG_NONE)); |
999 EXPECT_EQ(kWorldSize, num_bytes); | 1318 EXPECT_EQ(kWorldSize, num_bytes); |
(...skipping 12 matching lines...) Expand all Loading... |
1012 // above note. | 1331 // above note. |
1013 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ph)); | 1332 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ph)); |
1014 | 1333 |
1015 // Write to |ph_received|. Should receive on |ch_received|. | 1334 // Write to |ph_received|. Should receive on |ch_received|. |
1016 num_bytes = kHelloSize; | 1335 num_bytes = kHelloSize; |
1017 EXPECT_EQ(MOJO_RESULT_OK, | 1336 EXPECT_EQ(MOJO_RESULT_OK, |
1018 core()->WriteData(ph_received, | 1337 core()->WriteData(ph_received, |
1019 UserPointer<const void>(kHello), | 1338 UserPointer<const void>(kHello), |
1020 MakeUserPointer(&num_bytes), | 1339 MakeUserPointer(&num_bytes), |
1021 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)); | 1340 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)); |
| 1341 hss = kEmptyMojoHandleSignalsState; |
1022 EXPECT_EQ(MOJO_RESULT_OK, | 1342 EXPECT_EQ(MOJO_RESULT_OK, |
1023 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 1343 core()->Wait(ch_received, |
| 1344 MOJO_HANDLE_SIGNAL_READABLE, |
| 1345 1000000000, |
| 1346 MakeUserPointer(&hss))); |
| 1347 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 1348 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
1024 num_bytes = kBufferSize; | 1349 num_bytes = kBufferSize; |
1025 EXPECT_EQ(MOJO_RESULT_OK, | 1350 EXPECT_EQ(MOJO_RESULT_OK, |
1026 core()->ReadData(ch_received, | 1351 core()->ReadData(ch_received, |
1027 UserPointer<void>(buffer), | 1352 UserPointer<void>(buffer), |
1028 MakeUserPointer(&num_bytes), | 1353 MakeUserPointer(&num_bytes), |
1029 MOJO_READ_MESSAGE_FLAG_NONE)); | 1354 MOJO_READ_MESSAGE_FLAG_NONE)); |
1030 EXPECT_EQ(kHelloSize, num_bytes); | 1355 EXPECT_EQ(kHelloSize, num_bytes); |
1031 EXPECT_STREQ(kHello, buffer); | 1356 EXPECT_STREQ(kHello, buffer); |
1032 | 1357 |
1033 ph = ph_received; | 1358 ph = ph_received; |
(...skipping 20 matching lines...) Expand all Loading... |
1054 | 1379 |
1055 // But |ch| can, even if |ph| is in a two-phase write. | 1380 // But |ch| can, even if |ph| is in a two-phase write. |
1056 EXPECT_EQ(MOJO_RESULT_OK, | 1381 EXPECT_EQ(MOJO_RESULT_OK, |
1057 core()->WriteMessage(h_passing[0], | 1382 core()->WriteMessage(h_passing[0], |
1058 UserPointer<const void>(kHello), | 1383 UserPointer<const void>(kHello), |
1059 kHelloSize, | 1384 kHelloSize, |
1060 MakeUserPointer(&ch), | 1385 MakeUserPointer(&ch), |
1061 1, | 1386 1, |
1062 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1387 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
1063 ch = MOJO_HANDLE_INVALID; | 1388 ch = MOJO_HANDLE_INVALID; |
1064 EXPECT_EQ( | 1389 EXPECT_EQ(MOJO_RESULT_OK, |
1065 MOJO_RESULT_OK, | 1390 core()->Wait(h_passing[1], |
1066 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 1391 MOJO_HANDLE_SIGNAL_READABLE, |
| 1392 1000000000, |
| 1393 NullUserPointer())); |
1067 num_bytes = kBufferSize; | 1394 num_bytes = kBufferSize; |
1068 num_handles = arraysize(handles); | 1395 num_handles = arraysize(handles); |
1069 EXPECT_EQ(MOJO_RESULT_OK, | 1396 EXPECT_EQ(MOJO_RESULT_OK, |
1070 core()->ReadMessage(h_passing[1], | 1397 core()->ReadMessage(h_passing[1], |
1071 UserPointer<void>(buffer), | 1398 UserPointer<void>(buffer), |
1072 MakeUserPointer(&num_bytes), | 1399 MakeUserPointer(&num_bytes), |
1073 MakeUserPointer(handles), | 1400 MakeUserPointer(handles), |
1074 MakeUserPointer(&num_handles), | 1401 MakeUserPointer(&num_handles), |
1075 MOJO_READ_MESSAGE_FLAG_NONE)); | 1402 MOJO_READ_MESSAGE_FLAG_NONE)); |
1076 EXPECT_EQ(kHelloSize, num_bytes); | 1403 EXPECT_EQ(kHelloSize, num_bytes); |
1077 EXPECT_STREQ(kHello, buffer); | 1404 EXPECT_STREQ(kHello, buffer); |
1078 EXPECT_EQ(1u, num_handles); | 1405 EXPECT_EQ(1u, num_handles); |
1079 ch = handles[0]; | 1406 ch = handles[0]; |
1080 EXPECT_NE(ch, MOJO_HANDLE_INVALID); | 1407 EXPECT_NE(ch, MOJO_HANDLE_INVALID); |
1081 | 1408 |
1082 // Complete the two-phase write. | 1409 // Complete the two-phase write. |
1083 static_cast<char*>(write_ptr)[0] = 'x'; | 1410 static_cast<char*>(write_ptr)[0] = 'x'; |
1084 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 1)); | 1411 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 1)); |
1085 | 1412 |
1086 // Wait for |ch| to be readable. | 1413 // Wait for |ch| to be readable. |
1087 EXPECT_EQ(MOJO_RESULT_OK, | 1414 hss = kEmptyMojoHandleSignalsState; |
1088 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 1415 EXPECT_EQ( |
| 1416 MOJO_RESULT_OK, |
| 1417 core()->Wait( |
| 1418 ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000, MakeUserPointer(&hss))); |
| 1419 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 1420 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
1089 | 1421 |
1090 // Make sure that |ch| can't be sent if it's in a two-phase read. | 1422 // Make sure that |ch| can't be sent if it's in a two-phase read. |
1091 const void* read_ptr = NULL; | 1423 const void* read_ptr = NULL; |
1092 num_bytes = 1; | 1424 num_bytes = 1; |
1093 ASSERT_EQ(MOJO_RESULT_OK, | 1425 ASSERT_EQ(MOJO_RESULT_OK, |
1094 core()->BeginReadData(ch, | 1426 core()->BeginReadData(ch, |
1095 MakeUserPointer(&read_ptr), | 1427 MakeUserPointer(&read_ptr), |
1096 MakeUserPointer(&num_bytes), | 1428 MakeUserPointer(&num_bytes), |
1097 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); | 1429 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); |
1098 EXPECT_EQ(MOJO_RESULT_BUSY, | 1430 EXPECT_EQ(MOJO_RESULT_BUSY, |
1099 core()->WriteMessage(h_passing[0], | 1431 core()->WriteMessage(h_passing[0], |
1100 UserPointer<const void>(kHello), | 1432 UserPointer<const void>(kHello), |
1101 kHelloSize, | 1433 kHelloSize, |
1102 MakeUserPointer(&ch), | 1434 MakeUserPointer(&ch), |
1103 1, | 1435 1, |
1104 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1436 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
1105 | 1437 |
1106 // But |ph| can, even if |ch| is in a two-phase read. | 1438 // But |ph| can, even if |ch| is in a two-phase read. |
1107 EXPECT_EQ(MOJO_RESULT_OK, | 1439 EXPECT_EQ(MOJO_RESULT_OK, |
1108 core()->WriteMessage(h_passing[0], | 1440 core()->WriteMessage(h_passing[0], |
1109 UserPointer<const void>(kWorld), | 1441 UserPointer<const void>(kWorld), |
1110 kWorldSize, | 1442 kWorldSize, |
1111 MakeUserPointer(&ph), | 1443 MakeUserPointer(&ph), |
1112 1, | 1444 1, |
1113 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1445 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
1114 ph = MOJO_HANDLE_INVALID; | 1446 ph = MOJO_HANDLE_INVALID; |
1115 EXPECT_EQ( | 1447 hss = kEmptyMojoHandleSignalsState; |
1116 MOJO_RESULT_OK, | 1448 EXPECT_EQ(MOJO_RESULT_OK, |
1117 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 1449 core()->Wait(h_passing[1], |
| 1450 MOJO_HANDLE_SIGNAL_READABLE, |
| 1451 1000000000, |
| 1452 MakeUserPointer(&hss))); |
| 1453 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1454 hss.satisfied_signals); |
| 1455 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1456 hss.satisfiable_signals); |
1118 num_bytes = kBufferSize; | 1457 num_bytes = kBufferSize; |
1119 num_handles = arraysize(handles); | 1458 num_handles = arraysize(handles); |
1120 EXPECT_EQ(MOJO_RESULT_OK, | 1459 EXPECT_EQ(MOJO_RESULT_OK, |
1121 core()->ReadMessage(h_passing[1], | 1460 core()->ReadMessage(h_passing[1], |
1122 UserPointer<void>(buffer), | 1461 UserPointer<void>(buffer), |
1123 MakeUserPointer(&num_bytes), | 1462 MakeUserPointer(&num_bytes), |
1124 MakeUserPointer(handles), | 1463 MakeUserPointer(handles), |
1125 MakeUserPointer(&num_handles), | 1464 MakeUserPointer(&num_handles), |
1126 MOJO_READ_MESSAGE_FLAG_NONE)); | 1465 MOJO_READ_MESSAGE_FLAG_NONE)); |
1127 EXPECT_EQ(kWorldSize, num_bytes); | 1466 EXPECT_EQ(kWorldSize, num_bytes); |
(...skipping 10 matching lines...) Expand all Loading... |
1138 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); | 1477 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); |
1139 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); | 1478 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); |
1140 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); | 1479 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); |
1141 } | 1480 } |
1142 | 1481 |
1143 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. | 1482 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. |
1144 | 1483 |
1145 } // namespace | 1484 } // namespace |
1146 } // namespace system | 1485 } // namespace system |
1147 } // namespace mojo | 1486 } // namespace mojo |
OLD | NEW |