| 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" |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 67 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 68 MojoWriteData(MOJO_HANDLE_INVALID, buffer, &buffer_size, | 68 MojoWriteData(MOJO_HANDLE_INVALID, buffer, &buffer_size, |
| 69 MOJO_WRITE_DATA_FLAG_NONE)); | 69 MOJO_WRITE_DATA_FLAG_NONE)); |
| 70 write_pointer = nullptr; | 70 write_pointer = nullptr; |
| 71 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 71 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 72 MojoBeginWriteData(MOJO_HANDLE_INVALID, &write_pointer, | 72 MojoBeginWriteData(MOJO_HANDLE_INVALID, &write_pointer, |
| 73 &buffer_size, MOJO_WRITE_DATA_FLAG_NONE)); | 73 &buffer_size, MOJO_WRITE_DATA_FLAG_NONE)); |
| 74 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 74 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 75 MojoEndWriteData(MOJO_HANDLE_INVALID, 1u)); | 75 MojoEndWriteData(MOJO_HANDLE_INVALID, 1u)); |
| 76 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 76 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 77 // TODO(vtl): Enable once I've added support for NaCl. |
| 78 #ifndef __native_client__ |
| 79 MojoDataPipeConsumerOptions dpc_options = { |
| 80 sizeof(MojoDataPipeConsumerOptions), 0u}; |
| 81 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 82 MojoSetDataPipeConsumerOptions(MOJO_HANDLE_INVALID, &dpc_options)); |
| 83 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 84 MojoGetDataPipeConsumerOptions( |
| 85 MOJO_HANDLE_INVALID, &dpc_options, |
| 86 static_cast<uint32_t>(sizeof(dpc_options)))); |
| 87 #endif |
| 77 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 88 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 78 MojoReadData(MOJO_HANDLE_INVALID, buffer, &buffer_size, | 89 MojoReadData(MOJO_HANDLE_INVALID, buffer, &buffer_size, |
| 79 MOJO_READ_DATA_FLAG_NONE)); | 90 MOJO_READ_DATA_FLAG_NONE)); |
| 80 read_pointer = nullptr; | 91 read_pointer = nullptr; |
| 81 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 92 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 82 MojoBeginReadData(MOJO_HANDLE_INVALID, &read_pointer, &buffer_size, | 93 MojoBeginReadData(MOJO_HANDLE_INVALID, &read_pointer, &buffer_size, |
| 83 MOJO_READ_DATA_FLAG_NONE)); | 94 MOJO_READ_DATA_FLAG_NONE)); |
| 84 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 95 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 85 MojoEndReadData(MOJO_HANDLE_INVALID, 1u)); | 96 MojoEndReadData(MOJO_HANDLE_INVALID, 1u)); |
| 86 | 97 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 buffer_size = static_cast<uint32_t>(sizeof(kHello)); | 157 buffer_size = static_cast<uint32_t>(sizeof(kHello)); |
| 147 EXPECT_EQ(MOJO_RESULT_OK, MojoWriteMessage(h1, kHello, buffer_size, nullptr, | 158 EXPECT_EQ(MOJO_RESULT_OK, MojoWriteMessage(h1, kHello, buffer_size, nullptr, |
| 148 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 159 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 149 | 160 |
| 150 // |h0| should be readable. | 161 // |h0| should be readable. |
| 151 uint32_t result_index = 1; | 162 uint32_t result_index = 1; |
| 152 MojoHandleSignalsState states[1]; | 163 MojoHandleSignalsState states[1]; |
| 153 sig = MOJO_HANDLE_SIGNAL_READABLE; | 164 sig = MOJO_HANDLE_SIGNAL_READABLE; |
| 154 EXPECT_EQ(MOJO_RESULT_OK, MojoWaitMany(&h0, &sig, 1, MOJO_DEADLINE_INDEFINITE, | 165 EXPECT_EQ(MOJO_RESULT_OK, MojoWaitMany(&h0, &sig, 1, MOJO_DEADLINE_INDEFINITE, |
| 155 &result_index, states)); | 166 &result_index, states)); |
| 156 | |
| 157 EXPECT_EQ(0u, result_index); | 167 EXPECT_EQ(0u, result_index); |
| 158 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 168 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 159 states[0].satisfied_signals); | 169 states[0].satisfied_signals); |
| 160 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 170 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 161 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 171 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 162 states[0].satisfiable_signals); | 172 states[0].satisfiable_signals); |
| 163 | 173 |
| 164 // Read from |h0|. | 174 // Read from |h0|. |
| 165 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 175 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 166 EXPECT_EQ(MOJO_RESULT_OK, | 176 EXPECT_EQ(MOJO_RESULT_OK, |
| 167 MojoReadMessage(h0, buffer, &buffer_size, nullptr, nullptr, | 177 MojoReadMessage(h0, buffer, &buffer_size, nullptr, nullptr, |
| 168 MOJO_READ_MESSAGE_FLAG_NONE)); | 178 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 169 EXPECT_EQ(static_cast<uint32_t>(sizeof(kHello)), buffer_size); | 179 EXPECT_EQ(static_cast<uint32_t>(sizeof(kHello)), buffer_size); |
| 170 EXPECT_STREQ(kHello, buffer); | 180 EXPECT_STREQ(kHello, buffer); |
| 171 | 181 |
| 172 // |h0| should no longer be readable. | 182 // |h0| should no longer be readable. |
| 173 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 183 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 174 MojoWait(h0, MOJO_HANDLE_SIGNAL_READABLE, 10, &state)); | 184 MojoWait(h0, MOJO_HANDLE_SIGNAL_READABLE, 10, &state)); |
| 175 | |
| 176 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals); | 185 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals); |
| 177 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 186 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 178 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 187 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 179 state.satisfiable_signals); | 188 state.satisfiable_signals); |
| 180 | 189 |
| 181 // Close |h0|. | 190 // Close |h0|. |
| 182 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0)); | 191 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0)); |
| 183 | 192 |
| 184 // |h1| should no longer be readable or writable. | 193 // |h1| should no longer be readable or writable. |
| 185 EXPECT_EQ( | 194 EXPECT_EQ( |
| 186 MOJO_RESULT_FAILED_PRECONDITION, | 195 MOJO_RESULT_FAILED_PRECONDITION, |
| 187 MojoWait(h1, MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 196 MojoWait(h1, MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 188 1000, &state)); | 197 1000, &state)); |
| 189 | |
| 190 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals); | 198 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals); |
| 191 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals); | 199 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals); |
| 192 | 200 |
| 193 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1)); | 201 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1)); |
| 194 } | 202 } |
| 195 | 203 |
| 196 // TODO(ncbray): enable these tests once NaCl supports the corresponding APIs. | 204 // TODO(ncbray): enable this test once NaCl supports the corresponding APIs. |
| 197 #ifdef __native_client__ | 205 #ifdef __native_client__ |
| 198 #define MAYBE_BasicDataPipe DISABLED_BasicDataPipe | 206 #define MAYBE_BasicDataPipe DISABLED_BasicDataPipe |
| 199 #define MAYBE_BasicSharedBuffer DISABLED_BasicSharedBuffer | |
| 200 #else | 207 #else |
| 201 #define MAYBE_BasicDataPipe BasicDataPipe | 208 #define MAYBE_BasicDataPipe BasicDataPipe |
| 202 #define MAYBE_BasicSharedBuffer BasicSharedBuffer | |
| 203 #endif | 209 #endif |
| 204 | |
| 205 TEST(CoreTest, MAYBE_BasicDataPipe) { | 210 TEST(CoreTest, MAYBE_BasicDataPipe) { |
| 206 MojoHandle hp, hc; | 211 MojoHandle hp, hc; |
| 207 MojoHandleSignals sig; | 212 MojoHandleSignals sig; |
| 208 char buffer[20] = {0}; | 213 char buffer[20] = {0}; |
| 209 uint32_t buffer_size; | 214 uint32_t buffer_size; |
| 210 void* write_pointer; | 215 void* write_pointer; |
| 211 const void* read_pointer; | 216 const void* read_pointer; |
| 212 | 217 |
| 213 hp = MOJO_HANDLE_INVALID; | 218 hp = MOJO_HANDLE_INVALID; |
| 214 hc = MOJO_HANDLE_INVALID; | 219 hc = MOJO_HANDLE_INVALID; |
| 215 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &hp, &hc)); | 220 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &hp, &hc)); |
| 216 EXPECT_NE(hp, MOJO_HANDLE_INVALID); | 221 EXPECT_NE(hp, MOJO_HANDLE_INVALID); |
| 217 EXPECT_NE(hc, MOJO_HANDLE_INVALID); | 222 EXPECT_NE(hc, MOJO_HANDLE_INVALID); |
| 218 | 223 |
| 219 // The consumer |hc| shouldn't be readable. | 224 // The consumer |hc| shouldn't be readable. |
| 220 MojoHandleSignalsState state; | 225 MojoHandleSignalsState state; |
| 221 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 226 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 222 MojoWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 0, &state)); | 227 MojoWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 0, &state)); |
| 223 | |
| 224 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, state.satisfied_signals); | 228 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, state.satisfied_signals); |
| 225 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 229 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 226 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 230 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 227 state.satisfiable_signals); | 231 state.satisfiable_signals); |
| 228 | 232 |
| 229 // The producer |hp| should be writable. | 233 // The producer |hp| should be writable. |
| 230 EXPECT_EQ(MOJO_RESULT_OK, | 234 EXPECT_EQ(MOJO_RESULT_OK, |
| 231 MojoWait(hp, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &state)); | 235 MojoWait(hp, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &state)); |
| 232 | |
| 233 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals); | 236 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals); |
| 234 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 237 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 235 state.satisfiable_signals); | 238 state.satisfiable_signals); |
| 236 | 239 |
| 237 // Try to read from |hc|. | 240 // Try to read from |hc|. |
| 238 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 241 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 239 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 242 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 240 MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE)); | 243 MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE)); |
| 241 | 244 |
| 242 // Try to begin a two-phase read from |hc|. | 245 // Try to begin a two-phase read from |hc|. |
| 243 read_pointer = nullptr; | 246 read_pointer = nullptr; |
| 244 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 247 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 245 MojoBeginReadData(hc, &read_pointer, &buffer_size, | 248 MojoBeginReadData(hc, &read_pointer, &buffer_size, |
| 246 MOJO_READ_DATA_FLAG_NONE)); | 249 MOJO_READ_DATA_FLAG_NONE)); |
| 247 | 250 |
| 248 // Write to |hp|. | 251 // Write to |hp|. |
| 249 static const char kHello[] = "hello "; | 252 static const char kHello[] = "hello "; |
| 250 // Don't include terminating null. | 253 // Don't include terminating null. |
| 251 buffer_size = static_cast<uint32_t>(strlen(kHello)); | 254 buffer_size = static_cast<uint32_t>(strlen(kHello)); |
| 252 EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(hp, kHello, &buffer_size, | 255 EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(hp, kHello, &buffer_size, |
| 253 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 256 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 254 | 257 |
| 255 // |hc| should be(come) readable. | 258 // |hc| should be(come) readable. |
| 256 uint32_t result_index = 1; | 259 uint32_t result_index = 1; |
| 257 MojoHandleSignalsState states[1]; | 260 MojoHandleSignalsState states[1]; |
| 258 sig = MOJO_HANDLE_SIGNAL_READABLE; | 261 sig = MOJO_HANDLE_SIGNAL_READABLE; |
| 259 EXPECT_EQ(MOJO_RESULT_OK, MojoWaitMany(&hc, &sig, 1, MOJO_DEADLINE_INDEFINITE, | 262 EXPECT_EQ(MOJO_RESULT_OK, MojoWaitMany(&hc, &sig, 1, MOJO_DEADLINE_INDEFINITE, |
| 260 &result_index, states)); | 263 &result_index, states)); |
| 261 | |
| 262 EXPECT_EQ(0u, result_index); | 264 EXPECT_EQ(0u, result_index); |
| 263 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 265 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 264 states[0].satisfied_signals); | 266 states[0].satisfied_signals); |
| 265 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 267 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 266 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 268 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 267 states[0].satisfiable_signals); | 269 states[0].satisfiable_signals); |
| 268 | 270 |
| 269 // Do a two-phase write to |hp|. | 271 // Do a two-phase write to |hp|. |
| 270 EXPECT_EQ(MOJO_RESULT_OK, MojoBeginWriteData(hp, &write_pointer, &buffer_size, | 272 EXPECT_EQ(MOJO_RESULT_OK, MojoBeginWriteData(hp, &write_pointer, &buffer_size, |
| 271 MOJO_WRITE_DATA_FLAG_NONE)); | 273 MOJO_WRITE_DATA_FLAG_NONE)); |
| 272 static const char kWorld[] = "world"; | 274 static const char kWorld[] = "world"; |
| 273 ASSERT_GE(buffer_size, sizeof(kWorld)); | 275 ASSERT_GE(buffer_size, sizeof(kWorld)); |
| 274 // Include the terminating null. | 276 // Include the terminating null. |
| 275 memcpy(write_pointer, kWorld, sizeof(kWorld)); | 277 memcpy(write_pointer, kWorld, sizeof(kWorld)); |
| 276 EXPECT_EQ(MOJO_RESULT_OK, | 278 EXPECT_EQ(MOJO_RESULT_OK, |
| 277 MojoEndWriteData(hp, static_cast<uint32_t>(sizeof(kWorld)))); | 279 MojoEndWriteData(hp, static_cast<uint32_t>(sizeof(kWorld)))); |
| 278 | 280 |
| 279 // Read one character from |hc|. | 281 // Read one character from |hc|. |
| 280 memset(buffer, 0, sizeof(buffer)); | 282 memset(buffer, 0, sizeof(buffer)); |
| 281 buffer_size = 1; | 283 buffer_size = 1; |
| 282 EXPECT_EQ(MOJO_RESULT_OK, | 284 EXPECT_EQ(MOJO_RESULT_OK, |
| 283 MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE)); | 285 MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE)); |
| 284 | 286 |
| 285 // Close |hp|. | 287 // Close |hp|. |
| 286 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hp)); | 288 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hp)); |
| 287 | 289 |
| 288 // |hc| should still be readable. | 290 // |hc| should still be readable. |
| 289 EXPECT_EQ(MOJO_RESULT_OK, | 291 EXPECT_EQ(MOJO_RESULT_OK, |
| 290 MojoWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 0, &state)); | 292 MojoWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 0, &state)); |
| 291 | |
| 292 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 293 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 293 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 294 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 294 state.satisfied_signals); | 295 state.satisfied_signals); |
| 295 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 296 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 296 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 297 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 297 state.satisfiable_signals); | 298 state.satisfiable_signals); |
| 298 | 299 |
| 299 // Do a two-phase read from |hc|. | 300 // Do a two-phase read from |hc|. |
| 300 read_pointer = nullptr; | 301 read_pointer = nullptr; |
| 301 EXPECT_EQ(MOJO_RESULT_OK, MojoBeginReadData(hc, &read_pointer, &buffer_size, | 302 EXPECT_EQ(MOJO_RESULT_OK, MojoBeginReadData(hc, &read_pointer, &buffer_size, |
| 302 MOJO_READ_DATA_FLAG_NONE)); | 303 MOJO_READ_DATA_FLAG_NONE)); |
| 303 ASSERT_LE(buffer_size, sizeof(buffer) - 1); | 304 ASSERT_LE(buffer_size, sizeof(buffer) - 1); |
| 304 memcpy(&buffer[1], read_pointer, buffer_size); | 305 memcpy(&buffer[1], read_pointer, buffer_size); |
| 305 EXPECT_EQ(MOJO_RESULT_OK, MojoEndReadData(hc, buffer_size)); | 306 EXPECT_EQ(MOJO_RESULT_OK, MojoEndReadData(hc, buffer_size)); |
| 306 EXPECT_STREQ("hello world", buffer); | 307 EXPECT_STREQ("hello world", buffer); |
| 307 | 308 |
| 308 // |hc| should no longer be readable. | 309 // |hc| should no longer be readable. |
| 309 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 310 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 310 MojoWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 1000, &state)); | 311 MojoWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 1000, &state)); |
| 311 | |
| 312 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals); | 312 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals); |
| 313 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals); | 313 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals); |
| 314 | 314 |
| 315 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hc)); | 315 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hc)); |
| 316 | 316 |
| 317 // TODO(vtl): Test the other way around -- closing the consumer should make | 317 // TODO(vtl): Test the other way around -- closing the consumer should make |
| 318 // the producer never-writable? | 318 // the producer never-writable? |
| 319 } | 319 } |
| 320 | 320 |
| 321 // TODO(vtl): Enable once I've added support for NaCl. |
| 322 #ifndef __native_client__ |
| 323 TEST(CoreTest, DataPipeReadThreshold) { |
| 324 MojoHandle hp = MOJO_HANDLE_INVALID; |
| 325 MojoHandle hc = MOJO_HANDLE_INVALID; |
| 326 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &hp, &hc)); |
| 327 EXPECT_NE(hp, MOJO_HANDLE_INVALID); |
| 328 EXPECT_NE(hc, MOJO_HANDLE_INVALID); |
| 329 |
| 330 MojoDataPipeConsumerOptions copts; |
| 331 static const uint32_t kCoptsSize = static_cast<uint32_t>(sizeof(copts)); |
| 332 |
| 333 // Check the current read threshold; should be the default. |
| 334 memset(&copts, 255, kCoptsSize); |
| 335 EXPECT_EQ(MOJO_RESULT_OK, |
| 336 MojoGetDataPipeConsumerOptions(hc, &copts, kCoptsSize)); |
| 337 EXPECT_EQ(kCoptsSize, copts.struct_size); |
| 338 EXPECT_EQ(0u, copts.read_threshold_num_bytes); |
| 339 |
| 340 // Shouldn't have the read threshold signal yet. |
| 341 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 342 MojoWait(hc, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 1000, nullptr)); |
| 343 |
| 344 // Write a byte to |hp|. |
| 345 static const char kAByte = 'A'; |
| 346 uint32_t num_bytes = 1u; |
| 347 EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(hp, &kAByte, &num_bytes, |
| 348 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 349 EXPECT_EQ(1u, num_bytes); |
| 350 |
| 351 // Now should have the read threshold signal. |
| 352 MojoHandleSignalsState state; |
| 353 EXPECT_EQ(MOJO_RESULT_OK, |
| 354 MojoWait(hc, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 1000, &state)); |
| 355 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 356 state.satisfied_signals); |
| 357 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 358 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 359 state.satisfiable_signals); |
| 360 |
| 361 // Set the read threshold to 3, and then check it. |
| 362 copts.struct_size = kCoptsSize; |
| 363 copts.read_threshold_num_bytes = 3u; |
| 364 EXPECT_EQ(MOJO_RESULT_OK, MojoSetDataPipeConsumerOptions(hc, &copts)); |
| 365 |
| 366 memset(&copts, 255, kCoptsSize); |
| 367 EXPECT_EQ(MOJO_RESULT_OK, |
| 368 MojoGetDataPipeConsumerOptions(hc, &copts, kCoptsSize)); |
| 369 EXPECT_EQ(kCoptsSize, copts.struct_size); |
| 370 EXPECT_EQ(3u, copts.read_threshold_num_bytes); |
| 371 |
| 372 // Shouldn't have the read threshold signal again. |
| 373 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 374 MojoWait(hc, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 0, nullptr)); |
| 375 |
| 376 // Write another byte to |hp|. |
| 377 static const char kBByte = 'B'; |
| 378 num_bytes = 1u; |
| 379 EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(hp, &kBByte, &num_bytes, |
| 380 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 381 EXPECT_EQ(1u, num_bytes); |
| 382 |
| 383 // Still shouldn't have the read threshold signal. |
| 384 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 385 MojoWait(hc, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 1000, nullptr)); |
| 386 |
| 387 // Write a third byte to |hp|. |
| 388 static const char kCByte = 'C'; |
| 389 num_bytes = 1u; |
| 390 EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(hp, &kCByte, &num_bytes, |
| 391 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 392 EXPECT_EQ(1u, num_bytes); |
| 393 |
| 394 // Now should have the read threshold signal. |
| 395 EXPECT_EQ(MOJO_RESULT_OK, |
| 396 MojoWait(hc, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 1000, nullptr)); |
| 397 |
| 398 // Read a byte. |
| 399 char read_byte = 'x'; |
| 400 num_bytes = 1u; |
| 401 EXPECT_EQ(MOJO_RESULT_OK, |
| 402 MojoReadData(hc, &read_byte, &num_bytes, MOJO_READ_DATA_FLAG_NONE)); |
| 403 EXPECT_EQ(1u, num_bytes); |
| 404 EXPECT_EQ(kAByte, read_byte); |
| 405 |
| 406 // Shouldn't have the read threshold signal again. |
| 407 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 408 MojoWait(hc, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 0, nullptr)); |
| 409 |
| 410 // Set the read threshold to 2. |
| 411 copts.struct_size = kCoptsSize; |
| 412 copts.read_threshold_num_bytes = 2u; |
| 413 EXPECT_EQ(MOJO_RESULT_OK, MojoSetDataPipeConsumerOptions(hc, &copts)); |
| 414 |
| 415 // Should have the read threshold signal again. |
| 416 EXPECT_EQ(MOJO_RESULT_OK, |
| 417 MojoWait(hc, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 0, nullptr)); |
| 418 |
| 419 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hp)); |
| 420 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hc)); |
| 421 } |
| 422 #endif |
| 423 |
| 424 // TODO(ncbray): enable this test once NaCl supports the corresponding APIs. |
| 425 #ifdef __native_client__ |
| 426 #define MAYBE_BasicSharedBuffer DISABLED_BasicSharedBuffer |
| 427 #else |
| 428 #define MAYBE_BasicSharedBuffer BasicSharedBuffer |
| 429 #endif |
| 321 TEST(CoreTest, MAYBE_BasicSharedBuffer) { | 430 TEST(CoreTest, MAYBE_BasicSharedBuffer) { |
| 322 MojoHandle h0, h1; | 431 MojoHandle h0, h1; |
| 323 void* pointer; | 432 void* pointer; |
| 324 | 433 |
| 325 // Create a shared buffer (|h0|). | 434 // Create a shared buffer (|h0|). |
| 326 h0 = MOJO_HANDLE_INVALID; | 435 h0 = MOJO_HANDLE_INVALID; |
| 327 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateSharedBuffer(nullptr, 100, &h0)); | 436 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateSharedBuffer(nullptr, 100, &h0)); |
| 328 EXPECT_NE(h0, MOJO_HANDLE_INVALID); | 437 EXPECT_NE(h0, MOJO_HANDLE_INVALID); |
| 329 | 438 |
| 439 // Check information about the buffer from |h0|. |
| 440 MojoBufferInformation info = {}; |
| 441 static const uint32_t kInfoSize = static_cast<uint32_t>(sizeof(info)); |
| 442 EXPECT_EQ(MOJO_RESULT_OK, MojoGetBufferInformation(h0, &info, kInfoSize)); |
| 443 EXPECT_EQ(kInfoSize, info.struct_size); |
| 444 EXPECT_EQ(MOJO_BUFFER_INFORMATION_FLAG_NONE, info.flags); |
| 445 EXPECT_EQ(100u, info.num_bytes); |
| 446 |
| 330 // Map everything. | 447 // Map everything. |
| 331 pointer = nullptr; | 448 pointer = nullptr; |
| 332 EXPECT_EQ(MOJO_RESULT_OK, | 449 EXPECT_EQ(MOJO_RESULT_OK, |
| 333 MojoMapBuffer(h0, 0, 100, &pointer, MOJO_MAP_BUFFER_FLAG_NONE)); | 450 MojoMapBuffer(h0, 0, 100, &pointer, MOJO_MAP_BUFFER_FLAG_NONE)); |
| 334 ASSERT_TRUE(pointer); | 451 ASSERT_TRUE(pointer); |
| 335 static_cast<char*>(pointer)[50] = 'x'; | 452 static_cast<char*>(pointer)[50] = 'x'; |
| 336 | 453 |
| 337 // Duplicate |h0| to |h1|. | 454 // Duplicate |h0| to |h1|. |
| 338 h1 = MOJO_HANDLE_INVALID; | 455 h1 = MOJO_HANDLE_INVALID; |
| 339 EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateBufferHandle(h0, nullptr, &h1)); | 456 EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateBufferHandle(h0, nullptr, &h1)); |
| 340 EXPECT_NE(h1, MOJO_HANDLE_INVALID); | 457 EXPECT_NE(h1, MOJO_HANDLE_INVALID); |
| 341 | 458 |
| 459 // Check information about the buffer from |h1|. |
| 460 info = MojoBufferInformation(); |
| 461 EXPECT_EQ(MOJO_RESULT_OK, MojoGetBufferInformation(h1, &info, kInfoSize)); |
| 462 EXPECT_EQ(kInfoSize, info.struct_size); |
| 463 EXPECT_EQ(MOJO_BUFFER_INFORMATION_FLAG_NONE, info.flags); |
| 464 EXPECT_EQ(100u, info.num_bytes); |
| 465 |
| 342 // Close |h0|. | 466 // Close |h0|. |
| 343 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0)); | 467 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0)); |
| 344 | 468 |
| 345 // The mapping should still be good. | 469 // The mapping should still be good. |
| 346 static_cast<char*>(pointer)[51] = 'y'; | 470 static_cast<char*>(pointer)[51] = 'y'; |
| 347 | 471 |
| 348 // Unmap it. | 472 // Unmap it. |
| 349 EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(pointer)); | 473 EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(pointer)); |
| 350 | 474 |
| 351 // Map half of |h1|. | 475 // Map half of |h1|. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 372 | 496 |
| 373 TEST(CoreTest, MinimalCppTest) { | 497 TEST(CoreTest, MinimalCppTest) { |
| 374 const char* failure = MinimalCppTest(); | 498 const char* failure = MinimalCppTest(); |
| 375 EXPECT_FALSE(failure) << failure; | 499 EXPECT_FALSE(failure) << failure; |
| 376 } | 500 } |
| 377 | 501 |
| 378 // TODO(vtl): Add multi-threaded tests. | 502 // TODO(vtl): Add multi-threaded tests. |
| 379 | 503 |
| 380 } // namespace | 504 } // namespace |
| 381 } // namespace mojo | 505 } // namespace mojo |
| OLD | NEW |