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.
5 #include "mojo/system/data_pipe.h"
12 #include "mojo/system/constants.h"
13 #include "testing/gtest/include/gtest/gtest.h"
19 const uint32_t kSizeOfCreateOptions =
20 static_cast<uint32_t>(sizeof(MojoCreateDataPipeOptions));
22 // Does a cursory sanity check of |validated_options|. Calls
23 // |ValidateCreateOptions()| on already-validated options. The validated options
24 // should be valid, and the revalidated copy should be the same.
25 void RevalidateCreateOptions(
26 const MojoCreateDataPipeOptions& validated_options) {
27 EXPECT_EQ(kSizeOfCreateOptions, validated_options.struct_size);
28 // Nothing to check for flags.
29 EXPECT_GT(validated_options.element_num_bytes, 0u);
30 EXPECT_GT(validated_options.capacity_num_bytes, 0u);
32 validated_options.capacity_num_bytes %
33 validated_options.element_num_bytes);
35 MojoCreateDataPipeOptions revalidated_options = {};
36 EXPECT_EQ(MOJO_RESULT_OK,
37 DataPipe::ValidateCreateOptions(MakeUserPointer(&validated_options),
38 &revalidated_options));
39 EXPECT_EQ(validated_options.struct_size, revalidated_options.struct_size);
40 EXPECT_EQ(validated_options.element_num_bytes,
41 revalidated_options.element_num_bytes);
42 EXPECT_EQ(validated_options.capacity_num_bytes,
43 revalidated_options.capacity_num_bytes);
44 EXPECT_EQ(validated_options.flags, revalidated_options.flags);
47 // Checks that a default-computed capacity is correct. (Does not duplicate the
48 // checks done by |RevalidateCreateOptions()|.)
49 void CheckDefaultCapacity(const MojoCreateDataPipeOptions& validated_options) {
50 EXPECT_LE(validated_options.capacity_num_bytes,
51 kDefaultDataPipeCapacityBytes);
52 EXPECT_GT(validated_options.capacity_num_bytes +
53 validated_options.element_num_bytes,
54 kDefaultDataPipeCapacityBytes);
57 // Tests valid inputs to |ValidateCreateOptions()|.
58 TEST(DataPipeTest, ValidateCreateOptionsValid) {
61 MojoCreateDataPipeOptions validated_options = {};
64 DataPipe::ValidateCreateOptions(NullUserPointer(), &validated_options));
65 RevalidateCreateOptions(validated_options);
66 CheckDefaultCapacity(validated_options);
69 // Size member, but nothing beyond.
71 MojoCreateDataPipeOptions options = {
72 offsetof(MojoCreateDataPipeOptions, flags) // |struct_size|.
74 MojoCreateDataPipeOptions validated_options = {};
75 EXPECT_EQ(MOJO_RESULT_OK,
76 DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
78 RevalidateCreateOptions(validated_options);
79 CheckDefaultCapacity(validated_options);
83 MojoCreateDataPipeOptionsFlags flags_values[] = {
84 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,
85 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD};
86 for (size_t i = 0; i < arraysize(flags_values); i++) {
87 const MojoCreateDataPipeOptionsFlags flags = flags_values[i];
89 // Flags member, but nothing beyond.
91 MojoCreateDataPipeOptions options = {
93 offsetof(MojoCreateDataPipeOptions, element_num_bytes),
96 MojoCreateDataPipeOptions validated_options = {};
97 EXPECT_EQ(MOJO_RESULT_OK,
98 DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
100 RevalidateCreateOptions(validated_options);
101 EXPECT_EQ(options.flags, validated_options.flags);
102 CheckDefaultCapacity(validated_options);
105 // Different capacities (size 1).
106 for (uint32_t capacity = 1; capacity <= 100 * 1000 * 1000; capacity *= 10) {
107 MojoCreateDataPipeOptions options = {
108 kSizeOfCreateOptions, // |struct_size|.
110 1, // |element_num_bytes|.
111 capacity // |capacity_num_bytes|.
113 MojoCreateDataPipeOptions validated_options = {};
114 EXPECT_EQ(MOJO_RESULT_OK,
115 DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
118 RevalidateCreateOptions(validated_options);
119 EXPECT_EQ(options.flags, validated_options.flags);
120 EXPECT_EQ(options.element_num_bytes, validated_options.element_num_bytes);
121 EXPECT_EQ(options.capacity_num_bytes,
122 validated_options.capacity_num_bytes);
126 for (uint32_t size = 1; size < 100; size++) {
127 // Different capacities.
128 for (uint32_t elements = 1; elements <= 1000 * 1000; elements *= 10) {
129 MojoCreateDataPipeOptions options = {
130 kSizeOfCreateOptions, // |struct_size|.
132 size, // |element_num_bytes|.
133 size * elements // |capacity_num_bytes|.
135 MojoCreateDataPipeOptions validated_options = {};
136 EXPECT_EQ(MOJO_RESULT_OK,
137 DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
139 << size << ", " << elements;
140 RevalidateCreateOptions(validated_options);
141 EXPECT_EQ(options.flags, validated_options.flags);
142 EXPECT_EQ(options.element_num_bytes,
143 validated_options.element_num_bytes);
144 EXPECT_EQ(options.capacity_num_bytes,
145 validated_options.capacity_num_bytes);
150 MojoCreateDataPipeOptions options = {
151 kSizeOfCreateOptions, // |struct_size|.
153 size, // |element_num_bytes|.
154 0 // |capacity_num_bytes|.
156 MojoCreateDataPipeOptions validated_options = {};
157 EXPECT_EQ(MOJO_RESULT_OK,
158 DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
161 RevalidateCreateOptions(validated_options);
162 EXPECT_EQ(options.flags, validated_options.flags);
163 EXPECT_EQ(options.element_num_bytes,
164 validated_options.element_num_bytes);
165 CheckDefaultCapacity(validated_options);
168 // No capacity field.
170 MojoCreateDataPipeOptions options = {
172 offsetof(MojoCreateDataPipeOptions, capacity_num_bytes),
174 size // |element_num_bytes|.
176 MojoCreateDataPipeOptions validated_options = {};
177 EXPECT_EQ(MOJO_RESULT_OK,
178 DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
181 RevalidateCreateOptions(validated_options);
182 EXPECT_EQ(options.flags, validated_options.flags);
183 EXPECT_EQ(options.element_num_bytes,
184 validated_options.element_num_bytes);
185 CheckDefaultCapacity(validated_options);
190 for (uint32_t size = 100; size <= 100 * 1000; size *= 10) {
191 // Capacity of 1000 elements.
193 MojoCreateDataPipeOptions options = {
194 kSizeOfCreateOptions, // |struct_size|.
196 size, // |element_num_bytes|.
197 1000 * size // |capacity_num_bytes|.
199 MojoCreateDataPipeOptions validated_options = {};
200 EXPECT_EQ(MOJO_RESULT_OK,
201 DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
204 RevalidateCreateOptions(validated_options);
205 EXPECT_EQ(options.flags, validated_options.flags);
206 EXPECT_EQ(options.element_num_bytes,
207 validated_options.element_num_bytes);
208 EXPECT_EQ(options.capacity_num_bytes,
209 validated_options.capacity_num_bytes);
214 MojoCreateDataPipeOptions options = {
215 kSizeOfCreateOptions, // |struct_size|.
217 size, // |element_num_bytes|.
218 0 // |capacity_num_bytes|.
220 MojoCreateDataPipeOptions validated_options = {};
221 EXPECT_EQ(MOJO_RESULT_OK,
222 DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
225 RevalidateCreateOptions(validated_options);
226 EXPECT_EQ(options.flags, validated_options.flags);
227 EXPECT_EQ(options.element_num_bytes,
228 validated_options.element_num_bytes);
229 CheckDefaultCapacity(validated_options);
232 // No capacity field.
234 MojoCreateDataPipeOptions options = {
236 offsetof(MojoCreateDataPipeOptions, capacity_num_bytes),
238 size // |element_num_bytes|.
240 MojoCreateDataPipeOptions validated_options = {};
241 EXPECT_EQ(MOJO_RESULT_OK,
242 DataPipe::ValidateCreateOptions(MakeUserPointer(&options),
245 RevalidateCreateOptions(validated_options);
246 EXPECT_EQ(options.flags, validated_options.flags);
247 EXPECT_EQ(options.element_num_bytes,
248 validated_options.element_num_bytes);
249 CheckDefaultCapacity(validated_options);
255 TEST(DataPipeTest, ValidateCreateOptionsInvalid) {
256 // Invalid |struct_size|.
258 MojoCreateDataPipeOptions options = {
260 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
261 1, // |element_num_bytes|.
262 0 // |capacity_num_bytes|.
264 MojoCreateDataPipeOptions unused;
266 MOJO_RESULT_INVALID_ARGUMENT,
267 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused));
272 MojoCreateDataPipeOptions options = {
273 kSizeOfCreateOptions, // |struct_size|.
275 1, // |element_num_bytes|.
276 0 // |capacity_num_bytes|.
278 MojoCreateDataPipeOptions unused;
280 MOJO_RESULT_UNIMPLEMENTED,
281 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused));
284 // Invalid |element_num_bytes|.
286 MojoCreateDataPipeOptions options = {
287 kSizeOfCreateOptions, // |struct_size|.
288 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
289 0, // |element_num_bytes|.
290 1000 // |capacity_num_bytes|.
292 MojoCreateDataPipeOptions unused;
294 MOJO_RESULT_INVALID_ARGUMENT,
295 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused));
297 // |element_num_bytes| too big.
299 MojoCreateDataPipeOptions options = {
300 kSizeOfCreateOptions, // |struct_size|.
301 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
302 std::numeric_limits<uint32_t>::max(), // |element_num_bytes|.
303 std::numeric_limits<uint32_t>::max() // |capacity_num_bytes|.
305 MojoCreateDataPipeOptions unused;
307 MOJO_RESULT_RESOURCE_EXHAUSTED,
308 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused));
311 MojoCreateDataPipeOptions options = {
312 kSizeOfCreateOptions, // |struct_size|.
313 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
314 std::numeric_limits<uint32_t>::max() - 1000, // |element_num_bytes|.
315 std::numeric_limits<uint32_t>::max() - 1000 // |capacity_num_bytes|.
317 MojoCreateDataPipeOptions unused;
319 MOJO_RESULT_RESOURCE_EXHAUSTED,
320 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused));
323 // Invalid |capacity_num_bytes|.
325 MojoCreateDataPipeOptions options = {
326 kSizeOfCreateOptions, // |struct_size|.
327 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
328 2, // |element_num_bytes|.
329 1 // |capacity_num_bytes|.
331 MojoCreateDataPipeOptions unused;
333 MOJO_RESULT_INVALID_ARGUMENT,
334 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused));
337 MojoCreateDataPipeOptions options = {
338 kSizeOfCreateOptions, // |struct_size|.
339 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
340 2, // |element_num_bytes|.
341 111 // |capacity_num_bytes|.
343 MojoCreateDataPipeOptions unused;
345 MOJO_RESULT_INVALID_ARGUMENT,
346 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused));
349 MojoCreateDataPipeOptions options = {
350 kSizeOfCreateOptions, // |struct_size|.
351 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
352 5, // |element_num_bytes|.
353 104 // |capacity_num_bytes|.
355 MojoCreateDataPipeOptions unused;
357 MOJO_RESULT_INVALID_ARGUMENT,
358 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused));
360 // |capacity_num_bytes| too big.
362 MojoCreateDataPipeOptions options = {
363 kSizeOfCreateOptions, // |struct_size|.
364 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
365 8, // |element_num_bytes|.
366 0xffff0000 // |capacity_num_bytes|.
368 MojoCreateDataPipeOptions unused;
370 MOJO_RESULT_RESOURCE_EXHAUSTED,
371 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused));
376 } // namespace system