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

Side by Side Diff: mojo/public/c/system/tests/core_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698