1 // Copyright 2014 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.
5 #include "mojo/system/shared_buffer_dispatcher.h"
9 #include "base/memory/ref_counted.h"
10 #include "mojo/system/dispatcher.h"
11 #include "mojo/system/raw_shared_buffer.h"
12 #include "testing/gtest/include/gtest/gtest.h"
18 // NOTE(vtl): There's currently not much to test for in
19 // |SharedBufferDispatcher::ValidateOptions()|, but the tests should be expanded
20 // if/when options are added, so I've kept the general form of the tests from
21 // data_pipe_unittest.cc.
23 const uint32_t kSizeOfOptions =
24 static_cast<uint32_t>(sizeof(MojoCreateSharedBufferOptions));
26 // Does a cursory sanity check of |validated_options|. Calls |ValidateOptions()|
27 // on already-validated options. The validated options should be valid, and the
28 // revalidated copy should be the same.
29 void RevalidateOptions(const MojoCreateSharedBufferOptions& validated_options) {
30 EXPECT_EQ(kSizeOfOptions, validated_options.struct_size);
31 // Nothing to check for flags.
33 MojoCreateSharedBufferOptions revalidated_options = { 0 };
34 EXPECT_EQ(MOJO_RESULT_OK,
35 SharedBufferDispatcher::ValidateOptions(&validated_options,
36 &revalidated_options));
37 EXPECT_EQ(validated_options.struct_size, revalidated_options.struct_size);
38 EXPECT_EQ(validated_options.flags, revalidated_options.flags);
41 // Tests valid inputs to |ValidateOptions()|.
42 TEST(SharedBufferDispatcherTest, ValidateOptionsValidInputs) {
45 MojoCreateSharedBufferOptions validated_options = { 0 };
46 EXPECT_EQ(MOJO_RESULT_OK,
47 SharedBufferDispatcher::ValidateOptions(NULL,
49 RevalidateOptions(validated_options);
53 MojoCreateSharedBufferOptionsFlags flags_values[] = {
54 MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE
56 for (size_t i = 0; i < arraysize(flags_values); i++) {
57 const MojoCreateSharedBufferOptionsFlags flags = flags_values[i];
59 // Different capacities (size 1).
60 for (uint32_t capacity = 1; capacity <= 100 * 1000 * 1000; capacity *= 10) {
61 MojoCreateSharedBufferOptions options = {
62 kSizeOfOptions, // |struct_size|.
65 MojoCreateSharedBufferOptions validated_options = { 0 };
66 EXPECT_EQ(MOJO_RESULT_OK,
67 SharedBufferDispatcher::ValidateOptions(&options,
70 RevalidateOptions(validated_options);
75 TEST(SharedBufferDispatcherTest, ValidateOptionsInvalidInputs) {
76 // Invalid |struct_size|.
77 // Note: If/when we extend |MojoCreateSharedBufferOptions|, this will have to
79 for (uint32_t struct_size = 0; struct_size < kSizeOfOptions; struct_size++) {
80 MojoCreateSharedBufferOptions options = {
81 struct_size, // |struct_size|.
82 MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE // |flags|.
84 MojoCreateSharedBufferOptions unused = { 0 };
85 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
86 SharedBufferDispatcher::ValidateOptions(&options, &unused));
90 TEST(SharedBufferDispatcherTest, CreateAndMapBuffer) {
91 MojoCreateSharedBufferOptions validated_options = { 0 };
92 EXPECT_EQ(MOJO_RESULT_OK,
93 SharedBufferDispatcher::ValidateOptions(NULL,
96 scoped_refptr<SharedBufferDispatcher> dispatcher;
97 EXPECT_EQ(MOJO_RESULT_OK,
98 SharedBufferDispatcher::Create(validated_options, 100,
100 ASSERT_TRUE(dispatcher);
101 EXPECT_EQ(Dispatcher::kTypeSharedBuffer, dispatcher->GetType());
103 // Make a couple of mappings.
104 scoped_ptr<RawSharedBufferMapping> mapping1;
105 EXPECT_EQ(MOJO_RESULT_OK,
106 dispatcher->MapBuffer(0, 100, MOJO_MAP_BUFFER_FLAG_NONE,
108 ASSERT_TRUE(mapping1);
109 ASSERT_TRUE(mapping1->base());
110 EXPECT_EQ(100u, mapping1->length());
112 static_cast<char*>(mapping1->base())[50] = 'x';
114 scoped_ptr<RawSharedBufferMapping> mapping2;
115 EXPECT_EQ(MOJO_RESULT_OK,
116 dispatcher->MapBuffer(50, 50, MOJO_MAP_BUFFER_FLAG_NONE,
118 ASSERT_TRUE(mapping2);
119 ASSERT_TRUE(mapping2->base());
120 EXPECT_EQ(50u, mapping2->length());
121 EXPECT_EQ('x', static_cast<char*>(mapping2->base())[0]);
123 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
125 // Check that we can still read/write to mappings after the dispatcher has
127 static_cast<char*>(mapping2->base())[1] = 'y';
128 EXPECT_EQ('y', static_cast<char*>(mapping1->base())[51]);
131 TEST(SharedBufferDispatcher, DuplicateBufferHandle) {
132 MojoCreateSharedBufferOptions validated_options = { 0 };
133 EXPECT_EQ(MOJO_RESULT_OK,
134 SharedBufferDispatcher::ValidateOptions(NULL,
135 &validated_options));
137 scoped_refptr<SharedBufferDispatcher> dispatcher1;
138 EXPECT_EQ(MOJO_RESULT_OK,
139 SharedBufferDispatcher::Create(validated_options, 100,
142 // Map and write something.
143 scoped_ptr<RawSharedBufferMapping> mapping;
144 EXPECT_EQ(MOJO_RESULT_OK,
145 dispatcher1->MapBuffer(0, 100, MOJO_MAP_BUFFER_FLAG_NONE,
147 static_cast<char*>(mapping->base())[0] = 'x';
150 // Duplicate |dispatcher1| and then close it.
151 scoped_refptr<Dispatcher> dispatcher2;
152 EXPECT_EQ(MOJO_RESULT_OK,
153 dispatcher1->DuplicateBufferHandle(NULL, &dispatcher2));
154 ASSERT_TRUE(dispatcher2);
155 EXPECT_EQ(Dispatcher::kTypeSharedBuffer, dispatcher2->GetType());
157 EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->Close());
159 // Map |dispatcher2| and read something.
160 EXPECT_EQ(MOJO_RESULT_OK,
161 dispatcher2->MapBuffer(0, 100, MOJO_MAP_BUFFER_FLAG_NONE,
163 EXPECT_EQ('x', static_cast<char*>(mapping->base())[0]);
165 EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->Close());
168 // TODO(vtl): Test |DuplicateBufferHandle()| with non-null (valid) |options|.
170 TEST(SharedBufferDispatcherTest, CreateInvalidNumBytes) {
171 MojoCreateSharedBufferOptions validated_options = { 0 };
172 EXPECT_EQ(MOJO_RESULT_OK,
173 SharedBufferDispatcher::ValidateOptions(NULL,
174 &validated_options));
177 scoped_refptr<SharedBufferDispatcher> dispatcher;
178 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
179 SharedBufferDispatcher::Create(validated_options,
180 std::numeric_limits<uint64_t>::max(),
182 EXPECT_FALSE(dispatcher);
185 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
186 SharedBufferDispatcher::Create(validated_options, 0, &dispatcher));
187 EXPECT_FALSE(dispatcher);
190 TEST(SharedBufferDispatcherTest, MapBufferInvalidArguments) {
191 MojoCreateSharedBufferOptions validated_options = { 0 };
192 EXPECT_EQ(MOJO_RESULT_OK,
193 SharedBufferDispatcher::ValidateOptions(NULL,
194 &validated_options));
196 scoped_refptr<SharedBufferDispatcher> dispatcher;
197 EXPECT_EQ(MOJO_RESULT_OK,
198 SharedBufferDispatcher::Create(validated_options, 100,
201 scoped_ptr<RawSharedBufferMapping> mapping;
202 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
203 dispatcher->MapBuffer(0, 101, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
204 EXPECT_FALSE(mapping);
206 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
207 dispatcher->MapBuffer(1, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
208 EXPECT_FALSE(mapping);
210 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
211 dispatcher->MapBuffer(0, 0, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
212 EXPECT_FALSE(mapping);
214 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
217 // TODO(vtl): Test |DuplicateBufferHandle()| with invalid |options|.
220 } // namespace system