| OLD | NEW | 
|---|
|  | (Empty) | 
| 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/edk/system/data_pipe.h" |  | 
| 6 |  | 
| 7 #include <stddef.h> |  | 
| 8 #include <stdint.h> |  | 
| 9 |  | 
| 10 #include <limits> |  | 
| 11 |  | 
| 12 #include "mojo/edk/system/configuration.h" |  | 
| 13 #include "testing/gtest/include/gtest/gtest.h" |  | 
| 14 |  | 
| 15 namespace mojo { |  | 
| 16 namespace system { |  | 
| 17 namespace { |  | 
| 18 |  | 
| 19 const uint32_t kSizeOfCreateOptions = |  | 
| 20     static_cast<uint32_t>(sizeof(MojoCreateDataPipeOptions)); |  | 
| 21 |  | 
| 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); |  | 
| 31   EXPECT_EQ(0u, validated_options.capacity_num_bytes % |  | 
| 32                     validated_options.element_num_bytes); |  | 
| 33 |  | 
| 34   MojoCreateDataPipeOptions revalidated_options = {}; |  | 
| 35   EXPECT_EQ(MOJO_RESULT_OK, |  | 
| 36             DataPipe::ValidateCreateOptions(MakeUserPointer(&validated_options), |  | 
| 37                                             &revalidated_options)); |  | 
| 38   EXPECT_EQ(validated_options.struct_size, revalidated_options.struct_size); |  | 
| 39   EXPECT_EQ(validated_options.element_num_bytes, |  | 
| 40             revalidated_options.element_num_bytes); |  | 
| 41   EXPECT_EQ(validated_options.capacity_num_bytes, |  | 
| 42             revalidated_options.capacity_num_bytes); |  | 
| 43   EXPECT_EQ(validated_options.flags, revalidated_options.flags); |  | 
| 44 } |  | 
| 45 |  | 
| 46 // Checks that a default-computed capacity is correct. (Does not duplicate the |  | 
| 47 // checks done by |RevalidateCreateOptions()|.) |  | 
| 48 void CheckDefaultCapacity(const MojoCreateDataPipeOptions& validated_options) { |  | 
| 49   EXPECT_LE(validated_options.capacity_num_bytes, |  | 
| 50             GetConfiguration().default_data_pipe_capacity_bytes); |  | 
| 51   EXPECT_GT(validated_options.capacity_num_bytes + |  | 
| 52                 validated_options.element_num_bytes, |  | 
| 53             GetConfiguration().default_data_pipe_capacity_bytes); |  | 
| 54 } |  | 
| 55 |  | 
| 56 // Tests valid inputs to |ValidateCreateOptions()|. |  | 
| 57 TEST(DataPipeTest, ValidateCreateOptionsValid) { |  | 
| 58   // Default options. |  | 
| 59   { |  | 
| 60     MojoCreateDataPipeOptions validated_options = {}; |  | 
| 61     EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( |  | 
| 62                                   NullUserPointer(), &validated_options)); |  | 
| 63     RevalidateCreateOptions(validated_options); |  | 
| 64     CheckDefaultCapacity(validated_options); |  | 
| 65   } |  | 
| 66 |  | 
| 67   // Size member, but nothing beyond. |  | 
| 68   { |  | 
| 69     MojoCreateDataPipeOptions options = { |  | 
| 70         offsetof(MojoCreateDataPipeOptions, flags)  // |struct_size|. |  | 
| 71     }; |  | 
| 72     MojoCreateDataPipeOptions validated_options = {}; |  | 
| 73     EXPECT_EQ(MOJO_RESULT_OK, |  | 
| 74               DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |  | 
| 75                                               &validated_options)); |  | 
| 76     RevalidateCreateOptions(validated_options); |  | 
| 77     CheckDefaultCapacity(validated_options); |  | 
| 78   } |  | 
| 79 |  | 
| 80   // Different flags. |  | 
| 81   MojoCreateDataPipeOptionsFlags flags_values[] = { |  | 
| 82       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, |  | 
| 83       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD}; |  | 
| 84   for (size_t i = 0; i < arraysize(flags_values); i++) { |  | 
| 85     const MojoCreateDataPipeOptionsFlags flags = flags_values[i]; |  | 
| 86 |  | 
| 87     // Flags member, but nothing beyond. |  | 
| 88     { |  | 
| 89       MojoCreateDataPipeOptions options = { |  | 
| 90           // |struct_size|. |  | 
| 91           offsetof(MojoCreateDataPipeOptions, element_num_bytes), |  | 
| 92           flags  // |flags|. |  | 
| 93       }; |  | 
| 94       MojoCreateDataPipeOptions validated_options = {}; |  | 
| 95       EXPECT_EQ(MOJO_RESULT_OK, |  | 
| 96                 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |  | 
| 97                                                 &validated_options)); |  | 
| 98       RevalidateCreateOptions(validated_options); |  | 
| 99       EXPECT_EQ(options.flags, validated_options.flags); |  | 
| 100       CheckDefaultCapacity(validated_options); |  | 
| 101     } |  | 
| 102 |  | 
| 103     // Different capacities (size 1). |  | 
| 104     for (uint32_t capacity = 1; capacity <= 100 * 1000 * 1000; capacity *= 10) { |  | 
| 105       MojoCreateDataPipeOptions options = { |  | 
| 106           kSizeOfCreateOptions,  // |struct_size|. |  | 
| 107           flags,                 // |flags|. |  | 
| 108           1,                     // |element_num_bytes|. |  | 
| 109           capacity               // |capacity_num_bytes|. |  | 
| 110       }; |  | 
| 111       MojoCreateDataPipeOptions validated_options = {}; |  | 
| 112       EXPECT_EQ(MOJO_RESULT_OK, |  | 
| 113                 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |  | 
| 114                                                 &validated_options)) |  | 
| 115           << capacity; |  | 
| 116       RevalidateCreateOptions(validated_options); |  | 
| 117       EXPECT_EQ(options.flags, validated_options.flags); |  | 
| 118       EXPECT_EQ(options.element_num_bytes, validated_options.element_num_bytes); |  | 
| 119       EXPECT_EQ(options.capacity_num_bytes, |  | 
| 120                 validated_options.capacity_num_bytes); |  | 
| 121     } |  | 
| 122 |  | 
| 123     // Small sizes. |  | 
| 124     for (uint32_t size = 1; size < 100; size++) { |  | 
| 125       // Different capacities. |  | 
| 126       for (uint32_t elements = 1; elements <= 1000 * 1000; elements *= 10) { |  | 
| 127         MojoCreateDataPipeOptions options = { |  | 
| 128             kSizeOfCreateOptions,  // |struct_size|. |  | 
| 129             flags,                 // |flags|. |  | 
| 130             size,                  // |element_num_bytes|. |  | 
| 131             size * elements        // |capacity_num_bytes|. |  | 
| 132         }; |  | 
| 133         MojoCreateDataPipeOptions validated_options = {}; |  | 
| 134         EXPECT_EQ(MOJO_RESULT_OK, |  | 
| 135                   DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |  | 
| 136                                                   &validated_options)) |  | 
| 137             << size << ", " << elements; |  | 
| 138         RevalidateCreateOptions(validated_options); |  | 
| 139         EXPECT_EQ(options.flags, validated_options.flags); |  | 
| 140         EXPECT_EQ(options.element_num_bytes, |  | 
| 141                   validated_options.element_num_bytes); |  | 
| 142         EXPECT_EQ(options.capacity_num_bytes, |  | 
| 143                   validated_options.capacity_num_bytes); |  | 
| 144       } |  | 
| 145 |  | 
| 146       // Default capacity. |  | 
| 147       { |  | 
| 148         MojoCreateDataPipeOptions options = { |  | 
| 149             kSizeOfCreateOptions,  // |struct_size|. |  | 
| 150             flags,                 // |flags|. |  | 
| 151             size,                  // |element_num_bytes|. |  | 
| 152             0                      // |capacity_num_bytes|. |  | 
| 153         }; |  | 
| 154         MojoCreateDataPipeOptions validated_options = {}; |  | 
| 155         EXPECT_EQ(MOJO_RESULT_OK, |  | 
| 156                   DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |  | 
| 157                                                   &validated_options)) |  | 
| 158             << size; |  | 
| 159         RevalidateCreateOptions(validated_options); |  | 
| 160         EXPECT_EQ(options.flags, validated_options.flags); |  | 
| 161         EXPECT_EQ(options.element_num_bytes, |  | 
| 162                   validated_options.element_num_bytes); |  | 
| 163         CheckDefaultCapacity(validated_options); |  | 
| 164       } |  | 
| 165 |  | 
| 166       // No capacity field. |  | 
| 167       { |  | 
| 168         MojoCreateDataPipeOptions options = { |  | 
| 169             // |struct_size|. |  | 
| 170             offsetof(MojoCreateDataPipeOptions, capacity_num_bytes), |  | 
| 171             flags,  // |flags|. |  | 
| 172             size    // |element_num_bytes|. |  | 
| 173         }; |  | 
| 174         MojoCreateDataPipeOptions validated_options = {}; |  | 
| 175         EXPECT_EQ(MOJO_RESULT_OK, |  | 
| 176                   DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |  | 
| 177                                                   &validated_options)) |  | 
| 178             << size; |  | 
| 179         RevalidateCreateOptions(validated_options); |  | 
| 180         EXPECT_EQ(options.flags, validated_options.flags); |  | 
| 181         EXPECT_EQ(options.element_num_bytes, |  | 
| 182                   validated_options.element_num_bytes); |  | 
| 183         CheckDefaultCapacity(validated_options); |  | 
| 184       } |  | 
| 185     } |  | 
| 186 |  | 
| 187     // Larger sizes. |  | 
| 188     for (uint32_t size = 100; size <= 100 * 1000; size *= 10) { |  | 
| 189       // Capacity of 1000 elements. |  | 
| 190       { |  | 
| 191         MojoCreateDataPipeOptions options = { |  | 
| 192             kSizeOfCreateOptions,  // |struct_size|. |  | 
| 193             flags,                 // |flags|. |  | 
| 194             size,                  // |element_num_bytes|. |  | 
| 195             1000 * size            // |capacity_num_bytes|. |  | 
| 196         }; |  | 
| 197         MojoCreateDataPipeOptions validated_options = {}; |  | 
| 198         EXPECT_EQ(MOJO_RESULT_OK, |  | 
| 199                   DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |  | 
| 200                                                   &validated_options)) |  | 
| 201             << size; |  | 
| 202         RevalidateCreateOptions(validated_options); |  | 
| 203         EXPECT_EQ(options.flags, validated_options.flags); |  | 
| 204         EXPECT_EQ(options.element_num_bytes, |  | 
| 205                   validated_options.element_num_bytes); |  | 
| 206         EXPECT_EQ(options.capacity_num_bytes, |  | 
| 207                   validated_options.capacity_num_bytes); |  | 
| 208       } |  | 
| 209 |  | 
| 210       // Default capacity. |  | 
| 211       { |  | 
| 212         MojoCreateDataPipeOptions options = { |  | 
| 213             kSizeOfCreateOptions,  // |struct_size|. |  | 
| 214             flags,                 // |flags|. |  | 
| 215             size,                  // |element_num_bytes|. |  | 
| 216             0                      // |capacity_num_bytes|. |  | 
| 217         }; |  | 
| 218         MojoCreateDataPipeOptions validated_options = {}; |  | 
| 219         EXPECT_EQ(MOJO_RESULT_OK, |  | 
| 220                   DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |  | 
| 221                                                   &validated_options)) |  | 
| 222             << size; |  | 
| 223         RevalidateCreateOptions(validated_options); |  | 
| 224         EXPECT_EQ(options.flags, validated_options.flags); |  | 
| 225         EXPECT_EQ(options.element_num_bytes, |  | 
| 226                   validated_options.element_num_bytes); |  | 
| 227         CheckDefaultCapacity(validated_options); |  | 
| 228       } |  | 
| 229 |  | 
| 230       // No capacity field. |  | 
| 231       { |  | 
| 232         MojoCreateDataPipeOptions options = { |  | 
| 233             // |struct_size|. |  | 
| 234             offsetof(MojoCreateDataPipeOptions, capacity_num_bytes), |  | 
| 235             flags,  // |flags|. |  | 
| 236             size    // |element_num_bytes|. |  | 
| 237         }; |  | 
| 238         MojoCreateDataPipeOptions validated_options = {}; |  | 
| 239         EXPECT_EQ(MOJO_RESULT_OK, |  | 
| 240                   DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |  | 
| 241                                                   &validated_options)) |  | 
| 242             << size; |  | 
| 243         RevalidateCreateOptions(validated_options); |  | 
| 244         EXPECT_EQ(options.flags, validated_options.flags); |  | 
| 245         EXPECT_EQ(options.element_num_bytes, |  | 
| 246                   validated_options.element_num_bytes); |  | 
| 247         CheckDefaultCapacity(validated_options); |  | 
| 248       } |  | 
| 249     } |  | 
| 250   } |  | 
| 251 } |  | 
| 252 |  | 
| 253 TEST(DataPipeTest, ValidateCreateOptionsInvalid) { |  | 
| 254   // Invalid |struct_size|. |  | 
| 255   { |  | 
| 256     MojoCreateDataPipeOptions options = { |  | 
| 257         1,                                        // |struct_size|. |  | 
| 258         MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|. |  | 
| 259         1,                                        // |element_num_bytes|. |  | 
| 260         0                                         // |capacity_num_bytes|. |  | 
| 261     }; |  | 
| 262     MojoCreateDataPipeOptions unused; |  | 
| 263     EXPECT_EQ( |  | 
| 264         MOJO_RESULT_INVALID_ARGUMENT, |  | 
| 265         DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused)); |  | 
| 266   } |  | 
| 267 |  | 
| 268   // Unknown |flags|. |  | 
| 269   { |  | 
| 270     MojoCreateDataPipeOptions options = { |  | 
| 271         kSizeOfCreateOptions,  // |struct_size|. |  | 
| 272         ~0u,                   // |flags|. |  | 
| 273         1,                     // |element_num_bytes|. |  | 
| 274         0                      // |capacity_num_bytes|. |  | 
| 275     }; |  | 
| 276     MojoCreateDataPipeOptions unused; |  | 
| 277     EXPECT_EQ( |  | 
| 278         MOJO_RESULT_UNIMPLEMENTED, |  | 
| 279         DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused)); |  | 
| 280   } |  | 
| 281 |  | 
| 282   // Invalid |element_num_bytes|. |  | 
| 283   { |  | 
| 284     MojoCreateDataPipeOptions options = { |  | 
| 285         kSizeOfCreateOptions,                     // |struct_size|. |  | 
| 286         MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|. |  | 
| 287         0,                                        // |element_num_bytes|. |  | 
| 288         1000                                      // |capacity_num_bytes|. |  | 
| 289     }; |  | 
| 290     MojoCreateDataPipeOptions unused; |  | 
| 291     EXPECT_EQ( |  | 
| 292         MOJO_RESULT_INVALID_ARGUMENT, |  | 
| 293         DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused)); |  | 
| 294   } |  | 
| 295   // |element_num_bytes| too big. |  | 
| 296   { |  | 
| 297     MojoCreateDataPipeOptions options = { |  | 
| 298         kSizeOfCreateOptions,                     // |struct_size|. |  | 
| 299         MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|. |  | 
| 300         std::numeric_limits<uint32_t>::max(),     // |element_num_bytes|. |  | 
| 301         std::numeric_limits<uint32_t>::max()      // |capacity_num_bytes|. |  | 
| 302     }; |  | 
| 303     MojoCreateDataPipeOptions unused; |  | 
| 304     EXPECT_EQ( |  | 
| 305         MOJO_RESULT_RESOURCE_EXHAUSTED, |  | 
| 306         DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused)); |  | 
| 307   } |  | 
| 308   { |  | 
| 309     MojoCreateDataPipeOptions options = { |  | 
| 310         kSizeOfCreateOptions,                         // |struct_size|. |  | 
| 311         MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,      // |flags|. |  | 
| 312         std::numeric_limits<uint32_t>::max() - 1000,  // |element_num_bytes|. |  | 
| 313         std::numeric_limits<uint32_t>::max() - 1000   // |capacity_num_bytes|. |  | 
| 314     }; |  | 
| 315     MojoCreateDataPipeOptions unused; |  | 
| 316     EXPECT_EQ( |  | 
| 317         MOJO_RESULT_RESOURCE_EXHAUSTED, |  | 
| 318         DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused)); |  | 
| 319   } |  | 
| 320 |  | 
| 321   // Invalid |capacity_num_bytes|. |  | 
| 322   { |  | 
| 323     MojoCreateDataPipeOptions options = { |  | 
| 324         kSizeOfCreateOptions,                     // |struct_size|. |  | 
| 325         MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|. |  | 
| 326         2,                                        // |element_num_bytes|. |  | 
| 327         1                                         // |capacity_num_bytes|. |  | 
| 328     }; |  | 
| 329     MojoCreateDataPipeOptions unused; |  | 
| 330     EXPECT_EQ( |  | 
| 331         MOJO_RESULT_INVALID_ARGUMENT, |  | 
| 332         DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused)); |  | 
| 333   } |  | 
| 334   { |  | 
| 335     MojoCreateDataPipeOptions options = { |  | 
| 336         kSizeOfCreateOptions,                     // |struct_size|. |  | 
| 337         MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|. |  | 
| 338         2,                                        // |element_num_bytes|. |  | 
| 339         111                                       // |capacity_num_bytes|. |  | 
| 340     }; |  | 
| 341     MojoCreateDataPipeOptions unused; |  | 
| 342     EXPECT_EQ( |  | 
| 343         MOJO_RESULT_INVALID_ARGUMENT, |  | 
| 344         DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused)); |  | 
| 345   } |  | 
| 346   { |  | 
| 347     MojoCreateDataPipeOptions options = { |  | 
| 348         kSizeOfCreateOptions,                     // |struct_size|. |  | 
| 349         MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|. |  | 
| 350         5,                                        // |element_num_bytes|. |  | 
| 351         104                                       // |capacity_num_bytes|. |  | 
| 352     }; |  | 
| 353     MojoCreateDataPipeOptions unused; |  | 
| 354     EXPECT_EQ( |  | 
| 355         MOJO_RESULT_INVALID_ARGUMENT, |  | 
| 356         DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused)); |  | 
| 357   } |  | 
| 358   // |capacity_num_bytes| too big. |  | 
| 359   { |  | 
| 360     MojoCreateDataPipeOptions options = { |  | 
| 361         kSizeOfCreateOptions,                     // |struct_size|. |  | 
| 362         MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|. |  | 
| 363         8,                                        // |element_num_bytes|. |  | 
| 364         0xffff0000                                // |capacity_num_bytes|. |  | 
| 365     }; |  | 
| 366     MojoCreateDataPipeOptions unused; |  | 
| 367     EXPECT_EQ( |  | 
| 368         MOJO_RESULT_RESOURCE_EXHAUSTED, |  | 
| 369         DataPipe::ValidateCreateOptions(MakeUserPointer(&options), &unused)); |  | 
| 370   } |  | 
| 371 } |  | 
| 372 |  | 
| 373 }  // namespace |  | 
| 374 }  // namespace system |  | 
| 375 }  // namespace mojo |  | 
| OLD | NEW | 
|---|