[Clang][SME2] Enable multi-vector loads & stores for SME2 (#75821)
[llvm-project.git] / compiler-rt / lib / fuzzer / tests / FuzzedDataProviderUnittest.cpp
blobea6774e5a5cda654b99f52565cde00eb9268daee
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
5 #include "gtest/gtest.h"
6 #include <cstdint>
7 #include <cstdlib>
9 #include <fuzzer/FuzzedDataProvider.h>
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.
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)])"
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};
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));
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);
123 EXPECT_EQ(std::vector<signed char>(Data + 1 + 10 + 24, Data + sizeof(Data)),
124 DataProv.ConsumeBytes<signed char>(31337));
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));
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);
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));
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));
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));
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));
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 size_t Offset = 141;
194 EXPECT_EQ(std::string(Data + Offset, Data + Offset + 5),
195 DataProv.ConsumeRandomLengthString(5));
196 Offset += 5;
197 EXPECT_EQ(std::string(Data + Offset, Data + Offset + 2),
198 DataProv.ConsumeRandomLengthString(2));
199 Offset += 2;
201 // Call the overloaded method without arguments (uses max length available).
202 EXPECT_EQ(std::string(Data + Offset, Data + Offset + 664),
203 DataProv.ConsumeRandomLengthString());
204 Offset += 664 + 2; // +2 because of '\' character followed by any other byte.
206 EXPECT_EQ(std::string(Data + Offset, Data + Offset + 92),
207 DataProv.ConsumeRandomLengthString());
208 Offset += 92 + 2;
210 // Exhaust the buffer.
211 auto String = DataProv.ConsumeBytesAsString(31337);
212 EXPECT_EQ(size_t(116), String.length());
213 EXPECT_EQ(std::string(), DataProv.ConsumeRandomLengthString(1));
216 TEST(FuzzedDataProvider, ConsumeRemainingBytes) {
218 FuzzedDataProvider DataProv(Data, sizeof(Data));
219 EXPECT_EQ(std::vector<uint8_t>(Data, Data + sizeof(Data)),
220 DataProv.ConsumeRemainingBytes<uint8_t>());
221 EXPECT_EQ(std::vector<uint8_t>(),
222 DataProv.ConsumeRemainingBytes<uint8_t>());
226 FuzzedDataProvider DataProv(Data, sizeof(Data));
227 EXPECT_EQ(std::vector<uint8_t>(Data, Data + 123),
228 DataProv.ConsumeBytes<uint8_t>(123));
229 EXPECT_EQ(std::vector<char>(Data + 123, Data + sizeof(Data)),
230 DataProv.ConsumeRemainingBytes<char>());
234 TEST(FuzzedDataProvider, ConsumeRemainingBytesAsString) {
236 FuzzedDataProvider DataProv(Data, sizeof(Data));
237 EXPECT_EQ(std::string(Data, Data + sizeof(Data)),
238 DataProv.ConsumeRemainingBytesAsString());
239 EXPECT_EQ(std::string(""), DataProv.ConsumeRemainingBytesAsString());
243 FuzzedDataProvider DataProv(Data, sizeof(Data));
244 EXPECT_EQ(std::vector<uint8_t>(Data, Data + 123),
245 DataProv.ConsumeBytes<uint8_t>(123));
246 EXPECT_EQ(std::string(Data + 123, Data + sizeof(Data)),
247 DataProv.ConsumeRemainingBytesAsString());
251 TEST(FuzzedDataProvider, ConsumeIntegral) {
252 FuzzedDataProvider DataProv(Data, sizeof(Data));
253 EXPECT_EQ(int32_t(-903266865), DataProv.ConsumeIntegral<int32_t>());
254 EXPECT_EQ(uint32_t(372863811), DataProv.ConsumeIntegral<uint32_t>());
255 EXPECT_EQ(uint8_t(61), DataProv.ConsumeIntegral<uint8_t>());
256 EXPECT_EQ(int16_t(22100), DataProv.ConsumeIntegral<int16_t>());
257 EXPECT_EQ(uint64_t(18252263806144500217u),
258 DataProv.ConsumeIntegral<uint64_t>());
260 // Exhaust the buffer.
261 auto String = DataProv.ConsumeBytesAsString(31337);
262 EXPECT_EQ(size_t(1005), String.length());
263 EXPECT_EQ(std::numeric_limits<int64_t>::min(),
264 DataProv.ConsumeIntegral<int64_t>());
267 TEST(FuzzedDataProvider, ConsumeBool) {
268 FuzzedDataProvider DataProv(Data, sizeof(Data));
269 EXPECT_EQ(false, DataProv.ConsumeBool());
270 EXPECT_EQ(true, DataProv.ConsumeBool());
271 EXPECT_EQ(true, DataProv.ConsumeBool());
272 EXPECT_EQ(true, DataProv.ConsumeBool());
273 EXPECT_EQ(false, DataProv.ConsumeBool());
274 EXPECT_EQ(true, DataProv.ConsumeBool());
275 EXPECT_EQ(true, DataProv.ConsumeBool());
276 EXPECT_EQ(true, DataProv.ConsumeBool());
277 EXPECT_EQ(true, DataProv.ConsumeBool());
278 EXPECT_EQ(false, DataProv.ConsumeBool());
280 // Exhaust the buffer.
281 auto String = DataProv.ConsumeBytesAsString(31337);
282 EXPECT_EQ(size_t(1014), String.length());
283 EXPECT_EQ(false, DataProv.ConsumeBool());
286 TEST(FuzzedDataProvider, PickValueInStdArray) {
287 FuzzedDataProvider DataProv(Data, sizeof(Data));
288 const std::array<int, 5> Array = {1, 2, 3, 4, 5};
289 EXPECT_EQ(5, DataProv.PickValueInArray(Array));
290 EXPECT_EQ(2, DataProv.PickValueInArray(Array));
291 EXPECT_EQ(2, DataProv.PickValueInArray(Array));
292 EXPECT_EQ(3, DataProv.PickValueInArray(Array));
293 EXPECT_EQ(3, DataProv.PickValueInArray(Array));
294 EXPECT_EQ(3, DataProv.PickValueInArray(Array));
295 EXPECT_EQ(1, DataProv.PickValueInArray(Array));
296 EXPECT_EQ(3, DataProv.PickValueInArray(Array));
297 EXPECT_EQ(2, DataProv.PickValueInArray(Array));
300 TEST(FuzzedDataProvider, PickValueInArray) {
301 FuzzedDataProvider DataProv(Data, sizeof(Data));
302 const int Array[] = {1, 2, 3, 4, 5};
303 EXPECT_EQ(5, DataProv.PickValueInArray(Array));
304 EXPECT_EQ(2, DataProv.PickValueInArray(Array));
305 EXPECT_EQ(2, DataProv.PickValueInArray(Array));
306 EXPECT_EQ(3, DataProv.PickValueInArray(Array));
307 EXPECT_EQ(3, DataProv.PickValueInArray(Array));
308 EXPECT_EQ(3, DataProv.PickValueInArray(Array));
309 EXPECT_EQ(1, DataProv.PickValueInArray(Array));
310 EXPECT_EQ(3, DataProv.PickValueInArray(Array));
311 EXPECT_EQ(2, DataProv.PickValueInArray(Array));
313 EXPECT_EQ(uint8_t(0x9D), DataProv.PickValueInArray(Data));
314 EXPECT_EQ(uint8_t(0xBA), DataProv.PickValueInArray(Data));
315 EXPECT_EQ(uint8_t(0x69), DataProv.PickValueInArray(Data));
316 EXPECT_EQ(uint8_t(0xD6), DataProv.PickValueInArray(Data));
318 EXPECT_EQ(uint32_t(777), DataProv.PickValueInArray<uint32_t>({1337, 777}));
319 EXPECT_EQ(uint32_t(777), DataProv.PickValueInArray<uint32_t>({1337, 777}));
320 EXPECT_EQ(uint64_t(1337), DataProv.PickValueInArray<uint64_t>({1337, 777}));
321 EXPECT_EQ(size_t(777), DataProv.PickValueInArray<size_t>({1337, 777}));
322 EXPECT_EQ(int16_t(1337), DataProv.PickValueInArray<int16_t>({1337, 777}));
323 EXPECT_EQ(int32_t(777), DataProv.PickValueInArray<int32_t>({1337, 777}));
324 EXPECT_EQ(int64_t(777), DataProv.PickValueInArray<int64_t>({1337, 777}));
326 // Exhaust the buffer.
327 auto String = DataProv.ConsumeBytesAsString(31337);
328 EXPECT_EQ(size_t(1000), String.length());
329 EXPECT_EQ(uint8_t(0x8A), DataProv.PickValueInArray(Data));
332 TEST(FuzzedDataProvider, ConsumeEnum) {
333 FuzzedDataProvider DataProv(Data, sizeof(Data));
334 enum class Enum {
335 Zero,
336 One,
337 Two,
338 Three,
339 Four,
340 Five,
341 Six,
342 Seven,
343 kMaxValue = Seven
345 EXPECT_EQ(Enum::Two, DataProv.ConsumeEnum<Enum>());
346 EXPECT_EQ(Enum::One, DataProv.ConsumeEnum<Enum>());
347 EXPECT_EQ(Enum::Five, DataProv.ConsumeEnum<Enum>());
348 EXPECT_EQ(Enum::Seven, DataProv.ConsumeEnum<Enum>());
349 EXPECT_EQ(Enum::Six, DataProv.ConsumeEnum<Enum>());
350 EXPECT_EQ(Enum::One, DataProv.ConsumeEnum<Enum>());
351 EXPECT_EQ(Enum::Three, DataProv.ConsumeEnum<Enum>());
352 EXPECT_EQ(Enum::Three, DataProv.ConsumeEnum<Enum>());
353 EXPECT_EQ(Enum::Five, DataProv.ConsumeEnum<Enum>());
354 EXPECT_EQ(Enum::Six, DataProv.ConsumeEnum<Enum>());
356 // Exhaust the buffer.
357 auto String = DataProv.ConsumeBytesAsString(31337);
358 EXPECT_EQ(size_t(1014), String.length());
359 EXPECT_EQ(Enum::Zero, DataProv.ConsumeEnum<Enum>());
362 TEST(FuzzedDataProvider, remaining_bytes) {
363 FuzzedDataProvider DataProv(Data, sizeof(Data));
364 EXPECT_EQ(size_t(1024), DataProv.remaining_bytes());
365 EXPECT_EQ(false, DataProv.ConsumeBool());
366 EXPECT_EQ(size_t(1024 - 1), DataProv.remaining_bytes());
367 EXPECT_EQ(std::vector<uint8_t>(Data, Data + 8),
368 DataProv.ConsumeBytes<uint8_t>(8));
369 EXPECT_EQ(size_t(1024 - 1 - 8), DataProv.remaining_bytes());
371 // Exhaust the buffer.
372 EXPECT_EQ(std::vector<uint8_t>(Data + 8, Data + sizeof(Data) - 1),
373 DataProv.ConsumeRemainingBytes<uint8_t>());
374 EXPECT_EQ(size_t(0), DataProv.remaining_bytes());
377 TEST(FuzzedDataProvider, ConsumeProbability) {
378 FuzzedDataProvider DataProv(Data, sizeof(Data));
379 ASSERT_FLOAT_EQ(float(0.28969181), DataProv.ConsumeProbability<float>());
380 ASSERT_DOUBLE_EQ(double(0.086814121166605432),
381 DataProv.ConsumeProbability<double>());
382 ASSERT_FLOAT_EQ(float(0.30104411), DataProv.ConsumeProbability<float>());
383 ASSERT_DOUBLE_EQ(double(0.96218831486039413),
384 DataProv.ConsumeProbability<double>());
385 ASSERT_FLOAT_EQ(float(0.67005056), DataProv.ConsumeProbability<float>());
386 ASSERT_DOUBLE_EQ(double(0.69210584173832279),
387 DataProv.ConsumeProbability<double>());
389 // Exhaust the buffer.
390 EXPECT_EQ(std::vector<uint8_t>(Data, Data + sizeof(Data) - 36),
391 DataProv.ConsumeRemainingBytes<uint8_t>());
392 ASSERT_FLOAT_EQ(float(0.0), DataProv.ConsumeProbability<float>());
395 TEST(FuzzedDataProvider, ConsumeFloatingPoint) {
396 FuzzedDataProvider DataProv(Data, sizeof(Data));
397 ASSERT_FLOAT_EQ(float(-2.8546307e+38),
398 DataProv.ConsumeFloatingPoint<float>());
399 ASSERT_DOUBLE_EQ(double(8.0940194040236032e+307),
400 DataProv.ConsumeFloatingPoint<double>());
401 ASSERT_FLOAT_EQ(float(271.49084),
402 DataProv.ConsumeFloatingPointInRange<float>(123.0, 777.0));
403 ASSERT_DOUBLE_EQ(double(30.859126145478349),
404 DataProv.ConsumeFloatingPointInRange<double>(13.37, 31.337));
405 ASSERT_FLOAT_EQ(
406 float(-903.47729),
407 DataProv.ConsumeFloatingPointInRange<float>(-999.9999, -777.77));
408 ASSERT_DOUBLE_EQ(
409 double(24.561393182922771),
410 DataProv.ConsumeFloatingPointInRange<double>(-13.37, 31.337));
411 ASSERT_FLOAT_EQ(float(1.0),
412 DataProv.ConsumeFloatingPointInRange<float>(1.0, 1.0));
413 ASSERT_DOUBLE_EQ(double(-1.0),
414 DataProv.ConsumeFloatingPointInRange<double>(-1.0, -1.0));
416 // Exhaust the buffer.
417 EXPECT_EQ((std::vector<uint8_t>(Data, Data + sizeof(Data) - 50)).size(),
418 DataProv.ConsumeRemainingBytes<uint8_t>().size());
419 ASSERT_FLOAT_EQ(float(0.0), DataProv.ConsumeProbability<float>());
420 ASSERT_NEAR(std::numeric_limits<double>::lowest(),
421 DataProv.ConsumeFloatingPoint<double>(), 1e-10);
422 ASSERT_FLOAT_EQ(float(123.0),
423 DataProv.ConsumeFloatingPointInRange<float>(123.0, 777.0));
424 ASSERT_DOUBLE_EQ(double(-13.37), DataProv.ConsumeFloatingPointInRange<double>(
425 -13.37, 31.337));
428 TEST(FuzzedDataProvider, ConsumeData) {
429 FuzzedDataProvider DataProv(Data, sizeof(Data));
430 uint8_t Buffer[10] = {};
431 EXPECT_EQ(sizeof(Buffer), DataProv.ConsumeData(Buffer, sizeof(Buffer)));
432 std::vector<uint8_t> Expected(Data, Data + sizeof(Buffer));
433 EXPECT_EQ(Expected, std::vector<uint8_t>(Buffer, Buffer + sizeof(Buffer)));
435 EXPECT_EQ(size_t(2), DataProv.ConsumeData(Buffer, 2));
436 Expected[0] = Data[sizeof(Buffer)];
437 Expected[1] = Data[sizeof(Buffer) + 1];
438 EXPECT_EQ(Expected, std::vector<uint8_t>(Buffer, Buffer + sizeof(Buffer)));
440 // Exhaust the buffer.
441 EXPECT_EQ(std::vector<uint8_t>(Data + 12, Data + sizeof(Data)),
442 DataProv.ConsumeRemainingBytes<uint8_t>());
443 EXPECT_EQ(size_t(0), DataProv.ConsumeData(Buffer, sizeof(Buffer)));
444 EXPECT_EQ(Expected, std::vector<uint8_t>(Buffer, Buffer + sizeof(Buffer)));
447 int main(int argc, char **argv) {
448 testing::InitGoogleTest(&argc, argv);
449 return RUN_ALL_TESTS();