| // Copyright 2016 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef BASE_TEST_FUZZED_DATA_PROVIDER_H_ | 
 | #define BASE_TEST_FUZZED_DATA_PROVIDER_H_ | 
 |  | 
 | #include <stdint.h> | 
 |  | 
 | #include <string> | 
 |  | 
 | #include "base/base_export.h" | 
 | #include "base/macros.h" | 
 | #include "base/strings/string_piece.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | // Utility class to break up fuzzer input for multiple consumers. Whenever run | 
 | // on the same input, provides the same output, as long as its methods are | 
 | // called in the same order, with the same arguments. | 
 | class FuzzedDataProvider { | 
 |  public: | 
 |   // |data| is an array of length |size| that the FuzzedDataProvider wraps to | 
 |   // provide more granular access. |data| must outlive the FuzzedDataProvider. | 
 |   FuzzedDataProvider(const uint8_t* data, size_t size); | 
 |   ~FuzzedDataProvider(); | 
 |  | 
 |   // Returns a std::string containing |num_bytes| of input data. If fewer than | 
 |   // |num_bytes| of data remain, returns a shorter std::string containing all | 
 |   // of the data that's left. | 
 |   std::string ConsumeBytes(size_t num_bytes); | 
 |  | 
 |   // Returns a std::string containing all remaining bytes of the input data. | 
 |   std::string ConsumeRemainingBytes(); | 
 |  | 
 |   // Returns a std::string of length from 0 to |max_length|. When it runs out of | 
 |   // input data, returns what remains of the input. Designed to be more stable | 
 |   // with respect to a fuzzer inserting characters than just picking a random | 
 |   // length and then consuming that many bytes with ConsumeBytes(). | 
 |   std::string ConsumeRandomLengthString(size_t max_length); | 
 |  | 
 |   // Returns a number in the range [min, max] by consuming bytes from the input | 
 |   // data. The value might not be uniformly distributed in the given range. If | 
 |   // there's no input data left, always returns |min|. |min| must be less than | 
 |   // or equal to |max|. | 
 |   uint32_t ConsumeUint32InRange(uint32_t min, uint32_t max); | 
 |   int ConsumeInt32InRange(int min, int max); | 
 |  | 
 |   // Returns a bool, or false when no data remains. | 
 |   bool ConsumeBool(); | 
 |  | 
 |   // Returns a uint8_t from the input or 0 if nothing remains. This is | 
 |   // equivalent to ConsumeUint32InRange(0, 0xFF). | 
 |   uint8_t ConsumeUint8(); | 
 |  | 
 |   // Returns a uint16_t from the input. If fewer than 2 bytes of data remain | 
 |   // will fill the most significant bytes with 0. This is equivalent to | 
 |   // ConsumeUint32InRange(0, 0xFFFF). | 
 |   uint16_t ConsumeUint16(); | 
 |  | 
 |   // Returns a value from |array|, consuming as many bytes as needed to do so. | 
 |   // |array| must be a fixed-size array. Equivalent to | 
 |   // array[ConsumeUint32InRange(sizeof(array)-1)]; | 
 |   template <typename Type, size_t size> | 
 |   Type PickValueInArray(Type (&array)[size]) { | 
 |     return array[ConsumeUint32InRange(0, size - 1)]; | 
 |   } | 
 |  | 
 |   // Reports the remaining bytes available for fuzzed input. | 
 |   size_t remaining_bytes() { return remaining_data_.length(); } | 
 |  | 
 |  private: | 
 |   StringPiece remaining_data_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(FuzzedDataProvider); | 
 | }; | 
 |  | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_TEST_FUZZED_DATA_PROVIDER_H_ |