| Index: mojo/system/local_data_pipe_unittest.cc
|
| diff --git a/mojo/system/local_data_pipe_unittest.cc b/mojo/system/local_data_pipe_unittest.cc
|
| index ad699a9e40e3dade5971fa970d123f7eb4e166cc..a5099c8075ccd07152f363b996e4460e24b74fe7 100644
|
| --- a/mojo/system/local_data_pipe_unittest.cc
|
| +++ b/mojo/system/local_data_pipe_unittest.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "mojo/system/local_data_pipe.h"
|
|
|
| +#include "base/basictypes.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "mojo/system/data_pipe.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| @@ -12,20 +13,172 @@ namespace mojo {
|
| namespace system {
|
| namespace {
|
|
|
| +const uint32_t kSizeOfOptions =
|
| + static_cast<uint32_t>(sizeof(MojoCreateDataPipeOptions));
|
| +
|
| // Validate options.
|
| TEST(LocalDataPipeTest, Creation) {
|
| - // Get default options.
|
| - MojoCreateDataPipeOptions default_options = { 0 };
|
| - EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateOptions(NULL, &default_options));
|
| -
|
| // Create using default options.
|
| {
|
| + // Get default options.
|
| + MojoCreateDataPipeOptions default_options = { 0 };
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + DataPipe::ValidateOptions(NULL, &default_options));
|
| scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(default_options));
|
| dp->ProducerClose();
|
| dp->ConsumerClose();
|
| }
|
|
|
| - // TODO(vtl): More.
|
| + // Create using non-default options.
|
| + {
|
| + const MojoCreateDataPipeOptions options = {
|
| + kSizeOfOptions, // |struct_size|.
|
| + MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
|
| + 1, // |element_num_bytes|.
|
| + 1000 // |capacity_num_bytes|.
|
| + };
|
| + MojoCreateDataPipeOptions validated_options = { 0 };
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + DataPipe::ValidateOptions(&options, &validated_options));
|
| + scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
|
| + dp->ProducerClose();
|
| + dp->ConsumerClose();
|
| + }
|
| + {
|
| + const MojoCreateDataPipeOptions options = {
|
| + kSizeOfOptions, // |struct_size|.
|
| + MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
|
| + 4, // |element_num_bytes|.
|
| + 4000 // |capacity_num_bytes|.
|
| + };
|
| + MojoCreateDataPipeOptions validated_options = { 0 };
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + DataPipe::ValidateOptions(&options, &validated_options));
|
| + scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
|
| + dp->ProducerClose();
|
| + dp->ConsumerClose();
|
| + }
|
| + {
|
| + const MojoCreateDataPipeOptions options = {
|
| + kSizeOfOptions, // |struct_size|.
|
| + MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|.
|
| + 7, // |element_num_bytes|.
|
| + 7000000 // |capacity_num_bytes|.
|
| + };
|
| + MojoCreateDataPipeOptions validated_options = { 0 };
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + DataPipe::ValidateOptions(&options, &validated_options));
|
| + scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
|
| + dp->ProducerClose();
|
| + dp->ConsumerClose();
|
| + }
|
| + // Default capacity.
|
| + {
|
| + const MojoCreateDataPipeOptions options = {
|
| + kSizeOfOptions, // |struct_size|.
|
| + MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|.
|
| + 100, // |element_num_bytes|.
|
| + 0 // |capacity_num_bytes|.
|
| + };
|
| + MojoCreateDataPipeOptions validated_options = { 0 };
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + DataPipe::ValidateOptions(&options, &validated_options));
|
| + scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
|
| + dp->ProducerClose();
|
| + dp->ConsumerClose();
|
| + }
|
| +}
|
| +
|
| +TEST(LocalDataPipeTest, SimpleReadWrite) {
|
| + const MojoCreateDataPipeOptions options = {
|
| + kSizeOfOptions, // |struct_size|.
|
| + MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
|
| + static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|.
|
| + 1000 * sizeof(int32_t) // |capacity_num_bytes|.
|
| + };
|
| + MojoCreateDataPipeOptions validated_options = { 0 };
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + DataPipe::ValidateOptions(&options, &validated_options));
|
| +
|
| + scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
|
| +
|
| + int32_t elements[10] = { 0 };
|
| + uint32_t num_bytes = 0;
|
| +
|
| + // Try reading; nothing there yet.
|
| + num_bytes = static_cast<uint32_t>(arraysize(elements) * sizeof(elements[0]));
|
| + EXPECT_EQ(MOJO_RESULT_NOT_FOUND,
|
| + dp->ConsumerReadData(elements, &num_bytes, false));
|
| +
|
| + // Query; nothing there yet.
|
| + num_bytes = 0;
|
| + EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes));
|
| + EXPECT_EQ(0u, num_bytes);
|
| +
|
| + // Discard; nothing there yet.
|
| + num_bytes = static_cast<uint32_t>(5u * sizeof(elements[0]));
|
| + EXPECT_EQ(MOJO_RESULT_NOT_FOUND, dp->ConsumerDiscardData(&num_bytes, false));
|
| +
|
| + // Read with invalid |num_bytes|.
|
| + num_bytes = sizeof(elements[0]) + 1;
|
| + EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
|
| + dp->ConsumerReadData(elements, &num_bytes, false));
|
| +
|
| + // Write two elements.
|
| + elements[0] = 123;
|
| + elements[1] = 456;
|
| + num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + dp->ProducerWriteData(elements, &num_bytes, false));
|
| + // It should have written everything (even without "all or none").
|
| + EXPECT_EQ(2u * sizeof(elements[0]), num_bytes);
|
| +
|
| + // Query.
|
| + num_bytes = 0;
|
| + EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes));
|
| + EXPECT_EQ(2 * sizeof(elements[0]), num_bytes);
|
| +
|
| + // Read one element.
|
| + elements[0] = -1;
|
| + elements[1] = -1;
|
| + num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
|
| + EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(elements, &num_bytes, false));
|
| + EXPECT_EQ(1u * sizeof(elements[0]), num_bytes);
|
| + EXPECT_EQ(123, elements[0]);
|
| + EXPECT_EQ(-1, elements[1]);
|
| +
|
| + // Query.
|
| + num_bytes = 0;
|
| + EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes));
|
| + EXPECT_EQ(1 * sizeof(elements[0]), num_bytes);
|
| +
|
| + // Try to read two elements, with "all or none".
|
| + elements[0] = -1;
|
| + elements[1] = -1;
|
| + num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
|
| + EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
|
| + dp->ConsumerReadData(elements, &num_bytes, true));
|
| + EXPECT_EQ(-1, elements[0]);
|
| + EXPECT_EQ(-1, elements[1]);
|
| +
|
| + // Try to read two elements, without "all or none".
|
| + elements[0] = -1;
|
| + elements[1] = -1;
|
| + num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
|
| + EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(elements, &num_bytes, false));
|
| + EXPECT_EQ(456, elements[0]);
|
| + EXPECT_EQ(-1, elements[1]);
|
| +
|
| + // Query.
|
| + num_bytes = 0;
|
| + EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes));
|
| + EXPECT_EQ(0u, num_bytes);
|
| +
|
| + // TODO(vtl): More: discard (with/without "all or none"). More "all or none"
|
| + // tests.
|
| +
|
| + dp->ProducerClose();
|
| + dp->ConsumerClose();
|
| }
|
|
|
| // TODO(vtl): More.
|
|
|