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 |