xref: /openbsd-src/gnu/llvm/compiler-rt/lib/fuzzer/tests/FuzzedDataProviderUnittest.cpp (revision 1a8dbaac879b9f3335ad7fb25429ce63ac1d6bac)
1 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
2 // See https://llvm.org/LICENSE.txt for license information.
3 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4 
5 #include "gtest/gtest.h"
6 #include <cstdint>
7 #include <cstdlib>
8 
9 #include <fuzzer/FuzzedDataProvider.h>
10 
11 // The test is intentionally extensive, as behavior of |FuzzedDataProvider| must
12 // not be broken, given than many fuzz targets depend on it. Changing the
13 // behavior might invalidate existing corpora and make the fuzz targets using
14 // |FuzzedDataProvider| to lose code coverage accumulated over time.
15 
16 /* A random 1KB buffer generated by:
17 $ python -c "import os; print ',\n'.join([', '.join(['0x%02X' % ord(i) for i \
18       in list(os.urandom(8))]) for _ in xrange(128)])"
19 */
20 const uint8_t Data[] = {
21     0x8A, 0x19, 0x0D, 0x44, 0x37, 0x0D, 0x38, 0x5E, 0x9B, 0xAA, 0xF3, 0xDA,
22     0xAA, 0x88, 0xF2, 0x9B, 0x6C, 0xBA, 0xBE, 0xB1, 0xF2, 0xCF, 0x13, 0xB8,
23     0xAC, 0x1A, 0x7F, 0x1C, 0xC9, 0x90, 0xD0, 0xD9, 0x5C, 0x42, 0xB3, 0xFD,
24     0xE3, 0x05, 0xA4, 0x03, 0x37, 0x49, 0x50, 0x4B, 0xBC, 0x39, 0xA2, 0x09,
25     0x6C, 0x2F, 0xAF, 0xD1, 0xB5, 0x47, 0xBF, 0x92, 0xBD, 0x79, 0xE5, 0xC5,
26     0x6E, 0x51, 0xA4, 0xED, 0xE9, 0xBD, 0x40, 0x4A, 0xFC, 0x25, 0x7A, 0x27,
27     0xC8, 0x92, 0xF7, 0x30, 0xDE, 0x40, 0x66, 0x66, 0xE8, 0x5F, 0x65, 0x39,
28     0x7E, 0x9E, 0x80, 0x2B, 0x01, 0x71, 0x2A, 0xFF, 0xD3, 0x0A, 0xAC, 0x6E,
29     0x49, 0x32, 0x79, 0x10, 0x6A, 0x6F, 0x97, 0x96, 0x70, 0x7E, 0x50, 0x65,
30     0xC9, 0x1D, 0xBD, 0x4E, 0x17, 0x04, 0x1E, 0xBA, 0x26, 0xAC, 0x1F, 0xE3,
31     0x37, 0x1C, 0x15, 0x43, 0x60, 0x41, 0x2A, 0x7C, 0xCA, 0x70, 0xCE, 0xAB,
32     0x20, 0x24, 0xF8, 0xD9, 0x1F, 0x14, 0x7C, 0x5C, 0xDD, 0x6F, 0xB3, 0xD7,
33     0x8B, 0x63, 0x10, 0xB7, 0xDA, 0x99, 0xAF, 0x99, 0x01, 0x21, 0xE6, 0xE1,
34     0x86, 0x27, 0xBE, 0x8D, 0xDF, 0x1E, 0xEA, 0x80, 0x0B, 0x8A, 0x60, 0xC3,
35     0x3A, 0x85, 0x33, 0x53, 0x59, 0xE1, 0xB5, 0xF1, 0x62, 0xA6, 0x7B, 0x24,
36     0x94, 0xE3, 0x8C, 0x10, 0x93, 0xF8, 0x6E, 0xC2, 0x00, 0x91, 0x90, 0x0B,
37     0x5D, 0x52, 0x4F, 0x21, 0xE3, 0x40, 0x3A, 0x6E, 0xB6, 0x32, 0x15, 0xDB,
38     0x5D, 0x01, 0x86, 0x63, 0x83, 0x24, 0xC5, 0xDE, 0xAB, 0x31, 0x84, 0xAA,
39     0xE5, 0x64, 0x02, 0x8D, 0x23, 0x82, 0x86, 0x14, 0x16, 0x18, 0x9F, 0x3D,
40     0x31, 0xBE, 0x3B, 0xF0, 0x6C, 0x26, 0x42, 0x9A, 0x67, 0xFE, 0x28, 0xEC,
41     0x28, 0xDB, 0x01, 0xB4, 0x52, 0x41, 0x81, 0x7C, 0x54, 0xD3, 0xC8, 0x00,
42     0x01, 0x66, 0xB0, 0x2C, 0x3F, 0xBC, 0xAF, 0xAC, 0x87, 0xCD, 0x83, 0xCF,
43     0x23, 0xFC, 0xC8, 0x97, 0x8C, 0x71, 0x32, 0x8B, 0xBF, 0x70, 0xC0, 0x48,
44     0x31, 0x92, 0x18, 0xFE, 0xE5, 0x33, 0x48, 0x82, 0x98, 0x1E, 0x30, 0xCC,
45     0xAD, 0x5D, 0x97, 0xC4, 0xB4, 0x39, 0x7C, 0xCD, 0x39, 0x44, 0xF1, 0xA9,
46     0xD0, 0xF4, 0x27, 0xB7, 0x78, 0x85, 0x9E, 0x72, 0xFC, 0xCC, 0xEE, 0x98,
47     0x25, 0x3B, 0x69, 0x6B, 0x0C, 0x11, 0xEA, 0x22, 0xB6, 0xD0, 0xCD, 0xBF,
48     0x6D, 0xBE, 0x12, 0xDE, 0xFE, 0x78, 0x2E, 0x54, 0xCB, 0xBA, 0xD7, 0x2E,
49     0x54, 0x25, 0x14, 0x84, 0xFE, 0x1A, 0x10, 0xCE, 0xCC, 0x20, 0xE6, 0xE2,
50     0x7F, 0xE0, 0x5F, 0xDB, 0xA7, 0xF3, 0xE2, 0x4C, 0x52, 0x82, 0xFC, 0x0B,
51     0xA0, 0xBD, 0x34, 0x21, 0xF7, 0xEB, 0x1C, 0x5B, 0x67, 0xD0, 0xAF, 0x22,
52     0x15, 0xA1, 0xFF, 0xC2, 0x68, 0x25, 0x5B, 0xB2, 0x13, 0x3F, 0xFF, 0x98,
53     0x53, 0x25, 0xC5, 0x58, 0x39, 0xD0, 0x43, 0x86, 0x6C, 0x5B, 0x57, 0x8E,
54     0x83, 0xBA, 0xB9, 0x09, 0x09, 0x14, 0x0C, 0x9E, 0x99, 0x83, 0x88, 0x53,
55     0x79, 0xFD, 0xF7, 0x49, 0xE9, 0x2C, 0xCE, 0xE6, 0x7B, 0xF5, 0xC2, 0x27,
56     0x5E, 0x56, 0xB5, 0xB4, 0x46, 0x90, 0x91, 0x7F, 0x99, 0x88, 0xA7, 0x23,
57     0xC1, 0x80, 0xB8, 0x2D, 0xCD, 0xF7, 0x6F, 0x9A, 0xEC, 0xBD, 0x16, 0x9F,
58     0x7D, 0x87, 0x1E, 0x15, 0x51, 0xC4, 0x96, 0xE2, 0xBF, 0x61, 0x66, 0xB5,
59     0xFD, 0x01, 0x67, 0xD6, 0xFF, 0xD2, 0x14, 0x20, 0x98, 0x8E, 0xEF, 0xF3,
60     0x22, 0xDB, 0x7E, 0xCE, 0x70, 0x2D, 0x4C, 0x06, 0x5A, 0xA0, 0x4F, 0xC8,
61     0xB0, 0x4D, 0xA6, 0x52, 0xB2, 0xD6, 0x2F, 0xD8, 0x57, 0xE5, 0xEF, 0xF9,
62     0xEE, 0x52, 0x0F, 0xEC, 0xC4, 0x90, 0x33, 0xAD, 0x25, 0xDA, 0xCD, 0x12,
63     0x44, 0x5F, 0x32, 0xF6, 0x6F, 0xEF, 0x85, 0xB8, 0xDC, 0x3C, 0x01, 0x48,
64     0x28, 0x5D, 0x2D, 0x9C, 0x9B, 0xC0, 0x49, 0x36, 0x1E, 0x6A, 0x0A, 0x0C,
65     0xB0, 0x6E, 0x81, 0x89, 0xCB, 0x0A, 0x89, 0xCF, 0x73, 0xC6, 0x63, 0x3D,
66     0x8E, 0x13, 0x57, 0x91, 0x4E, 0xA3, 0x93, 0x8C, 0x61, 0x67, 0xFD, 0x13,
67     0xE0, 0x14, 0x72, 0xB3, 0xE4, 0x23, 0x45, 0x08, 0x4E, 0x4E, 0xF5, 0xA7,
68     0xA8, 0xEE, 0x30, 0xFD, 0x81, 0x80, 0x1F, 0xF3, 0x4F, 0xD7, 0xE7, 0xF2,
69     0x16, 0xC0, 0xD6, 0x15, 0x6A, 0x0F, 0x89, 0x15, 0xA9, 0xCF, 0x35, 0x50,
70     0x6B, 0x49, 0x3E, 0x12, 0x4A, 0x72, 0xE4, 0x59, 0x9D, 0xD7, 0xDB, 0xD2,
71     0xD1, 0x61, 0x7D, 0x52, 0x4A, 0x36, 0xF6, 0xBA, 0x0E, 0xFA, 0x88, 0x6F,
72     0x3C, 0x82, 0x16, 0xF0, 0xD5, 0xED, 0x4D, 0x78, 0xEF, 0x38, 0x17, 0x90,
73     0xEA, 0x28, 0x32, 0xA9, 0x79, 0x40, 0xFF, 0xAA, 0xE6, 0xF5, 0xC7, 0x96,
74     0x56, 0x65, 0x61, 0x83, 0x3D, 0xBD, 0xD7, 0xED, 0xD6, 0xB6, 0xC0, 0xED,
75     0x34, 0xAA, 0x60, 0xA9, 0xE8, 0x82, 0x78, 0xEA, 0x69, 0xF6, 0x47, 0xAF,
76     0x39, 0xAB, 0x11, 0xDB, 0xE9, 0xFB, 0x68, 0x0C, 0xFE, 0xDF, 0x97, 0x9F,
77     0x3A, 0xF4, 0xF3, 0x32, 0x27, 0x30, 0x57, 0x0E, 0xF7, 0xB2, 0xEE, 0xFB,
78     0x1E, 0x98, 0xA8, 0xA3, 0x25, 0x45, 0xE4, 0x6D, 0x2D, 0xAE, 0xFE, 0xDA,
79     0xB3, 0x32, 0x9B, 0x5D, 0xF5, 0x32, 0x74, 0xEA, 0xE5, 0x02, 0x30, 0x53,
80     0x95, 0x13, 0x7A, 0x23, 0x1F, 0x10, 0x30, 0xEA, 0x78, 0xE4, 0x36, 0x1D,
81     0x92, 0x96, 0xB9, 0x91, 0x2D, 0xFA, 0x43, 0xAB, 0xE6, 0xEF, 0x14, 0x14,
82     0xC9, 0xBC, 0x46, 0xC6, 0x05, 0x7C, 0xC6, 0x11, 0x23, 0xCF, 0x3D, 0xC8,
83     0xBE, 0xEC, 0xA3, 0x58, 0x31, 0x55, 0x65, 0x14, 0xA7, 0x94, 0x93, 0xDD,
84     0x2D, 0x76, 0xC9, 0x66, 0x06, 0xBD, 0xF5, 0xE7, 0x30, 0x65, 0x42, 0x52,
85     0xA2, 0x50, 0x9B, 0xE6, 0x40, 0xA2, 0x4B, 0xEC, 0xA6, 0xB7, 0x39, 0xAA,
86     0xD7, 0x61, 0x2C, 0xBF, 0x37, 0x5A, 0xDA, 0xB3, 0x5D, 0x2F, 0x5D, 0x11,
87     0x82, 0x97, 0x32, 0x8A, 0xC1, 0xA1, 0x13, 0x20, 0x17, 0xBD, 0xA2, 0x91,
88     0x94, 0x2A, 0x4E, 0xBE, 0x3E, 0x77, 0x63, 0x67, 0x5C, 0x0A, 0xE1, 0x22,
89     0x0A, 0x4F, 0x63, 0xE2, 0x84, 0xE9, 0x9F, 0x14, 0x86, 0xE2, 0x4B, 0x20,
90     0x9F, 0x50, 0xB3, 0x56, 0xED, 0xDE, 0x39, 0xD8, 0x75, 0x64, 0x45, 0x54,
91     0xE5, 0x34, 0x57, 0x8C, 0x3B, 0xF2, 0x0E, 0x94, 0x1B, 0x10, 0xA2, 0xA2,
92     0x38, 0x76, 0x21, 0x8E, 0x2A, 0x57, 0x64, 0x58, 0x0A, 0x27, 0x6D, 0x4C,
93     0xD0, 0xB5, 0xC1, 0xFC, 0x75, 0xD0, 0x01, 0x86, 0x66, 0xA8, 0xF1, 0x98,
94     0x58, 0xFB, 0xFC, 0x64, 0xD2, 0x31, 0x77, 0xAD, 0x0E, 0x46, 0x87, 0xCC,
95     0x9B, 0x86, 0x90, 0xFF, 0xB6, 0x64, 0x35, 0xA5, 0x5D, 0x9E, 0x44, 0x51,
96     0x87, 0x9E, 0x1E, 0xEE, 0xF3, 0x3B, 0x5C, 0xDD, 0x94, 0x03, 0xAA, 0x18,
97     0x2C, 0xB7, 0xC4, 0x37, 0xD5, 0x53, 0x28, 0x60, 0xEF, 0x77, 0xEF, 0x3B,
98     0x9E, 0xD2, 0xCE, 0xE9, 0x53, 0x2D, 0xF5, 0x19, 0x7E, 0xBB, 0xB5, 0x46,
99     0xE2, 0xF7, 0xD6, 0x4D, 0x6D, 0x5B, 0x81, 0x56, 0x6B, 0x12, 0x55, 0x63,
100     0xC3, 0xAB, 0x08, 0xBB, 0x2E, 0xD5, 0x11, 0xBC, 0x18, 0xCB, 0x8B, 0x12,
101     0x2E, 0x3E, 0x75, 0x32, 0x98, 0x8A, 0xDE, 0x3C, 0xEA, 0x33, 0x46, 0xE7,
102     0x7A, 0xA5, 0x12, 0x09, 0x26, 0x7E, 0x7E, 0x03, 0x4F, 0xFD, 0xC0, 0xFD,
103     0xEA, 0x4F, 0x83, 0x85, 0x39, 0x62, 0xFB, 0xA2, 0x33, 0xD9, 0x2D, 0xB1,
104     0x30, 0x6F, 0x88, 0xAB, 0x61, 0xCB, 0x32, 0xEB, 0x30, 0xF9, 0x51, 0xF6,
105     0x1F, 0x3A, 0x11, 0x4D, 0xFD, 0x54, 0xD6, 0x3D, 0x43, 0x73, 0x39, 0x16,
106     0xCF, 0x3D, 0x29, 0x4A};
107 
108 TEST(FuzzedDataProvider, ConsumeBytes) {
109   FuzzedDataProvider DataProv(Data, sizeof(Data));
110   EXPECT_EQ(std::vector<unsigned char>(1, 0x8A),
111             DataProv.ConsumeBytes<unsigned char>(1));
112   EXPECT_EQ(std::vector<uint8_t>(
113                 {0x19, 0x0D, 0x44, 0x37, 0x0D, 0x38, 0x5E, 0x9B, 0xAA, 0xF3}),
114             DataProv.ConsumeBytes<uint8_t>(10));
115 
116   std::vector<unsigned char> UChars = DataProv.ConsumeBytes<unsigned char>(24);
117   EXPECT_EQ(std::vector<unsigned char>({0xDA, 0xAA, 0x88, 0xF2, 0x9B, 0x6C,
118                                         0xBA, 0xBE, 0xB1, 0xF2, 0xCF, 0x13,
119                                         0xB8, 0xAC, 0x1A, 0x7F, 0x1C, 0xC9,
120                                         0x90, 0xD0, 0xD9, 0x5C, 0x42, 0xB3}),
121             UChars);
122 
123   EXPECT_EQ(std::vector<signed char>(Data + 1 + 10 + 24, Data + sizeof(Data)),
124             DataProv.ConsumeBytes<signed char>(31337));
125 }
126 
127 TEST(FuzzedDataProvider, ConsumeBytesWithTerminator) {
128   FuzzedDataProvider DataProv(Data, sizeof(Data));
129   EXPECT_EQ(std::vector<unsigned char>({0x8A, 0x00}),
130             DataProv.ConsumeBytesWithTerminator<unsigned char>(1));
131   EXPECT_EQ(std::vector<uint8_t>({0x19, 0x0D, 0x44, 0x37, 0x0D, 0x38, 0x5E,
132                                   0x9B, 0xAA, 0xF3, 111}),
133             DataProv.ConsumeBytesWithTerminator<uint8_t>(10, 111));
134 
135   std::vector<unsigned char> UChars =
136       DataProv.ConsumeBytesWithTerminator<unsigned char>(24);
137   EXPECT_EQ(std::vector<unsigned char>(
138                 {0xDA, 0xAA, 0x88, 0xF2, 0x9B, 0x6C, 0xBA, 0xBE, 0xB1,
139                  0xF2, 0xCF, 0x13, 0xB8, 0xAC, 0x1A, 0x7F, 0x1C, 0xC9,
140                  0x90, 0xD0, 0xD9, 0x5C, 0x42, 0xB3, 0x00}),
141             UChars);
142 
143   std::vector<signed char> Expected(Data + 1 + 10 + 24, Data + sizeof(Data));
144   Expected.push_back(65);
145   EXPECT_EQ(Expected,
146             DataProv.ConsumeBytesWithTerminator<signed char>(31337, 65));
147 }
148 
149 TEST(FuzzedDataProvider, ConsumeBytesAsString) {
150   FuzzedDataProvider DataProv(Data, sizeof(Data));
151   EXPECT_EQ(std::string("\x8A\x19\x0D\x44\x37\x0D\x38\x5E\x9B\xAA\xF3\xDA"),
152             DataProv.ConsumeBytesAsString(12));
153   EXPECT_EQ(std::string(Data + 12, Data + sizeof(Data)),
154             DataProv.ConsumeBytesAsString(31337));
155 }
156 
157 TEST(FuzzedDataProvider, ConsumeIntegralInRange) {
158   FuzzedDataProvider DataProv(Data, sizeof(Data));
159   EXPECT_EQ(int32_t(21), DataProv.ConsumeIntegralInRange<int32_t>(10, 30));
160   EXPECT_EQ(int32_t(1337),
161             DataProv.ConsumeIntegralInRange<int32_t>(1337, 1337));
162   EXPECT_EQ(int8_t(-59), DataProv.ConsumeIntegralInRange<int8_t>(-100, 100));
163   EXPECT_EQ(uint16_t(15823),
164             DataProv.ConsumeIntegralInRange<uint16_t>(0, 65535));
165   EXPECT_EQ((signed char)(-101),
166             DataProv.ConsumeIntegralInRange<signed char>(-123, 123));
167   EXPECT_EQ(int64_t(-53253077544), DataProv.ConsumeIntegralInRange<int64_t>(
168                                        -99999999999, 99999999999));
169 
170   // Exhaust the buffer.
171   auto String = DataProv.ConsumeBytesAsString(31337);
172   EXPECT_EQ(size_t(1014), String.length());
173   EXPECT_EQ(uint64_t(123456789),
174             DataProv.ConsumeIntegralInRange<uint64_t>(123456789, 987654321));
175 }
176 
177 TEST(FuzzedDataProvider, ConsumeRandomLengthString) {
178   FuzzedDataProvider DataProv(Data, sizeof(Data));
179   EXPECT_EQ(
180       std::string(
181           "\x8A\x19\x0D\x44\x37\x0D\x38\x5E\x9B\xAA\xF3\xDA\xAA\x88\xF2\x9B\x6C"
182           "\xBA\xBE\xB1\xF2\xCF\x13\xB8\xAC\x1A\x7F\x1C\xC9\x90\xD0\xD9"),
183       DataProv.ConsumeRandomLengthString(1337));
184   EXPECT_EQ(std::string(
185                 "\xB3\xFD\xE3\x05\xA4\x03\x37\x49\x50\x4B\xBC\x39\xA2\x09\x6C"
186                 "\x2F\xAF\xD1\xB5\x47\xBF\x92\xBD\x79\xE5\xC5\x6E\x51\xA4\xED"
187                 "\xE9\xBD\x40\x4A\xFC\x25\x7A\x27\xC8\x92\xF7\x30\xDE\x40\x66"
188                 "\x66\xE8\x5F\x65\x39\x7E\x9E\x80\x2B\x01\x71\x2A\xFF\xD3\x0A"
189                 "\xAC\x6E\x49\x32\x79\x10\x6A\x6F\x97\x96\x70\x7E\x50\x65\xC9"
190                 "\x1D\xBD\x4E\x17\x04\x1E\xBA\x26\xAC\x1F\xE3\x37\x1C\x15\x43"
191                 "\x60\x41\x2A\x7C\xCA\x70\xCE\xAB\x20\x24\xF8\xD9\x1F\x14\x7C"),
192             DataProv.ConsumeRandomLengthString(31337));
193   EXPECT_EQ(std::string(Data + 141, Data + 141 + 5),
194             DataProv.ConsumeRandomLengthString(5));
195   EXPECT_EQ(std::string(Data + 141 + 5, Data + 141 + 5 + 2),
196             DataProv.ConsumeRandomLengthString(2));
197 
198   // Exhaust the buffer.
199   auto String = DataProv.ConsumeBytesAsString(31337);
200   EXPECT_EQ(size_t(876), String.length());
201   EXPECT_EQ(std::string(), DataProv.ConsumeRandomLengthString(1));
202 }
203 
204 TEST(FuzzedDataProvider, ConsumeRemainingBytes) {
205   {
206     FuzzedDataProvider DataProv(Data, sizeof(Data));
207     EXPECT_EQ(std::vector<uint8_t>(Data, Data + sizeof(Data)),
208               DataProv.ConsumeRemainingBytes<uint8_t>());
209     EXPECT_EQ(std::vector<uint8_t>(),
210               DataProv.ConsumeRemainingBytes<uint8_t>());
211   }
212 
213   {
214     FuzzedDataProvider DataProv(Data, sizeof(Data));
215     EXPECT_EQ(std::vector<uint8_t>(Data, Data + 123),
216               DataProv.ConsumeBytes<uint8_t>(123));
217     EXPECT_EQ(std::vector<char>(Data + 123, Data + sizeof(Data)),
218               DataProv.ConsumeRemainingBytes<char>());
219   }
220 }
221 
222 TEST(FuzzedDataProvider, ConsumeRemainingBytesAsString) {
223   {
224     FuzzedDataProvider DataProv(Data, sizeof(Data));
225     EXPECT_EQ(std::string(Data, Data + sizeof(Data)),
226               DataProv.ConsumeRemainingBytesAsString());
227     EXPECT_EQ(std::string(""), DataProv.ConsumeRemainingBytesAsString());
228   }
229 
230   {
231     FuzzedDataProvider DataProv(Data, sizeof(Data));
232     EXPECT_EQ(std::vector<uint8_t>(Data, Data + 123),
233               DataProv.ConsumeBytes<uint8_t>(123));
234     EXPECT_EQ(std::string(Data + 123, Data + sizeof(Data)),
235               DataProv.ConsumeRemainingBytesAsString());
236   }
237 }
238 
239 TEST(FuzzedDataProvider, ConsumeIntegral) {
240   FuzzedDataProvider DataProv(Data, sizeof(Data));
241   EXPECT_EQ(int32_t(-903266865), DataProv.ConsumeIntegral<int32_t>());
242   EXPECT_EQ(uint32_t(372863811), DataProv.ConsumeIntegral<uint32_t>());
243   EXPECT_EQ(uint8_t(61), DataProv.ConsumeIntegral<uint8_t>());
244   EXPECT_EQ(int16_t(22100), DataProv.ConsumeIntegral<int16_t>());
245   EXPECT_EQ(uint64_t(18252263806144500217u),
246             DataProv.ConsumeIntegral<uint64_t>());
247 
248   // Exhaust the buffer.
249   auto String = DataProv.ConsumeBytesAsString(31337);
250   EXPECT_EQ(size_t(1005), String.length());
251   EXPECT_EQ(std::numeric_limits<int64_t>::min(),
252             DataProv.ConsumeIntegral<int64_t>());
253 }
254 
255 TEST(FuzzedDataProvider, ConsumeBool) {
256   FuzzedDataProvider DataProv(Data, sizeof(Data));
257   EXPECT_EQ(false, DataProv.ConsumeBool());
258   EXPECT_EQ(true, DataProv.ConsumeBool());
259   EXPECT_EQ(true, DataProv.ConsumeBool());
260   EXPECT_EQ(true, DataProv.ConsumeBool());
261   EXPECT_EQ(false, DataProv.ConsumeBool());
262   EXPECT_EQ(true, DataProv.ConsumeBool());
263   EXPECT_EQ(true, DataProv.ConsumeBool());
264   EXPECT_EQ(true, DataProv.ConsumeBool());
265   EXPECT_EQ(true, DataProv.ConsumeBool());
266   EXPECT_EQ(false, DataProv.ConsumeBool());
267 
268   // Exhaust the buffer.
269   auto String = DataProv.ConsumeBytesAsString(31337);
270   EXPECT_EQ(size_t(1014), String.length());
271   EXPECT_EQ(false, DataProv.ConsumeBool());
272 }
273 
274 TEST(FuzzedDataProvider, PickValueInArray) {
275   FuzzedDataProvider DataProv(Data, sizeof(Data));
276   const int Array[] = {1, 2, 3, 4, 5};
277   EXPECT_EQ(5, DataProv.PickValueInArray(Array));
278   EXPECT_EQ(2, DataProv.PickValueInArray(Array));
279   EXPECT_EQ(2, DataProv.PickValueInArray(Array));
280   EXPECT_EQ(3, DataProv.PickValueInArray(Array));
281   EXPECT_EQ(3, DataProv.PickValueInArray(Array));
282   EXPECT_EQ(3, DataProv.PickValueInArray(Array));
283   EXPECT_EQ(1, DataProv.PickValueInArray(Array));
284   EXPECT_EQ(3, DataProv.PickValueInArray(Array));
285   EXPECT_EQ(2, DataProv.PickValueInArray(Array));
286 
287   EXPECT_EQ(uint8_t(0x9D), DataProv.PickValueInArray(Data));
288   EXPECT_EQ(uint8_t(0xBA), DataProv.PickValueInArray(Data));
289   EXPECT_EQ(uint8_t(0x69), DataProv.PickValueInArray(Data));
290   EXPECT_EQ(uint8_t(0xD6), DataProv.PickValueInArray(Data));
291 
292   EXPECT_EQ(uint32_t(777), DataProv.PickValueInArray<uint32_t>({1337, 777}));
293   EXPECT_EQ(uint32_t(777), DataProv.PickValueInArray<uint32_t>({1337, 777}));
294   EXPECT_EQ(uint64_t(1337), DataProv.PickValueInArray<uint64_t>({1337, 777}));
295   EXPECT_EQ(size_t(777), DataProv.PickValueInArray<size_t>({1337, 777}));
296   EXPECT_EQ(int16_t(1337), DataProv.PickValueInArray<int16_t>({1337, 777}));
297   EXPECT_EQ(int32_t(777), DataProv.PickValueInArray<int32_t>({1337, 777}));
298   EXPECT_EQ(int64_t(777), DataProv.PickValueInArray<int64_t>({1337, 777}));
299 
300   // Exhaust the buffer.
301   auto String = DataProv.ConsumeBytesAsString(31337);
302   EXPECT_EQ(size_t(1000), String.length());
303   EXPECT_EQ(uint8_t(0x8A), DataProv.PickValueInArray(Data));
304 }
305 
306 TEST(FuzzedDataProvider, ConsumeEnum) {
307   FuzzedDataProvider DataProv(Data, sizeof(Data));
308   enum class Enum {
309     Zero,
310     One,
311     Two,
312     Three,
313     Four,
314     Five,
315     Six,
316     Seven,
317     kMaxValue = Seven
318   };
319   EXPECT_EQ(Enum::Two, DataProv.ConsumeEnum<Enum>());
320   EXPECT_EQ(Enum::One, DataProv.ConsumeEnum<Enum>());
321   EXPECT_EQ(Enum::Five, DataProv.ConsumeEnum<Enum>());
322   EXPECT_EQ(Enum::Seven, DataProv.ConsumeEnum<Enum>());
323   EXPECT_EQ(Enum::Six, DataProv.ConsumeEnum<Enum>());
324   EXPECT_EQ(Enum::One, DataProv.ConsumeEnum<Enum>());
325   EXPECT_EQ(Enum::Three, DataProv.ConsumeEnum<Enum>());
326   EXPECT_EQ(Enum::Three, DataProv.ConsumeEnum<Enum>());
327   EXPECT_EQ(Enum::Five, DataProv.ConsumeEnum<Enum>());
328   EXPECT_EQ(Enum::Six, DataProv.ConsumeEnum<Enum>());
329 
330   // Exhaust the buffer.
331   auto String = DataProv.ConsumeBytesAsString(31337);
332   EXPECT_EQ(size_t(1014), String.length());
333   EXPECT_EQ(Enum::Zero, DataProv.ConsumeEnum<Enum>());
334 }
335 
336 TEST(FuzzedDataProvider, remaining_bytes) {
337   FuzzedDataProvider DataProv(Data, sizeof(Data));
338   EXPECT_EQ(size_t(1024), DataProv.remaining_bytes());
339   EXPECT_EQ(false, DataProv.ConsumeBool());
340   EXPECT_EQ(size_t(1024 - 1), DataProv.remaining_bytes());
341   EXPECT_EQ(std::vector<uint8_t>(Data, Data + 8),
342             DataProv.ConsumeBytes<uint8_t>(8));
343   EXPECT_EQ(size_t(1024 - 1 - 8), DataProv.remaining_bytes());
344 
345   // Exhaust the buffer.
346   EXPECT_EQ(std::vector<uint8_t>(Data + 8, Data + sizeof(Data) - 1),
347             DataProv.ConsumeRemainingBytes<uint8_t>());
348   EXPECT_EQ(size_t(0), DataProv.remaining_bytes());
349 }
350 
351 TEST(FuzzedDataProvider, ConsumeProbability) {
352   FuzzedDataProvider DataProv(Data, sizeof(Data));
353   ASSERT_FLOAT_EQ(float(0.28969181), DataProv.ConsumeProbability<float>());
354   ASSERT_DOUBLE_EQ(double(0.086814121166605432),
355                    DataProv.ConsumeProbability<double>());
356   ASSERT_FLOAT_EQ(float(0.30104411), DataProv.ConsumeProbability<float>());
357   ASSERT_DOUBLE_EQ(double(0.96218831486039413),
358                    DataProv.ConsumeProbability<double>());
359   ASSERT_FLOAT_EQ(float(0.67005056), DataProv.ConsumeProbability<float>());
360   ASSERT_DOUBLE_EQ(double(0.69210584173832279),
361                    DataProv.ConsumeProbability<double>());
362 
363   // Exhaust the buffer.
364   EXPECT_EQ(std::vector<uint8_t>(Data, Data + sizeof(Data) - 36),
365             DataProv.ConsumeRemainingBytes<uint8_t>());
366   ASSERT_FLOAT_EQ(float(0.0), DataProv.ConsumeProbability<float>());
367 }
368 
369 TEST(FuzzedDataProvider, ConsumeFloatingPoint) {
370   FuzzedDataProvider DataProv(Data, sizeof(Data));
371   ASSERT_FLOAT_EQ(float(-2.8546307e+38),
372                   DataProv.ConsumeFloatingPoint<float>());
373   ASSERT_DOUBLE_EQ(double(8.0940194040236032e+307),
374                    DataProv.ConsumeFloatingPoint<double>());
375   ASSERT_FLOAT_EQ(float(271.49084),
376                   DataProv.ConsumeFloatingPointInRange<float>(123.0, 777.0));
377   ASSERT_DOUBLE_EQ(double(30.859126145478349),
378                    DataProv.ConsumeFloatingPointInRange<double>(13.37, 31.337));
379   ASSERT_FLOAT_EQ(
380       float(-903.47729),
381       DataProv.ConsumeFloatingPointInRange<float>(-999.9999, -777.77));
382   ASSERT_DOUBLE_EQ(
383       double(24.561393182922771),
384       DataProv.ConsumeFloatingPointInRange<double>(-13.37, 31.337));
385   ASSERT_FLOAT_EQ(float(1.0),
386                   DataProv.ConsumeFloatingPointInRange<float>(1.0, 1.0));
387   ASSERT_DOUBLE_EQ(double(-1.0),
388                    DataProv.ConsumeFloatingPointInRange<double>(-1.0, -1.0));
389 
390   // Exhaust the buffer.
391   EXPECT_EQ((std::vector<uint8_t>(Data, Data + sizeof(Data) - 50)).size(),
392             DataProv.ConsumeRemainingBytes<uint8_t>().size());
393   ASSERT_FLOAT_EQ(float(0.0), DataProv.ConsumeProbability<float>());
394   ASSERT_NEAR(std::numeric_limits<double>::lowest(),
395               DataProv.ConsumeFloatingPoint<double>(), 1e-10);
396   ASSERT_FLOAT_EQ(float(123.0),
397                   DataProv.ConsumeFloatingPointInRange<float>(123.0, 777.0));
398   ASSERT_DOUBLE_EQ(double(-13.37), DataProv.ConsumeFloatingPointInRange<double>(
399                                        -13.37, 31.337));
400 }
401 
402 int main(int argc, char **argv) {
403   testing::InitGoogleTest(&argc, argv);
404   return RUN_ALL_TESTS();
405 }
406