Upstream version 11.39.266.0
[platform/framework/web/crosswalk.git] / src / mojo / system / local_data_pipe_unittest.cc
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
3 // found in the LICENSE file.
4
5 #include "mojo/system/local_data_pipe.h"
6
7 #include <string.h>
8
9 #include "base/macros.h"
10 #include "base/memory/ref_counted.h"
11 #include "mojo/system/data_pipe.h"
12 #include "mojo/system/waiter.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 namespace mojo {
16 namespace system {
17 namespace {
18
19 const uint32_t kSizeOfOptions =
20     static_cast<uint32_t>(sizeof(MojoCreateDataPipeOptions));
21
22 // Validate options.
23 TEST(LocalDataPipeTest, Creation) {
24   // Create using default options.
25   {
26     // Get default options.
27     MojoCreateDataPipeOptions default_options = {0};
28     EXPECT_EQ(
29         MOJO_RESULT_OK,
30         DataPipe::ValidateCreateOptions(NullUserPointer(), &default_options));
31     scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(default_options));
32     dp->ProducerClose();
33     dp->ConsumerClose();
34   }
35
36   // Create using non-default options.
37   {
38     const MojoCreateDataPipeOptions options = {
39         kSizeOfOptions,                           // |struct_size|.
40         MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
41         1,                                        // |element_num_bytes|.
42         1000                                      // |capacity_num_bytes|.
43     };
44     MojoCreateDataPipeOptions validated_options = {0};
45     EXPECT_EQ(MOJO_RESULT_OK,
46               DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
47                                               &validated_options));
48     scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
49     dp->ProducerClose();
50     dp->ConsumerClose();
51   }
52   {
53     const MojoCreateDataPipeOptions options = {
54         kSizeOfOptions,                           // |struct_size|.
55         MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
56         4,                                        // |element_num_bytes|.
57         4000                                      // |capacity_num_bytes|.
58     };
59     MojoCreateDataPipeOptions validated_options = {0};
60     EXPECT_EQ(MOJO_RESULT_OK,
61               DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
62                                               &validated_options));
63     scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
64     dp->ProducerClose();
65     dp->ConsumerClose();
66   }
67   {
68     const MojoCreateDataPipeOptions options = {
69         kSizeOfOptions,                                  // |struct_size|.
70         MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD,  // |flags|.
71         7,                                               // |element_num_bytes|.
72         7000000  // |capacity_num_bytes|.
73     };
74     MojoCreateDataPipeOptions validated_options = {0};
75     EXPECT_EQ(MOJO_RESULT_OK,
76               DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
77                                               &validated_options));
78     scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
79     dp->ProducerClose();
80     dp->ConsumerClose();
81   }
82   // Default capacity.
83   {
84     const MojoCreateDataPipeOptions options = {
85         kSizeOfOptions,                                  // |struct_size|.
86         MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD,  // |flags|.
87         100,                                             // |element_num_bytes|.
88         0  // |capacity_num_bytes|.
89     };
90     MojoCreateDataPipeOptions validated_options = {0};
91     EXPECT_EQ(MOJO_RESULT_OK,
92               DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
93                                               &validated_options));
94     scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
95     dp->ProducerClose();
96     dp->ConsumerClose();
97   }
98 }
99
100 TEST(LocalDataPipeTest, SimpleReadWrite) {
101   const MojoCreateDataPipeOptions options = {
102       kSizeOfOptions,                           // |struct_size|.
103       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
104       static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
105       1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
106   };
107   MojoCreateDataPipeOptions validated_options = {0};
108   EXPECT_EQ(MOJO_RESULT_OK,
109             DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
110                                             &validated_options));
111
112   scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
113
114   int32_t elements[10] = {0};
115   uint32_t num_bytes = 0;
116
117   // Try reading; nothing there yet.
118   num_bytes = static_cast<uint32_t>(arraysize(elements) * sizeof(elements[0]));
119   EXPECT_EQ(
120       MOJO_RESULT_SHOULD_WAIT,
121       dp->ConsumerReadData(
122           UserPointer<void>(elements), MakeUserPointer(&num_bytes), false));
123
124   // Query; nothing there yet.
125   num_bytes = 0;
126   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
127   EXPECT_EQ(0u, num_bytes);
128
129   // Discard; nothing there yet.
130   num_bytes = static_cast<uint32_t>(5u * sizeof(elements[0]));
131   EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
132             dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), false));
133
134   // Read with invalid |num_bytes|.
135   num_bytes = sizeof(elements[0]) + 1;
136   EXPECT_EQ(
137       MOJO_RESULT_INVALID_ARGUMENT,
138       dp->ConsumerReadData(
139           UserPointer<void>(elements), MakeUserPointer(&num_bytes), false));
140
141   // Write two elements.
142   elements[0] = 123;
143   elements[1] = 456;
144   num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
145   EXPECT_EQ(MOJO_RESULT_OK,
146             dp->ProducerWriteData(UserPointer<const void>(elements),
147                                   MakeUserPointer(&num_bytes),
148                                   false));
149   // It should have written everything (even without "all or none").
150   EXPECT_EQ(2u * sizeof(elements[0]), num_bytes);
151
152   // Query.
153   num_bytes = 0;
154   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
155   EXPECT_EQ(2 * sizeof(elements[0]), num_bytes);
156
157   // Read one element.
158   elements[0] = -1;
159   elements[1] = -1;
160   num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
161   EXPECT_EQ(
162       MOJO_RESULT_OK,
163       dp->ConsumerReadData(
164           UserPointer<void>(elements), MakeUserPointer(&num_bytes), false));
165   EXPECT_EQ(1u * sizeof(elements[0]), num_bytes);
166   EXPECT_EQ(123, elements[0]);
167   EXPECT_EQ(-1, elements[1]);
168
169   // Query.
170   num_bytes = 0;
171   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
172   EXPECT_EQ(1 * sizeof(elements[0]), num_bytes);
173
174   // Try to read two elements, with "all or none".
175   elements[0] = -1;
176   elements[1] = -1;
177   num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
178   EXPECT_EQ(
179       MOJO_RESULT_OUT_OF_RANGE,
180       dp->ConsumerReadData(
181           UserPointer<void>(elements), MakeUserPointer(&num_bytes), true));
182   EXPECT_EQ(-1, elements[0]);
183   EXPECT_EQ(-1, elements[1]);
184
185   // Try to read two elements, without "all or none".
186   elements[0] = -1;
187   elements[1] = -1;
188   num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
189   EXPECT_EQ(
190       MOJO_RESULT_OK,
191       dp->ConsumerReadData(
192           UserPointer<void>(elements), MakeUserPointer(&num_bytes), false));
193   EXPECT_EQ(456, elements[0]);
194   EXPECT_EQ(-1, elements[1]);
195
196   // Query.
197   num_bytes = 0;
198   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
199   EXPECT_EQ(0u, num_bytes);
200
201   dp->ProducerClose();
202   dp->ConsumerClose();
203 }
204
205 // Note: The "basic" waiting tests test that the "wait states" are correct in
206 // various situations; they don't test that waiters are properly awoken on state
207 // changes. (For that, we need to use multiple threads.)
208 TEST(LocalDataPipeTest, BasicProducerWaiting) {
209   // Note: We take advantage of the fact that for |LocalDataPipe|, capacities
210   // are strict maximums. This is not guaranteed by the API.
211
212   const MojoCreateDataPipeOptions options = {
213       kSizeOfOptions,                           // |struct_size|.
214       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
215       static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
216       2 * sizeof(int32_t)                       // |capacity_num_bytes|.
217   };
218   MojoCreateDataPipeOptions validated_options = {0};
219   EXPECT_EQ(MOJO_RESULT_OK,
220             DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
221                                             &validated_options));
222
223   scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
224   Waiter waiter;
225   uint32_t context = 0;
226   HandleSignalsState hss;
227
228   // Never readable.
229   waiter.Init();
230   hss = HandleSignalsState();
231   EXPECT_EQ(
232       MOJO_RESULT_FAILED_PRECONDITION,
233       dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss));
234   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
235   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
236
237   // Already writable.
238   waiter.Init();
239   hss = HandleSignalsState();
240   EXPECT_EQ(
241       MOJO_RESULT_ALREADY_EXISTS,
242       dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 34, &hss));
243
244   // Write two elements.
245   int32_t elements[2] = {123, 456};
246   uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
247   EXPECT_EQ(MOJO_RESULT_OK,
248             dp->ProducerWriteData(UserPointer<const void>(elements),
249                                   MakeUserPointer(&num_bytes),
250                                   true));
251   EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes);
252
253   // Adding a waiter should now succeed.
254   waiter.Init();
255   ASSERT_EQ(
256       MOJO_RESULT_OK,
257       dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, nullptr));
258   // And it shouldn't be writable yet.
259   EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
260   hss = HandleSignalsState();
261   dp->ProducerRemoveWaiter(&waiter, &hss);
262   EXPECT_EQ(0u, hss.satisfied_signals);
263   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
264
265   // Do it again.
266   waiter.Init();
267   ASSERT_EQ(
268       MOJO_RESULT_OK,
269       dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 78, nullptr));
270
271   // Read one element.
272   elements[0] = -1;
273   elements[1] = -1;
274   num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
275   EXPECT_EQ(
276       MOJO_RESULT_OK,
277       dp->ConsumerReadData(
278           UserPointer<void>(elements), MakeUserPointer(&num_bytes), true));
279   EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
280   EXPECT_EQ(123, elements[0]);
281   EXPECT_EQ(-1, elements[1]);
282
283   // Waiting should now succeed.
284   EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context));
285   EXPECT_EQ(78u, context);
286   hss = HandleSignalsState();
287   dp->ProducerRemoveWaiter(&waiter, &hss);
288   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
289   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
290
291   // Try writing, using a two-phase write.
292   void* buffer = nullptr;
293   num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
294   EXPECT_EQ(MOJO_RESULT_OK,
295             dp->ProducerBeginWriteData(
296                 MakeUserPointer(&buffer), MakeUserPointer(&num_bytes), false));
297   EXPECT_TRUE(buffer);
298   EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
299
300   static_cast<int32_t*>(buffer)[0] = 789;
301   EXPECT_EQ(MOJO_RESULT_OK,
302             dp->ProducerEndWriteData(
303                 static_cast<uint32_t>(1u * sizeof(elements[0]))));
304
305   // Add a waiter.
306   waiter.Init();
307   ASSERT_EQ(
308       MOJO_RESULT_OK,
309       dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 90, nullptr));
310
311   // Read one element, using a two-phase read.
312   const void* read_buffer = nullptr;
313   num_bytes = 0u;
314   EXPECT_EQ(
315       MOJO_RESULT_OK,
316       dp->ConsumerBeginReadData(
317           MakeUserPointer(&read_buffer), MakeUserPointer(&num_bytes), false));
318   EXPECT_TRUE(read_buffer);
319   // Since we only read one element (after having written three in all), the
320   // two-phase read should only allow us to read one. This checks an
321   // implementation detail!
322   EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
323   EXPECT_EQ(456, static_cast<const int32_t*>(read_buffer)[0]);
324   EXPECT_EQ(
325       MOJO_RESULT_OK,
326       dp->ConsumerEndReadData(static_cast<uint32_t>(1u * sizeof(elements[0]))));
327
328   // Waiting should succeed.
329   EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context));
330   EXPECT_EQ(90u, context);
331   hss = HandleSignalsState();
332   dp->ProducerRemoveWaiter(&waiter, &hss);
333   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
334   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
335
336   // Write one element.
337   elements[0] = 123;
338   num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
339   EXPECT_EQ(MOJO_RESULT_OK,
340             dp->ProducerWriteData(UserPointer<const void>(elements),
341                                   MakeUserPointer(&num_bytes),
342                                   false));
343   EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
344
345   // Add a waiter.
346   waiter.Init();
347   ASSERT_EQ(
348       MOJO_RESULT_OK,
349       dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, nullptr));
350
351   // Close the consumer.
352   dp->ConsumerClose();
353
354   // It should now be never-writable.
355   EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context));
356   EXPECT_EQ(12u, context);
357   hss = HandleSignalsState();
358   dp->ProducerRemoveWaiter(&waiter, &hss);
359   EXPECT_EQ(0u, hss.satisfied_signals);
360   EXPECT_EQ(0u, hss.satisfiable_signals);
361
362   dp->ProducerClose();
363 }
364
365 TEST(LocalDataPipeTest, BasicConsumerWaiting) {
366   const MojoCreateDataPipeOptions options = {
367       kSizeOfOptions,                           // |struct_size|.
368       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
369       static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
370       1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
371   };
372   MojoCreateDataPipeOptions validated_options = {0};
373   EXPECT_EQ(MOJO_RESULT_OK,
374             DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
375                                             &validated_options));
376
377   {
378     scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
379     Waiter waiter;
380     uint32_t context = 0;
381     HandleSignalsState hss;
382
383     // Never writable.
384     waiter.Init();
385     hss = HandleSignalsState();
386     EXPECT_EQ(
387         MOJO_RESULT_FAILED_PRECONDITION,
388         dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, &hss));
389     EXPECT_EQ(0u, hss.satisfied_signals);
390     EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
391
392     // Not yet readable.
393     waiter.Init();
394     ASSERT_EQ(MOJO_RESULT_OK,
395               dp->ConsumerAddWaiter(
396                   &waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, nullptr));
397     EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
398     hss = HandleSignalsState();
399     dp->ConsumerRemoveWaiter(&waiter, &hss);
400     EXPECT_EQ(0u, hss.satisfied_signals);
401     EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
402
403     // Write two elements.
404     int32_t elements[2] = {123, 456};
405     uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
406     EXPECT_EQ(MOJO_RESULT_OK,
407               dp->ProducerWriteData(UserPointer<const void>(elements),
408                                     MakeUserPointer(&num_bytes),
409                                     true));
410
411     // Should already be readable.
412     waiter.Init();
413     hss = HandleSignalsState();
414     EXPECT_EQ(
415         MOJO_RESULT_ALREADY_EXISTS,
416         dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, &hss));
417     EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
418     EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
419
420     // Discard one element.
421     num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
422     EXPECT_EQ(MOJO_RESULT_OK,
423               dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true));
424     EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
425
426     // Should still be readable.
427     waiter.Init();
428     hss = HandleSignalsState();
429     EXPECT_EQ(
430         MOJO_RESULT_ALREADY_EXISTS,
431         dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss));
432     EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
433     EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
434
435     // Read one element.
436     elements[0] = -1;
437     elements[1] = -1;
438     num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
439     EXPECT_EQ(
440         MOJO_RESULT_OK,
441         dp->ConsumerReadData(
442             UserPointer<void>(elements), MakeUserPointer(&num_bytes), true));
443     EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
444     EXPECT_EQ(456, elements[0]);
445     EXPECT_EQ(-1, elements[1]);
446
447     // Adding a waiter should now succeed.
448     waiter.Init();
449     ASSERT_EQ(MOJO_RESULT_OK,
450               dp->ConsumerAddWaiter(
451                   &waiter, MOJO_HANDLE_SIGNAL_READABLE, 90, nullptr));
452
453     // Write one element.
454     elements[0] = 789;
455     elements[1] = -1;
456     num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
457     EXPECT_EQ(MOJO_RESULT_OK,
458               dp->ProducerWriteData(UserPointer<const void>(elements),
459                                     MakeUserPointer(&num_bytes),
460                                     true));
461
462     // Waiting should now succeed.
463     EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context));
464     EXPECT_EQ(90u, context);
465     hss = HandleSignalsState();
466     dp->ConsumerRemoveWaiter(&waiter, &hss);
467     EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
468     EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
469
470     // Close the producer.
471     dp->ProducerClose();
472
473     // Should still be readable.
474     waiter.Init();
475     hss = HandleSignalsState();
476     EXPECT_EQ(
477         MOJO_RESULT_ALREADY_EXISTS,
478         dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss));
479     EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
480     EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
481
482     // Read one element.
483     elements[0] = -1;
484     elements[1] = -1;
485     num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
486     EXPECT_EQ(
487         MOJO_RESULT_OK,
488         dp->ConsumerReadData(
489             UserPointer<void>(elements), MakeUserPointer(&num_bytes), true));
490     EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
491     EXPECT_EQ(789, elements[0]);
492     EXPECT_EQ(-1, elements[1]);
493
494     // Should be never-readable.
495     waiter.Init();
496     hss = HandleSignalsState();
497     EXPECT_EQ(
498         MOJO_RESULT_FAILED_PRECONDITION,
499         dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss));
500     EXPECT_EQ(0u, hss.satisfied_signals);
501     EXPECT_EQ(0u, hss.satisfiable_signals);
502
503     dp->ConsumerClose();
504   }
505
506   // Test with two-phase APIs and closing the producer with an active consumer
507   // waiter.
508   {
509     scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
510     Waiter waiter;
511     uint32_t context = 0;
512     HandleSignalsState hss;
513
514     // Write two elements.
515     int32_t* elements = nullptr;
516     void* buffer = nullptr;
517     // Request room for three (but we'll only write two).
518     uint32_t num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
519     EXPECT_EQ(MOJO_RESULT_OK,
520               dp->ProducerBeginWriteData(
521                   MakeUserPointer(&buffer), MakeUserPointer(&num_bytes), true));
522     EXPECT_TRUE(buffer);
523     EXPECT_GE(num_bytes, static_cast<uint32_t>(3u * sizeof(elements[0])));
524     elements = static_cast<int32_t*>(buffer);
525     elements[0] = 123;
526     elements[1] = 456;
527     EXPECT_EQ(MOJO_RESULT_OK,
528               dp->ProducerEndWriteData(
529                   static_cast<uint32_t>(2u * sizeof(elements[0]))));
530
531     // Should already be readable.
532     waiter.Init();
533     hss = HandleSignalsState();
534     EXPECT_EQ(
535         MOJO_RESULT_ALREADY_EXISTS,
536         dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss));
537     EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
538     EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
539
540     // Read one element.
541     // Request two in all-or-none mode, but only read one.
542     const void* read_buffer = nullptr;
543     num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
544     EXPECT_EQ(
545         MOJO_RESULT_OK,
546         dp->ConsumerBeginReadData(
547             MakeUserPointer(&read_buffer), MakeUserPointer(&num_bytes), true));
548     EXPECT_TRUE(read_buffer);
549     EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes);
550     const int32_t* read_elements = static_cast<const int32_t*>(read_buffer);
551     EXPECT_EQ(123, read_elements[0]);
552     EXPECT_EQ(MOJO_RESULT_OK,
553               dp->ConsumerEndReadData(
554                   static_cast<uint32_t>(1u * sizeof(elements[0]))));
555
556     // Should still be readable.
557     waiter.Init();
558     hss = HandleSignalsState();
559     EXPECT_EQ(
560         MOJO_RESULT_ALREADY_EXISTS,
561         dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss));
562     EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
563     EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
564
565     // Read one element.
566     // Request three, but not in all-or-none mode.
567     read_buffer = nullptr;
568     num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
569     EXPECT_EQ(
570         MOJO_RESULT_OK,
571         dp->ConsumerBeginReadData(
572             MakeUserPointer(&read_buffer), MakeUserPointer(&num_bytes), false));
573     EXPECT_TRUE(read_buffer);
574     EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
575     read_elements = static_cast<const int32_t*>(read_buffer);
576     EXPECT_EQ(456, read_elements[0]);
577     EXPECT_EQ(MOJO_RESULT_OK,
578               dp->ConsumerEndReadData(
579                   static_cast<uint32_t>(1u * sizeof(elements[0]))));
580
581     // Adding a waiter should now succeed.
582     waiter.Init();
583     ASSERT_EQ(MOJO_RESULT_OK,
584               dp->ConsumerAddWaiter(
585                   &waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, nullptr));
586
587     // Close the producer.
588     dp->ProducerClose();
589
590     // Should be never-readable.
591     EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context));
592     EXPECT_EQ(56u, context);
593     hss = HandleSignalsState();
594     dp->ConsumerRemoveWaiter(&waiter, &hss);
595     EXPECT_EQ(0u, hss.satisfied_signals);
596     EXPECT_EQ(0u, hss.satisfiable_signals);
597
598     dp->ConsumerClose();
599   }
600 }
601
602 // Tests that data pipes aren't writable/readable during two-phase writes/reads.
603 TEST(LocalDataPipeTest, BasicTwoPhaseWaiting) {
604   const MojoCreateDataPipeOptions options = {
605       kSizeOfOptions,                           // |struct_size|.
606       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
607       static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
608       1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
609   };
610   MojoCreateDataPipeOptions validated_options = {0};
611   EXPECT_EQ(MOJO_RESULT_OK,
612             DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
613                                             &validated_options));
614
615   scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
616   Waiter waiter;
617   HandleSignalsState hss;
618
619   // It should be writable.
620   waiter.Init();
621   hss = HandleSignalsState();
622   EXPECT_EQ(
623       MOJO_RESULT_ALREADY_EXISTS,
624       dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss));
625   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
626   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
627
628   uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
629   void* write_ptr = nullptr;
630   EXPECT_EQ(
631       MOJO_RESULT_OK,
632       dp->ProducerBeginWriteData(
633           MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), false));
634   EXPECT_TRUE(write_ptr);
635   EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t)));
636
637   // At this point, it shouldn't be writable.
638   waiter.Init();
639   ASSERT_EQ(
640       MOJO_RESULT_OK,
641       dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 1, nullptr));
642   EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
643   hss = HandleSignalsState();
644   dp->ProducerRemoveWaiter(&waiter, &hss);
645   EXPECT_EQ(0u, hss.satisfied_signals);
646   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
647
648   // It shouldn't be readable yet either.
649   waiter.Init();
650   ASSERT_EQ(
651       MOJO_RESULT_OK,
652       dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 2, nullptr));
653   EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
654   hss = HandleSignalsState();
655   dp->ConsumerRemoveWaiter(&waiter, &hss);
656   EXPECT_EQ(0u, hss.satisfied_signals);
657   EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
658
659   static_cast<int32_t*>(write_ptr)[0] = 123;
660   EXPECT_EQ(
661       MOJO_RESULT_OK,
662       dp->ProducerEndWriteData(static_cast<uint32_t>(1u * sizeof(int32_t))));
663
664   // It should be writable again.
665   waiter.Init();
666   hss = HandleSignalsState();
667   EXPECT_EQ(
668       MOJO_RESULT_ALREADY_EXISTS,
669       dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, &hss));
670   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
671   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
672
673   // And readable.
674   waiter.Init();
675   hss = HandleSignalsState();
676   EXPECT_EQ(
677       MOJO_RESULT_ALREADY_EXISTS,
678       dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 4, &hss));
679   EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
680   EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
681
682   // Start another two-phase write and check that it's readable even in the
683   // middle of it.
684   num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
685   write_ptr = nullptr;
686   EXPECT_EQ(
687       MOJO_RESULT_OK,
688       dp->ProducerBeginWriteData(
689           MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), false));
690   EXPECT_TRUE(write_ptr);
691   EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t)));
692
693   // It should be readable.
694   waiter.Init();
695   hss = HandleSignalsState();
696   EXPECT_EQ(
697       MOJO_RESULT_ALREADY_EXISTS,
698       dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss));
699   EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
700   EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
701
702   // End the two-phase write without writing anything.
703   EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(0u));
704
705   // Start a two-phase read.
706   num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
707   const void* read_ptr = nullptr;
708   EXPECT_EQ(
709       MOJO_RESULT_OK,
710       dp->ConsumerBeginReadData(
711           MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), false));
712   EXPECT_TRUE(read_ptr);
713   EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes);
714
715   // At this point, it should still be writable.
716   waiter.Init();
717   hss = HandleSignalsState();
718   EXPECT_EQ(
719       MOJO_RESULT_ALREADY_EXISTS,
720       dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss));
721   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
722   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
723
724   // But not readable.
725   waiter.Init();
726   ASSERT_EQ(
727       MOJO_RESULT_OK,
728       dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, nullptr));
729   EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
730   hss = HandleSignalsState();
731   dp->ConsumerRemoveWaiter(&waiter, &hss);
732   EXPECT_EQ(0u, hss.satisfied_signals);
733   EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
734
735   // End the two-phase read without reading anything.
736   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(0u));
737
738   // It should be readable again.
739   waiter.Init();
740   hss = HandleSignalsState();
741   EXPECT_EQ(
742       MOJO_RESULT_ALREADY_EXISTS,
743       dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 8, &hss));
744   EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
745   EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
746
747   dp->ProducerClose();
748   dp->ConsumerClose();
749 }
750
751 // Test that a "may discard" data pipe is writable even when it's full.
752 TEST(LocalDataPipeTest, BasicMayDiscardWaiting) {
753   const MojoCreateDataPipeOptions options = {
754       kSizeOfOptions,                                  // |struct_size|.
755       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD,  // |flags|.
756       static_cast<uint32_t>(sizeof(int32_t)),          // |element_num_bytes|.
757       1 * sizeof(int32_t)                              // |capacity_num_bytes|.
758   };
759   MojoCreateDataPipeOptions validated_options = {0};
760   EXPECT_EQ(MOJO_RESULT_OK,
761             DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
762                                             &validated_options));
763
764   scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
765   Waiter waiter;
766   HandleSignalsState hss;
767
768   // Writable.
769   waiter.Init();
770   hss = HandleSignalsState();
771   EXPECT_EQ(
772       MOJO_RESULT_ALREADY_EXISTS,
773       dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss));
774   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
775   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
776
777   // Not readable.
778   waiter.Init();
779   ASSERT_EQ(
780       MOJO_RESULT_OK,
781       dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr));
782   EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
783   hss = HandleSignalsState();
784   dp->ConsumerRemoveWaiter(&waiter, &hss);
785   EXPECT_EQ(0u, hss.satisfied_signals);
786   EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
787
788   uint32_t num_bytes = static_cast<uint32_t>(sizeof(int32_t));
789   int32_t element = 123;
790   EXPECT_EQ(MOJO_RESULT_OK,
791             dp->ProducerWriteData(UserPointer<const void>(&element),
792                                   MakeUserPointer(&num_bytes),
793                                   false));
794   EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes);
795
796   // Still writable (even though it's full).
797   waiter.Init();
798   hss = HandleSignalsState();
799   EXPECT_EQ(
800       MOJO_RESULT_ALREADY_EXISTS,
801       dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 2, &hss));
802   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
803   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
804
805   // Now readable.
806   waiter.Init();
807   hss = HandleSignalsState();
808   EXPECT_EQ(
809       MOJO_RESULT_ALREADY_EXISTS,
810       dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss));
811   EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
812   EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
813
814   // Overwrite that element.
815   num_bytes = static_cast<uint32_t>(sizeof(int32_t));
816   element = 456;
817   EXPECT_EQ(MOJO_RESULT_OK,
818             dp->ProducerWriteData(UserPointer<const void>(&element),
819                                   MakeUserPointer(&num_bytes),
820                                   false));
821   EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes);
822
823   // Still writable.
824   waiter.Init();
825   hss = HandleSignalsState();
826   EXPECT_EQ(
827       MOJO_RESULT_ALREADY_EXISTS,
828       dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss));
829   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
830   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
831
832   // And still readable.
833   waiter.Init();
834   hss = HandleSignalsState();
835   EXPECT_EQ(
836       MOJO_RESULT_ALREADY_EXISTS,
837       dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss));
838   EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
839   EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
840
841   // Read that element.
842   num_bytes = static_cast<uint32_t>(sizeof(int32_t));
843   element = 0;
844   EXPECT_EQ(
845       MOJO_RESULT_OK,
846       dp->ConsumerReadData(
847           UserPointer<void>(&element), MakeUserPointer(&num_bytes), false));
848   EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes);
849   EXPECT_EQ(456, element);
850
851   // Still writable.
852   waiter.Init();
853   hss = HandleSignalsState();
854   EXPECT_EQ(
855       MOJO_RESULT_ALREADY_EXISTS,
856       dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss));
857   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
858   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
859
860   // No longer readable.
861   waiter.Init();
862   ASSERT_EQ(
863       MOJO_RESULT_OK,
864       dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, nullptr));
865   EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
866   hss = HandleSignalsState();
867   dp->ConsumerRemoveWaiter(&waiter, &hss);
868   EXPECT_EQ(0u, hss.satisfied_signals);
869   EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
870
871   dp->ProducerClose();
872   dp->ConsumerClose();
873 }
874
875 void Seq(int32_t start, size_t count, int32_t* out) {
876   for (size_t i = 0; i < count; i++)
877     out[i] = start + static_cast<int32_t>(i);
878 }
879
880 TEST(LocalDataPipeTest, MayDiscard) {
881   const MojoCreateDataPipeOptions options = {
882       kSizeOfOptions,                                  // |struct_size|.
883       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD,  // |flags|.
884       static_cast<uint32_t>(sizeof(int32_t)),          // |element_num_bytes|.
885       10 * sizeof(int32_t)                             // |capacity_num_bytes|.
886   };
887   MojoCreateDataPipeOptions validated_options = {0};
888   EXPECT_EQ(MOJO_RESULT_OK,
889             DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
890                                             &validated_options));
891
892   scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
893
894   int32_t buffer[100] = {0};
895   uint32_t num_bytes = 0;
896
897   num_bytes = 20u * sizeof(int32_t);
898   Seq(0, arraysize(buffer), buffer);
899   // Try writing more than capacity. (This test relies on the implementation
900   // enforcing the capacity strictly.)
901   EXPECT_EQ(
902       MOJO_RESULT_OK,
903       dp->ProducerWriteData(
904           UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), false));
905   EXPECT_EQ(10u * sizeof(int32_t), num_bytes);
906
907   // Read half of what we wrote.
908   num_bytes = 5u * sizeof(int32_t);
909   memset(buffer, 0xab, sizeof(buffer));
910   EXPECT_EQ(MOJO_RESULT_OK,
911             dp->ConsumerReadData(
912                 UserPointer<void>(buffer), MakeUserPointer(&num_bytes), false));
913   EXPECT_EQ(5u * sizeof(int32_t), num_bytes);
914   int32_t expected_buffer[100];
915   memset(expected_buffer, 0xab, sizeof(expected_buffer));
916   Seq(0, 5u, expected_buffer);
917   EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
918   // Internally, a circular buffer would now look like:
919   //   -, -, -, -, -, 5, 6, 7, 8, 9
920
921   // Write a bit more than the space that's available.
922   num_bytes = 8u * sizeof(int32_t);
923   Seq(100, arraysize(buffer), buffer);
924   EXPECT_EQ(
925       MOJO_RESULT_OK,
926       dp->ProducerWriteData(
927           UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), false));
928   EXPECT_EQ(8u * sizeof(int32_t), num_bytes);
929   // Internally, a circular buffer would now look like:
930   //   100, 101, 102, 103, 104, 105, 106, 107, 8, 9
931
932   // Read half of what's available.
933   num_bytes = 5u * sizeof(int32_t);
934   memset(buffer, 0xab, sizeof(buffer));
935   EXPECT_EQ(MOJO_RESULT_OK,
936             dp->ConsumerReadData(
937                 UserPointer<void>(buffer), MakeUserPointer(&num_bytes), false));
938   EXPECT_EQ(5u * sizeof(int32_t), num_bytes);
939   memset(expected_buffer, 0xab, sizeof(expected_buffer));
940   expected_buffer[0] = 8;
941   expected_buffer[1] = 9;
942   expected_buffer[2] = 100;
943   expected_buffer[3] = 101;
944   expected_buffer[4] = 102;
945   EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
946   // Internally, a circular buffer would now look like:
947   //   -, -, -, 103, 104, 105, 106, 107, -, -
948
949   // Write one integer.
950   num_bytes = 1u * sizeof(int32_t);
951   Seq(200, arraysize(buffer), buffer);
952   EXPECT_EQ(
953       MOJO_RESULT_OK,
954       dp->ProducerWriteData(
955           UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), false));
956   EXPECT_EQ(1u * sizeof(int32_t), num_bytes);
957   // Internally, a circular buffer would now look like:
958   //   -, -, -, 103, 104, 105, 106, 107, 200, -
959
960   // Write five more.
961   num_bytes = 5u * sizeof(int32_t);
962   Seq(300, arraysize(buffer), buffer);
963   EXPECT_EQ(
964       MOJO_RESULT_OK,
965       dp->ProducerWriteData(
966           UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), false));
967   EXPECT_EQ(5u * sizeof(int32_t), num_bytes);
968   // Internally, a circular buffer would now look like:
969   //   301, 302, 303, 304, 104, 105, 106, 107, 200, 300
970
971   // Read it all.
972   num_bytes = sizeof(buffer);
973   memset(buffer, 0xab, sizeof(buffer));
974   EXPECT_EQ(MOJO_RESULT_OK,
975             dp->ConsumerReadData(
976                 UserPointer<void>(buffer), MakeUserPointer(&num_bytes), false));
977   EXPECT_EQ(10u * sizeof(int32_t), num_bytes);
978   memset(expected_buffer, 0xab, sizeof(expected_buffer));
979   expected_buffer[0] = 104;
980   expected_buffer[1] = 105;
981   expected_buffer[2] = 106;
982   expected_buffer[3] = 107;
983   expected_buffer[4] = 200;
984   expected_buffer[5] = 300;
985   expected_buffer[6] = 301;
986   expected_buffer[7] = 302;
987   expected_buffer[8] = 303;
988   expected_buffer[9] = 304;
989   EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
990
991   // Test two-phase writes, including in all-or-none mode.
992   // Note: Again, the following depends on an implementation detail -- namely
993   // that the write pointer will point at the 5th element of the buffer (and the
994   // buffer has exactly the capacity requested).
995
996   num_bytes = 0u;
997   void* write_ptr = nullptr;
998   EXPECT_EQ(
999       MOJO_RESULT_OK,
1000       dp->ProducerBeginWriteData(
1001           MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), false));
1002   EXPECT_TRUE(write_ptr);
1003   EXPECT_EQ(6u * sizeof(int32_t), num_bytes);
1004   Seq(400, 6, static_cast<int32_t*>(write_ptr));
1005   EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(6u * sizeof(int32_t)));
1006   // Internally, a circular buffer would now look like:
1007   //   -, -, -, -, 400, 401, 402, 403, 404, 405
1008
1009   // |ProducerBeginWriteData()| ignores |*num_bytes| except in "all-or-none"
1010   // mode.
1011   num_bytes = 6u * sizeof(int32_t);
1012   write_ptr = nullptr;
1013   EXPECT_EQ(
1014       MOJO_RESULT_OK,
1015       dp->ProducerBeginWriteData(
1016           MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), false));
1017   EXPECT_EQ(4u * sizeof(int32_t), num_bytes);
1018   static_cast<int32_t*>(write_ptr)[0] = 500;
1019   EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(1u * sizeof(int32_t)));
1020   // Internally, a circular buffer would now look like:
1021   //   500, -, -, -, 400, 401, 402, 403, 404, 405
1022
1023   // Requesting a 10-element buffer in all-or-none mode fails at this point.
1024   num_bytes = 10u * sizeof(int32_t);
1025   write_ptr = nullptr;
1026   EXPECT_EQ(
1027       MOJO_RESULT_OUT_OF_RANGE,
1028       dp->ProducerBeginWriteData(
1029           MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), true));
1030
1031   // But requesting, say, a 5-element (up to 9, really) buffer should be okay.
1032   // It will discard two elements.
1033   num_bytes = 5u * sizeof(int32_t);
1034   write_ptr = nullptr;
1035   EXPECT_EQ(
1036       MOJO_RESULT_OK,
1037       dp->ProducerBeginWriteData(
1038           MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), true));
1039   EXPECT_EQ(5u * sizeof(int32_t), num_bytes);
1040   // Only write 4 elements though.
1041   Seq(600, 4, static_cast<int32_t*>(write_ptr));
1042   EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(4u * sizeof(int32_t)));
1043   // Internally, a circular buffer would now look like:
1044   //   500, 600, 601, 602, 603, -, 402, 403, 404, 405
1045
1046   // Do this again. Make sure we can get a buffer all the way out to the end of
1047   // the internal buffer.
1048   num_bytes = 5u * sizeof(int32_t);
1049   write_ptr = nullptr;
1050   EXPECT_EQ(
1051       MOJO_RESULT_OK,
1052       dp->ProducerBeginWriteData(
1053           MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), true));
1054   EXPECT_EQ(5u * sizeof(int32_t), num_bytes);
1055   // Only write 3 elements though.
1056   Seq(700, 3, static_cast<int32_t*>(write_ptr));
1057   EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(3u * sizeof(int32_t)));
1058   // Internally, a circular buffer would now look like:
1059   //   500, 600, 601, 602, 603, 700, 701, 702, -, -
1060
1061   // Read everything.
1062   num_bytes = sizeof(buffer);
1063   memset(buffer, 0xab, sizeof(buffer));
1064   EXPECT_EQ(MOJO_RESULT_OK,
1065             dp->ConsumerReadData(
1066                 UserPointer<void>(buffer), MakeUserPointer(&num_bytes), false));
1067   EXPECT_EQ(8u * sizeof(int32_t), num_bytes);
1068   memset(expected_buffer, 0xab, sizeof(expected_buffer));
1069   expected_buffer[0] = 500;
1070   expected_buffer[1] = 600;
1071   expected_buffer[2] = 601;
1072   expected_buffer[3] = 602;
1073   expected_buffer[4] = 603;
1074   expected_buffer[5] = 700;
1075   expected_buffer[6] = 701;
1076   expected_buffer[7] = 702;
1077   EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
1078
1079   dp->ProducerClose();
1080   dp->ConsumerClose();
1081 }
1082
1083 TEST(LocalDataPipeTest, AllOrNone) {
1084   const MojoCreateDataPipeOptions options = {
1085       kSizeOfOptions,                           // |struct_size|.
1086       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
1087       static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
1088       10 * sizeof(int32_t)                      // |capacity_num_bytes|.
1089   };
1090   MojoCreateDataPipeOptions validated_options = {0};
1091   EXPECT_EQ(MOJO_RESULT_OK,
1092             DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
1093                                             &validated_options));
1094
1095   scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
1096
1097   // Try writing way too much.
1098   uint32_t num_bytes = 20u * sizeof(int32_t);
1099   int32_t buffer[100];
1100   Seq(0, arraysize(buffer), buffer);
1101   EXPECT_EQ(
1102       MOJO_RESULT_OUT_OF_RANGE,
1103       dp->ProducerWriteData(
1104           UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true));
1105
1106   // Should still be empty.
1107   num_bytes = ~0u;
1108   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1109   EXPECT_EQ(0u, num_bytes);
1110
1111   // Write some data.
1112   num_bytes = 5u * sizeof(int32_t);
1113   Seq(100, arraysize(buffer), buffer);
1114   EXPECT_EQ(
1115       MOJO_RESULT_OK,
1116       dp->ProducerWriteData(
1117           UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true));
1118   EXPECT_EQ(5u * sizeof(int32_t), num_bytes);
1119
1120   // Half full.
1121   num_bytes = 0u;
1122   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1123   EXPECT_EQ(5u * sizeof(int32_t), num_bytes);
1124
1125   // Too much.
1126   num_bytes = 6u * sizeof(int32_t);
1127   Seq(200, arraysize(buffer), buffer);
1128   EXPECT_EQ(
1129       MOJO_RESULT_OUT_OF_RANGE,
1130       dp->ProducerWriteData(
1131           UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true));
1132
1133   // Try reading too much.
1134   num_bytes = 11u * sizeof(int32_t);
1135   memset(buffer, 0xab, sizeof(buffer));
1136   EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
1137             dp->ConsumerReadData(
1138                 UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true));
1139   int32_t expected_buffer[100];
1140   memset(expected_buffer, 0xab, sizeof(expected_buffer));
1141   EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
1142
1143   // Try discarding too much.
1144   num_bytes = 11u * sizeof(int32_t);
1145   EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
1146             dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true));
1147
1148   // Just a little.
1149   num_bytes = 2u * sizeof(int32_t);
1150   Seq(300, arraysize(buffer), buffer);
1151   EXPECT_EQ(
1152       MOJO_RESULT_OK,
1153       dp->ProducerWriteData(
1154           UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true));
1155   EXPECT_EQ(2u * sizeof(int32_t), num_bytes);
1156
1157   // Just right.
1158   num_bytes = 3u * sizeof(int32_t);
1159   Seq(400, arraysize(buffer), buffer);
1160   EXPECT_EQ(
1161       MOJO_RESULT_OK,
1162       dp->ProducerWriteData(
1163           UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true));
1164   EXPECT_EQ(3u * sizeof(int32_t), num_bytes);
1165
1166   // Exactly full.
1167   num_bytes = 0u;
1168   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1169   EXPECT_EQ(10u * sizeof(int32_t), num_bytes);
1170
1171   // Read half.
1172   num_bytes = 5u * sizeof(int32_t);
1173   memset(buffer, 0xab, sizeof(buffer));
1174   EXPECT_EQ(MOJO_RESULT_OK,
1175             dp->ConsumerReadData(
1176                 UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true));
1177   EXPECT_EQ(5u * sizeof(int32_t), num_bytes);
1178   memset(expected_buffer, 0xab, sizeof(expected_buffer));
1179   Seq(100, 5, expected_buffer);
1180   EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
1181
1182   // Try reading too much again.
1183   num_bytes = 6u * sizeof(int32_t);
1184   memset(buffer, 0xab, sizeof(buffer));
1185   EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
1186             dp->ConsumerReadData(
1187                 UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true));
1188   memset(expected_buffer, 0xab, sizeof(expected_buffer));
1189   EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
1190
1191   // Try discarding too much again.
1192   num_bytes = 6u * sizeof(int32_t);
1193   EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
1194             dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true));
1195
1196   // Discard a little.
1197   num_bytes = 2u * sizeof(int32_t);
1198   EXPECT_EQ(MOJO_RESULT_OK,
1199             dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true));
1200   EXPECT_EQ(2u * sizeof(int32_t), num_bytes);
1201
1202   // Three left.
1203   num_bytes = 0u;
1204   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1205   EXPECT_EQ(3u * sizeof(int32_t), num_bytes);
1206
1207   // Close the producer, then test producer-closed cases.
1208   dp->ProducerClose();
1209
1210   // Try reading too much; "failed precondition" since the producer is closed.
1211   num_bytes = 4u * sizeof(int32_t);
1212   memset(buffer, 0xab, sizeof(buffer));
1213   EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
1214             dp->ConsumerReadData(
1215                 UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true));
1216   memset(expected_buffer, 0xab, sizeof(expected_buffer));
1217   EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
1218
1219   // Try discarding too much; "failed precondition" again.
1220   num_bytes = 4u * sizeof(int32_t);
1221   EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
1222             dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true));
1223
1224   // Read a little.
1225   num_bytes = 2u * sizeof(int32_t);
1226   memset(buffer, 0xab, sizeof(buffer));
1227   EXPECT_EQ(MOJO_RESULT_OK,
1228             dp->ConsumerReadData(
1229                 UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true));
1230   EXPECT_EQ(2u * sizeof(int32_t), num_bytes);
1231   memset(expected_buffer, 0xab, sizeof(expected_buffer));
1232   Seq(400, 2, expected_buffer);
1233   EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
1234
1235   // Discard the remaining element.
1236   num_bytes = 1u * sizeof(int32_t);
1237   EXPECT_EQ(MOJO_RESULT_OK,
1238             dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true));
1239   EXPECT_EQ(1u * sizeof(int32_t), num_bytes);
1240
1241   // Empty again.
1242   num_bytes = ~0u;
1243   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1244   EXPECT_EQ(0u, num_bytes);
1245
1246   dp->ConsumerClose();
1247 }
1248
1249 TEST(LocalDataPipeTest, AllOrNoneMayDiscard) {
1250   const MojoCreateDataPipeOptions options = {
1251       kSizeOfOptions,                                  // |struct_size|.
1252       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD,  // |flags|.
1253       static_cast<uint32_t>(sizeof(int32_t)),          // |element_num_bytes|.
1254       10 * sizeof(int32_t)                             // |capacity_num_bytes|.
1255   };
1256   MojoCreateDataPipeOptions validated_options = {0};
1257   EXPECT_EQ(MOJO_RESULT_OK,
1258             DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
1259                                             &validated_options));
1260
1261   scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
1262
1263   // Try writing way too much.
1264   uint32_t num_bytes = 20u * sizeof(int32_t);
1265   int32_t buffer[100];
1266   Seq(0, arraysize(buffer), buffer);
1267   EXPECT_EQ(
1268       MOJO_RESULT_OUT_OF_RANGE,
1269       dp->ProducerWriteData(
1270           UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true));
1271
1272   // Write some stuff.
1273   num_bytes = 5u * sizeof(int32_t);
1274   Seq(100, arraysize(buffer), buffer);
1275   EXPECT_EQ(
1276       MOJO_RESULT_OK,
1277       dp->ProducerWriteData(
1278           UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true));
1279   EXPECT_EQ(5u * sizeof(int32_t), num_bytes);
1280
1281   // Write lots of stuff (discarding all but "104").
1282   num_bytes = 9u * sizeof(int32_t);
1283   Seq(200, arraysize(buffer), buffer);
1284   EXPECT_EQ(
1285       MOJO_RESULT_OK,
1286       dp->ProducerWriteData(
1287           UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true));
1288   EXPECT_EQ(9u * sizeof(int32_t), num_bytes);
1289
1290   // Read one.
1291   num_bytes = 1u * sizeof(int32_t);
1292   memset(buffer, 0xab, sizeof(buffer));
1293   EXPECT_EQ(MOJO_RESULT_OK,
1294             dp->ConsumerReadData(
1295                 UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true));
1296   EXPECT_EQ(1u * sizeof(int32_t), num_bytes);
1297   int32_t expected_buffer[100];
1298   memset(expected_buffer, 0xab, sizeof(expected_buffer));
1299   expected_buffer[0] = 104;
1300   EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
1301
1302   // Try reading too many.
1303   num_bytes = 10u * sizeof(int32_t);
1304   memset(buffer, 0xab, sizeof(buffer));
1305   EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
1306             dp->ConsumerReadData(
1307                 UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true));
1308   memset(expected_buffer, 0xab, sizeof(expected_buffer));
1309   EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
1310
1311   // Try discarding too many.
1312   num_bytes = 10u * sizeof(int32_t);
1313   EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
1314             dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true));
1315
1316   // Discard a bunch.
1317   num_bytes = 4u * sizeof(int32_t);
1318   EXPECT_EQ(MOJO_RESULT_OK,
1319             dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true));
1320
1321   // Half full.
1322   num_bytes = 0u;
1323   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1324   EXPECT_EQ(5u * sizeof(int32_t), num_bytes);
1325
1326   // Write as much as possible.
1327   num_bytes = 10u * sizeof(int32_t);
1328   Seq(300, arraysize(buffer), buffer);
1329   EXPECT_EQ(
1330       MOJO_RESULT_OK,
1331       dp->ProducerWriteData(
1332           UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true));
1333   EXPECT_EQ(10u * sizeof(int32_t), num_bytes);
1334
1335   // Read everything.
1336   num_bytes = 10u * sizeof(int32_t);
1337   memset(buffer, 0xab, sizeof(buffer));
1338   EXPECT_EQ(MOJO_RESULT_OK,
1339             dp->ConsumerReadData(
1340                 UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true));
1341   memset(expected_buffer, 0xab, sizeof(expected_buffer));
1342   EXPECT_EQ(10u * sizeof(int32_t), num_bytes);
1343   Seq(300, 10, expected_buffer);
1344   EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
1345
1346   // Note: All-or-none two-phase writes on a "may discard" data pipe are tested
1347   // in LocalDataPipeTest.MayDiscard.
1348
1349   dp->ProducerClose();
1350   dp->ConsumerClose();
1351 }
1352
1353 TEST(LocalDataPipeTest, TwoPhaseAllOrNone) {
1354   const MojoCreateDataPipeOptions options = {
1355       kSizeOfOptions,                           // |struct_size|.
1356       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
1357       static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
1358       10 * sizeof(int32_t)                      // |capacity_num_bytes|.
1359   };
1360   MojoCreateDataPipeOptions validated_options = {0};
1361   EXPECT_EQ(MOJO_RESULT_OK,
1362             DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
1363                                             &validated_options));
1364
1365   scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
1366
1367   // Try writing way too much (two-phase).
1368   uint32_t num_bytes = 20u * sizeof(int32_t);
1369   void* write_ptr = nullptr;
1370   EXPECT_EQ(
1371       MOJO_RESULT_OUT_OF_RANGE,
1372       dp->ProducerBeginWriteData(
1373           MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), true));
1374
1375   // Try writing an amount which isn't a multiple of the element size
1376   // (two-phase).
1377   static_assert(sizeof(int32_t) > 1u, "Wow! int32_t's have size 1");
1378   num_bytes = 1u;
1379   write_ptr = nullptr;
1380   EXPECT_EQ(
1381       MOJO_RESULT_INVALID_ARGUMENT,
1382       dp->ProducerBeginWriteData(
1383           MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), true));
1384
1385   // Try reading way too much (two-phase).
1386   num_bytes = 20u * sizeof(int32_t);
1387   const void* read_ptr = nullptr;
1388   EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
1389             dp->ConsumerBeginReadData(
1390                 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), true));
1391
1392   // Write half (two-phase).
1393   num_bytes = 5u * sizeof(int32_t);
1394   write_ptr = nullptr;
1395   EXPECT_EQ(
1396       MOJO_RESULT_OK,
1397       dp->ProducerBeginWriteData(
1398           MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), true));
1399   // May provide more space than requested.
1400   EXPECT_GE(num_bytes, 5u * sizeof(int32_t));
1401   EXPECT_TRUE(write_ptr);
1402   Seq(0, 5, static_cast<int32_t*>(write_ptr));
1403   EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(5u * sizeof(int32_t)));
1404
1405   // Try reading an amount which isn't a multiple of the element size
1406   // (two-phase).
1407   num_bytes = 1u;
1408   read_ptr = nullptr;
1409   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
1410             dp->ConsumerBeginReadData(
1411                 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), true));
1412
1413   // Read one (two-phase).
1414   num_bytes = 1u * sizeof(int32_t);
1415   read_ptr = nullptr;
1416   EXPECT_EQ(MOJO_RESULT_OK,
1417             dp->ConsumerBeginReadData(
1418                 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), true));
1419   EXPECT_GE(num_bytes, 1u * sizeof(int32_t));
1420   EXPECT_EQ(0, static_cast<const int32_t*>(read_ptr)[0]);
1421   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(1u * sizeof(int32_t)));
1422
1423   // We should have four left, leaving room for six.
1424   num_bytes = 0u;
1425   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1426   EXPECT_EQ(4u * sizeof(int32_t), num_bytes);
1427
1428   // Assuming a tight circular buffer of the specified capacity, we can't do a
1429   // two-phase write of six now.
1430   num_bytes = 6u * sizeof(int32_t);
1431   write_ptr = nullptr;
1432   EXPECT_EQ(
1433       MOJO_RESULT_OUT_OF_RANGE,
1434       dp->ProducerBeginWriteData(
1435           MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), true));
1436
1437   // Write six elements (simple), filling the buffer.
1438   num_bytes = 6u * sizeof(int32_t);
1439   int32_t buffer[100];
1440   Seq(100, 6, buffer);
1441   EXPECT_EQ(
1442       MOJO_RESULT_OK,
1443       dp->ProducerWriteData(
1444           UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true));
1445   EXPECT_EQ(6u * sizeof(int32_t), num_bytes);
1446
1447   // We have ten.
1448   num_bytes = 0u;
1449   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1450   EXPECT_EQ(10u * sizeof(int32_t), num_bytes);
1451
1452   // But a two-phase read of ten should fail.
1453   num_bytes = 10u * sizeof(int32_t);
1454   read_ptr = nullptr;
1455   EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
1456             dp->ConsumerBeginReadData(
1457                 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), true));
1458
1459   // Close the producer.
1460   dp->ProducerClose();
1461
1462   // A two-phase read of nine should work.
1463   num_bytes = 9u * sizeof(int32_t);
1464   read_ptr = nullptr;
1465   EXPECT_EQ(MOJO_RESULT_OK,
1466             dp->ConsumerBeginReadData(
1467                 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), true));
1468   EXPECT_GE(num_bytes, 9u * sizeof(int32_t));
1469   EXPECT_EQ(1, static_cast<const int32_t*>(read_ptr)[0]);
1470   EXPECT_EQ(2, static_cast<const int32_t*>(read_ptr)[1]);
1471   EXPECT_EQ(3, static_cast<const int32_t*>(read_ptr)[2]);
1472   EXPECT_EQ(4, static_cast<const int32_t*>(read_ptr)[3]);
1473   EXPECT_EQ(100, static_cast<const int32_t*>(read_ptr)[4]);
1474   EXPECT_EQ(101, static_cast<const int32_t*>(read_ptr)[5]);
1475   EXPECT_EQ(102, static_cast<const int32_t*>(read_ptr)[6]);
1476   EXPECT_EQ(103, static_cast<const int32_t*>(read_ptr)[7]);
1477   EXPECT_EQ(104, static_cast<const int32_t*>(read_ptr)[8]);
1478   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(9u * sizeof(int32_t)));
1479
1480   // A two-phase read of two should fail, with "failed precondition".
1481   num_bytes = 2u * sizeof(int32_t);
1482   read_ptr = nullptr;
1483   EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
1484             dp->ConsumerBeginReadData(
1485                 MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), true));
1486
1487   dp->ConsumerClose();
1488 }
1489
1490 // Tests that |ProducerWriteData()| and |ConsumerReadData()| writes and reads,
1491 // respectively, as much as possible, even if it has to "wrap around" the
1492 // internal circular buffer. (Note that the two-phase write and read do not do
1493 // this.)
1494 TEST(LocalDataPipeTest, WrapAround) {
1495   unsigned char test_data[1000];
1496   for (size_t i = 0; i < arraysize(test_data); i++)
1497     test_data[i] = static_cast<unsigned char>(i);
1498
1499   const MojoCreateDataPipeOptions options = {
1500       kSizeOfOptions,                           // |struct_size|.
1501       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
1502       1u,                                       // |element_num_bytes|.
1503       100u                                      // |capacity_num_bytes|.
1504   };
1505   MojoCreateDataPipeOptions validated_options = {0};
1506   EXPECT_EQ(MOJO_RESULT_OK,
1507             DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
1508                                             &validated_options));
1509   // This test won't be valid if |ValidateCreateOptions()| decides to give the
1510   // pipe more space.
1511   ASSERT_EQ(100u, validated_options.capacity_num_bytes);
1512
1513   scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
1514
1515   // Write 20 bytes.
1516   uint32_t num_bytes = 20u;
1517   EXPECT_EQ(MOJO_RESULT_OK,
1518             dp->ProducerWriteData(UserPointer<const void>(&test_data[0]),
1519                                   MakeUserPointer(&num_bytes),
1520                                   false));
1521   EXPECT_EQ(20u, num_bytes);
1522
1523   // Read 10 bytes.
1524   unsigned char read_buffer[1000] = {0};
1525   num_bytes = 10u;
1526   EXPECT_EQ(
1527       MOJO_RESULT_OK,
1528       dp->ConsumerReadData(
1529           UserPointer<void>(read_buffer), MakeUserPointer(&num_bytes), false));
1530   EXPECT_EQ(10u, num_bytes);
1531   EXPECT_EQ(0, memcmp(read_buffer, &test_data[0], 10u));
1532
1533   // Check that a two-phase write can now only write (at most) 80 bytes. (This
1534   // checks an implementation detail; this behavior is not guaranteed, but we
1535   // need it for this test.)
1536   void* write_buffer_ptr = nullptr;
1537   num_bytes = 0u;
1538   EXPECT_EQ(MOJO_RESULT_OK,
1539             dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr),
1540                                        MakeUserPointer(&num_bytes),
1541                                        false));
1542   EXPECT_TRUE(write_buffer_ptr);
1543   EXPECT_EQ(80u, num_bytes);
1544   EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(0u));
1545
1546   // Write as much data as we can (using |ProducerWriteData()|). We should write
1547   // 90 bytes.
1548   num_bytes = 200u;
1549   EXPECT_EQ(MOJO_RESULT_OK,
1550             dp->ProducerWriteData(UserPointer<const void>(&test_data[20]),
1551                                   MakeUserPointer(&num_bytes),
1552                                   false));
1553   EXPECT_EQ(90u, num_bytes);
1554
1555   // Check that a two-phase read can now only read (at most) 90 bytes. (This
1556   // checks an implementation detail; this behavior is not guaranteed, but we
1557   // need it for this test.)
1558   const void* read_buffer_ptr = nullptr;
1559   num_bytes = 0u;
1560   EXPECT_EQ(MOJO_RESULT_OK,
1561             dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr),
1562                                       MakeUserPointer(&num_bytes),
1563                                       false));
1564   EXPECT_TRUE(read_buffer_ptr);
1565   EXPECT_EQ(90u, num_bytes);
1566   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(0u));
1567
1568   // Read as much as possible (using |ConsumerReadData()|). We should read 100
1569   // bytes.
1570   num_bytes =
1571       static_cast<uint32_t>(arraysize(read_buffer) * sizeof(read_buffer[0]));
1572   memset(read_buffer, 0, num_bytes);
1573   EXPECT_EQ(
1574       MOJO_RESULT_OK,
1575       dp->ConsumerReadData(
1576           UserPointer<void>(read_buffer), MakeUserPointer(&num_bytes), false));
1577   EXPECT_EQ(100u, num_bytes);
1578   EXPECT_EQ(0, memcmp(read_buffer, &test_data[10], 100u));
1579
1580   dp->ProducerClose();
1581   dp->ConsumerClose();
1582 }
1583
1584 // Tests the behavior of closing the producer or consumer with respect to
1585 // writes and reads (simple and two-phase).
1586 TEST(LocalDataPipeTest, CloseWriteRead) {
1587   const char kTestData[] = "hello world";
1588   const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
1589
1590   const MojoCreateDataPipeOptions options = {
1591       kSizeOfOptions,                           // |struct_size|.
1592       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
1593       1u,                                       // |element_num_bytes|.
1594       1000u                                     // |capacity_num_bytes|.
1595   };
1596   MojoCreateDataPipeOptions validated_options = {0};
1597   EXPECT_EQ(MOJO_RESULT_OK,
1598             DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
1599                                             &validated_options));
1600
1601   // Close producer first, then consumer.
1602   {
1603     scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
1604
1605     // Write some data, so we'll have something to read.
1606     uint32_t num_bytes = kTestDataSize;
1607     EXPECT_EQ(MOJO_RESULT_OK,
1608               dp->ProducerWriteData(UserPointer<const void>(kTestData),
1609                                     MakeUserPointer(&num_bytes),
1610                                     false));
1611     EXPECT_EQ(kTestDataSize, num_bytes);
1612
1613     // Write it again, so we'll have something left over.
1614     num_bytes = kTestDataSize;
1615     EXPECT_EQ(MOJO_RESULT_OK,
1616               dp->ProducerWriteData(UserPointer<const void>(kTestData),
1617                                     MakeUserPointer(&num_bytes),
1618                                     false));
1619     EXPECT_EQ(kTestDataSize, num_bytes);
1620
1621     // Start two-phase write.
1622     void* write_buffer_ptr = nullptr;
1623     num_bytes = 0u;
1624     EXPECT_EQ(MOJO_RESULT_OK,
1625               dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr),
1626                                          MakeUserPointer(&num_bytes),
1627                                          false));
1628     EXPECT_TRUE(write_buffer_ptr);
1629     EXPECT_GT(num_bytes, 0u);
1630
1631     // Start two-phase read.
1632     const void* read_buffer_ptr = nullptr;
1633     num_bytes = 0u;
1634     EXPECT_EQ(MOJO_RESULT_OK,
1635               dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr),
1636                                         MakeUserPointer(&num_bytes),
1637                                         false));
1638     EXPECT_TRUE(read_buffer_ptr);
1639     EXPECT_EQ(2u * kTestDataSize, num_bytes);
1640
1641     // Close the producer.
1642     dp->ProducerClose();
1643
1644     // The consumer can finish its two-phase read.
1645     EXPECT_EQ(0, memcmp(read_buffer_ptr, kTestData, kTestDataSize));
1646     EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(kTestDataSize));
1647
1648     // And start another.
1649     read_buffer_ptr = nullptr;
1650     num_bytes = 0u;
1651     EXPECT_EQ(MOJO_RESULT_OK,
1652               dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr),
1653                                         MakeUserPointer(&num_bytes),
1654                                         false));
1655     EXPECT_TRUE(read_buffer_ptr);
1656     EXPECT_EQ(kTestDataSize, num_bytes);
1657
1658     // Close the consumer, which cancels the two-phase read.
1659     dp->ConsumerClose();
1660   }
1661
1662   // Close consumer first, then producer.
1663   {
1664     scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
1665
1666     // Write some data, so we'll have something to read.
1667     uint32_t num_bytes = kTestDataSize;
1668     EXPECT_EQ(MOJO_RESULT_OK,
1669               dp->ProducerWriteData(UserPointer<const void>(kTestData),
1670                                     MakeUserPointer(&num_bytes),
1671                                     false));
1672     EXPECT_EQ(kTestDataSize, num_bytes);
1673
1674     // Start two-phase write.
1675     void* write_buffer_ptr = nullptr;
1676     num_bytes = 0u;
1677     EXPECT_EQ(MOJO_RESULT_OK,
1678               dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr),
1679                                          MakeUserPointer(&num_bytes),
1680                                          false));
1681     EXPECT_TRUE(write_buffer_ptr);
1682     ASSERT_GT(num_bytes, kTestDataSize);
1683
1684     // Start two-phase read.
1685     const void* read_buffer_ptr = nullptr;
1686     num_bytes = 0u;
1687     EXPECT_EQ(MOJO_RESULT_OK,
1688               dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr),
1689                                         MakeUserPointer(&num_bytes),
1690                                         false));
1691     EXPECT_TRUE(read_buffer_ptr);
1692     EXPECT_EQ(kTestDataSize, num_bytes);
1693
1694     // Close the consumer.
1695     dp->ConsumerClose();
1696
1697     // Actually write some data. (Note: Premature freeing of the buffer would
1698     // probably only be detected under ASAN or similar.)
1699     memcpy(write_buffer_ptr, kTestData, kTestDataSize);
1700     // Note: Even though the consumer has been closed, ending the two-phase
1701     // write will report success.
1702     EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(kTestDataSize));
1703
1704     // But trying to write should result in failure.
1705     num_bytes = kTestDataSize;
1706     EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
1707               dp->ProducerWriteData(UserPointer<const void>(kTestData),
1708                                     MakeUserPointer(&num_bytes),
1709                                     false));
1710
1711     // As will trying to start another two-phase write.
1712     write_buffer_ptr = nullptr;
1713     num_bytes = 0u;
1714     EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
1715               dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr),
1716                                          MakeUserPointer(&num_bytes),
1717                                          false));
1718
1719     dp->ProducerClose();
1720   }
1721
1722   // Test closing the consumer first, then the producer, with an active
1723   // two-phase write.
1724   {
1725     scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
1726
1727     // Start two-phase write.
1728     void* write_buffer_ptr = nullptr;
1729     uint32_t num_bytes = 0u;
1730     EXPECT_EQ(MOJO_RESULT_OK,
1731               dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr),
1732                                          MakeUserPointer(&num_bytes),
1733                                          false));
1734     EXPECT_TRUE(write_buffer_ptr);
1735     ASSERT_GT(num_bytes, kTestDataSize);
1736
1737     dp->ConsumerClose();
1738     dp->ProducerClose();
1739   }
1740
1741   // Test closing the producer and then trying to read (with no data).
1742   {
1743     scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
1744
1745     // Write some data, so we'll have something to read.
1746     uint32_t num_bytes = kTestDataSize;
1747     EXPECT_EQ(MOJO_RESULT_OK,
1748               dp->ProducerWriteData(UserPointer<const void>(kTestData),
1749                                     MakeUserPointer(&num_bytes),
1750                                     false));
1751     EXPECT_EQ(kTestDataSize, num_bytes);
1752
1753     // Close the producer.
1754     dp->ProducerClose();
1755
1756     // Read that data.
1757     char buffer[1000];
1758     num_bytes = static_cast<uint32_t>(sizeof(buffer));
1759     EXPECT_EQ(
1760         MOJO_RESULT_OK,
1761         dp->ConsumerReadData(
1762             UserPointer<void>(buffer), MakeUserPointer(&num_bytes), false));
1763     EXPECT_EQ(kTestDataSize, num_bytes);
1764     EXPECT_EQ(0, memcmp(buffer, kTestData, kTestDataSize));
1765
1766     // A second read should fail.
1767     num_bytes = static_cast<uint32_t>(sizeof(buffer));
1768     EXPECT_EQ(
1769         MOJO_RESULT_FAILED_PRECONDITION,
1770         dp->ConsumerReadData(
1771             UserPointer<void>(buffer), MakeUserPointer(&num_bytes), false));
1772
1773     // A two-phase read should also fail.
1774     const void* read_buffer_ptr = nullptr;
1775     num_bytes = 0u;
1776     EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
1777               dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr),
1778                                         MakeUserPointer(&num_bytes),
1779                                         false));
1780
1781     // Ditto for discard.
1782     num_bytes = 10u;
1783     EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
1784               dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), false));
1785
1786     dp->ConsumerClose();
1787   }
1788 }
1789
1790 TEST(LocalDataPipeTest, TwoPhaseMoreInvalidArguments) {
1791   const MojoCreateDataPipeOptions options = {
1792       kSizeOfOptions,                           // |struct_size|.
1793       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
1794       static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
1795       10 * sizeof(int32_t)                      // |capacity_num_bytes|.
1796   };
1797   MojoCreateDataPipeOptions validated_options = {0};
1798   EXPECT_EQ(MOJO_RESULT_OK,
1799             DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
1800                                             &validated_options));
1801
1802   scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
1803
1804   // No data.
1805   uint32_t num_bytes = 1000u;
1806   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1807   EXPECT_EQ(0u, num_bytes);
1808
1809   // Try "ending" a two-phase write when one isn't active.
1810   EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
1811             dp->ProducerEndWriteData(1u * sizeof(int32_t)));
1812
1813   // Still no data.
1814   num_bytes = 1000u;
1815   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1816   EXPECT_EQ(0u, num_bytes);
1817
1818   // Try ending a two-phase write with an invalid amount (too much).
1819   num_bytes = 0u;
1820   void* write_ptr = nullptr;
1821   EXPECT_EQ(
1822       MOJO_RESULT_OK,
1823       dp->ProducerBeginWriteData(
1824           MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), false));
1825   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
1826             dp->ProducerEndWriteData(num_bytes +
1827                                      static_cast<uint32_t>(sizeof(int32_t))));
1828
1829   // But the two-phase write still ended.
1830   EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, dp->ProducerEndWriteData(0u));
1831
1832   // Still no data.
1833   num_bytes = 1000u;
1834   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1835   EXPECT_EQ(0u, num_bytes);
1836
1837   // Try ending a two-phase write with an invalid amount (not a multiple of the
1838   // element size).
1839   num_bytes = 0u;
1840   write_ptr = nullptr;
1841   EXPECT_EQ(
1842       MOJO_RESULT_OK,
1843       dp->ProducerBeginWriteData(
1844           MakeUserPointer(&write_ptr), MakeUserPointer(&num_bytes), false));
1845   EXPECT_GE(num_bytes, 1u);
1846   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, dp->ProducerEndWriteData(1u));
1847
1848   // But the two-phase write still ended.
1849   EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, dp->ProducerEndWriteData(0u));
1850
1851   // Still no data.
1852   num_bytes = 1000u;
1853   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1854   EXPECT_EQ(0u, num_bytes);
1855
1856   // Now write some data, so we'll be able to try reading.
1857   int32_t element = 123;
1858   num_bytes = 1u * sizeof(int32_t);
1859   EXPECT_EQ(MOJO_RESULT_OK,
1860             dp->ProducerWriteData(UserPointer<const void>(&element),
1861                                   MakeUserPointer(&num_bytes),
1862                                   false));
1863
1864   // One element available.
1865   num_bytes = 0u;
1866   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1867   EXPECT_EQ(1u * sizeof(int32_t), num_bytes);
1868
1869   // Try "ending" a two-phase read when one isn't active.
1870   EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
1871             dp->ConsumerEndReadData(1u * sizeof(int32_t)));
1872
1873   // Still one element available.
1874   num_bytes = 0u;
1875   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1876   EXPECT_EQ(1u * sizeof(int32_t), num_bytes);
1877
1878   // Try ending a two-phase read with an invalid amount (too much).
1879   num_bytes = 0u;
1880   const void* read_ptr = nullptr;
1881   EXPECT_EQ(
1882       MOJO_RESULT_OK,
1883       dp->ConsumerBeginReadData(
1884           MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), false));
1885   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
1886             dp->ConsumerEndReadData(num_bytes +
1887                                     static_cast<uint32_t>(sizeof(int32_t))));
1888
1889   // Still one element available.
1890   num_bytes = 0u;
1891   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1892   EXPECT_EQ(1u * sizeof(int32_t), num_bytes);
1893
1894   // Try ending a two-phase read with an invalid amount (not a multiple of the
1895   // element size).
1896   num_bytes = 0u;
1897   read_ptr = nullptr;
1898   EXPECT_EQ(
1899       MOJO_RESULT_OK,
1900       dp->ConsumerBeginReadData(
1901           MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), false));
1902   EXPECT_EQ(1u * sizeof(int32_t), num_bytes);
1903   EXPECT_EQ(123, static_cast<const int32_t*>(read_ptr)[0]);
1904   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, dp->ConsumerEndReadData(1u));
1905
1906   // Still one element available.
1907   num_bytes = 0u;
1908   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes)));
1909   EXPECT_EQ(1u * sizeof(int32_t), num_bytes);
1910
1911   dp->ProducerClose();
1912   dp->ConsumerClose();
1913 }
1914
1915 // Tests that even with "may discard", the data won't change under a two-phase
1916 // read.
1917 // TODO(vtl): crbug.com/348644: We currently don't pass this. (There are two
1918 // related issues: First, we don't recognize that the data given to
1919 // |ConsumerBeginReadData()| isn't discardable until |ConsumerEndReadData()|,
1920 // and thus we erroneously allow |ProducerWriteData()| to succeed. Second, the
1921 // |ProducerWriteData()| then changes the data underneath the two-phase read.)
1922 TEST(LocalDataPipeTest, DISABLED_MayDiscardTwoPhaseConsistent) {
1923   const MojoCreateDataPipeOptions options = {
1924       kSizeOfOptions,                                  // |struct_size|.
1925       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD,  // |flags|.
1926       1,                                               // |element_num_bytes|.
1927       2                                                // |capacity_num_bytes|.
1928   };
1929   MojoCreateDataPipeOptions validated_options = {0};
1930   EXPECT_EQ(MOJO_RESULT_OK,
1931             DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
1932                                             &validated_options));
1933
1934   scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
1935
1936   // Write some elements.
1937   char elements[2] = {'a', 'b'};
1938   uint32_t num_bytes = 2u;
1939   EXPECT_EQ(MOJO_RESULT_OK,
1940             dp->ProducerWriteData(UserPointer<const void>(elements),
1941                                   MakeUserPointer(&num_bytes),
1942                                   false));
1943   EXPECT_EQ(2u, num_bytes);
1944
1945   // Begin reading.
1946   const void* read_ptr = nullptr;
1947   num_bytes = 2u;
1948   EXPECT_EQ(
1949       MOJO_RESULT_OK,
1950       dp->ConsumerBeginReadData(
1951           MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), false));
1952   EXPECT_EQ(2u, num_bytes);
1953   EXPECT_EQ('a', static_cast<const char*>(read_ptr)[0]);
1954   EXPECT_EQ('b', static_cast<const char*>(read_ptr)[1]);
1955
1956   // Try to write some more. But nothing should be discardable right now.
1957   elements[0] = 'x';
1958   elements[1] = 'y';
1959   num_bytes = 2u;
1960   // TODO(vtl): This should be:
1961   //  EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
1962   //            dp->ProducerWriteData(elements, &num_bytes, false));
1963   // but we incorrectly think that the bytes being read are discardable. Letting
1964   // this through reveals the significant consequence.
1965   EXPECT_EQ(MOJO_RESULT_OK,
1966             dp->ProducerWriteData(UserPointer<const void>(elements),
1967                                   MakeUserPointer(&num_bytes),
1968                                   false));
1969
1970   // Check that our read buffer hasn't changed underneath us.
1971   EXPECT_EQ('a', static_cast<const char*>(read_ptr)[0]);
1972   EXPECT_EQ('b', static_cast<const char*>(read_ptr)[1]);
1973
1974   // End reading.
1975   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u));
1976
1977   // Now writing should succeed.
1978   EXPECT_EQ(MOJO_RESULT_OK,
1979             dp->ProducerWriteData(UserPointer<const void>(elements),
1980                                   MakeUserPointer(&num_bytes),
1981                                   false));
1982
1983   // And if we read, we should get the new values.
1984   read_ptr = nullptr;
1985   num_bytes = 2u;
1986   EXPECT_EQ(
1987       MOJO_RESULT_OK,
1988       dp->ConsumerBeginReadData(
1989           MakeUserPointer(&read_ptr), MakeUserPointer(&num_bytes), false));
1990   EXPECT_EQ(2u, num_bytes);
1991   EXPECT_EQ('x', static_cast<const char*>(read_ptr)[0]);
1992   EXPECT_EQ('y', static_cast<const char*>(read_ptr)[1]);
1993
1994   // End reading.
1995   EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u));
1996
1997   dp->ProducerClose();
1998   dp->ConsumerClose();
1999 }
2000
2001 }  // namespace
2002 }  // namespace system
2003 }  // namespace mojo