Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(361)

Side by Side Diff: mojo/system/core_unittest.cc

Issue 418033005: Mojo: Change how we handle invalid pointer arguments (at the system layer). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review changes Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « mojo/system/core_test_base.cc ('k') | mojo/system/entrypoints.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « mojo/system/core_test_base.cc ('k') | mojo/system/entrypoints.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698