| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 // This file tests the C++ Mojo system core wrappers. | 5 // This file tests the C++ Mojo system core wrappers. |
| 6 // TODO(vtl): Maybe rename "CoreCppTest" -> "CoreTest" if/when this gets | 6 // TODO(vtl): Maybe rename "CoreCppTest" -> "CoreTest" if/when this gets |
| 7 // compiled into a different binary from the C API tests. | 7 // compiled into a different binary from the C API tests. |
| 8 | 8 |
| 9 #include "mojo/public/cpp/system/core.h" | 9 #include "mojo/public/cpp/system/core.h" |
| 10 | 10 |
| 11 #include <stddef.h> |
| 12 |
| 11 #include <map> | 13 #include <map> |
| 12 | 14 |
| 13 #include "mojo/public/cpp/system/macros.h" | 15 #include "mojo/public/cpp/system/macros.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 17 |
| 16 namespace mojo { | 18 namespace mojo { |
| 17 namespace { | 19 namespace { |
| 18 | 20 |
| 21 const MojoHandleSignals kSignalReadableWritable = |
| 22 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE; |
| 23 |
| 24 const MojoHandleSignals kSignalAll = MOJO_HANDLE_SIGNAL_READABLE | |
| 25 MOJO_HANDLE_SIGNAL_WRITABLE | |
| 26 MOJO_HANDLE_SIGNAL_PEER_CLOSED; |
| 27 |
| 19 TEST(CoreCppTest, GetTimeTicksNow) { | 28 TEST(CoreCppTest, GetTimeTicksNow) { |
| 20 const MojoTimeTicks start = GetTimeTicksNow(); | 29 const MojoTimeTicks start = GetTimeTicksNow(); |
| 21 EXPECT_NE(static_cast<MojoTimeTicks>(0), start) | 30 EXPECT_NE(static_cast<MojoTimeTicks>(0), start) |
| 22 << "GetTimeTicksNow should return nonzero value"; | 31 << "GetTimeTicksNow should return nonzero value"; |
| 23 } | 32 } |
| 24 | 33 |
| 25 TEST(CoreCppTest, Basic) { | 34 TEST(CoreCppTest, Basic) { |
| 26 // Basic |Handle| implementation: | 35 // Basic |Handle| implementation: |
| 27 { | 36 { |
| 28 EXPECT_EQ(MOJO_HANDLE_INVALID, kInvalidHandleValue); | 37 EXPECT_EQ(MOJO_HANDLE_INVALID, kInvalidHandleValue); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 // It should still be invalid. | 107 // It should still be invalid. |
| 99 EXPECT_EQ(kInvalidHandleValue, h.get().value()); | 108 EXPECT_EQ(kInvalidHandleValue, h.get().value()); |
| 100 | 109 |
| 101 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 110 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 102 Wait(h.get(), ~MOJO_HANDLE_SIGNAL_NONE, 1000000)); | 111 Wait(h.get(), ~MOJO_HANDLE_SIGNAL_NONE, 1000000)); |
| 103 | 112 |
| 104 std::vector<Handle> wh; | 113 std::vector<Handle> wh; |
| 105 wh.push_back(h.get()); | 114 wh.push_back(h.get()); |
| 106 std::vector<MojoHandleSignals> sigs; | 115 std::vector<MojoHandleSignals> sigs; |
| 107 sigs.push_back(~MOJO_HANDLE_SIGNAL_NONE); | 116 sigs.push_back(~MOJO_HANDLE_SIGNAL_NONE); |
| 108 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 117 WaitManyResult wait_many_result = |
| 109 WaitMany(wh, sigs, MOJO_DEADLINE_INDEFINITE)); | 118 WaitMany(wh, sigs, MOJO_DEADLINE_INDEFINITE, nullptr); |
| 119 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, wait_many_result.result); |
| 120 EXPECT_TRUE(wait_many_result.IsIndexValid()); |
| 121 EXPECT_FALSE(wait_many_result.AreSignalsStatesValid()); |
| 122 |
| 123 // Make sure that our specialized template correctly handles |NULL| as well |
| 124 // as |nullptr|. |
| 125 wait_many_result = WaitMany(wh, sigs, MOJO_DEADLINE_INDEFINITE, NULL); |
| 126 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, wait_many_result.result); |
| 127 EXPECT_EQ(0u, wait_many_result.index); |
| 128 EXPECT_TRUE(wait_many_result.IsIndexValid()); |
| 129 EXPECT_FALSE(wait_many_result.AreSignalsStatesValid()); |
| 110 } | 130 } |
| 111 | 131 |
| 112 // |MakeScopedHandle| (just compilation tests): | 132 // |MakeScopedHandle| (just compilation tests): |
| 113 { | 133 { |
| 114 EXPECT_FALSE(MakeScopedHandle(Handle()).is_valid()); | 134 EXPECT_FALSE(MakeScopedHandle(Handle()).is_valid()); |
| 115 EXPECT_FALSE(MakeScopedHandle(MessagePipeHandle()).is_valid()); | 135 EXPECT_FALSE(MakeScopedHandle(MessagePipeHandle()).is_valid()); |
| 116 EXPECT_FALSE(MakeScopedHandle(DataPipeProducerHandle()).is_valid()); | 136 EXPECT_FALSE(MakeScopedHandle(DataPipeProducerHandle()).is_valid()); |
| 117 EXPECT_FALSE(MakeScopedHandle(DataPipeConsumerHandle()).is_valid()); | 137 EXPECT_FALSE(MakeScopedHandle(DataPipeConsumerHandle()).is_valid()); |
| 118 EXPECT_FALSE(MakeScopedHandle(SharedBufferHandle()).is_valid()); | 138 EXPECT_FALSE(MakeScopedHandle(SharedBufferHandle()).is_valid()); |
| 119 } | 139 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 EXPECT_FALSE(h1.get().is_valid()); | 179 EXPECT_FALSE(h1.get().is_valid()); |
| 160 | 180 |
| 161 CreateMessagePipe(nullptr, &h0, &h1); | 181 CreateMessagePipe(nullptr, &h0, &h1); |
| 162 EXPECT_TRUE(h0.get().is_valid()); | 182 EXPECT_TRUE(h0.get().is_valid()); |
| 163 EXPECT_TRUE(h1.get().is_valid()); | 183 EXPECT_TRUE(h1.get().is_valid()); |
| 164 EXPECT_NE(h0.get().value(), h1.get().value()); | 184 EXPECT_NE(h0.get().value(), h1.get().value()); |
| 165 // Save the handle values, so we can check that things got closed | 185 // Save the handle values, so we can check that things got closed |
| 166 // correctly. | 186 // correctly. |
| 167 hv0 = h0.get().value(); | 187 hv0 = h0.get().value(); |
| 168 MojoHandle hv1 = h1.get().value(); | 188 MojoHandle hv1 = h1.get().value(); |
| 189 MojoHandleSignalsState state; |
| 169 | 190 |
| 170 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 191 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 171 Wait(h0.get(), MOJO_HANDLE_SIGNAL_READABLE, 0)); | 192 Wait(h0.get(), MOJO_HANDLE_SIGNAL_READABLE, 0, &state)); |
| 193 |
| 194 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals); |
| 195 EXPECT_EQ(kSignalAll, state.satisfiable_signals); |
| 196 |
| 172 std::vector<Handle> wh; | 197 std::vector<Handle> wh; |
| 173 wh.push_back(h0.get()); | 198 wh.push_back(h0.get()); |
| 174 wh.push_back(h1.get()); | 199 wh.push_back(h1.get()); |
| 175 std::vector<MojoHandleSignals> sigs; | 200 std::vector<MojoHandleSignals> sigs; |
| 176 sigs.push_back(MOJO_HANDLE_SIGNAL_READABLE); | 201 sigs.push_back(MOJO_HANDLE_SIGNAL_READABLE); |
| 177 sigs.push_back(MOJO_HANDLE_SIGNAL_WRITABLE); | 202 sigs.push_back(MOJO_HANDLE_SIGNAL_WRITABLE); |
| 178 EXPECT_EQ(1, WaitMany(wh, sigs, 1000)); | 203 std::vector<MojoHandleSignalsState> states(sigs.size()); |
| 204 WaitManyResult wait_many_result = WaitMany(wh, sigs, 1000, &states); |
| 205 EXPECT_EQ(MOJO_RESULT_OK, wait_many_result.result); |
| 206 EXPECT_EQ(1u, wait_many_result.index); |
| 207 EXPECT_TRUE(wait_many_result.IsIndexValid()); |
| 208 EXPECT_TRUE(wait_many_result.AreSignalsStatesValid()); |
| 209 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, states[0].satisfied_signals); |
| 210 EXPECT_EQ(kSignalAll, states[0].satisfiable_signals); |
| 211 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, states[1].satisfied_signals); |
| 212 EXPECT_EQ(kSignalAll, states[1].satisfiable_signals); |
| 179 | 213 |
| 180 // Test closing |h1| explicitly. | 214 // Test closing |h1| explicitly. |
| 181 Close(h1.Pass()); | 215 Close(h1.Pass()); |
| 182 EXPECT_FALSE(h1.get().is_valid()); | 216 EXPECT_FALSE(h1.get().is_valid()); |
| 183 | 217 |
| 184 // Make sure |h1| is closed. | 218 // Make sure |h1| is closed. |
| 185 EXPECT_EQ( | 219 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 186 MOJO_RESULT_INVALID_ARGUMENT, | 220 Wait(Handle(hv1), ~MOJO_HANDLE_SIGNAL_NONE, |
| 187 MojoWait(hv1, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE)); | 221 MOJO_DEADLINE_INDEFINITE, nullptr)); |
| 188 | 222 |
| 189 EXPECT_EQ( | 223 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 190 MOJO_RESULT_FAILED_PRECONDITION, | 224 Wait(h0.get(), MOJO_HANDLE_SIGNAL_READABLE, |
| 191 Wait( | 225 MOJO_DEADLINE_INDEFINITE, &state)); |
| 192 h0.get(), MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE)); | 226 |
| 227 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals); |
| 228 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals); |
| 193 } | 229 } |
| 194 // |hv0| should have been closed when |h0| went out of scope, so this close | 230 // |hv0| should have been closed when |h0| went out of scope, so this close |
| 195 // should fail. | 231 // should fail. |
| 196 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(hv0)); | 232 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(hv0)); |
| 197 | 233 |
| 198 // Actually test writing/reading messages. | 234 // Actually test writing/reading messages. |
| 199 { | 235 { |
| 200 ScopedMessagePipeHandle h0; | 236 ScopedMessagePipeHandle h0; |
| 201 ScopedMessagePipeHandle h1; | 237 ScopedMessagePipeHandle h1; |
| 202 CreateMessagePipe(nullptr, &h0, &h1); | 238 CreateMessagePipe(nullptr, &h0, &h1); |
| 203 | 239 |
| 204 const char kHello[] = "hello"; | 240 const char kHello[] = "hello"; |
| 205 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); | 241 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); |
| 206 EXPECT_EQ(MOJO_RESULT_OK, | 242 EXPECT_EQ(MOJO_RESULT_OK, |
| 207 WriteMessageRaw(h0.get(), | 243 WriteMessageRaw(h0.get(), |
| 208 kHello, | 244 kHello, |
| 209 kHelloSize, | 245 kHelloSize, |
| 210 nullptr, | 246 nullptr, |
| 211 0, | 247 0, |
| 212 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 248 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 213 EXPECT_EQ( | 249 |
| 214 MOJO_RESULT_OK, | 250 MojoHandleSignalsState state; |
| 215 Wait( | 251 EXPECT_EQ(MOJO_RESULT_OK, Wait(h1.get(), MOJO_HANDLE_SIGNAL_READABLE, |
| 216 h1.get(), MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE)); | 252 MOJO_DEADLINE_INDEFINITE, &state)); |
| 253 EXPECT_EQ(kSignalReadableWritable, state.satisfied_signals); |
| 254 EXPECT_EQ(kSignalAll, state.satisfiable_signals); |
| 255 |
| 217 char buffer[10] = {0}; | 256 char buffer[10] = {0}; |
| 218 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 257 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 219 EXPECT_EQ(MOJO_RESULT_OK, | 258 EXPECT_EQ(MOJO_RESULT_OK, |
| 220 ReadMessageRaw(h1.get(), | 259 ReadMessageRaw(h1.get(), |
| 221 buffer, | 260 buffer, |
| 222 &buffer_size, | 261 &buffer_size, |
| 223 nullptr, | 262 nullptr, |
| 224 nullptr, | 263 nullptr, |
| 225 MOJO_READ_MESSAGE_FLAG_NONE)); | 264 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 226 EXPECT_EQ(kHelloSize, buffer_size); | 265 EXPECT_EQ(kHelloSize, buffer_size); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 252 WriteMessageRaw(h1.get(), | 291 WriteMessageRaw(h1.get(), |
| 253 kHello, | 292 kHello, |
| 254 kHelloSize, | 293 kHelloSize, |
| 255 handles, | 294 handles, |
| 256 handles_count, | 295 handles_count, |
| 257 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 296 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 258 // |handles[0]| should actually be invalid now. | 297 // |handles[0]| should actually be invalid now. |
| 259 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handles[0])); | 298 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handles[0])); |
| 260 | 299 |
| 261 // Read "hello" and the sent handle. | 300 // Read "hello" and the sent handle. |
| 262 EXPECT_EQ( | 301 EXPECT_EQ(MOJO_RESULT_OK, Wait(h0.get(), MOJO_HANDLE_SIGNAL_READABLE, |
| 263 MOJO_RESULT_OK, | 302 MOJO_DEADLINE_INDEFINITE, &state)); |
| 264 Wait( | 303 EXPECT_EQ(kSignalReadableWritable, state.satisfied_signals); |
| 265 h0.get(), MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE)); | 304 EXPECT_EQ(kSignalAll, state.satisfiable_signals); |
| 305 |
| 266 memset(buffer, 0, sizeof(buffer)); | 306 memset(buffer, 0, sizeof(buffer)); |
| 267 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 307 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 268 for (size_t i = 0; i < MOJO_ARRAYSIZE(handles); i++) | 308 for (size_t i = 0; i < MOJO_ARRAYSIZE(handles); i++) |
| 269 handles[i] = kInvalidHandleValue; | 309 handles[i] = kInvalidHandleValue; |
| 270 handles_count = static_cast<uint32_t>(MOJO_ARRAYSIZE(handles)); | 310 handles_count = static_cast<uint32_t>(MOJO_ARRAYSIZE(handles)); |
| 271 EXPECT_EQ(MOJO_RESULT_OK, | 311 EXPECT_EQ(MOJO_RESULT_OK, |
| 272 ReadMessageRaw(h0.get(), | 312 ReadMessageRaw(h0.get(), |
| 273 buffer, | 313 buffer, |
| 274 &buffer_size, | 314 &buffer_size, |
| 275 handles, | 315 handles, |
| 276 &handles_count, | 316 &handles_count, |
| 277 MOJO_READ_MESSAGE_FLAG_NONE)); | 317 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 278 EXPECT_EQ(kHelloSize, buffer_size); | 318 EXPECT_EQ(kHelloSize, buffer_size); |
| 279 EXPECT_STREQ(kHello, buffer); | 319 EXPECT_STREQ(kHello, buffer); |
| 280 EXPECT_EQ(1u, handles_count); | 320 EXPECT_EQ(1u, handles_count); |
| 281 EXPECT_NE(kInvalidHandleValue, handles[0]); | 321 EXPECT_NE(kInvalidHandleValue, handles[0]); |
| 282 | 322 |
| 283 // Read from the sent/received handle. | 323 // Read from the sent/received handle. |
| 284 mp.handle1.reset(MessagePipeHandle(handles[0])); | 324 mp.handle1.reset(MessagePipeHandle(handles[0])); |
| 285 // Save |handles[0]| to check that it gets properly closed. | 325 // Save |handles[0]| to check that it gets properly closed. |
| 286 hv0 = handles[0]; | 326 hv0 = handles[0]; |
| 327 |
| 287 EXPECT_EQ(MOJO_RESULT_OK, | 328 EXPECT_EQ(MOJO_RESULT_OK, |
| 288 Wait(mp.handle1.get(), | 329 Wait(mp.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE, |
| 289 MOJO_HANDLE_SIGNAL_READABLE, | 330 MOJO_DEADLINE_INDEFINITE, &state)); |
| 290 MOJO_DEADLINE_INDEFINITE)); | 331 EXPECT_EQ(kSignalReadableWritable, state.satisfied_signals); |
| 332 EXPECT_EQ(kSignalAll, state.satisfiable_signals); |
| 333 |
| 291 memset(buffer, 0, sizeof(buffer)); | 334 memset(buffer, 0, sizeof(buffer)); |
| 292 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 335 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 293 for (size_t i = 0; i < MOJO_ARRAYSIZE(handles); i++) | 336 for (size_t i = 0; i < MOJO_ARRAYSIZE(handles); i++) |
| 294 handles[i] = kInvalidHandleValue; | 337 handles[i] = kInvalidHandleValue; |
| 295 handles_count = static_cast<uint32_t>(MOJO_ARRAYSIZE(handles)); | 338 handles_count = static_cast<uint32_t>(MOJO_ARRAYSIZE(handles)); |
| 296 EXPECT_EQ(MOJO_RESULT_OK, | 339 EXPECT_EQ(MOJO_RESULT_OK, |
| 297 ReadMessageRaw(mp.handle1.get(), | 340 ReadMessageRaw(mp.handle1.get(), |
| 298 buffer, | 341 buffer, |
| 299 &buffer_size, | 342 &buffer_size, |
| 300 handles, | 343 handles, |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 | 486 |
| 444 buffer1 = buffer1.Pass(); | 487 buffer1 = buffer1.Pass(); |
| 445 | 488 |
| 446 EXPECT_TRUE(buffer1.is_valid()); | 489 EXPECT_TRUE(buffer1.is_valid()); |
| 447 } | 490 } |
| 448 | 491 |
| 449 // TODO(vtl): Write data pipe tests. | 492 // TODO(vtl): Write data pipe tests. |
| 450 | 493 |
| 451 } // namespace | 494 } // namespace |
| 452 } // namespace mojo | 495 } // namespace mojo |
| OLD | NEW |