Home | History | Annotate | Download | only in system
      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
   2004