| 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 // This file tests the C API. | 5 // This file tests the C API. |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include "mojo/public/c/system/buffer.h" | 9 #include "mojo/public/c/system/buffer.h" |
| 10 #include "mojo/public/c/system/data_pipe.h" | 10 #include "mojo/public/c/system/data_pipe.h" |
| 11 #include "mojo/public/c/system/handle.h" | 11 #include "mojo/public/c/system/handle.h" |
| 12 #include "mojo/public/c/system/message_pipe.h" | 12 #include "mojo/public/c/system/message_pipe.h" |
| 13 #include "mojo/public/c/system/result.h" | 13 #include "mojo/public/c/system/result.h" |
| 14 #include "mojo/public/c/system/time.h" | 14 #include "mojo/public/c/system/time.h" |
| 15 #include "mojo/public/c/system/wait.h" | 15 #include "mojo/public/c/system/wait.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 17 |
| 18 // Defined in core_unittest_pure_c.c. | 18 // Defined in core_unittest_pure_c.c. |
| 19 extern "C" const char* MinimalCTest(void); | 19 extern "C" const char* MinimalCTest(void); |
| 20 | 20 |
| 21 // Defined in core_unittest_pure_cpp.cc. | 21 // Defined in core_unittest_pure_cpp.cc. |
| 22 const char* MinimalCppTest(); | 22 const char* MinimalCppTest(); |
| 23 | 23 |
| 24 namespace mojo { | 24 namespace mojo { |
| 25 namespace { | 25 namespace { |
| 26 | 26 |
| 27 const MojoHandleSignals kSignalReadadableWritable = | |
| 28 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE; | |
| 29 | |
| 30 const MojoHandleSignals kSignalAll = MOJO_HANDLE_SIGNAL_READABLE | | |
| 31 MOJO_HANDLE_SIGNAL_WRITABLE | | |
| 32 MOJO_HANDLE_SIGNAL_PEER_CLOSED; | |
| 33 | |
| 34 TEST(CoreTest, GetTimeTicksNow) { | 27 TEST(CoreTest, GetTimeTicksNow) { |
| 35 const MojoTimeTicks start = MojoGetTimeTicksNow(); | 28 const MojoTimeTicks start = MojoGetTimeTicksNow(); |
| 36 EXPECT_NE(static_cast<MojoTimeTicks>(0), start) | 29 EXPECT_NE(static_cast<MojoTimeTicks>(0), start) |
| 37 << "MojoGetTimeTicksNow should return nonzero value"; | 30 << "MojoGetTimeTicksNow should return nonzero value"; |
| 38 } | 31 } |
| 39 | 32 |
| 40 // The only handle that's guaranteed to be invalid is |MOJO_HANDLE_INVALID|. | 33 // The only handle that's guaranteed to be invalid is |MOJO_HANDLE_INVALID|. |
| 41 // Tests that everything that takes a handle properly recognizes it. | 34 // Tests that everything that takes a handle properly recognizes it. |
| 42 TEST(CoreTest, InvalidHandle) { | 35 TEST(CoreTest, InvalidHandle) { |
| 43 MojoHandleSignals sig; | 36 MojoHandleSignals sig; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 h1 = MOJO_HANDLE_INVALID; | 112 h1 = MOJO_HANDLE_INVALID; |
| 120 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &h0, &h1)); | 113 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &h0, &h1)); |
| 121 EXPECT_NE(h0, MOJO_HANDLE_INVALID); | 114 EXPECT_NE(h0, MOJO_HANDLE_INVALID); |
| 122 EXPECT_NE(h1, MOJO_HANDLE_INVALID); | 115 EXPECT_NE(h1, MOJO_HANDLE_INVALID); |
| 123 | 116 |
| 124 // Shouldn't be readable, we haven't written anything. | 117 // Shouldn't be readable, we haven't written anything. |
| 125 MojoHandleSignalsState state; | 118 MojoHandleSignalsState state; |
| 126 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 119 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 127 MojoWait(h0, MOJO_HANDLE_SIGNAL_READABLE, 0, &state)); | 120 MojoWait(h0, MOJO_HANDLE_SIGNAL_READABLE, 0, &state)); |
| 128 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals); | 121 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals); |
| 129 EXPECT_EQ(kSignalAll, state.satisfiable_signals); | 122 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 123 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 124 state.satisfiable_signals); |
| 130 | 125 |
| 131 // Should be writable. | 126 // Should be writable. |
| 132 EXPECT_EQ(MOJO_RESULT_OK, | 127 EXPECT_EQ(MOJO_RESULT_OK, |
| 133 MojoWait(h0, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &state)); | 128 MojoWait(h0, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &state)); |
| 134 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals); | 129 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals); |
| 135 EXPECT_EQ(kSignalAll, state.satisfiable_signals); | 130 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 131 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 132 state.satisfiable_signals); |
| 136 | 133 |
| 137 // Last parameter is optional. | 134 // Last parameter is optional. |
| 138 EXPECT_EQ(MOJO_RESULT_OK, | 135 EXPECT_EQ(MOJO_RESULT_OK, |
| 139 MojoWait(h0, MOJO_HANDLE_SIGNAL_WRITABLE, 0, nullptr)); | 136 MojoWait(h0, MOJO_HANDLE_SIGNAL_WRITABLE, 0, nullptr)); |
| 140 | 137 |
| 141 // Try to read. | 138 // Try to read. |
| 142 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 139 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 143 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 140 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 144 MojoReadMessage(h0, buffer, &buffer_size, nullptr, nullptr, | 141 MojoReadMessage(h0, buffer, &buffer_size, nullptr, nullptr, |
| 145 MOJO_READ_MESSAGE_FLAG_NONE)); | 142 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 146 | 143 |
| 147 // Write to |h1|. | 144 // Write to |h1|. |
| 148 static const char kHello[] = "hello"; | 145 static const char kHello[] = "hello"; |
| 149 buffer_size = static_cast<uint32_t>(sizeof(kHello)); | 146 buffer_size = static_cast<uint32_t>(sizeof(kHello)); |
| 150 EXPECT_EQ(MOJO_RESULT_OK, MojoWriteMessage(h1, kHello, buffer_size, nullptr, | 147 EXPECT_EQ(MOJO_RESULT_OK, MojoWriteMessage(h1, kHello, buffer_size, nullptr, |
| 151 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 148 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 152 | 149 |
| 153 // |h0| should be readable. | 150 // |h0| should be readable. |
| 154 uint32_t result_index = 1; | 151 uint32_t result_index = 1; |
| 155 MojoHandleSignalsState states[1]; | 152 MojoHandleSignalsState states[1]; |
| 156 sig = MOJO_HANDLE_SIGNAL_READABLE; | 153 sig = MOJO_HANDLE_SIGNAL_READABLE; |
| 157 EXPECT_EQ(MOJO_RESULT_OK, MojoWaitMany(&h0, &sig, 1, MOJO_DEADLINE_INDEFINITE, | 154 EXPECT_EQ(MOJO_RESULT_OK, MojoWaitMany(&h0, &sig, 1, MOJO_DEADLINE_INDEFINITE, |
| 158 &result_index, states)); | 155 &result_index, states)); |
| 159 | 156 |
| 160 EXPECT_EQ(0u, result_index); | 157 EXPECT_EQ(0u, result_index); |
| 161 EXPECT_EQ(kSignalReadadableWritable, states[0].satisfied_signals); | 158 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 162 EXPECT_EQ(kSignalAll, states[0].satisfiable_signals); | 159 states[0].satisfied_signals); |
| 160 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 161 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 162 states[0].satisfiable_signals); |
| 163 | 163 |
| 164 // Read from |h0|. | 164 // Read from |h0|. |
| 165 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 165 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 166 EXPECT_EQ(MOJO_RESULT_OK, | 166 EXPECT_EQ(MOJO_RESULT_OK, |
| 167 MojoReadMessage(h0, buffer, &buffer_size, nullptr, nullptr, | 167 MojoReadMessage(h0, buffer, &buffer_size, nullptr, nullptr, |
| 168 MOJO_READ_MESSAGE_FLAG_NONE)); | 168 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 169 EXPECT_EQ(static_cast<uint32_t>(sizeof(kHello)), buffer_size); | 169 EXPECT_EQ(static_cast<uint32_t>(sizeof(kHello)), buffer_size); |
| 170 EXPECT_STREQ(kHello, buffer); | 170 EXPECT_STREQ(kHello, buffer); |
| 171 | 171 |
| 172 // |h0| should no longer be readable. | 172 // |h0| should no longer be readable. |
| 173 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 173 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 174 MojoWait(h0, MOJO_HANDLE_SIGNAL_READABLE, 10, &state)); | 174 MojoWait(h0, MOJO_HANDLE_SIGNAL_READABLE, 10, &state)); |
| 175 | 175 |
| 176 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals); | 176 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals); |
| 177 EXPECT_EQ(kSignalAll, state.satisfiable_signals); | 177 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 178 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 179 state.satisfiable_signals); |
| 178 | 180 |
| 179 // Close |h0|. | 181 // Close |h0|. |
| 180 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0)); | 182 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0)); |
| 181 | 183 |
| 182 // |h1| should no longer be readable or writable. | 184 // |h1| should no longer be readable or writable. |
| 183 EXPECT_EQ( | 185 EXPECT_EQ( |
| 184 MOJO_RESULT_FAILED_PRECONDITION, | 186 MOJO_RESULT_FAILED_PRECONDITION, |
| 185 MojoWait(h1, MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 187 MojoWait(h1, MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 186 1000, &state)); | 188 1000, &state)); |
| 187 | 189 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 213 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &hp, &hc)); | 215 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &hp, &hc)); |
| 214 EXPECT_NE(hp, MOJO_HANDLE_INVALID); | 216 EXPECT_NE(hp, MOJO_HANDLE_INVALID); |
| 215 EXPECT_NE(hc, MOJO_HANDLE_INVALID); | 217 EXPECT_NE(hc, MOJO_HANDLE_INVALID); |
| 216 | 218 |
| 217 // The consumer |hc| shouldn't be readable. | 219 // The consumer |hc| shouldn't be readable. |
| 218 MojoHandleSignalsState state; | 220 MojoHandleSignalsState state; |
| 219 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 221 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 220 MojoWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 0, &state)); | 222 MojoWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 0, &state)); |
| 221 | 223 |
| 222 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, state.satisfied_signals); | 224 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, state.satisfied_signals); |
| 223 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 225 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 226 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 224 state.satisfiable_signals); | 227 state.satisfiable_signals); |
| 225 | 228 |
| 226 // The producer |hp| should be writable. | 229 // The producer |hp| should be writable. |
| 227 EXPECT_EQ(MOJO_RESULT_OK, | 230 EXPECT_EQ(MOJO_RESULT_OK, |
| 228 MojoWait(hp, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &state)); | 231 MojoWait(hp, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &state)); |
| 229 | 232 |
| 230 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals); | 233 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals); |
| 231 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 234 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 232 state.satisfiable_signals); | 235 state.satisfiable_signals); |
| 233 | 236 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 250 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 253 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 251 | 254 |
| 252 // |hc| should be(come) readable. | 255 // |hc| should be(come) readable. |
| 253 uint32_t result_index = 1; | 256 uint32_t result_index = 1; |
| 254 MojoHandleSignalsState states[1]; | 257 MojoHandleSignalsState states[1]; |
| 255 sig = MOJO_HANDLE_SIGNAL_READABLE; | 258 sig = MOJO_HANDLE_SIGNAL_READABLE; |
| 256 EXPECT_EQ(MOJO_RESULT_OK, MojoWaitMany(&hc, &sig, 1, MOJO_DEADLINE_INDEFINITE, | 259 EXPECT_EQ(MOJO_RESULT_OK, MojoWaitMany(&hc, &sig, 1, MOJO_DEADLINE_INDEFINITE, |
| 257 &result_index, states)); | 260 &result_index, states)); |
| 258 | 261 |
| 259 EXPECT_EQ(0u, result_index); | 262 EXPECT_EQ(0u, result_index); |
| 260 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, states[0].satisfied_signals); | 263 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 261 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 264 states[0].satisfied_signals); |
| 265 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 266 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 262 states[0].satisfiable_signals); | 267 states[0].satisfiable_signals); |
| 263 | 268 |
| 264 // Do a two-phase write to |hp|. | 269 // Do a two-phase write to |hp|. |
| 265 EXPECT_EQ(MOJO_RESULT_OK, MojoBeginWriteData(hp, &write_pointer, &buffer_size, | 270 EXPECT_EQ(MOJO_RESULT_OK, MojoBeginWriteData(hp, &write_pointer, &buffer_size, |
| 266 MOJO_WRITE_DATA_FLAG_NONE)); | 271 MOJO_WRITE_DATA_FLAG_NONE)); |
| 267 static const char kWorld[] = "world"; | 272 static const char kWorld[] = "world"; |
| 268 ASSERT_GE(buffer_size, sizeof(kWorld)); | 273 ASSERT_GE(buffer_size, sizeof(kWorld)); |
| 269 // Include the terminating null. | 274 // Include the terminating null. |
| 270 memcpy(write_pointer, kWorld, sizeof(kWorld)); | 275 memcpy(write_pointer, kWorld, sizeof(kWorld)); |
| 271 EXPECT_EQ(MOJO_RESULT_OK, | 276 EXPECT_EQ(MOJO_RESULT_OK, |
| 272 MojoEndWriteData(hp, static_cast<uint32_t>(sizeof(kWorld)))); | 277 MojoEndWriteData(hp, static_cast<uint32_t>(sizeof(kWorld)))); |
| 273 | 278 |
| 274 // Read one character from |hc|. | 279 // Read one character from |hc|. |
| 275 memset(buffer, 0, sizeof(buffer)); | 280 memset(buffer, 0, sizeof(buffer)); |
| 276 buffer_size = 1; | 281 buffer_size = 1; |
| 277 EXPECT_EQ(MOJO_RESULT_OK, | 282 EXPECT_EQ(MOJO_RESULT_OK, |
| 278 MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE)); | 283 MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE)); |
| 279 | 284 |
| 280 // Close |hp|. | 285 // Close |hp|. |
| 281 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hp)); | 286 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hp)); |
| 282 | 287 |
| 283 // |hc| should still be readable. | 288 // |hc| should still be readable. |
| 284 EXPECT_EQ(MOJO_RESULT_OK, | 289 EXPECT_EQ(MOJO_RESULT_OK, |
| 285 MojoWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 0, &state)); | 290 MojoWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 0, &state)); |
| 286 | 291 |
| 287 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 292 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 293 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 288 state.satisfied_signals); | 294 state.satisfied_signals); |
| 289 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 295 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 296 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 290 state.satisfiable_signals); | 297 state.satisfiable_signals); |
| 291 | 298 |
| 292 // Do a two-phase read from |hc|. | 299 // Do a two-phase read from |hc|. |
| 293 read_pointer = nullptr; | 300 read_pointer = nullptr; |
| 294 EXPECT_EQ(MOJO_RESULT_OK, MojoBeginReadData(hc, &read_pointer, &buffer_size, | 301 EXPECT_EQ(MOJO_RESULT_OK, MojoBeginReadData(hc, &read_pointer, &buffer_size, |
| 295 MOJO_READ_DATA_FLAG_NONE)); | 302 MOJO_READ_DATA_FLAG_NONE)); |
| 296 ASSERT_LE(buffer_size, sizeof(buffer) - 1); | 303 ASSERT_LE(buffer_size, sizeof(buffer) - 1); |
| 297 memcpy(&buffer[1], read_pointer, buffer_size); | 304 memcpy(&buffer[1], read_pointer, buffer_size); |
| 298 EXPECT_EQ(MOJO_RESULT_OK, MojoEndReadData(hc, buffer_size)); | 305 EXPECT_EQ(MOJO_RESULT_OK, MojoEndReadData(hc, buffer_size)); |
| 299 EXPECT_STREQ("hello world", buffer); | 306 EXPECT_STREQ("hello world", buffer); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 | 372 |
| 366 TEST(CoreTest, MinimalCppTest) { | 373 TEST(CoreTest, MinimalCppTest) { |
| 367 const char* failure = MinimalCppTest(); | 374 const char* failure = MinimalCppTest(); |
| 368 EXPECT_FALSE(failure) << failure; | 375 EXPECT_FALSE(failure) << failure; |
| 369 } | 376 } |
| 370 | 377 |
| 371 // TODO(vtl): Add multi-threaded tests. | 378 // TODO(vtl): Add multi-threaded tests. |
| 372 | 379 |
| 373 } // namespace | 380 } // namespace |
| 374 } // namespace mojo | 381 } // namespace mojo |
| OLD | NEW |