| 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/public/system/core_cpp.h" | 5 #include "mojo/public/system/core_cpp.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "mojo/public/system/macros.h" | 9 #include "mojo/public/system/macros.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 | 82 |
| 83 EXPECT_EQ(kInvalidHandleValue, h.get().value()); | 83 EXPECT_EQ(kInvalidHandleValue, h.get().value()); |
| 84 | 84 |
| 85 // This should be a no-op. | 85 // This should be a no-op. |
| 86 Close(h.Pass()); | 86 Close(h.Pass()); |
| 87 | 87 |
| 88 // It should still be invalid. | 88 // It should still be invalid. |
| 89 EXPECT_EQ(kInvalidHandleValue, h.get().value()); | 89 EXPECT_EQ(kInvalidHandleValue, h.get().value()); |
| 90 | 90 |
| 91 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 91 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 92 Wait(h, MOJO_WAIT_FLAG_EVERYTHING, 1000000)); | 92 Wait(h.get(), MOJO_WAIT_FLAG_EVERYTHING, 1000000)); |
| 93 | 93 |
| 94 std::vector<Handle> wh; | 94 std::vector<Handle> wh; |
| 95 wh.push_back(h); | 95 wh.push_back(h.get()); |
| 96 std::vector<MojoWaitFlags> wf; | 96 std::vector<MojoWaitFlags> wf; |
| 97 wf.push_back(MOJO_WAIT_FLAG_EVERYTHING); | 97 wf.push_back(MOJO_WAIT_FLAG_EVERYTHING); |
| 98 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 98 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 99 WaitMany(wh, wf, MOJO_DEADLINE_INDEFINITE)); | 99 WaitMany(wh, wf, MOJO_DEADLINE_INDEFINITE)); |
| 100 } | 100 } |
| 101 | 101 |
| 102 // |MessagePipeHandle|/|ScopedMessagePipeHandle| functions: | 102 // |MessagePipeHandle|/|ScopedMessagePipeHandle| functions: |
| 103 { | 103 { |
| 104 MessagePipeHandle h_invalid; | 104 MessagePipeHandle h_invalid; |
| 105 EXPECT_FALSE(h_invalid.is_valid()); | 105 EXPECT_FALSE(h_invalid.is_valid()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 CreateMessagePipe(&h_0, &h_1); | 137 CreateMessagePipe(&h_0, &h_1); |
| 138 EXPECT_TRUE(h_0.get().is_valid()); | 138 EXPECT_TRUE(h_0.get().is_valid()); |
| 139 EXPECT_TRUE(h_1.get().is_valid()); | 139 EXPECT_TRUE(h_1.get().is_valid()); |
| 140 EXPECT_NE(h_0.get().value(), h_1.get().value()); | 140 EXPECT_NE(h_0.get().value(), h_1.get().value()); |
| 141 // Save the handle values, so we can check that things got closed | 141 // Save the handle values, so we can check that things got closed |
| 142 // correctly. | 142 // correctly. |
| 143 hv_0 = h_0.get().value(); | 143 hv_0 = h_0.get().value(); |
| 144 MojoHandle hv_1 = h_1.get().value(); | 144 MojoHandle hv_1 = h_1.get().value(); |
| 145 | 145 |
| 146 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 146 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 147 Wait(h_0, MOJO_WAIT_FLAG_READABLE, 0)); | 147 Wait(h_0.get(), MOJO_WAIT_FLAG_READABLE, 0)); |
| 148 std::vector<Handle> wh; | 148 std::vector<Handle> wh; |
| 149 wh.push_back(h_0); | 149 wh.push_back(h_0.get()); |
| 150 wh.push_back(h_1); | 150 wh.push_back(h_1.get()); |
| 151 std::vector<MojoWaitFlags> wf; | 151 std::vector<MojoWaitFlags> wf; |
| 152 wf.push_back(MOJO_WAIT_FLAG_READABLE); | 152 wf.push_back(MOJO_WAIT_FLAG_READABLE); |
| 153 wf.push_back(MOJO_WAIT_FLAG_WRITABLE); | 153 wf.push_back(MOJO_WAIT_FLAG_WRITABLE); |
| 154 EXPECT_EQ(1, WaitMany(wh, wf, 1000)); | 154 EXPECT_EQ(1, WaitMany(wh, wf, 1000)); |
| 155 | 155 |
| 156 // Test closing |h_1| explicitly. | 156 // Test closing |h_1| explicitly. |
| 157 Close(h_1.Pass()); | 157 Close(h_1.Pass()); |
| 158 EXPECT_FALSE(h_1.get().is_valid()); | 158 EXPECT_FALSE(h_1.get().is_valid()); |
| 159 | 159 |
| 160 // Make sure |h_1| is closed. | 160 // Make sure |h_1| is closed. |
| 161 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 161 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 162 MojoWait(hv_1, | 162 MojoWait(hv_1, |
| 163 MOJO_WAIT_FLAG_EVERYTHING, | 163 MOJO_WAIT_FLAG_EVERYTHING, |
| 164 MOJO_DEADLINE_INDEFINITE)); | 164 MOJO_DEADLINE_INDEFINITE)); |
| 165 | 165 |
| 166 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 166 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 167 Wait(h_0, MOJO_WAIT_FLAG_READABLE, MOJO_DEADLINE_INDEFINITE)); | 167 Wait(h_0.get(), MOJO_WAIT_FLAG_READABLE, |
| 168 MOJO_DEADLINE_INDEFINITE)); |
| 168 } | 169 } |
| 169 // |hv_0| should have been closed when |h_0| went out of scope, so this | 170 // |hv_0| should have been closed when |h_0| went out of scope, so this |
| 170 // close should fail. | 171 // close should fail. |
| 171 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(hv_0)); | 172 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(hv_0)); |
| 172 | 173 |
| 173 // Actually test writing/reading messages. | 174 // Actually test writing/reading messages. |
| 174 { | 175 { |
| 175 ScopedMessagePipeHandle h_0; | 176 ScopedMessagePipeHandle h_0; |
| 176 ScopedMessagePipeHandle h_1; | 177 ScopedMessagePipeHandle h_1; |
| 177 CreateMessagePipe(&h_0, &h_1); | 178 CreateMessagePipe(&h_0, &h_1); |
| 178 | 179 |
| 179 const char kHello[] = "hello"; | 180 const char kHello[] = "hello"; |
| 180 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); | 181 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); |
| 181 EXPECT_EQ(MOJO_RESULT_OK, | 182 EXPECT_EQ(MOJO_RESULT_OK, |
| 182 WriteMessageRaw(h_0, | 183 WriteMessageRaw(h_0.get(), |
| 183 kHello, kHelloSize, | 184 kHello, kHelloSize, |
| 184 NULL, 0, | 185 NULL, 0, |
| 185 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 186 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 186 EXPECT_EQ(MOJO_RESULT_OK, | 187 EXPECT_EQ(MOJO_RESULT_OK, |
| 187 Wait(h_1, MOJO_WAIT_FLAG_READABLE, MOJO_DEADLINE_INDEFINITE)); | 188 Wait(h_1.get(), MOJO_WAIT_FLAG_READABLE, |
| 189 MOJO_DEADLINE_INDEFINITE)); |
| 188 char buffer[10] = { 0 }; | 190 char buffer[10] = { 0 }; |
| 189 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 191 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 190 EXPECT_EQ(MOJO_RESULT_OK, | 192 EXPECT_EQ(MOJO_RESULT_OK, |
| 191 ReadMessageRaw(h_1, | 193 ReadMessageRaw(h_1.get(), |
| 192 buffer, &buffer_size, | 194 buffer, &buffer_size, |
| 193 NULL, NULL, | 195 NULL, NULL, |
| 194 MOJO_READ_MESSAGE_FLAG_NONE)); | 196 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 195 EXPECT_EQ(kHelloSize, buffer_size); | 197 EXPECT_EQ(kHelloSize, buffer_size); |
| 196 EXPECT_STREQ(kHello, buffer); | 198 EXPECT_STREQ(kHello, buffer); |
| 197 | 199 |
| 198 // Send a handle over the previously-establish |MessagePipe|. | 200 // Send a handle over the previously-establish |MessagePipe|. |
| 199 ScopedMessagePipeHandle h_2; | 201 ScopedMessagePipeHandle h_2; |
| 200 ScopedMessagePipeHandle h_3; | 202 ScopedMessagePipeHandle h_3; |
| 201 CreateMessagePipe(&h_2, &h_3); | 203 CreateMessagePipe(&h_2, &h_3); |
| 202 | 204 |
| 203 // Write a message to |h_2|, before we send |h_3|. | 205 // Write a message to |h_2|, before we send |h_3|. |
| 204 const char kWorld[] = "world!"; | 206 const char kWorld[] = "world!"; |
| 205 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); | 207 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); |
| 206 EXPECT_EQ(MOJO_RESULT_OK, | 208 EXPECT_EQ(MOJO_RESULT_OK, |
| 207 WriteMessageRaw(h_2, | 209 WriteMessageRaw(h_2.get(), |
| 208 kWorld, kWorldSize, | 210 kWorld, kWorldSize, |
| 209 NULL, 0, | 211 NULL, 0, |
| 210 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 212 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 211 | 213 |
| 212 // Send |h_3| over |h_1| to |h_0|. | 214 // Send |h_3| over |h_1| to |h_0|. |
| 213 MojoHandle handles[5]; | 215 MojoHandle handles[5]; |
| 214 handles[0] = h_3.release().value(); | 216 handles[0] = h_3.release().value(); |
| 215 EXPECT_NE(kInvalidHandleValue, handles[0]); | 217 EXPECT_NE(kInvalidHandleValue, handles[0]); |
| 216 EXPECT_FALSE(h_3.get().is_valid()); | 218 EXPECT_FALSE(h_3.get().is_valid()); |
| 217 uint32_t handles_count = 1; | 219 uint32_t handles_count = 1; |
| 218 EXPECT_EQ(MOJO_RESULT_OK, | 220 EXPECT_EQ(MOJO_RESULT_OK, |
| 219 WriteMessageRaw(h_1, | 221 WriteMessageRaw(h_1.get(), |
| 220 kHello, kHelloSize, | 222 kHello, kHelloSize, |
| 221 handles, handles_count, | 223 handles, handles_count, |
| 222 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 224 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 223 // |handles[0]| should actually be invalid now. | 225 // |handles[0]| should actually be invalid now. |
| 224 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handles[0])); | 226 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handles[0])); |
| 225 | 227 |
| 226 // Read "hello" and the sent handle. | 228 // Read "hello" and the sent handle. |
| 227 EXPECT_EQ(MOJO_RESULT_OK, | 229 EXPECT_EQ(MOJO_RESULT_OK, |
| 228 Wait(h_0, MOJO_WAIT_FLAG_READABLE, MOJO_DEADLINE_INDEFINITE)); | 230 Wait(h_0.get(), MOJO_WAIT_FLAG_READABLE, |
| 231 MOJO_DEADLINE_INDEFINITE)); |
| 229 memset(buffer, 0, sizeof(buffer)); | 232 memset(buffer, 0, sizeof(buffer)); |
| 230 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 233 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 231 for (size_t i = 0; i < MOJO_ARRAYSIZE(handles); i++) | 234 for (size_t i = 0; i < MOJO_ARRAYSIZE(handles); i++) |
| 232 handles[i] = kInvalidHandleValue; | 235 handles[i] = kInvalidHandleValue; |
| 233 handles_count = static_cast<uint32_t>(MOJO_ARRAYSIZE(handles)); | 236 handles_count = static_cast<uint32_t>(MOJO_ARRAYSIZE(handles)); |
| 234 EXPECT_EQ(MOJO_RESULT_OK, | 237 EXPECT_EQ(MOJO_RESULT_OK, |
| 235 ReadMessageRaw(h_0, | 238 ReadMessageRaw(h_0.get(), |
| 236 buffer, &buffer_size, | 239 buffer, &buffer_size, |
| 237 handles, &handles_count, | 240 handles, &handles_count, |
| 238 MOJO_READ_MESSAGE_FLAG_NONE)); | 241 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 239 EXPECT_EQ(kHelloSize, buffer_size); | 242 EXPECT_EQ(kHelloSize, buffer_size); |
| 240 EXPECT_STREQ(kHello, buffer); | 243 EXPECT_STREQ(kHello, buffer); |
| 241 EXPECT_EQ(1u, handles_count); | 244 EXPECT_EQ(1u, handles_count); |
| 242 EXPECT_NE(kInvalidHandleValue, handles[0]); | 245 EXPECT_NE(kInvalidHandleValue, handles[0]); |
| 243 | 246 |
| 244 // Read from the sent/received handle. | 247 // Read from the sent/received handle. |
| 245 h_3.reset(MessagePipeHandle(handles[0])); | 248 h_3.reset(MessagePipeHandle(handles[0])); |
| 246 // Save |handles[0]| to check that it gets properly closed. | 249 // Save |handles[0]| to check that it gets properly closed. |
| 247 hv_0 = handles[0]; | 250 hv_0 = handles[0]; |
| 248 EXPECT_EQ(MOJO_RESULT_OK, | 251 EXPECT_EQ(MOJO_RESULT_OK, |
| 249 Wait(h_3, MOJO_WAIT_FLAG_READABLE, MOJO_DEADLINE_INDEFINITE)); | 252 Wait(h_3.get(), MOJO_WAIT_FLAG_READABLE, |
| 253 MOJO_DEADLINE_INDEFINITE)); |
| 250 memset(buffer, 0, sizeof(buffer)); | 254 memset(buffer, 0, sizeof(buffer)); |
| 251 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 255 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 252 for (size_t i = 0; i < MOJO_ARRAYSIZE(handles); i++) | 256 for (size_t i = 0; i < MOJO_ARRAYSIZE(handles); i++) |
| 253 handles[i] = kInvalidHandleValue; | 257 handles[i] = kInvalidHandleValue; |
| 254 handles_count = static_cast<uint32_t>(MOJO_ARRAYSIZE(handles)); | 258 handles_count = static_cast<uint32_t>(MOJO_ARRAYSIZE(handles)); |
| 255 EXPECT_EQ(MOJO_RESULT_OK, | 259 EXPECT_EQ(MOJO_RESULT_OK, |
| 256 ReadMessageRaw(h_3, | 260 ReadMessageRaw(h_3.get(), |
| 257 buffer, &buffer_size, | 261 buffer, &buffer_size, |
| 258 handles, &handles_count, | 262 handles, &handles_count, |
| 259 MOJO_READ_MESSAGE_FLAG_NONE)); | 263 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 260 EXPECT_EQ(kWorldSize, buffer_size); | 264 EXPECT_EQ(kWorldSize, buffer_size); |
| 261 EXPECT_STREQ(kWorld, buffer); | 265 EXPECT_STREQ(kWorld, buffer); |
| 262 EXPECT_EQ(0u, handles_count); | 266 EXPECT_EQ(0u, handles_count); |
| 263 } | 267 } |
| 264 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(hv_0)); | 268 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(hv_0)); |
| 265 } | 269 } |
| 266 | 270 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 278 | 282 |
| 279 // Send a handle over the previously-establish |MessagePipe|. | 283 // Send a handle over the previously-establish |MessagePipe|. |
| 280 ScopedMessagePipeHandle h_2; | 284 ScopedMessagePipeHandle h_2; |
| 281 ScopedMessagePipeHandle h_3; | 285 ScopedMessagePipeHandle h_3; |
| 282 CreateMessagePipe(&h_2, &h_3); | 286 CreateMessagePipe(&h_2, &h_3); |
| 283 | 287 |
| 284 // Write a message to |h_2|, before we send |h_3|. | 288 // Write a message to |h_2|, before we send |h_3|. |
| 285 const char kWorld[] = "world!"; | 289 const char kWorld[] = "world!"; |
| 286 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); | 290 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); |
| 287 EXPECT_EQ(MOJO_RESULT_OK, | 291 EXPECT_EQ(MOJO_RESULT_OK, |
| 288 WriteMessageRaw(h_2, | 292 WriteMessageRaw(h_2.get(), |
| 289 kWorld, kWorldSize, | 293 kWorld, kWorldSize, |
| 290 NULL, 0, | 294 NULL, 0, |
| 291 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 295 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 292 // And also a message to |h_3|. | 296 // And also a message to |h_3|. |
| 293 EXPECT_EQ(MOJO_RESULT_OK, | 297 EXPECT_EQ(MOJO_RESULT_OK, |
| 294 WriteMessageRaw(h_3, | 298 WriteMessageRaw(h_3.get(), |
| 295 kWorld, kWorldSize, | 299 kWorld, kWorldSize, |
| 296 NULL, 0, | 300 NULL, 0, |
| 297 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 301 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 298 | 302 |
| 299 // Send |h_3| over |h_1| to |h_0|. | 303 // Send |h_3| over |h_1| to |h_0|. |
| 300 const char kHello[] = "hello"; | 304 const char kHello[] = "hello"; |
| 301 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); | 305 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); |
| 302 MojoHandle h_3_value; | 306 MojoHandle h_3_value; |
| 303 h_3_value = h_3.release().value(); | 307 h_3_value = h_3.release().value(); |
| 304 EXPECT_NE(kInvalidHandleValue, h_3_value); | 308 EXPECT_NE(kInvalidHandleValue, h_3_value); |
| 305 EXPECT_FALSE(h_3.get().is_valid()); | 309 EXPECT_FALSE(h_3.get().is_valid()); |
| 306 EXPECT_EQ(MOJO_RESULT_OK, | 310 EXPECT_EQ(MOJO_RESULT_OK, |
| 307 WriteMessageRaw(h_1, | 311 WriteMessageRaw(h_1.get(), |
| 308 kHello, kHelloSize, | 312 kHello, kHelloSize, |
| 309 &h_3_value, 1, | 313 &h_3_value, 1, |
| 310 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 314 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 311 // |h_3_value| should actually be invalid now. | 315 // |h_3_value| should actually be invalid now. |
| 312 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(h_3_value)); | 316 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(h_3_value)); |
| 313 | 317 |
| 314 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_0.release().value())); | 318 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_0.release().value())); |
| 315 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_1.release().value())); | 319 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_1.release().value())); |
| 316 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_2.release().value())); | 320 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_2.release().value())); |
| 317 } | 321 } |
| 318 | 322 |
| 319 // Do this in a different order: make the enqueued |MessagePipe| handle only | 323 // Do this in a different order: make the enqueued |MessagePipe| handle only |
| 320 // half-alive. | 324 // half-alive. |
| 321 { | 325 { |
| 322 ScopedMessagePipeHandle h_0; | 326 ScopedMessagePipeHandle h_0; |
| 323 ScopedMessagePipeHandle h_1; | 327 ScopedMessagePipeHandle h_1; |
| 324 CreateMessagePipe(&h_0, &h_1); | 328 CreateMessagePipe(&h_0, &h_1); |
| 325 | 329 |
| 326 // Send a handle over the previously-establish |MessagePipe|. | 330 // Send a handle over the previously-establish |MessagePipe|. |
| 327 ScopedMessagePipeHandle h_2; | 331 ScopedMessagePipeHandle h_2; |
| 328 ScopedMessagePipeHandle h_3; | 332 ScopedMessagePipeHandle h_3; |
| 329 CreateMessagePipe(&h_2, &h_3); | 333 CreateMessagePipe(&h_2, &h_3); |
| 330 | 334 |
| 331 // Write a message to |h_2|, before we send |h_3|. | 335 // Write a message to |h_2|, before we send |h_3|. |
| 332 const char kWorld[] = "world!"; | 336 const char kWorld[] = "world!"; |
| 333 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); | 337 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); |
| 334 EXPECT_EQ(MOJO_RESULT_OK, | 338 EXPECT_EQ(MOJO_RESULT_OK, |
| 335 WriteMessageRaw(h_2, | 339 WriteMessageRaw(h_2.get(), |
| 336 kWorld, kWorldSize, | 340 kWorld, kWorldSize, |
| 337 NULL, 0, | 341 NULL, 0, |
| 338 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 342 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 339 // And also a message to |h_3|. | 343 // And also a message to |h_3|. |
| 340 EXPECT_EQ(MOJO_RESULT_OK, | 344 EXPECT_EQ(MOJO_RESULT_OK, |
| 341 WriteMessageRaw(h_3, | 345 WriteMessageRaw(h_3.get(), |
| 342 kWorld, kWorldSize, | 346 kWorld, kWorldSize, |
| 343 NULL, 0, | 347 NULL, 0, |
| 344 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 348 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 345 | 349 |
| 346 // Send |h_3| over |h_1| to |h_0|. | 350 // Send |h_3| over |h_1| to |h_0|. |
| 347 const char kHello[] = "hello"; | 351 const char kHello[] = "hello"; |
| 348 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); | 352 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); |
| 349 MojoHandle h_3_value; | 353 MojoHandle h_3_value; |
| 350 h_3_value = h_3.release().value(); | 354 h_3_value = h_3.release().value(); |
| 351 EXPECT_NE(kInvalidHandleValue, h_3_value); | 355 EXPECT_NE(kInvalidHandleValue, h_3_value); |
| 352 EXPECT_FALSE(h_3.get().is_valid()); | 356 EXPECT_FALSE(h_3.get().is_valid()); |
| 353 EXPECT_EQ(MOJO_RESULT_OK, | 357 EXPECT_EQ(MOJO_RESULT_OK, |
| 354 WriteMessageRaw(h_1, | 358 WriteMessageRaw(h_1.get(), |
| 355 kHello, kHelloSize, | 359 kHello, kHelloSize, |
| 356 &h_3_value, 1, | 360 &h_3_value, 1, |
| 357 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 361 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 358 // |h_3_value| should actually be invalid now. | 362 // |h_3_value| should actually be invalid now. |
| 359 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(h_3_value)); | 363 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(h_3_value)); |
| 360 | 364 |
| 361 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_2.release().value())); | 365 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_2.release().value())); |
| 362 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_0.release().value())); | 366 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_0.release().value())); |
| 363 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_1.release().value())); | 367 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h_1.release().value())); |
| 364 } | 368 } |
| 365 } | 369 } |
| 366 | 370 |
| 367 } // namespace | 371 } // namespace |
| 368 } // namespace mojo | 372 } // namespace mojo |
| OLD | NEW |