| 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 <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/threading/platform_thread.h" | 10 #include "base/threading/platform_thread.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 TEST_F(CoreTest, Basic) { | 31 TEST_F(CoreTest, Basic) { |
| 32 MockHandleInfo info; | 32 MockHandleInfo info; |
| 33 | 33 |
| 34 EXPECT_EQ(0u, info.GetCtorCallCount()); | 34 EXPECT_EQ(0u, info.GetCtorCallCount()); |
| 35 MojoHandle h = CreateMockHandle(&info); | 35 MojoHandle h = CreateMockHandle(&info); |
| 36 EXPECT_EQ(1u, info.GetCtorCallCount()); | 36 EXPECT_EQ(1u, info.GetCtorCallCount()); |
| 37 EXPECT_NE(h, MOJO_HANDLE_INVALID); | 37 EXPECT_NE(h, MOJO_HANDLE_INVALID); |
| 38 | 38 |
| 39 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); | 39 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
| 40 EXPECT_EQ(MOJO_RESULT_OK, | 40 EXPECT_EQ(MOJO_RESULT_OK, |
| 41 core()->WriteMessage(h, NULL, 0, NULL, 0, | 41 core()->WriteMessage(h, NullUserPointer(), 0, NullUserPointer(), 0, |
| 42 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 42 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 43 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); | 43 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); |
| 44 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 44 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 45 core()->WriteMessage(h, NULL, 1, NULL, 0, | 45 core()->WriteMessage(h, NullUserPointer(), 1, NullUserPointer(), 0, |
| 46 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 46 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 47 EXPECT_EQ(2u, info.GetWriteMessageCallCount()); | 47 EXPECT_EQ(2u, info.GetWriteMessageCallCount()); |
| 48 | 48 |
| 49 EXPECT_EQ(0u, info.GetReadMessageCallCount()); | 49 EXPECT_EQ(0u, info.GetReadMessageCallCount()); |
| 50 uint32_t num_bytes = 0; | 50 uint32_t num_bytes = 0; |
| 51 EXPECT_EQ(MOJO_RESULT_OK, | 51 EXPECT_EQ(MOJO_RESULT_OK, |
| 52 core()->ReadMessage(h, NULL, &num_bytes, NULL, NULL, | 52 core()->ReadMessage(h, NullUserPointer(), |
| 53 MakeUserPointer(&num_bytes), NullUserPointer(), |
| 54 NullUserPointer(), |
| 53 MOJO_READ_MESSAGE_FLAG_NONE)); | 55 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 54 EXPECT_EQ(1u, info.GetReadMessageCallCount()); | 56 EXPECT_EQ(1u, info.GetReadMessageCallCount()); |
| 55 num_bytes = 1; | 57 num_bytes = 1; |
| 56 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 58 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 57 core()->ReadMessage(h, NULL, &num_bytes, NULL, NULL, | 59 core()->ReadMessage(h, NullUserPointer(), |
| 60 MakeUserPointer(&num_bytes), NullUserPointer(), |
| 61 NullUserPointer(), |
| 58 MOJO_READ_MESSAGE_FLAG_NONE)); | 62 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 59 EXPECT_EQ(2u, info.GetReadMessageCallCount()); | 63 EXPECT_EQ(2u, info.GetReadMessageCallCount()); |
| 60 EXPECT_EQ(MOJO_RESULT_OK, | 64 EXPECT_EQ(MOJO_RESULT_OK, |
| 61 core()->ReadMessage(h, NULL, NULL, NULL, NULL, | 65 core()->ReadMessage(h, NullUserPointer(), NullUserPointer(), |
| 66 NullUserPointer(), NullUserPointer(), |
| 62 MOJO_READ_MESSAGE_FLAG_NONE)); | 67 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 63 EXPECT_EQ(3u, info.GetReadMessageCallCount()); | 68 EXPECT_EQ(3u, info.GetReadMessageCallCount()); |
| 64 | 69 |
| 65 EXPECT_EQ(0u, info.GetWriteDataCallCount()); | 70 EXPECT_EQ(0u, info.GetWriteDataCallCount()); |
| 66 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, | 71 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, |
| 67 core()->WriteData(h, NULL, NULL, MOJO_WRITE_DATA_FLAG_NONE)); | 72 core()->WriteData(h, NullUserPointer(), NullUserPointer(), |
| 73 MOJO_WRITE_DATA_FLAG_NONE)); |
| 68 EXPECT_EQ(1u, info.GetWriteDataCallCount()); | 74 EXPECT_EQ(1u, info.GetWriteDataCallCount()); |
| 69 | 75 |
| 70 EXPECT_EQ(0u, info.GetBeginWriteDataCallCount()); | 76 EXPECT_EQ(0u, info.GetBeginWriteDataCallCount()); |
| 71 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, | 77 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, |
| 72 core()->BeginWriteData(h, NULL, NULL, MOJO_WRITE_DATA_FLAG_NONE)); | 78 core()->BeginWriteData(h, NullUserPointer(), NullUserPointer(), |
| 79 MOJO_WRITE_DATA_FLAG_NONE)); |
| 73 EXPECT_EQ(1u, info.GetBeginWriteDataCallCount()); | 80 EXPECT_EQ(1u, info.GetBeginWriteDataCallCount()); |
| 74 | 81 |
| 75 EXPECT_EQ(0u, info.GetEndWriteDataCallCount()); | 82 EXPECT_EQ(0u, info.GetEndWriteDataCallCount()); |
| 76 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, | 83 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, |
| 77 core()->EndWriteData(h, 0)); | 84 core()->EndWriteData(h, 0)); |
| 78 EXPECT_EQ(1u, info.GetEndWriteDataCallCount()); | 85 EXPECT_EQ(1u, info.GetEndWriteDataCallCount()); |
| 79 | 86 |
| 80 EXPECT_EQ(0u, info.GetReadDataCallCount()); | 87 EXPECT_EQ(0u, info.GetReadDataCallCount()); |
| 81 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, | 88 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, |
| 82 core()->ReadData(h, NULL, NULL, MOJO_READ_DATA_FLAG_NONE)); | 89 core()->ReadData(h, NullUserPointer(), NullUserPointer(), |
| 90 MOJO_READ_DATA_FLAG_NONE)); |
| 83 EXPECT_EQ(1u, info.GetReadDataCallCount()); | 91 EXPECT_EQ(1u, info.GetReadDataCallCount()); |
| 84 | 92 |
| 85 EXPECT_EQ(0u, info.GetBeginReadDataCallCount()); | 93 EXPECT_EQ(0u, info.GetBeginReadDataCallCount()); |
| 86 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, | 94 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, |
| 87 core()->BeginReadData(h, NULL, NULL, MOJO_READ_DATA_FLAG_NONE)); | 95 core()->BeginReadData(h, NullUserPointer(), NullUserPointer(), |
| 96 MOJO_READ_DATA_FLAG_NONE)); |
| 88 EXPECT_EQ(1u, info.GetBeginReadDataCallCount()); | 97 EXPECT_EQ(1u, info.GetBeginReadDataCallCount()); |
| 89 | 98 |
| 90 EXPECT_EQ(0u, info.GetEndReadDataCallCount()); | 99 EXPECT_EQ(0u, info.GetEndReadDataCallCount()); |
| 91 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, | 100 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, |
| 92 core()->EndReadData(h, 0)); | 101 core()->EndReadData(h, 0)); |
| 93 EXPECT_EQ(1u, info.GetEndReadDataCallCount()); | 102 EXPECT_EQ(1u, info.GetEndReadDataCallCount()); |
| 94 | 103 |
| 95 EXPECT_EQ(0u, info.GetAddWaiterCallCount()); | 104 EXPECT_EQ(0u, info.GetAddWaiterCallCount()); |
| 96 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 105 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 97 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, | 106 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, |
| 98 MOJO_DEADLINE_INDEFINITE)); | 107 MOJO_DEADLINE_INDEFINITE)); |
| 99 EXPECT_EQ(1u, info.GetAddWaiterCallCount()); | 108 EXPECT_EQ(1u, info.GetAddWaiterCallCount()); |
| 100 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 109 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 101 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 0)); | 110 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 0)); |
| 102 EXPECT_EQ(2u, info.GetAddWaiterCallCount()); | 111 EXPECT_EQ(2u, info.GetAddWaiterCallCount()); |
| 103 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 112 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 104 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000)); | 113 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000)); |
| 105 EXPECT_EQ(3u, info.GetAddWaiterCallCount()); | 114 EXPECT_EQ(3u, info.GetAddWaiterCallCount()); |
| 106 MojoHandleSignals handle_signals = ~MOJO_HANDLE_SIGNAL_NONE; | 115 MojoHandleSignals handle_signals = ~MOJO_HANDLE_SIGNAL_NONE; |
| 107 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 116 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 108 core()->WaitMany(&h, &handle_signals, 1, MOJO_DEADLINE_INDEFINITE)); | 117 core()->WaitMany(MakeUserPointer(&h), |
| 118 MakeUserPointer(&handle_signals), 1, |
| 119 MOJO_DEADLINE_INDEFINITE)); |
| 109 EXPECT_EQ(4u, info.GetAddWaiterCallCount()); | 120 EXPECT_EQ(4u, info.GetAddWaiterCallCount()); |
| 110 | 121 |
| 111 EXPECT_EQ(0u, info.GetDtorCallCount()); | 122 EXPECT_EQ(0u, info.GetDtorCallCount()); |
| 112 EXPECT_EQ(0u, info.GetCloseCallCount()); | 123 EXPECT_EQ(0u, info.GetCloseCallCount()); |
| 113 EXPECT_EQ(0u, info.GetCancelAllWaitersCallCount()); | 124 EXPECT_EQ(0u, info.GetCancelAllWaitersCallCount()); |
| 114 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 125 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
| 115 EXPECT_EQ(1u, info.GetCancelAllWaitersCallCount()); | 126 EXPECT_EQ(1u, info.GetCancelAllWaitersCallCount()); |
| 116 EXPECT_EQ(1u, info.GetCloseCallCount()); | 127 EXPECT_EQ(1u, info.GetCloseCallCount()); |
| 117 EXPECT_EQ(1u, info.GetDtorCallCount()); | 128 EXPECT_EQ(1u, info.GetDtorCallCount()); |
| 118 | 129 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 145 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE, | 156 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE, |
| 146 MOJO_DEADLINE_INDEFINITE)); | 157 MOJO_DEADLINE_INDEFINITE)); |
| 147 } | 158 } |
| 148 | 159 |
| 149 // |WaitMany()|: | 160 // |WaitMany()|: |
| 150 { | 161 { |
| 151 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID}; | 162 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID}; |
| 152 MojoHandleSignals signals[2] = {~MOJO_HANDLE_SIGNAL_NONE, | 163 MojoHandleSignals signals[2] = {~MOJO_HANDLE_SIGNAL_NONE, |
| 153 ~MOJO_HANDLE_SIGNAL_NONE}; | 164 ~MOJO_HANDLE_SIGNAL_NONE}; |
| 154 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 165 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 155 core()->WaitMany(handles, signals, 0, MOJO_DEADLINE_INDEFINITE)); | 166 core()->WaitMany(MakeUserPointer(handles), |
| 167 MakeUserPointer(signals), 0, |
| 168 MOJO_DEADLINE_INDEFINITE)); |
| 156 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 169 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 157 core()->WaitMany(NULL, signals, 0, MOJO_DEADLINE_INDEFINITE)); | 170 core()->WaitMany(NullUserPointer(), MakeUserPointer(signals), 0, |
| 171 MOJO_DEADLINE_INDEFINITE)); |
| 158 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 172 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 159 core()->WaitMany(handles, NULL, 0, MOJO_DEADLINE_INDEFINITE)); | 173 core()->WaitMany(MakeUserPointer(handles), NullUserPointer(), 0, |
| 160 | 174 MOJO_DEADLINE_INDEFINITE)); |
| 161 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 175 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 162 core()->WaitMany(NULL, signals, 1, MOJO_DEADLINE_INDEFINITE)); | 176 core()->WaitMany(MakeUserPointer(handles), |
| 163 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 177 MakeUserPointer(signals), 1, |
| 164 core()->WaitMany(handles, NULL, 1, MOJO_DEADLINE_INDEFINITE)); | 178 MOJO_DEADLINE_INDEFINITE)); |
| 165 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | |
| 166 core()->WaitMany(handles, signals, 1, MOJO_DEADLINE_INDEFINITE)); | |
| 167 | 179 |
| 168 MockHandleInfo info[2]; | 180 MockHandleInfo info[2]; |
| 169 handles[0] = CreateMockHandle(&info[0]); | 181 handles[0] = CreateMockHandle(&info[0]); |
| 170 | 182 |
| 171 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 183 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 172 core()->WaitMany(handles, signals, 1, MOJO_DEADLINE_INDEFINITE)); | 184 core()->WaitMany(MakeUserPointer(handles), |
| 185 MakeUserPointer(signals), 1, |
| 186 MOJO_DEADLINE_INDEFINITE)); |
| 173 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 187 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 174 core()->WaitMany(handles, signals, 2, MOJO_DEADLINE_INDEFINITE)); | 188 core()->WaitMany(MakeUserPointer(handles), |
| 189 MakeUserPointer(signals), 2, |
| 190 MOJO_DEADLINE_INDEFINITE)); |
| 175 handles[1] = handles[0] + 1; // Invalid handle. | 191 handles[1] = handles[0] + 1; // Invalid handle. |
| 176 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 192 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 177 core()->WaitMany(handles, signals, 2, MOJO_DEADLINE_INDEFINITE)); | 193 core()->WaitMany(MakeUserPointer(handles), |
| 194 MakeUserPointer(signals), 2, |
| 195 MOJO_DEADLINE_INDEFINITE)); |
| 178 handles[1] = CreateMockHandle(&info[1]); | 196 handles[1] = CreateMockHandle(&info[1]); |
| 179 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 197 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 180 core()->WaitMany(handles, signals, 2, MOJO_DEADLINE_INDEFINITE)); | 198 core()->WaitMany(MakeUserPointer(handles), |
| 199 MakeUserPointer(signals), 2, |
| 200 MOJO_DEADLINE_INDEFINITE)); |
| 181 | 201 |
| 182 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0])); | 202 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0])); |
| 183 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1])); | 203 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1])); |
| 184 } | 204 } |
| 185 | 205 |
| 186 // |CreateMessagePipe()|: | 206 // |CreateMessagePipe()|: Nothing to check (apart from things that cause |
| 187 { | 207 // death). |
| 188 MojoHandle h; | |
| 189 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | |
| 190 core()->CreateMessagePipe(NULL, NULL, NULL)); | |
| 191 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | |
| 192 core()->CreateMessagePipe(NULL, &h, NULL)); | |
| 193 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | |
| 194 core()->CreateMessagePipe(NULL, NULL, &h)); | |
| 195 } | |
| 196 | 208 |
| 197 // |WriteMessage()|: | 209 // |WriteMessage()|: |
| 198 // Only check arguments checked by |Core|, namely |handle|, |handles|, and | 210 // Only check arguments checked by |Core|, namely |handle|, |handles|, and |
| 199 // |num_handles|. | 211 // |num_handles|. |
| 200 { | 212 { |
| 201 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 213 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 202 core()->WriteMessage(MOJO_HANDLE_INVALID, NULL, 0, NULL, 0, | 214 core()->WriteMessage(MOJO_HANDLE_INVALID, NullUserPointer(), 0, |
| 215 NullUserPointer(), 0, |
| 203 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 216 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 204 | 217 |
| 205 MockHandleInfo info; | 218 MockHandleInfo info; |
| 206 MojoHandle h = CreateMockHandle(&info); | 219 MojoHandle h = CreateMockHandle(&info); |
| 207 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID}; | 220 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID}; |
| 208 | 221 |
| 209 // Null |handles| with nonzero |num_handles|. | |
| 210 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | |
| 211 core()->WriteMessage(h, NULL, 0, NULL, 1, | |
| 212 MOJO_WRITE_MESSAGE_FLAG_NONE)); | |
| 213 // Checked by |Core|, shouldn't go through to the dispatcher. | |
| 214 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); | |
| 215 | |
| 216 // Huge handle count (implausibly big on some systems -- more than can be | 222 // Huge handle count (implausibly big on some systems -- more than can be |
| 217 // stored in a 32-bit address space). | 223 // stored in a 32-bit address space). |
| 218 // Note: This may return either |MOJO_RESULT_INVALID_ARGUMENT| or | 224 // Note: This may return either |MOJO_RESULT_INVALID_ARGUMENT| or |
| 219 // |MOJO_RESULT_RESOURCE_EXHAUSTED|, depending on whether it's plausible or | 225 // |MOJO_RESULT_RESOURCE_EXHAUSTED|, depending on whether it's plausible or |
| 220 // not. | 226 // not. |
| 221 EXPECT_NE(MOJO_RESULT_OK, | 227 EXPECT_NE(MOJO_RESULT_OK, |
| 222 core()->WriteMessage(h, NULL, 0, handles, | 228 core()->WriteMessage(h, NullUserPointer(), 0, |
| 229 MakeUserPointer(handles), |
| 223 std::numeric_limits<uint32_t>::max(), | 230 std::numeric_limits<uint32_t>::max(), |
| 224 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 231 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 225 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); | 232 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
| 226 | 233 |
| 227 // Huge handle count (plausibly big). | 234 // Huge handle count (plausibly big). |
| 228 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 235 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
| 229 core()->WriteMessage(h, NULL, 0, handles, | 236 core()->WriteMessage(h, NullUserPointer(), 0, |
| 237 MakeUserPointer(handles), |
| 230 std::numeric_limits<uint32_t>::max() / | 238 std::numeric_limits<uint32_t>::max() / |
| 231 sizeof(handles[0]), | 239 sizeof(handles[0]), |
| 232 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 240 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 233 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); | 241 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
| 234 | 242 |
| 235 // Invalid handle in |handles|. | 243 // Invalid handle in |handles|. |
| 236 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 244 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 237 core()->WriteMessage(h, NULL, 0, handles, 1, | 245 core()->WriteMessage(h, NullUserPointer(), 0, |
| 246 MakeUserPointer(handles), 1, |
| 238 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 247 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 239 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); | 248 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
| 240 | 249 |
| 241 // Two invalid handles in |handles|. | 250 // Two invalid handles in |handles|. |
| 242 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 251 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 243 core()->WriteMessage(h, NULL, 0, handles, 2, | 252 core()->WriteMessage(h, NullUserPointer(), 0, |
| 253 MakeUserPointer(handles), 2, |
| 244 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 254 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 245 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); | 255 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
| 246 | 256 |
| 247 // Can't send a handle over itself. | 257 // Can't send a handle over itself. |
| 248 handles[0] = h; | 258 handles[0] = h; |
| 249 EXPECT_EQ(MOJO_RESULT_BUSY, | 259 EXPECT_EQ(MOJO_RESULT_BUSY, |
| 250 core()->WriteMessage(h, NULL, 0, handles, 1, | 260 core()->WriteMessage(h, NullUserPointer(), 0, |
| 261 MakeUserPointer(handles), 1, |
| 251 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 262 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 252 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); | 263 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
| 253 | 264 |
| 254 MockHandleInfo info2; | 265 MockHandleInfo info2; |
| 255 MojoHandle h2 = CreateMockHandle(&info2); | 266 MojoHandle h2 = CreateMockHandle(&info2); |
| 256 | 267 |
| 257 // This is "okay", but |MockDispatcher| doesn't implement it. | 268 // This is "okay", but |MockDispatcher| doesn't implement it. |
| 258 handles[0] = h2; | 269 handles[0] = h2; |
| 259 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, | 270 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, |
| 260 core()->WriteMessage(h, NULL, 0, handles, 1, | 271 core()->WriteMessage(h, NullUserPointer(), 0, |
| 272 MakeUserPointer(handles), 1, |
| 261 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 273 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 262 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); | 274 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); |
| 263 | 275 |
| 264 // One of the |handles| is still invalid. | 276 // One of the |handles| is still invalid. |
| 265 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 277 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 266 core()->WriteMessage(h, NULL, 0, handles, 2, | 278 core()->WriteMessage(h, NullUserPointer(), 0, |
| 279 MakeUserPointer(handles), 2, |
| 267 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 280 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 268 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); | 281 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); |
| 269 | 282 |
| 270 // One of the |handles| is the same as |handle|. | 283 // One of the |handles| is the same as |handle|. |
| 271 handles[1] = h; | 284 handles[1] = h; |
| 272 EXPECT_EQ(MOJO_RESULT_BUSY, | 285 EXPECT_EQ(MOJO_RESULT_BUSY, |
| 273 core()->WriteMessage(h, NULL, 0, handles, 2, | 286 core()->WriteMessage(h, NullUserPointer(), 0, |
| 287 MakeUserPointer(handles), 2, |
| 274 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 288 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 275 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); | 289 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); |
| 276 | 290 |
| 277 // Can't send a handle twice in the same message. | 291 // Can't send a handle twice in the same message. |
| 278 handles[1] = h2; | 292 handles[1] = h2; |
| 279 EXPECT_EQ(MOJO_RESULT_BUSY, | 293 EXPECT_EQ(MOJO_RESULT_BUSY, |
| 280 core()->WriteMessage(h, NULL, 0, handles, 2, | 294 core()->WriteMessage(h, NullUserPointer(), 0, |
| 295 MakeUserPointer(handles), 2, |
| 281 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 296 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 282 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); | 297 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); |
| 283 | 298 |
| 284 // Note: Since we never successfully sent anything with it, |h2| should | 299 // Note: Since we never successfully sent anything with it, |h2| should |
| 285 // still be valid. | 300 // still be valid. |
| 286 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h2)); | 301 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h2)); |
| 287 | 302 |
| 288 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 303 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
| 289 } | 304 } |
| 290 | 305 |
| 291 // |ReadMessage()|: | 306 // |ReadMessage()|: |
| 292 // Only check arguments checked by |Core|, namely |handle|, |handles|, and | 307 // Only check arguments checked by |Core|, namely |handle|, |handles|, and |
| 293 // |num_handles|. | 308 // |num_handles|. |
| 294 { | 309 { |
| 295 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 310 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 296 core()->ReadMessage(MOJO_HANDLE_INVALID, NULL, NULL, NULL, NULL, | 311 core()->ReadMessage(MOJO_HANDLE_INVALID, NullUserPointer(), |
| 312 NullUserPointer(), NullUserPointer(), |
| 313 NullUserPointer(), |
| 297 MOJO_READ_MESSAGE_FLAG_NONE)); | 314 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 298 | 315 |
| 299 MockHandleInfo info; | 316 MockHandleInfo info; |
| 300 MojoHandle h = CreateMockHandle(&info); | 317 MojoHandle h = CreateMockHandle(&info); |
| 301 | 318 |
| 302 uint32_t handle_count = 1; | |
| 303 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | |
| 304 core()->ReadMessage(h, NULL, NULL, NULL, &handle_count, | |
| 305 MOJO_READ_MESSAGE_FLAG_NONE)); | |
| 306 // Checked by |Core|, shouldn't go through to the dispatcher. | |
| 307 EXPECT_EQ(0u, info.GetReadMessageCallCount()); | |
| 308 | |
| 309 // Okay. | 319 // Okay. |
| 310 handle_count = 0; | 320 uint32_t handle_count = 0; |
| 311 EXPECT_EQ(MOJO_RESULT_OK, | 321 EXPECT_EQ(MOJO_RESULT_OK, |
| 312 core()->ReadMessage(h, NULL, NULL, NULL, &handle_count, | 322 core()->ReadMessage(h, NullUserPointer(), NullUserPointer(), |
| 323 NullUserPointer(), |
| 324 MakeUserPointer(&handle_count), |
| 313 MOJO_READ_MESSAGE_FLAG_NONE)); | 325 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 314 // Checked by |Core|, shouldn't go through to the dispatcher. | 326 // Checked by |Core|, shouldn't go through to the dispatcher. |
| 315 EXPECT_EQ(1u, info.GetReadMessageCallCount()); | 327 EXPECT_EQ(1u, info.GetReadMessageCallCount()); |
| 316 | 328 |
| 317 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 329 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
| 318 } | 330 } |
| 319 } | 331 } |
| 320 | 332 |
| 333 // These test invalid arguments that should cause death if we're being paranoid |
| 334 // about checking arguments (which we would want to do if, e.g., we were in a |
| 335 // true "kernel" situation, but we might not want to do otherwise for |
| 336 // performance reasons). Probably blatant errors like passing in null pointers |
| 337 // (for required pointer arguments) will still cause death, but perhaps not |
| 338 // predictably. |
| 339 TEST_F(CoreTest, InvalidArgumentsDeath) { |
| 340 const char kMemoryCheckFailedRegex[] = "Check failed"; |
| 341 |
| 342 // |WaitMany()|: |
| 343 { |
| 344 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID}; |
| 345 MojoHandleSignals signals[2] = {~MOJO_HANDLE_SIGNAL_NONE, |
| 346 ~MOJO_HANDLE_SIGNAL_NONE}; |
| 347 EXPECT_DEATH_IF_SUPPORTED( |
| 348 core()->WaitMany(NullUserPointer(), MakeUserPointer(signals), 1, |
| 349 MOJO_DEADLINE_INDEFINITE), |
| 350 kMemoryCheckFailedRegex); |
| 351 EXPECT_DEATH_IF_SUPPORTED( |
| 352 core()->WaitMany(MakeUserPointer(handles), NullUserPointer(), 1, |
| 353 MOJO_DEADLINE_INDEFINITE), |
| 354 kMemoryCheckFailedRegex); |
| 355 } |
| 356 |
| 357 // |CreateMessagePipe()|: |
| 358 { |
| 359 MojoHandle h; |
| 360 EXPECT_DEATH_IF_SUPPORTED( |
| 361 core()->CreateMessagePipe(NullUserPointer(), NullUserPointer(), |
| 362 NullUserPointer()), |
| 363 kMemoryCheckFailedRegex); |
| 364 EXPECT_DEATH_IF_SUPPORTED( |
| 365 core()->CreateMessagePipe(NullUserPointer(), MakeUserPointer(&h), |
| 366 NullUserPointer()), |
| 367 kMemoryCheckFailedRegex); |
| 368 EXPECT_DEATH_IF_SUPPORTED( |
| 369 core()->CreateMessagePipe(NullUserPointer(), NullUserPointer(), |
| 370 MakeUserPointer(&h)), |
| 371 kMemoryCheckFailedRegex); |
| 372 } |
| 373 |
| 374 // |WriteMessage()|: |
| 375 // Only check arguments checked by |Core|, namely |handle|, |handles|, and |
| 376 // |num_handles|. |
| 377 { |
| 378 MockHandleInfo info; |
| 379 MojoHandle h = CreateMockHandle(&info); |
| 380 |
| 381 // Null |handles| with nonzero |num_handles|. |
| 382 EXPECT_DEATH_IF_SUPPORTED( |
| 383 core()->WriteMessage(h, NullUserPointer(), 0, NullUserPointer(), |
| 384 1, MOJO_WRITE_MESSAGE_FLAG_NONE), |
| 385 kMemoryCheckFailedRegex); |
| 386 |
| 387 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
| 388 } |
| 389 |
| 390 // |ReadMessage()|: |
| 391 // Only check arguments checked by |Core|, namely |handle|, |handles|, and |
| 392 // |num_handles|. |
| 393 { |
| 394 MockHandleInfo info; |
| 395 MojoHandle h = CreateMockHandle(&info); |
| 396 |
| 397 uint32_t handle_count = 1; |
| 398 EXPECT_DEATH_IF_SUPPORTED( |
| 399 core()->ReadMessage(h, NullUserPointer(), NullUserPointer(), |
| 400 NullUserPointer(), |
| 401 MakeUserPointer(&handle_count), |
| 402 MOJO_READ_MESSAGE_FLAG_NONE), |
| 403 kMemoryCheckFailedRegex); |
| 404 |
| 405 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
| 406 } |
| 407 } |
| 408 |
| 321 // TODO(vtl): test |Wait()| and |WaitMany()| properly | 409 // TODO(vtl): test |Wait()| and |WaitMany()| properly |
| 322 // - including |WaitMany()| with the same handle more than once (with | 410 // - including |WaitMany()| with the same handle more than once (with |
| 323 // same/different signals) | 411 // same/different signals) |
| 324 | 412 |
| 325 TEST_F(CoreTest, MessagePipe) { | 413 TEST_F(CoreTest, MessagePipe) { |
| 326 MojoHandle h[2]; | 414 MojoHandle h[2]; |
| 327 | 415 |
| 328 EXPECT_EQ(MOJO_RESULT_OK, core()->CreateMessagePipe(NULL, &h[0], &h[1])); | 416 EXPECT_EQ(MOJO_RESULT_OK, |
| 417 core()->CreateMessagePipe(NullUserPointer(), MakeUserPointer(&h[0]), |
| 418 MakeUserPointer(&h[1]))); |
| 329 // Should get two distinct, valid handles. | 419 // Should get two distinct, valid handles. |
| 330 EXPECT_NE(h[0], MOJO_HANDLE_INVALID); | 420 EXPECT_NE(h[0], MOJO_HANDLE_INVALID); |
| 331 EXPECT_NE(h[1], MOJO_HANDLE_INVALID); | 421 EXPECT_NE(h[1], MOJO_HANDLE_INVALID); |
| 332 EXPECT_NE(h[0], h[1]); | 422 EXPECT_NE(h[0], h[1]); |
| 333 | 423 |
| 334 // Neither should be readable. | 424 // Neither should be readable. |
| 335 MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE, | 425 MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE, |
| 336 MOJO_HANDLE_SIGNAL_READABLE}; | 426 MOJO_HANDLE_SIGNAL_READABLE}; |
| 337 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 427 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 338 core()->WaitMany(h, signals, 2, 0)); | 428 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2, |
| 429 0)); |
| 339 | 430 |
| 340 // Try to read anyway. | 431 // Try to read anyway. |
| 341 char buffer[1] = {'a'}; | 432 char buffer[1] = {'a'}; |
| 342 uint32_t buffer_size = 1; | 433 uint32_t buffer_size = 1; |
| 343 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 434 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 344 core()->ReadMessage(h[0], buffer, &buffer_size, NULL, NULL, | 435 core()->ReadMessage(h[0], UserPointer<void>(buffer), |
| 436 MakeUserPointer(&buffer_size), |
| 437 NullUserPointer(), NullUserPointer(), |
| 345 MOJO_READ_MESSAGE_FLAG_NONE)); | 438 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 346 // Check that it left its inputs alone. | 439 // Check that it left its inputs alone. |
| 347 EXPECT_EQ('a', buffer[0]); | 440 EXPECT_EQ('a', buffer[0]); |
| 348 EXPECT_EQ(1u, buffer_size); | 441 EXPECT_EQ(1u, buffer_size); |
| 349 | 442 |
| 350 // Both should be writable. | 443 // Both should be writable. |
| 351 EXPECT_EQ(MOJO_RESULT_OK, | 444 EXPECT_EQ(MOJO_RESULT_OK, |
| 352 core()->Wait(h[0], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000)); | 445 core()->Wait(h[0], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000)); |
| 353 EXPECT_EQ(MOJO_RESULT_OK, | 446 EXPECT_EQ(MOJO_RESULT_OK, |
| 354 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000)); | 447 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000)); |
| 355 | 448 |
| 356 // Also check that |h[1]| is writable using |WaitMany()|. | 449 // Also check that |h[1]| is writable using |WaitMany()|. |
| 357 signals[0] = MOJO_HANDLE_SIGNAL_READABLE; | 450 signals[0] = MOJO_HANDLE_SIGNAL_READABLE; |
| 358 signals[1] = MOJO_HANDLE_SIGNAL_WRITABLE; | 451 signals[1] = MOJO_HANDLE_SIGNAL_WRITABLE; |
| 359 EXPECT_EQ(1, core()->WaitMany(h, signals, 2, MOJO_DEADLINE_INDEFINITE)); | 452 EXPECT_EQ(1, core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2, |
| 453 MOJO_DEADLINE_INDEFINITE)); |
| 360 | 454 |
| 361 // Write to |h[1]|. | 455 // Write to |h[1]|. |
| 362 buffer[0] = 'b'; | 456 buffer[0] = 'b'; |
| 363 EXPECT_EQ(MOJO_RESULT_OK, | 457 EXPECT_EQ(MOJO_RESULT_OK, |
| 364 core()->WriteMessage(h[1], buffer, 1, NULL, 0, | 458 core()->WriteMessage(h[1], UserPointer<const void>(buffer), 1, |
| 459 NullUserPointer(), 0, |
| 365 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 460 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 366 | 461 |
| 367 // Check that |h[0]| is now readable. | 462 // Check that |h[0]| is now readable. |
| 368 signals[0] = MOJO_HANDLE_SIGNAL_READABLE; | 463 signals[0] = MOJO_HANDLE_SIGNAL_READABLE; |
| 369 signals[1] = MOJO_HANDLE_SIGNAL_READABLE; | 464 signals[1] = MOJO_HANDLE_SIGNAL_READABLE; |
| 370 EXPECT_EQ(0, core()->WaitMany(h, signals, 2, MOJO_DEADLINE_INDEFINITE)); | 465 EXPECT_EQ(0, core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2, |
| 466 MOJO_DEADLINE_INDEFINITE)); |
| 371 | 467 |
| 372 // Read from |h[0]|. | 468 // Read from |h[0]|. |
| 373 // First, get only the size. | 469 // First, get only the size. |
| 374 buffer_size = 0; | 470 buffer_size = 0; |
| 375 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 471 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
| 376 core()->ReadMessage(h[0], NULL, &buffer_size, NULL, NULL, | 472 core()->ReadMessage(h[0], NullUserPointer(), |
| 473 MakeUserPointer(&buffer_size), |
| 474 NullUserPointer(), NullUserPointer(), |
| 377 MOJO_READ_MESSAGE_FLAG_NONE)); | 475 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 378 EXPECT_EQ(1u, buffer_size); | 476 EXPECT_EQ(1u, buffer_size); |
| 379 // Then actually read it. | 477 // Then actually read it. |
| 380 buffer[0] = 'c'; | 478 buffer[0] = 'c'; |
| 381 buffer_size = 1; | 479 buffer_size = 1; |
| 382 EXPECT_EQ(MOJO_RESULT_OK, | 480 EXPECT_EQ(MOJO_RESULT_OK, |
| 383 core()->ReadMessage(h[0], buffer, &buffer_size, NULL, NULL, | 481 core()->ReadMessage(h[0], UserPointer<void>(buffer), |
| 482 MakeUserPointer(&buffer_size), |
| 483 NullUserPointer(), NullUserPointer(), |
| 384 MOJO_READ_MESSAGE_FLAG_NONE)); | 484 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 385 EXPECT_EQ('b', buffer[0]); | 485 EXPECT_EQ('b', buffer[0]); |
| 386 EXPECT_EQ(1u, buffer_size); | 486 EXPECT_EQ(1u, buffer_size); |
| 387 | 487 |
| 388 // |h[0]| should no longer be readable. | 488 // |h[0]| should no longer be readable. |
| 389 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 489 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 390 core()->Wait(h[0], MOJO_HANDLE_SIGNAL_READABLE, 0)); | 490 core()->Wait(h[0], MOJO_HANDLE_SIGNAL_READABLE, 0)); |
| 391 | 491 |
| 392 // Write to |h[0]|. | 492 // Write to |h[0]|. |
| 393 buffer[0] = 'd'; | 493 buffer[0] = 'd'; |
| 394 EXPECT_EQ(MOJO_RESULT_OK, | 494 EXPECT_EQ(MOJO_RESULT_OK, |
| 395 core()->WriteMessage(h[0], buffer, 1, NULL, 0, | 495 core()->WriteMessage(h[0], UserPointer<const void>(buffer), 1, |
| 496 NullUserPointer(), 0, |
| 396 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 497 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 397 | 498 |
| 398 // Close |h[0]|. | 499 // Close |h[0]|. |
| 399 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0])); | 500 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0])); |
| 400 | 501 |
| 401 // Check that |h[1]| is no longer writable (and will never be). | 502 // Check that |h[1]| is no longer writable (and will never be). |
| 402 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 503 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 403 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000)); | 504 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000)); |
| 404 | 505 |
| 405 // Check that |h[1]| is still readable (for the moment). | 506 // Check that |h[1]| is still readable (for the moment). |
| 406 EXPECT_EQ(MOJO_RESULT_OK, | 507 EXPECT_EQ(MOJO_RESULT_OK, |
| 407 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 508 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); |
| 408 | 509 |
| 409 // Discard a message from |h[1]|. | 510 // Discard a message from |h[1]|. |
| 410 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 511 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
| 411 core()->ReadMessage(h[1], NULL, NULL, NULL, NULL, | 512 core()->ReadMessage(h[1], NullUserPointer(), NullUserPointer(), |
| 513 NullUserPointer(), NullUserPointer(), |
| 412 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); | 514 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
| 413 | 515 |
| 414 // |h[1]| is no longer readable (and will never be). | 516 // |h[1]| is no longer readable (and will never be). |
| 415 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 517 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 416 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 518 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); |
| 417 | 519 |
| 418 // Try writing to |h[1]|. | 520 // Try writing to |h[1]|. |
| 419 buffer[0] = 'e'; | 521 buffer[0] = 'e'; |
| 420 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 522 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 421 core()->WriteMessage(h[1], buffer, 1, NULL, 0, | 523 core()->WriteMessage(h[1], UserPointer<const void>(buffer), 1, |
| 524 NullUserPointer(), 0, |
| 422 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 525 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 423 | 526 |
| 424 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1])); | 527 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1])); |
| 425 } | 528 } |
| 426 | 529 |
| 427 // Tests passing a message pipe handle. | 530 // Tests passing a message pipe handle. |
| 428 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) { | 531 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) { |
| 429 const char kHello[] = "hello"; | 532 const char kHello[] = "hello"; |
| 430 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); | 533 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); |
| 431 const char kWorld[] = "world!!!"; | 534 const char kWorld[] = "world!!!"; |
| 432 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); | 535 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); |
| 433 char buffer[100]; | 536 char buffer[100]; |
| 434 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 537 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
| 435 uint32_t num_bytes; | 538 uint32_t num_bytes; |
| 436 MojoHandle handles[10]; | 539 MojoHandle handles[10]; |
| 437 uint32_t num_handles; | 540 uint32_t num_handles; |
| 438 MojoHandle h_received; | 541 MojoHandle h_received; |
| 439 | 542 |
| 440 MojoHandle h_passing[2]; | 543 MojoHandle h_passing[2]; |
| 441 EXPECT_EQ(MOJO_RESULT_OK, | 544 EXPECT_EQ(MOJO_RESULT_OK, |
| 442 core()->CreateMessagePipe(NULL, &h_passing[0], &h_passing[1])); | 545 core()->CreateMessagePipe(NullUserPointer(), |
| 546 MakeUserPointer(&h_passing[0]), |
| 547 MakeUserPointer(&h_passing[1]))); |
| 443 | 548 |
| 444 // Make sure that |h_passing[]| work properly. | 549 // Make sure that |h_passing[]| work properly. |
| 445 EXPECT_EQ(MOJO_RESULT_OK, | 550 EXPECT_EQ(MOJO_RESULT_OK, |
| 446 core()->WriteMessage(h_passing[0], | 551 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), |
| 447 kHello, kHelloSize, | 552 kHelloSize, NullUserPointer(), 0, |
| 448 NULL, 0, | |
| 449 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 553 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 450 EXPECT_EQ(MOJO_RESULT_OK, | 554 EXPECT_EQ(MOJO_RESULT_OK, |
| 451 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, | 555 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, |
| 452 1000000000)); | 556 1000000000)); |
| 453 num_bytes = kBufferSize; | 557 num_bytes = kBufferSize; |
| 454 num_handles = arraysize(handles); | 558 num_handles = arraysize(handles); |
| 455 EXPECT_EQ(MOJO_RESULT_OK, | 559 EXPECT_EQ(MOJO_RESULT_OK, |
| 456 core()->ReadMessage(h_passing[1], | 560 core()->ReadMessage(h_passing[1], UserPointer<void>(buffer), |
| 457 buffer, &num_bytes, | 561 MakeUserPointer(&num_bytes), |
| 458 handles, &num_handles, | 562 MakeUserPointer(handles), |
| 563 MakeUserPointer(&num_handles), |
| 459 MOJO_READ_MESSAGE_FLAG_NONE)); | 564 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 460 EXPECT_EQ(kHelloSize, num_bytes); | 565 EXPECT_EQ(kHelloSize, num_bytes); |
| 461 EXPECT_STREQ(kHello, buffer); | 566 EXPECT_STREQ(kHello, buffer); |
| 462 EXPECT_EQ(0u, num_handles); | 567 EXPECT_EQ(0u, num_handles); |
| 463 | 568 |
| 464 // Make sure that you can't pass either of the message pipe's handles over | 569 // Make sure that you can't pass either of the message pipe's handles over |
| 465 // itself. | 570 // itself. |
| 466 EXPECT_EQ(MOJO_RESULT_BUSY, | 571 EXPECT_EQ(MOJO_RESULT_BUSY, |
| 467 core()->WriteMessage(h_passing[0], | 572 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), |
| 468 kHello, kHelloSize, | 573 kHelloSize, MakeUserPointer(&h_passing[0]), 1, |
| 469 &h_passing[0], 1, | |
| 470 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 574 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 471 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 575 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 472 core()->WriteMessage(h_passing[0], | 576 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), |
| 473 kHello, kHelloSize, | 577 kHelloSize, MakeUserPointer(&h_passing[1]), 1, |
| 474 &h_passing[1], 1, | |
| 475 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 578 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 476 | 579 |
| 477 MojoHandle h_passed[2]; | 580 MojoHandle h_passed[2]; |
| 478 EXPECT_EQ(MOJO_RESULT_OK, | 581 EXPECT_EQ(MOJO_RESULT_OK, |
| 479 core()->CreateMessagePipe(NULL, &h_passed[0], &h_passed[1])); | 582 core()->CreateMessagePipe(NullUserPointer(), |
| 583 MakeUserPointer(&h_passed[0]), |
| 584 MakeUserPointer(&h_passed[1]))); |
| 480 | 585 |
| 481 // Make sure that |h_passed[]| work properly. | 586 // Make sure that |h_passed[]| work properly. |
| 482 EXPECT_EQ(MOJO_RESULT_OK, | 587 EXPECT_EQ(MOJO_RESULT_OK, |
| 483 core()->WriteMessage(h_passed[0], | 588 core()->WriteMessage(h_passed[0], UserPointer<const void>(kHello), |
| 484 kHello, kHelloSize, | 589 kHelloSize, NullUserPointer(), 0, |
| 485 NULL, 0, | |
| 486 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 590 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 487 EXPECT_EQ(MOJO_RESULT_OK, | 591 EXPECT_EQ(MOJO_RESULT_OK, |
| 488 core()->Wait(h_passed[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 592 core()->Wait(h_passed[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); |
| 489 num_bytes = kBufferSize; | 593 num_bytes = kBufferSize; |
| 490 num_handles = arraysize(handles); | 594 num_handles = arraysize(handles); |
| 491 EXPECT_EQ(MOJO_RESULT_OK, | 595 EXPECT_EQ(MOJO_RESULT_OK, |
| 492 core()->ReadMessage(h_passed[1], | 596 core()->ReadMessage(h_passed[1], UserPointer<void>(buffer), |
| 493 buffer, &num_bytes, | 597 MakeUserPointer(&num_bytes), |
| 494 handles, &num_handles, | 598 MakeUserPointer(handles), |
| 599 MakeUserPointer(&num_handles), |
| 495 MOJO_READ_MESSAGE_FLAG_NONE)); | 600 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 496 EXPECT_EQ(kHelloSize, num_bytes); | 601 EXPECT_EQ(kHelloSize, num_bytes); |
| 497 EXPECT_STREQ(kHello, buffer); | 602 EXPECT_STREQ(kHello, buffer); |
| 498 EXPECT_EQ(0u, num_handles); | 603 EXPECT_EQ(0u, num_handles); |
| 499 | 604 |
| 500 // Send |h_passed[1]| from |h_passing[0]| to |h_passing[1]|. | 605 // Send |h_passed[1]| from |h_passing[0]| to |h_passing[1]|. |
| 501 EXPECT_EQ(MOJO_RESULT_OK, | 606 EXPECT_EQ(MOJO_RESULT_OK, |
| 502 core()->WriteMessage(h_passing[0], | 607 core()->WriteMessage(h_passing[0], UserPointer<const void>(kWorld), |
| 503 kWorld, kWorldSize, | 608 kWorldSize, |
| 504 &h_passed[1], 1, | 609 MakeUserPointer(&h_passed[1]), 1, |
| 505 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 610 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 506 EXPECT_EQ(MOJO_RESULT_OK, | 611 EXPECT_EQ(MOJO_RESULT_OK, |
| 507 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, | 612 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, |
| 508 1000000000)); | 613 1000000000)); |
| 509 num_bytes = kBufferSize; | 614 num_bytes = kBufferSize; |
| 510 num_handles = arraysize(handles); | 615 num_handles = arraysize(handles); |
| 511 EXPECT_EQ(MOJO_RESULT_OK, | 616 EXPECT_EQ(MOJO_RESULT_OK, |
| 512 core()->ReadMessage(h_passing[1], | 617 core()->ReadMessage(h_passing[1], UserPointer<void>(buffer), |
| 513 buffer, &num_bytes, | 618 MakeUserPointer(&num_bytes), |
| 514 handles, &num_handles, | 619 MakeUserPointer(handles), |
| 620 MakeUserPointer(&num_handles), |
| 515 MOJO_READ_MESSAGE_FLAG_NONE)); | 621 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 516 EXPECT_EQ(kWorldSize, num_bytes); | 622 EXPECT_EQ(kWorldSize, num_bytes); |
| 517 EXPECT_STREQ(kWorld, buffer); | 623 EXPECT_STREQ(kWorld, buffer); |
| 518 EXPECT_EQ(1u, num_handles); | 624 EXPECT_EQ(1u, num_handles); |
| 519 h_received = handles[0]; | 625 h_received = handles[0]; |
| 520 EXPECT_NE(h_received, MOJO_HANDLE_INVALID); | 626 EXPECT_NE(h_received, MOJO_HANDLE_INVALID); |
| 521 EXPECT_NE(h_received, h_passing[0]); | 627 EXPECT_NE(h_received, h_passing[0]); |
| 522 EXPECT_NE(h_received, h_passing[1]); | 628 EXPECT_NE(h_received, h_passing[1]); |
| 523 EXPECT_NE(h_received, h_passed[0]); | 629 EXPECT_NE(h_received, h_passed[0]); |
| 524 | 630 |
| 525 // Note: We rely on the Mojo system not re-using handle values very often. | 631 // Note: We rely on the Mojo system not re-using handle values very often. |
| 526 EXPECT_NE(h_received, h_passed[1]); | 632 EXPECT_NE(h_received, h_passed[1]); |
| 527 | 633 |
| 528 // |h_passed[1]| should no longer be valid; check that trying to close it | 634 // |h_passed[1]| should no longer be valid; check that trying to close it |
| 529 // fails. See above note. | 635 // fails. See above note. |
| 530 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h_passed[1])); | 636 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h_passed[1])); |
| 531 | 637 |
| 532 // Write to |h_passed[0]|. Should receive on |h_received|. | 638 // Write to |h_passed[0]|. Should receive on |h_received|. |
| 533 EXPECT_EQ(MOJO_RESULT_OK, | 639 EXPECT_EQ(MOJO_RESULT_OK, |
| 534 core()->WriteMessage(h_passed[0], | 640 core()->WriteMessage(h_passed[0], UserPointer<const void>(kHello), |
| 535 kHello, kHelloSize, | 641 kHelloSize, NullUserPointer(), 0, |
| 536 NULL, 0, | |
| 537 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 642 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 538 EXPECT_EQ(MOJO_RESULT_OK, | 643 EXPECT_EQ(MOJO_RESULT_OK, |
| 539 core()->Wait(h_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 644 core()->Wait(h_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); |
| 540 num_bytes = kBufferSize; | 645 num_bytes = kBufferSize; |
| 541 num_handles = arraysize(handles); | 646 num_handles = arraysize(handles); |
| 542 EXPECT_EQ(MOJO_RESULT_OK, | 647 EXPECT_EQ(MOJO_RESULT_OK, |
| 543 core()->ReadMessage(h_received, | 648 core()->ReadMessage(h_received, UserPointer<void>(buffer), |
| 544 buffer, &num_bytes, | 649 MakeUserPointer(&num_bytes), |
| 545 handles, &num_handles, | 650 MakeUserPointer(handles), |
| 651 MakeUserPointer(&num_handles), |
| 546 MOJO_READ_MESSAGE_FLAG_NONE)); | 652 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 547 EXPECT_EQ(kHelloSize, num_bytes); | 653 EXPECT_EQ(kHelloSize, num_bytes); |
| 548 EXPECT_STREQ(kHello, buffer); | 654 EXPECT_STREQ(kHello, buffer); |
| 549 EXPECT_EQ(0u, num_handles); | 655 EXPECT_EQ(0u, num_handles); |
| 550 | 656 |
| 551 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0])); | 657 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0])); |
| 552 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); | 658 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); |
| 553 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0])); | 659 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0])); |
| 554 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_received)); | 660 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_received)); |
| 555 } | 661 } |
| 556 | 662 |
| 557 TEST_F(CoreTest, DataPipe) { | 663 TEST_F(CoreTest, DataPipe) { |
| 558 MojoHandle ph, ch; // p is for producer and c is for consumer. | 664 MojoHandle ph, ch; // p is for producer and c is for consumer. |
| 559 | 665 |
| 560 EXPECT_EQ(MOJO_RESULT_OK, core()->CreateDataPipe(NULL, &ph, &ch)); | 666 EXPECT_EQ(MOJO_RESULT_OK, |
| 667 core()->CreateDataPipe(NullUserPointer(), MakeUserPointer(&ph), |
| 668 MakeUserPointer(&ch))); |
| 561 // Should get two distinct, valid handles. | 669 // Should get two distinct, valid handles. |
| 562 EXPECT_NE(ph, MOJO_HANDLE_INVALID); | 670 EXPECT_NE(ph, MOJO_HANDLE_INVALID); |
| 563 EXPECT_NE(ch, MOJO_HANDLE_INVALID); | 671 EXPECT_NE(ch, MOJO_HANDLE_INVALID); |
| 564 EXPECT_NE(ph, ch); | 672 EXPECT_NE(ph, ch); |
| 565 | 673 |
| 566 // Producer should be never-readable, but already writable. | 674 // Producer should be never-readable, but already writable. |
| 567 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 675 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 568 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0)); | 676 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0)); |
| 569 EXPECT_EQ(MOJO_RESULT_OK, | 677 EXPECT_EQ(MOJO_RESULT_OK, |
| 570 core()->Wait(ph, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); | 678 core()->Wait(ph, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
| 571 | 679 |
| 572 // Consumer should be never-writable, and not yet readable. | 680 // Consumer should be never-writable, and not yet readable. |
| 573 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 681 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 574 core()->Wait(ch, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); | 682 core()->Wait(ch, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
| 575 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 683 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 576 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0)); | 684 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0)); |
| 577 | 685 |
| 578 // Write. | 686 // Write. |
| 579 char elements[2] = {'A', 'B'}; | 687 char elements[2] = {'A', 'B'}; |
| 580 uint32_t num_bytes = 2u; | 688 uint32_t num_bytes = 2u; |
| 581 EXPECT_EQ(MOJO_RESULT_OK, | 689 EXPECT_EQ(MOJO_RESULT_OK, |
| 582 core()->WriteData(ph, elements, &num_bytes, | 690 core()->WriteData(ph, UserPointer<const void>(elements), |
| 691 MakeUserPointer(&num_bytes), |
| 583 MOJO_WRITE_DATA_FLAG_NONE)); | 692 MOJO_WRITE_DATA_FLAG_NONE)); |
| 584 EXPECT_EQ(2u, num_bytes); | 693 EXPECT_EQ(2u, num_bytes); |
| 585 | 694 |
| 586 // Consumer should now be readable. | 695 // Consumer should now be readable. |
| 587 EXPECT_EQ(MOJO_RESULT_OK, | 696 EXPECT_EQ(MOJO_RESULT_OK, |
| 588 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0)); | 697 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0)); |
| 589 | 698 |
| 590 // Read one character. | 699 // Read one character. |
| 591 elements[0] = -1; | 700 elements[0] = -1; |
| 592 elements[1] = -1; | 701 elements[1] = -1; |
| 593 num_bytes = 1u; | 702 num_bytes = 1u; |
| 594 EXPECT_EQ(MOJO_RESULT_OK, | 703 EXPECT_EQ(MOJO_RESULT_OK, |
| 595 core()->ReadData(ch, elements, &num_bytes, | 704 core()->ReadData(ch, UserPointer<void>(elements), |
| 705 MakeUserPointer(&num_bytes), |
| 596 MOJO_READ_DATA_FLAG_NONE)); | 706 MOJO_READ_DATA_FLAG_NONE)); |
| 597 EXPECT_EQ('A', elements[0]); | 707 EXPECT_EQ('A', elements[0]); |
| 598 EXPECT_EQ(-1, elements[1]); | 708 EXPECT_EQ(-1, elements[1]); |
| 599 | 709 |
| 600 // Two-phase write. | 710 // Two-phase write. |
| 601 void* write_ptr = NULL; | 711 void* write_ptr = NULL; |
| 602 num_bytes = 0u; | 712 num_bytes = 0u; |
| 603 ASSERT_EQ(MOJO_RESULT_OK, | 713 ASSERT_EQ(MOJO_RESULT_OK, |
| 604 core()->BeginWriteData(ph, &write_ptr, &num_bytes, | 714 core()->BeginWriteData(ph, MakeUserPointer(&write_ptr), |
| 715 MakeUserPointer(&num_bytes), |
| 605 MOJO_WRITE_DATA_FLAG_NONE)); | 716 MOJO_WRITE_DATA_FLAG_NONE)); |
| 606 // We count on the default options providing a decent buffer size. | 717 // We count on the default options providing a decent buffer size. |
| 607 ASSERT_GE(num_bytes, 3u); | 718 ASSERT_GE(num_bytes, 3u); |
| 608 | 719 |
| 609 // Trying to do a normal write during a two-phase write should fail. | 720 // Trying to do a normal write during a two-phase write should fail. |
| 610 elements[0] = 'X'; | 721 elements[0] = 'X'; |
| 611 num_bytes = 1u; | 722 num_bytes = 1u; |
| 612 EXPECT_EQ(MOJO_RESULT_BUSY, | 723 EXPECT_EQ(MOJO_RESULT_BUSY, |
| 613 core()->WriteData(ph, elements, &num_bytes, | 724 core()->WriteData(ph, UserPointer<const void>(elements), |
| 725 MakeUserPointer(&num_bytes), |
| 614 MOJO_WRITE_DATA_FLAG_NONE)); | 726 MOJO_WRITE_DATA_FLAG_NONE)); |
| 615 | 727 |
| 616 // Actually write the data, and complete it now. | 728 // Actually write the data, and complete it now. |
| 617 static_cast<char*>(write_ptr)[0] = 'C'; | 729 static_cast<char*>(write_ptr)[0] = 'C'; |
| 618 static_cast<char*>(write_ptr)[1] = 'D'; | 730 static_cast<char*>(write_ptr)[1] = 'D'; |
| 619 static_cast<char*>(write_ptr)[2] = 'E'; | 731 static_cast<char*>(write_ptr)[2] = 'E'; |
| 620 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 3u)); | 732 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 3u)); |
| 621 | 733 |
| 622 // Query how much data we have. | 734 // Query how much data we have. |
| 623 num_bytes = 0; | 735 num_bytes = 0; |
| 624 EXPECT_EQ(MOJO_RESULT_OK, | 736 EXPECT_EQ(MOJO_RESULT_OK, |
| 625 core()->ReadData(ch, NULL, &num_bytes, MOJO_READ_DATA_FLAG_QUERY)); | 737 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), |
| 738 MOJO_READ_DATA_FLAG_QUERY)); |
| 626 EXPECT_EQ(4u, num_bytes); | 739 EXPECT_EQ(4u, num_bytes); |
| 627 | 740 |
| 628 // Try to discard ten characters, in all-or-none mode. Should fail. | 741 // Try to discard ten characters, in all-or-none mode. Should fail. |
| 629 num_bytes = 10; | 742 num_bytes = 10; |
| 630 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 743 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 631 core()->ReadData(ch, NULL, &num_bytes, | 744 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), |
| 632 MOJO_READ_DATA_FLAG_DISCARD | | 745 MOJO_READ_DATA_FLAG_DISCARD | |
| 633 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); | 746 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); |
| 634 | 747 |
| 635 // Discard two characters. | 748 // Discard two characters. |
| 636 num_bytes = 2; | 749 num_bytes = 2; |
| 637 EXPECT_EQ(MOJO_RESULT_OK, | 750 EXPECT_EQ(MOJO_RESULT_OK, |
| 638 core()->ReadData(ch, NULL, &num_bytes, | 751 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), |
| 639 MOJO_READ_DATA_FLAG_DISCARD | | 752 MOJO_READ_DATA_FLAG_DISCARD | |
| 640 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); | 753 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); |
| 641 | 754 |
| 642 // Read the remaining two characters, in two-phase mode (all-or-none). | 755 // Read the remaining two characters, in two-phase mode (all-or-none). |
| 643 const void* read_ptr = NULL; | 756 const void* read_ptr = NULL; |
| 644 num_bytes = 2; | 757 num_bytes = 2; |
| 645 ASSERT_EQ(MOJO_RESULT_OK, | 758 ASSERT_EQ(MOJO_RESULT_OK, |
| 646 core()->BeginReadData(ch, &read_ptr, &num_bytes, | 759 core()->BeginReadData(ch, MakeUserPointer(&read_ptr), |
| 760 MakeUserPointer(&num_bytes), |
| 647 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); | 761 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); |
| 648 // Note: Count on still being able to do the contiguous read here. | 762 // Note: Count on still being able to do the contiguous read here. |
| 649 ASSERT_EQ(2u, num_bytes); | 763 ASSERT_EQ(2u, num_bytes); |
| 650 | 764 |
| 651 // Discarding right now should fail. | 765 // Discarding right now should fail. |
| 652 num_bytes = 1; | 766 num_bytes = 1; |
| 653 EXPECT_EQ(MOJO_RESULT_BUSY, | 767 EXPECT_EQ(MOJO_RESULT_BUSY, |
| 654 core()->ReadData(ch, NULL, &num_bytes, | 768 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), |
| 655 MOJO_READ_DATA_FLAG_DISCARD)); | 769 MOJO_READ_DATA_FLAG_DISCARD)); |
| 656 | 770 |
| 657 // Actually check our data and end the two-phase read. | 771 // Actually check our data and end the two-phase read. |
| 658 EXPECT_EQ('D', static_cast<const char*>(read_ptr)[0]); | 772 EXPECT_EQ('D', static_cast<const char*>(read_ptr)[0]); |
| 659 EXPECT_EQ('E', static_cast<const char*>(read_ptr)[1]); | 773 EXPECT_EQ('E', static_cast<const char*>(read_ptr)[1]); |
| 660 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 2u)); | 774 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 2u)); |
| 661 | 775 |
| 662 // Consumer should now be no longer readable. | 776 // Consumer should now be no longer readable. |
| 663 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 777 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 664 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0)); | 778 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0)); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 682 const char kWorld[] = "world!!!"; | 796 const char kWorld[] = "world!!!"; |
| 683 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); | 797 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); |
| 684 char buffer[100]; | 798 char buffer[100]; |
| 685 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 799 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
| 686 uint32_t num_bytes; | 800 uint32_t num_bytes; |
| 687 MojoHandle handles[10]; | 801 MojoHandle handles[10]; |
| 688 uint32_t num_handles; | 802 uint32_t num_handles; |
| 689 | 803 |
| 690 MojoHandle h_passing[2]; | 804 MojoHandle h_passing[2]; |
| 691 EXPECT_EQ(MOJO_RESULT_OK, | 805 EXPECT_EQ(MOJO_RESULT_OK, |
| 692 core()->CreateMessagePipe(NULL, &h_passing[0], &h_passing[1])); | 806 core()->CreateMessagePipe(NullUserPointer(), |
| 807 MakeUserPointer(&h_passing[0]), |
| 808 MakeUserPointer(&h_passing[1]))); |
| 693 | 809 |
| 694 MojoHandle ph, ch; | 810 MojoHandle ph, ch; |
| 695 EXPECT_EQ(MOJO_RESULT_OK, | 811 EXPECT_EQ(MOJO_RESULT_OK, |
| 696 core()->CreateDataPipe(NULL, &ph, &ch)); | 812 core()->CreateDataPipe(NullUserPointer(), MakeUserPointer(&ph), |
| 813 MakeUserPointer(&ch))); |
| 697 | 814 |
| 698 // Send |ch| from |h_passing[0]| to |h_passing[1]|. | 815 // Send |ch| from |h_passing[0]| to |h_passing[1]|. |
| 699 EXPECT_EQ(MOJO_RESULT_OK, | 816 EXPECT_EQ(MOJO_RESULT_OK, |
| 700 core()->WriteMessage(h_passing[0], | 817 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), |
| 701 kHello, kHelloSize, | 818 kHelloSize, MakeUserPointer(&ch), 1, |
| 702 &ch, 1, | |
| 703 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 819 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 704 EXPECT_EQ(MOJO_RESULT_OK, | 820 EXPECT_EQ(MOJO_RESULT_OK, |
| 705 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, | 821 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, |
| 706 1000000000)); | 822 1000000000)); |
| 707 num_bytes = kBufferSize; | 823 num_bytes = kBufferSize; |
| 708 num_handles = arraysize(handles); | 824 num_handles = arraysize(handles); |
| 709 EXPECT_EQ(MOJO_RESULT_OK, | 825 EXPECT_EQ(MOJO_RESULT_OK, |
| 710 core()->ReadMessage(h_passing[1], | 826 core()->ReadMessage(h_passing[1], UserPointer<void>(buffer), |
| 711 buffer, &num_bytes, | 827 MakeUserPointer(&num_bytes), |
| 712 handles, &num_handles, | 828 MakeUserPointer(handles), |
| 829 MakeUserPointer(&num_handles), |
| 713 MOJO_READ_MESSAGE_FLAG_NONE)); | 830 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 714 EXPECT_EQ(kHelloSize, num_bytes); | 831 EXPECT_EQ(kHelloSize, num_bytes); |
| 715 EXPECT_STREQ(kHello, buffer); | 832 EXPECT_STREQ(kHello, buffer); |
| 716 EXPECT_EQ(1u, num_handles); | 833 EXPECT_EQ(1u, num_handles); |
| 717 MojoHandle ch_received = handles[0]; | 834 MojoHandle ch_received = handles[0]; |
| 718 EXPECT_NE(ch_received, MOJO_HANDLE_INVALID); | 835 EXPECT_NE(ch_received, MOJO_HANDLE_INVALID); |
| 719 EXPECT_NE(ch_received, h_passing[0]); | 836 EXPECT_NE(ch_received, h_passing[0]); |
| 720 EXPECT_NE(ch_received, h_passing[1]); | 837 EXPECT_NE(ch_received, h_passing[1]); |
| 721 EXPECT_NE(ch_received, ph); | 838 EXPECT_NE(ch_received, ph); |
| 722 | 839 |
| 723 // Note: We rely on the Mojo system not re-using handle values very often. | 840 // Note: We rely on the Mojo system not re-using handle values very often. |
| 724 EXPECT_NE(ch_received, ch); | 841 EXPECT_NE(ch_received, ch); |
| 725 | 842 |
| 726 // |ch| should no longer be valid; check that trying to close it fails. See | 843 // |ch| should no longer be valid; check that trying to close it fails. See |
| 727 // above note. | 844 // above note. |
| 728 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ch)); | 845 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ch)); |
| 729 | 846 |
| 730 // Write to |ph|. Should receive on |ch_received|. | 847 // Write to |ph|. Should receive on |ch_received|. |
| 731 num_bytes = kWorldSize; | 848 num_bytes = kWorldSize; |
| 732 EXPECT_EQ(MOJO_RESULT_OK, | 849 EXPECT_EQ(MOJO_RESULT_OK, |
| 733 core()->WriteData(ph, kWorld, &num_bytes, | 850 core()->WriteData(ph, UserPointer<const void>(kWorld), |
| 851 MakeUserPointer(&num_bytes), |
| 734 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)); | 852 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)); |
| 735 EXPECT_EQ(MOJO_RESULT_OK, | 853 EXPECT_EQ(MOJO_RESULT_OK, |
| 736 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 854 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); |
| 737 num_bytes = kBufferSize; | 855 num_bytes = kBufferSize; |
| 738 EXPECT_EQ(MOJO_RESULT_OK, | 856 EXPECT_EQ(MOJO_RESULT_OK, |
| 739 core()->ReadData(ch_received, buffer, &num_bytes, | 857 core()->ReadData(ch_received, UserPointer<void>(buffer), |
| 858 MakeUserPointer(&num_bytes), |
| 740 MOJO_READ_MESSAGE_FLAG_NONE)); | 859 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 741 EXPECT_EQ(kWorldSize, num_bytes); | 860 EXPECT_EQ(kWorldSize, num_bytes); |
| 742 EXPECT_STREQ(kWorld, buffer); | 861 EXPECT_STREQ(kWorld, buffer); |
| 743 | 862 |
| 744 // Now pass |ph| in the same direction. | 863 // Now pass |ph| in the same direction. |
| 745 EXPECT_EQ(MOJO_RESULT_OK, | 864 EXPECT_EQ(MOJO_RESULT_OK, |
| 746 core()->WriteMessage(h_passing[0], | 865 core()->WriteMessage(h_passing[0], UserPointer<const void>(kWorld), |
| 747 kWorld, kWorldSize, | 866 kWorldSize, MakeUserPointer(&ph), 1, |
| 748 &ph, 1, | |
| 749 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 867 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 750 EXPECT_EQ(MOJO_RESULT_OK, | 868 EXPECT_EQ(MOJO_RESULT_OK, |
| 751 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, | 869 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, |
| 752 1000000000)); | 870 1000000000)); |
| 753 num_bytes = kBufferSize; | 871 num_bytes = kBufferSize; |
| 754 num_handles = arraysize(handles); | 872 num_handles = arraysize(handles); |
| 755 EXPECT_EQ(MOJO_RESULT_OK, | 873 EXPECT_EQ(MOJO_RESULT_OK, |
| 756 core()->ReadMessage(h_passing[1], | 874 core()->ReadMessage(h_passing[1], UserPointer<void>(buffer), |
| 757 buffer, &num_bytes, | 875 MakeUserPointer(&num_bytes), |
| 758 handles, &num_handles, | 876 MakeUserPointer(handles), |
| 877 MakeUserPointer(&num_handles), |
| 759 MOJO_READ_MESSAGE_FLAG_NONE)); | 878 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 760 EXPECT_EQ(kWorldSize, num_bytes); | 879 EXPECT_EQ(kWorldSize, num_bytes); |
| 761 EXPECT_STREQ(kWorld, buffer); | 880 EXPECT_STREQ(kWorld, buffer); |
| 762 EXPECT_EQ(1u, num_handles); | 881 EXPECT_EQ(1u, num_handles); |
| 763 MojoHandle ph_received = handles[0]; | 882 MojoHandle ph_received = handles[0]; |
| 764 EXPECT_NE(ph_received, MOJO_HANDLE_INVALID); | 883 EXPECT_NE(ph_received, MOJO_HANDLE_INVALID); |
| 765 EXPECT_NE(ph_received, h_passing[0]); | 884 EXPECT_NE(ph_received, h_passing[0]); |
| 766 EXPECT_NE(ph_received, h_passing[1]); | 885 EXPECT_NE(ph_received, h_passing[1]); |
| 767 EXPECT_NE(ph_received, ch_received); | 886 EXPECT_NE(ph_received, ch_received); |
| 768 | 887 |
| 769 // Again, rely on the Mojo system not re-using handle values very often. | 888 // Again, rely on the Mojo system not re-using handle values very often. |
| 770 EXPECT_NE(ph_received, ph); | 889 EXPECT_NE(ph_received, ph); |
| 771 | 890 |
| 772 // |ph| should no longer be valid; check that trying to close it fails. See | 891 // |ph| should no longer be valid; check that trying to close it fails. See |
| 773 // above note. | 892 // above note. |
| 774 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ph)); | 893 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ph)); |
| 775 | 894 |
| 776 // Write to |ph_received|. Should receive on |ch_received|. | 895 // Write to |ph_received|. Should receive on |ch_received|. |
| 777 num_bytes = kHelloSize; | 896 num_bytes = kHelloSize; |
| 778 EXPECT_EQ(MOJO_RESULT_OK, | 897 EXPECT_EQ(MOJO_RESULT_OK, |
| 779 core()->WriteData(ph_received, kHello, &num_bytes, | 898 core()->WriteData(ph_received, UserPointer<const void>(kHello), |
| 899 MakeUserPointer(&num_bytes), |
| 780 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)); | 900 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)); |
| 781 EXPECT_EQ(MOJO_RESULT_OK, | 901 EXPECT_EQ(MOJO_RESULT_OK, |
| 782 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 902 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); |
| 783 num_bytes = kBufferSize; | 903 num_bytes = kBufferSize; |
| 784 EXPECT_EQ(MOJO_RESULT_OK, | 904 EXPECT_EQ(MOJO_RESULT_OK, |
| 785 core()->ReadData(ch_received, buffer, &num_bytes, | 905 core()->ReadData(ch_received, UserPointer<void>(buffer), |
| 906 MakeUserPointer(&num_bytes), |
| 786 MOJO_READ_MESSAGE_FLAG_NONE)); | 907 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 787 EXPECT_EQ(kHelloSize, num_bytes); | 908 EXPECT_EQ(kHelloSize, num_bytes); |
| 788 EXPECT_STREQ(kHello, buffer); | 909 EXPECT_STREQ(kHello, buffer); |
| 789 | 910 |
| 790 ph = ph_received; | 911 ph = ph_received; |
| 791 ph_received = MOJO_HANDLE_INVALID; | 912 ph_received = MOJO_HANDLE_INVALID; |
| 792 ch = ch_received; | 913 ch = ch_received; |
| 793 ch_received = MOJO_HANDLE_INVALID; | 914 ch_received = MOJO_HANDLE_INVALID; |
| 794 | 915 |
| 795 // Make sure that |ph| can't be sent if it's in a two-phase write. | 916 // Make sure that |ph| can't be sent if it's in a two-phase write. |
| 796 void* write_ptr = NULL; | 917 void* write_ptr = NULL; |
| 797 num_bytes = 0; | 918 num_bytes = 0; |
| 798 ASSERT_EQ(MOJO_RESULT_OK, | 919 ASSERT_EQ(MOJO_RESULT_OK, |
| 799 core()->BeginWriteData(ph, &write_ptr, &num_bytes, | 920 core()->BeginWriteData(ph, MakeUserPointer(&write_ptr), |
| 921 MakeUserPointer(&num_bytes), |
| 800 MOJO_WRITE_DATA_FLAG_NONE)); | 922 MOJO_WRITE_DATA_FLAG_NONE)); |
| 801 ASSERT_GE(num_bytes, 1u); | 923 ASSERT_GE(num_bytes, 1u); |
| 802 EXPECT_EQ(MOJO_RESULT_BUSY, | 924 EXPECT_EQ(MOJO_RESULT_BUSY, |
| 803 core()->WriteMessage(h_passing[0], | 925 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), |
| 804 kHello, kHelloSize, | 926 kHelloSize, MakeUserPointer(&ph), 1, |
| 805 &ph, 1, | |
| 806 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 927 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 807 | 928 |
| 808 // But |ch| can, even if |ph| is in a two-phase write. | 929 // But |ch| can, even if |ph| is in a two-phase write. |
| 809 EXPECT_EQ(MOJO_RESULT_OK, | 930 EXPECT_EQ(MOJO_RESULT_OK, |
| 810 core()->WriteMessage(h_passing[0], | 931 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), |
| 811 kHello, kHelloSize, | 932 kHelloSize, MakeUserPointer(&ch), 1, |
| 812 &ch, 1, | |
| 813 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 933 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 814 ch = MOJO_HANDLE_INVALID; | 934 ch = MOJO_HANDLE_INVALID; |
| 815 EXPECT_EQ(MOJO_RESULT_OK, | 935 EXPECT_EQ(MOJO_RESULT_OK, |
| 816 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, | 936 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, |
| 817 1000000000)); | 937 1000000000)); |
| 818 num_bytes = kBufferSize; | 938 num_bytes = kBufferSize; |
| 819 num_handles = arraysize(handles); | 939 num_handles = arraysize(handles); |
| 820 EXPECT_EQ(MOJO_RESULT_OK, | 940 EXPECT_EQ(MOJO_RESULT_OK, |
| 821 core()->ReadMessage(h_passing[1], | 941 core()->ReadMessage(h_passing[1], UserPointer<void>(buffer), |
| 822 buffer, &num_bytes, | 942 MakeUserPointer(&num_bytes), |
| 823 handles, &num_handles, | 943 MakeUserPointer(handles), |
| 944 MakeUserPointer(&num_handles), |
| 824 MOJO_READ_MESSAGE_FLAG_NONE)); | 945 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 825 EXPECT_EQ(kHelloSize, num_bytes); | 946 EXPECT_EQ(kHelloSize, num_bytes); |
| 826 EXPECT_STREQ(kHello, buffer); | 947 EXPECT_STREQ(kHello, buffer); |
| 827 EXPECT_EQ(1u, num_handles); | 948 EXPECT_EQ(1u, num_handles); |
| 828 ch = handles[0]; | 949 ch = handles[0]; |
| 829 EXPECT_NE(ch, MOJO_HANDLE_INVALID); | 950 EXPECT_NE(ch, MOJO_HANDLE_INVALID); |
| 830 | 951 |
| 831 // Complete the two-phase write. | 952 // Complete the two-phase write. |
| 832 static_cast<char*>(write_ptr)[0] = 'x'; | 953 static_cast<char*>(write_ptr)[0] = 'x'; |
| 833 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 1)); | 954 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 1)); |
| 834 | 955 |
| 835 // Wait for |ch| to be readable. | 956 // Wait for |ch| to be readable. |
| 836 EXPECT_EQ(MOJO_RESULT_OK, | 957 EXPECT_EQ(MOJO_RESULT_OK, |
| 837 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); | 958 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); |
| 838 | 959 |
| 839 // Make sure that |ch| can't be sent if it's in a two-phase read. | 960 // Make sure that |ch| can't be sent if it's in a two-phase read. |
| 840 const void* read_ptr = NULL; | 961 const void* read_ptr = NULL; |
| 841 num_bytes = 1; | 962 num_bytes = 1; |
| 842 ASSERT_EQ(MOJO_RESULT_OK, | 963 ASSERT_EQ(MOJO_RESULT_OK, |
| 843 core()->BeginReadData(ch, &read_ptr, &num_bytes, | 964 core()->BeginReadData(ch, MakeUserPointer(&read_ptr), |
| 965 MakeUserPointer(&num_bytes), |
| 844 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); | 966 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); |
| 845 EXPECT_EQ(MOJO_RESULT_BUSY, | 967 EXPECT_EQ(MOJO_RESULT_BUSY, |
| 846 core()->WriteMessage(h_passing[0], | 968 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), |
| 847 kHello, kHelloSize, | 969 kHelloSize, MakeUserPointer(&ch), 1, |
| 848 &ch, 1, | |
| 849 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 970 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 850 | 971 |
| 851 // But |ph| can, even if |ch| is in a two-phase read. | 972 // But |ph| can, even if |ch| is in a two-phase read. |
| 852 EXPECT_EQ(MOJO_RESULT_OK, | 973 EXPECT_EQ(MOJO_RESULT_OK, |
| 853 core()->WriteMessage(h_passing[0], | 974 core()->WriteMessage(h_passing[0], UserPointer<const void>(kWorld), |
| 854 kWorld, kWorldSize, | 975 kWorldSize, MakeUserPointer(&ph), 1, |
| 855 &ph, 1, | |
| 856 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 976 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 857 ph = MOJO_HANDLE_INVALID; | 977 ph = MOJO_HANDLE_INVALID; |
| 858 EXPECT_EQ(MOJO_RESULT_OK, | 978 EXPECT_EQ(MOJO_RESULT_OK, |
| 859 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, | 979 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, |
| 860 1000000000)); | 980 1000000000)); |
| 861 num_bytes = kBufferSize; | 981 num_bytes = kBufferSize; |
| 862 num_handles = arraysize(handles); | 982 num_handles = arraysize(handles); |
| 863 EXPECT_EQ(MOJO_RESULT_OK, | 983 EXPECT_EQ(MOJO_RESULT_OK, |
| 864 core()->ReadMessage(h_passing[1], | 984 core()->ReadMessage(h_passing[1], UserPointer<void>(buffer), |
| 865 buffer, &num_bytes, | 985 MakeUserPointer(&num_bytes), |
| 866 handles, &num_handles, | 986 MakeUserPointer(handles), |
| 987 MakeUserPointer(&num_handles), |
| 867 MOJO_READ_MESSAGE_FLAG_NONE)); | 988 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 868 EXPECT_EQ(kWorldSize, num_bytes); | 989 EXPECT_EQ(kWorldSize, num_bytes); |
| 869 EXPECT_STREQ(kWorld, buffer); | 990 EXPECT_STREQ(kWorld, buffer); |
| 870 EXPECT_EQ(1u, num_handles); | 991 EXPECT_EQ(1u, num_handles); |
| 871 ph = handles[0]; | 992 ph = handles[0]; |
| 872 EXPECT_NE(ph, MOJO_HANDLE_INVALID); | 993 EXPECT_NE(ph, MOJO_HANDLE_INVALID); |
| 873 | 994 |
| 874 // Complete the two-phase read. | 995 // Complete the two-phase read. |
| 875 EXPECT_EQ('x', static_cast<const char*>(read_ptr)[0]); | 996 EXPECT_EQ('x', static_cast<const char*>(read_ptr)[0]); |
| 876 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 1)); | 997 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 1)); |
| 877 | 998 |
| 878 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0])); | 999 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0])); |
| 879 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); | 1000 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); |
| 880 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); | 1001 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); |
| 881 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); | 1002 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); |
| 882 } | 1003 } |
| 883 | 1004 |
| 884 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. | 1005 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. |
| 885 | 1006 |
| 886 } // namespace | 1007 } // namespace |
| 887 } // namespace system | 1008 } // namespace system |
| 888 } // namespace mojo | 1009 } // namespace mojo |
| OLD | NEW |