110ed6818SMax Moroz // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
210ed6818SMax Moroz // See https://llvm.org/LICENSE.txt for license information.
310ed6818SMax Moroz // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
410ed6818SMax Moroz 
510ed6818SMax Moroz #include "gtest/gtest.h"
610ed6818SMax Moroz #include <cstdint>
710ed6818SMax Moroz #include <cstdlib>
810ed6818SMax Moroz 
9df3b465cSMax Moroz #include <fuzzer/FuzzedDataProvider.h>
1010ed6818SMax Moroz 
1110ed6818SMax Moroz // The test is intentionally extensive, as behavior of |FuzzedDataProvider| must
1210ed6818SMax Moroz // not be broken, given than many fuzz targets depend on it. Changing the
1310ed6818SMax Moroz // behavior might invalidate existing corpora and make the fuzz targets using
1410ed6818SMax Moroz // |FuzzedDataProvider| to lose code coverage accumulated over time.
1510ed6818SMax Moroz 
1610ed6818SMax Moroz /* A random 1KB buffer generated by:
1710ed6818SMax Moroz $ python -c "import os; print ',\n'.join([', '.join(['0x%02X' % ord(i) for i \
1810ed6818SMax Moroz       in list(os.urandom(8))]) for _ in xrange(128)])"
1910ed6818SMax Moroz */
2010ed6818SMax Moroz const uint8_t Data[] = {
2110ed6818SMax Moroz     0x8A, 0x19, 0x0D, 0x44, 0x37, 0x0D, 0x38, 0x5E, 0x9B, 0xAA, 0xF3, 0xDA,
2210ed6818SMax Moroz     0xAA, 0x88, 0xF2, 0x9B, 0x6C, 0xBA, 0xBE, 0xB1, 0xF2, 0xCF, 0x13, 0xB8,
2310ed6818SMax Moroz     0xAC, 0x1A, 0x7F, 0x1C, 0xC9, 0x90, 0xD0, 0xD9, 0x5C, 0x42, 0xB3, 0xFD,
2410ed6818SMax Moroz     0xE3, 0x05, 0xA4, 0x03, 0x37, 0x49, 0x50, 0x4B, 0xBC, 0x39, 0xA2, 0x09,
2510ed6818SMax Moroz     0x6C, 0x2F, 0xAF, 0xD1, 0xB5, 0x47, 0xBF, 0x92, 0xBD, 0x79, 0xE5, 0xC5,
2610ed6818SMax Moroz     0x6E, 0x51, 0xA4, 0xED, 0xE9, 0xBD, 0x40, 0x4A, 0xFC, 0x25, 0x7A, 0x27,
2710ed6818SMax Moroz     0xC8, 0x92, 0xF7, 0x30, 0xDE, 0x40, 0x66, 0x66, 0xE8, 0x5F, 0x65, 0x39,
2810ed6818SMax Moroz     0x7E, 0x9E, 0x80, 0x2B, 0x01, 0x71, 0x2A, 0xFF, 0xD3, 0x0A, 0xAC, 0x6E,
2910ed6818SMax Moroz     0x49, 0x32, 0x79, 0x10, 0x6A, 0x6F, 0x97, 0x96, 0x70, 0x7E, 0x50, 0x65,
3010ed6818SMax Moroz     0xC9, 0x1D, 0xBD, 0x4E, 0x17, 0x04, 0x1E, 0xBA, 0x26, 0xAC, 0x1F, 0xE3,
3110ed6818SMax Moroz     0x37, 0x1C, 0x15, 0x43, 0x60, 0x41, 0x2A, 0x7C, 0xCA, 0x70, 0xCE, 0xAB,
3210ed6818SMax Moroz     0x20, 0x24, 0xF8, 0xD9, 0x1F, 0x14, 0x7C, 0x5C, 0xDD, 0x6F, 0xB3, 0xD7,
3310ed6818SMax Moroz     0x8B, 0x63, 0x10, 0xB7, 0xDA, 0x99, 0xAF, 0x99, 0x01, 0x21, 0xE6, 0xE1,
3410ed6818SMax Moroz     0x86, 0x27, 0xBE, 0x8D, 0xDF, 0x1E, 0xEA, 0x80, 0x0B, 0x8A, 0x60, 0xC3,
3510ed6818SMax Moroz     0x3A, 0x85, 0x33, 0x53, 0x59, 0xE1, 0xB5, 0xF1, 0x62, 0xA6, 0x7B, 0x24,
3610ed6818SMax Moroz     0x94, 0xE3, 0x8C, 0x10, 0x93, 0xF8, 0x6E, 0xC2, 0x00, 0x91, 0x90, 0x0B,
3710ed6818SMax Moroz     0x5D, 0x52, 0x4F, 0x21, 0xE3, 0x40, 0x3A, 0x6E, 0xB6, 0x32, 0x15, 0xDB,
3810ed6818SMax Moroz     0x5D, 0x01, 0x86, 0x63, 0x83, 0x24, 0xC5, 0xDE, 0xAB, 0x31, 0x84, 0xAA,
3910ed6818SMax Moroz     0xE5, 0x64, 0x02, 0x8D, 0x23, 0x82, 0x86, 0x14, 0x16, 0x18, 0x9F, 0x3D,
4010ed6818SMax Moroz     0x31, 0xBE, 0x3B, 0xF0, 0x6C, 0x26, 0x42, 0x9A, 0x67, 0xFE, 0x28, 0xEC,
4110ed6818SMax Moroz     0x28, 0xDB, 0x01, 0xB4, 0x52, 0x41, 0x81, 0x7C, 0x54, 0xD3, 0xC8, 0x00,
4210ed6818SMax Moroz     0x01, 0x66, 0xB0, 0x2C, 0x3F, 0xBC, 0xAF, 0xAC, 0x87, 0xCD, 0x83, 0xCF,
4310ed6818SMax Moroz     0x23, 0xFC, 0xC8, 0x97, 0x8C, 0x71, 0x32, 0x8B, 0xBF, 0x70, 0xC0, 0x48,
4410ed6818SMax Moroz     0x31, 0x92, 0x18, 0xFE, 0xE5, 0x33, 0x48, 0x82, 0x98, 0x1E, 0x30, 0xCC,
4510ed6818SMax Moroz     0xAD, 0x5D, 0x97, 0xC4, 0xB4, 0x39, 0x7C, 0xCD, 0x39, 0x44, 0xF1, 0xA9,
4610ed6818SMax Moroz     0xD0, 0xF4, 0x27, 0xB7, 0x78, 0x85, 0x9E, 0x72, 0xFC, 0xCC, 0xEE, 0x98,
4710ed6818SMax Moroz     0x25, 0x3B, 0x69, 0x6B, 0x0C, 0x11, 0xEA, 0x22, 0xB6, 0xD0, 0xCD, 0xBF,
4810ed6818SMax Moroz     0x6D, 0xBE, 0x12, 0xDE, 0xFE, 0x78, 0x2E, 0x54, 0xCB, 0xBA, 0xD7, 0x2E,
4910ed6818SMax Moroz     0x54, 0x25, 0x14, 0x84, 0xFE, 0x1A, 0x10, 0xCE, 0xCC, 0x20, 0xE6, 0xE2,
5010ed6818SMax Moroz     0x7F, 0xE0, 0x5F, 0xDB, 0xA7, 0xF3, 0xE2, 0x4C, 0x52, 0x82, 0xFC, 0x0B,
5110ed6818SMax Moroz     0xA0, 0xBD, 0x34, 0x21, 0xF7, 0xEB, 0x1C, 0x5B, 0x67, 0xD0, 0xAF, 0x22,
5210ed6818SMax Moroz     0x15, 0xA1, 0xFF, 0xC2, 0x68, 0x25, 0x5B, 0xB2, 0x13, 0x3F, 0xFF, 0x98,
5310ed6818SMax Moroz     0x53, 0x25, 0xC5, 0x58, 0x39, 0xD0, 0x43, 0x86, 0x6C, 0x5B, 0x57, 0x8E,
5410ed6818SMax Moroz     0x83, 0xBA, 0xB9, 0x09, 0x09, 0x14, 0x0C, 0x9E, 0x99, 0x83, 0x88, 0x53,
5510ed6818SMax Moroz     0x79, 0xFD, 0xF7, 0x49, 0xE9, 0x2C, 0xCE, 0xE6, 0x7B, 0xF5, 0xC2, 0x27,
5610ed6818SMax Moroz     0x5E, 0x56, 0xB5, 0xB4, 0x46, 0x90, 0x91, 0x7F, 0x99, 0x88, 0xA7, 0x23,
5710ed6818SMax Moroz     0xC1, 0x80, 0xB8, 0x2D, 0xCD, 0xF7, 0x6F, 0x9A, 0xEC, 0xBD, 0x16, 0x9F,
5810ed6818SMax Moroz     0x7D, 0x87, 0x1E, 0x15, 0x51, 0xC4, 0x96, 0xE2, 0xBF, 0x61, 0x66, 0xB5,
5910ed6818SMax Moroz     0xFD, 0x01, 0x67, 0xD6, 0xFF, 0xD2, 0x14, 0x20, 0x98, 0x8E, 0xEF, 0xF3,
6010ed6818SMax Moroz     0x22, 0xDB, 0x7E, 0xCE, 0x70, 0x2D, 0x4C, 0x06, 0x5A, 0xA0, 0x4F, 0xC8,
6110ed6818SMax Moroz     0xB0, 0x4D, 0xA6, 0x52, 0xB2, 0xD6, 0x2F, 0xD8, 0x57, 0xE5, 0xEF, 0xF9,
6210ed6818SMax Moroz     0xEE, 0x52, 0x0F, 0xEC, 0xC4, 0x90, 0x33, 0xAD, 0x25, 0xDA, 0xCD, 0x12,
6310ed6818SMax Moroz     0x44, 0x5F, 0x32, 0xF6, 0x6F, 0xEF, 0x85, 0xB8, 0xDC, 0x3C, 0x01, 0x48,
6410ed6818SMax Moroz     0x28, 0x5D, 0x2D, 0x9C, 0x9B, 0xC0, 0x49, 0x36, 0x1E, 0x6A, 0x0A, 0x0C,
6510ed6818SMax Moroz     0xB0, 0x6E, 0x81, 0x89, 0xCB, 0x0A, 0x89, 0xCF, 0x73, 0xC6, 0x63, 0x3D,
6610ed6818SMax Moroz     0x8E, 0x13, 0x57, 0x91, 0x4E, 0xA3, 0x93, 0x8C, 0x61, 0x67, 0xFD, 0x13,
6710ed6818SMax Moroz     0xE0, 0x14, 0x72, 0xB3, 0xE4, 0x23, 0x45, 0x08, 0x4E, 0x4E, 0xF5, 0xA7,
6810ed6818SMax Moroz     0xA8, 0xEE, 0x30, 0xFD, 0x81, 0x80, 0x1F, 0xF3, 0x4F, 0xD7, 0xE7, 0xF2,
6910ed6818SMax Moroz     0x16, 0xC0, 0xD6, 0x15, 0x6A, 0x0F, 0x89, 0x15, 0xA9, 0xCF, 0x35, 0x50,
7010ed6818SMax Moroz     0x6B, 0x49, 0x3E, 0x12, 0x4A, 0x72, 0xE4, 0x59, 0x9D, 0xD7, 0xDB, 0xD2,
7110ed6818SMax Moroz     0xD1, 0x61, 0x7D, 0x52, 0x4A, 0x36, 0xF6, 0xBA, 0x0E, 0xFA, 0x88, 0x6F,
7210ed6818SMax Moroz     0x3C, 0x82, 0x16, 0xF0, 0xD5, 0xED, 0x4D, 0x78, 0xEF, 0x38, 0x17, 0x90,
7310ed6818SMax Moroz     0xEA, 0x28, 0x32, 0xA9, 0x79, 0x40, 0xFF, 0xAA, 0xE6, 0xF5, 0xC7, 0x96,
7410ed6818SMax Moroz     0x56, 0x65, 0x61, 0x83, 0x3D, 0xBD, 0xD7, 0xED, 0xD6, 0xB6, 0xC0, 0xED,
7510ed6818SMax Moroz     0x34, 0xAA, 0x60, 0xA9, 0xE8, 0x82, 0x78, 0xEA, 0x69, 0xF6, 0x47, 0xAF,
7610ed6818SMax Moroz     0x39, 0xAB, 0x11, 0xDB, 0xE9, 0xFB, 0x68, 0x0C, 0xFE, 0xDF, 0x97, 0x9F,
7710ed6818SMax Moroz     0x3A, 0xF4, 0xF3, 0x32, 0x27, 0x30, 0x57, 0x0E, 0xF7, 0xB2, 0xEE, 0xFB,
7810ed6818SMax Moroz     0x1E, 0x98, 0xA8, 0xA3, 0x25, 0x45, 0xE4, 0x6D, 0x2D, 0xAE, 0xFE, 0xDA,
7910ed6818SMax Moroz     0xB3, 0x32, 0x9B, 0x5D, 0xF5, 0x32, 0x74, 0xEA, 0xE5, 0x02, 0x30, 0x53,
8010ed6818SMax Moroz     0x95, 0x13, 0x7A, 0x23, 0x1F, 0x10, 0x30, 0xEA, 0x78, 0xE4, 0x36, 0x1D,
8110ed6818SMax Moroz     0x92, 0x96, 0xB9, 0x91, 0x2D, 0xFA, 0x43, 0xAB, 0xE6, 0xEF, 0x14, 0x14,
8210ed6818SMax Moroz     0xC9, 0xBC, 0x46, 0xC6, 0x05, 0x7C, 0xC6, 0x11, 0x23, 0xCF, 0x3D, 0xC8,
8310ed6818SMax Moroz     0xBE, 0xEC, 0xA3, 0x58, 0x31, 0x55, 0x65, 0x14, 0xA7, 0x94, 0x93, 0xDD,
8410ed6818SMax Moroz     0x2D, 0x76, 0xC9, 0x66, 0x06, 0xBD, 0xF5, 0xE7, 0x30, 0x65, 0x42, 0x52,
8510ed6818SMax Moroz     0xA2, 0x50, 0x9B, 0xE6, 0x40, 0xA2, 0x4B, 0xEC, 0xA6, 0xB7, 0x39, 0xAA,
8610ed6818SMax Moroz     0xD7, 0x61, 0x2C, 0xBF, 0x37, 0x5A, 0xDA, 0xB3, 0x5D, 0x2F, 0x5D, 0x11,
8710ed6818SMax Moroz     0x82, 0x97, 0x32, 0x8A, 0xC1, 0xA1, 0x13, 0x20, 0x17, 0xBD, 0xA2, 0x91,
8810ed6818SMax Moroz     0x94, 0x2A, 0x4E, 0xBE, 0x3E, 0x77, 0x63, 0x67, 0x5C, 0x0A, 0xE1, 0x22,
8910ed6818SMax Moroz     0x0A, 0x4F, 0x63, 0xE2, 0x84, 0xE9, 0x9F, 0x14, 0x86, 0xE2, 0x4B, 0x20,
9010ed6818SMax Moroz     0x9F, 0x50, 0xB3, 0x56, 0xED, 0xDE, 0x39, 0xD8, 0x75, 0x64, 0x45, 0x54,
9110ed6818SMax Moroz     0xE5, 0x34, 0x57, 0x8C, 0x3B, 0xF2, 0x0E, 0x94, 0x1B, 0x10, 0xA2, 0xA2,
9210ed6818SMax Moroz     0x38, 0x76, 0x21, 0x8E, 0x2A, 0x57, 0x64, 0x58, 0x0A, 0x27, 0x6D, 0x4C,
9310ed6818SMax Moroz     0xD0, 0xB5, 0xC1, 0xFC, 0x75, 0xD0, 0x01, 0x86, 0x66, 0xA8, 0xF1, 0x98,
9410ed6818SMax Moroz     0x58, 0xFB, 0xFC, 0x64, 0xD2, 0x31, 0x77, 0xAD, 0x0E, 0x46, 0x87, 0xCC,
9510ed6818SMax Moroz     0x9B, 0x86, 0x90, 0xFF, 0xB6, 0x64, 0x35, 0xA5, 0x5D, 0x9E, 0x44, 0x51,
9610ed6818SMax Moroz     0x87, 0x9E, 0x1E, 0xEE, 0xF3, 0x3B, 0x5C, 0xDD, 0x94, 0x03, 0xAA, 0x18,
9710ed6818SMax Moroz     0x2C, 0xB7, 0xC4, 0x37, 0xD5, 0x53, 0x28, 0x60, 0xEF, 0x77, 0xEF, 0x3B,
9810ed6818SMax Moroz     0x9E, 0xD2, 0xCE, 0xE9, 0x53, 0x2D, 0xF5, 0x19, 0x7E, 0xBB, 0xB5, 0x46,
9910ed6818SMax Moroz     0xE2, 0xF7, 0xD6, 0x4D, 0x6D, 0x5B, 0x81, 0x56, 0x6B, 0x12, 0x55, 0x63,
10010ed6818SMax Moroz     0xC3, 0xAB, 0x08, 0xBB, 0x2E, 0xD5, 0x11, 0xBC, 0x18, 0xCB, 0x8B, 0x12,
10110ed6818SMax Moroz     0x2E, 0x3E, 0x75, 0x32, 0x98, 0x8A, 0xDE, 0x3C, 0xEA, 0x33, 0x46, 0xE7,
10210ed6818SMax Moroz     0x7A, 0xA5, 0x12, 0x09, 0x26, 0x7E, 0x7E, 0x03, 0x4F, 0xFD, 0xC0, 0xFD,
10310ed6818SMax Moroz     0xEA, 0x4F, 0x83, 0x85, 0x39, 0x62, 0xFB, 0xA2, 0x33, 0xD9, 0x2D, 0xB1,
10410ed6818SMax Moroz     0x30, 0x6F, 0x88, 0xAB, 0x61, 0xCB, 0x32, 0xEB, 0x30, 0xF9, 0x51, 0xF6,
10510ed6818SMax Moroz     0x1F, 0x3A, 0x11, 0x4D, 0xFD, 0x54, 0xD6, 0x3D, 0x43, 0x73, 0x39, 0x16,
10610ed6818SMax Moroz     0xCF, 0x3D, 0x29, 0x4A};
10710ed6818SMax Moroz 
TEST(FuzzedDataProvider,ConsumeBytes)10810ed6818SMax Moroz TEST(FuzzedDataProvider, ConsumeBytes) {
10910ed6818SMax Moroz   FuzzedDataProvider DataProv(Data, sizeof(Data));
110a0eb49c2SMax Moroz   EXPECT_EQ(std::vector<unsigned char>(1, 0x8A),
111a0eb49c2SMax Moroz             DataProv.ConsumeBytes<unsigned char>(1));
11210ed6818SMax Moroz   EXPECT_EQ(std::vector<uint8_t>(
11310ed6818SMax Moroz                 {0x19, 0x0D, 0x44, 0x37, 0x0D, 0x38, 0x5E, 0x9B, 0xAA, 0xF3}),
11410ed6818SMax Moroz             DataProv.ConsumeBytes<uint8_t>(10));
11510ed6818SMax Moroz 
116a0eb49c2SMax Moroz   std::vector<unsigned char> UChars = DataProv.ConsumeBytes<unsigned char>(24);
11710ed6818SMax Moroz   EXPECT_EQ(std::vector<unsigned char>({0xDA, 0xAA, 0x88, 0xF2, 0x9B, 0x6C,
11810ed6818SMax Moroz                                         0xBA, 0xBE, 0xB1, 0xF2, 0xCF, 0x13,
11910ed6818SMax Moroz                                         0xB8, 0xAC, 0x1A, 0x7F, 0x1C, 0xC9,
12010ed6818SMax Moroz                                         0x90, 0xD0, 0xD9, 0x5C, 0x42, 0xB3}),
12110ed6818SMax Moroz             UChars);
12210ed6818SMax Moroz 
12310ed6818SMax Moroz   EXPECT_EQ(std::vector<signed char>(Data + 1 + 10 + 24, Data + sizeof(Data)),
12410ed6818SMax Moroz             DataProv.ConsumeBytes<signed char>(31337));
12510ed6818SMax Moroz }
12610ed6818SMax Moroz 
TEST(FuzzedDataProvider,ConsumeBytesWithTerminator)127a0eb49c2SMax Moroz TEST(FuzzedDataProvider, ConsumeBytesWithTerminator) {
128a0eb49c2SMax Moroz   FuzzedDataProvider DataProv(Data, sizeof(Data));
129a0eb49c2SMax Moroz   EXPECT_EQ(std::vector<unsigned char>({0x8A, 0x00}),
130a0eb49c2SMax Moroz             DataProv.ConsumeBytesWithTerminator<unsigned char>(1));
131a0eb49c2SMax Moroz   EXPECT_EQ(std::vector<uint8_t>({0x19, 0x0D, 0x44, 0x37, 0x0D, 0x38, 0x5E,
132a0eb49c2SMax Moroz                                   0x9B, 0xAA, 0xF3, 111}),
133a0eb49c2SMax Moroz             DataProv.ConsumeBytesWithTerminator<uint8_t>(10, 111));
134a0eb49c2SMax Moroz 
135a0eb49c2SMax Moroz   std::vector<unsigned char> UChars =
136a0eb49c2SMax Moroz       DataProv.ConsumeBytesWithTerminator<unsigned char>(24);
137a0eb49c2SMax Moroz   EXPECT_EQ(std::vector<unsigned char>(
138a0eb49c2SMax Moroz                 {0xDA, 0xAA, 0x88, 0xF2, 0x9B, 0x6C, 0xBA, 0xBE, 0xB1,
139a0eb49c2SMax Moroz                  0xF2, 0xCF, 0x13, 0xB8, 0xAC, 0x1A, 0x7F, 0x1C, 0xC9,
140a0eb49c2SMax Moroz                  0x90, 0xD0, 0xD9, 0x5C, 0x42, 0xB3, 0x00}),
141a0eb49c2SMax Moroz             UChars);
142a0eb49c2SMax Moroz 
143a0eb49c2SMax Moroz   std::vector<signed char> Expected(Data + 1 + 10 + 24, Data + sizeof(Data));
144a0eb49c2SMax Moroz   Expected.push_back(65);
145a0eb49c2SMax Moroz   EXPECT_EQ(Expected,
146a0eb49c2SMax Moroz             DataProv.ConsumeBytesWithTerminator<signed char>(31337, 65));
147a0eb49c2SMax Moroz }
148a0eb49c2SMax Moroz 
TEST(FuzzedDataProvider,ConsumeBytesAsString)14910ed6818SMax Moroz TEST(FuzzedDataProvider, ConsumeBytesAsString) {
15010ed6818SMax Moroz   FuzzedDataProvider DataProv(Data, sizeof(Data));
15110ed6818SMax Moroz   EXPECT_EQ(std::string("\x8A\x19\x0D\x44\x37\x0D\x38\x5E\x9B\xAA\xF3\xDA"),
15210ed6818SMax Moroz             DataProv.ConsumeBytesAsString(12));
15310ed6818SMax Moroz   EXPECT_EQ(std::string(Data + 12, Data + sizeof(Data)),
15410ed6818SMax Moroz             DataProv.ConsumeBytesAsString(31337));
15510ed6818SMax Moroz }
15610ed6818SMax Moroz 
TEST(FuzzedDataProvider,ConsumeIntegralInRange)15710ed6818SMax Moroz TEST(FuzzedDataProvider, ConsumeIntegralInRange) {
15810ed6818SMax Moroz   FuzzedDataProvider DataProv(Data, sizeof(Data));
15910ed6818SMax Moroz   EXPECT_EQ(int32_t(21), DataProv.ConsumeIntegralInRange<int32_t>(10, 30));
16010ed6818SMax Moroz   EXPECT_EQ(int32_t(1337),
16110ed6818SMax Moroz             DataProv.ConsumeIntegralInRange<int32_t>(1337, 1337));
16210ed6818SMax Moroz   EXPECT_EQ(int8_t(-59), DataProv.ConsumeIntegralInRange<int8_t>(-100, 100));
16310ed6818SMax Moroz   EXPECT_EQ(uint16_t(15823),
16410ed6818SMax Moroz             DataProv.ConsumeIntegralInRange<uint16_t>(0, 65535));
16510ed6818SMax Moroz   EXPECT_EQ((signed char)(-101),
16610ed6818SMax Moroz             DataProv.ConsumeIntegralInRange<signed char>(-123, 123));
16710ed6818SMax Moroz   EXPECT_EQ(int64_t(-53253077544), DataProv.ConsumeIntegralInRange<int64_t>(
16810ed6818SMax Moroz                                        -99999999999, 99999999999));
16910ed6818SMax Moroz 
17010ed6818SMax Moroz   // Exhaust the buffer.
17110ed6818SMax Moroz   auto String = DataProv.ConsumeBytesAsString(31337);
17210ed6818SMax Moroz   EXPECT_EQ(size_t(1014), String.length());
17310ed6818SMax Moroz   EXPECT_EQ(uint64_t(123456789),
17410ed6818SMax Moroz             DataProv.ConsumeIntegralInRange<uint64_t>(123456789, 987654321));
17510ed6818SMax Moroz }
17610ed6818SMax Moroz 
TEST(FuzzedDataProvider,ConsumeRandomLengthString)17710ed6818SMax Moroz TEST(FuzzedDataProvider, ConsumeRandomLengthString) {
17810ed6818SMax Moroz   FuzzedDataProvider DataProv(Data, sizeof(Data));
17910ed6818SMax Moroz   EXPECT_EQ(
18010ed6818SMax Moroz       std::string(
18110ed6818SMax Moroz           "\x8A\x19\x0D\x44\x37\x0D\x38\x5E\x9B\xAA\xF3\xDA\xAA\x88\xF2\x9B\x6C"
18210ed6818SMax Moroz           "\xBA\xBE\xB1\xF2\xCF\x13\xB8\xAC\x1A\x7F\x1C\xC9\x90\xD0\xD9"),
18310ed6818SMax Moroz       DataProv.ConsumeRandomLengthString(1337));
18410ed6818SMax Moroz   EXPECT_EQ(std::string(
18510ed6818SMax Moroz                 "\xB3\xFD\xE3\x05\xA4\x03\x37\x49\x50\x4B\xBC\x39\xA2\x09\x6C"
18610ed6818SMax Moroz                 "\x2F\xAF\xD1\xB5\x47\xBF\x92\xBD\x79\xE5\xC5\x6E\x51\xA4\xED"
18710ed6818SMax Moroz                 "\xE9\xBD\x40\x4A\xFC\x25\x7A\x27\xC8\x92\xF7\x30\xDE\x40\x66"
18810ed6818SMax Moroz                 "\x66\xE8\x5F\x65\x39\x7E\x9E\x80\x2B\x01\x71\x2A\xFF\xD3\x0A"
18910ed6818SMax Moroz                 "\xAC\x6E\x49\x32\x79\x10\x6A\x6F\x97\x96\x70\x7E\x50\x65\xC9"
19010ed6818SMax Moroz                 "\x1D\xBD\x4E\x17\x04\x1E\xBA\x26\xAC\x1F\xE3\x37\x1C\x15\x43"
19110ed6818SMax Moroz                 "\x60\x41\x2A\x7C\xCA\x70\xCE\xAB\x20\x24\xF8\xD9\x1F\x14\x7C"),
19210ed6818SMax Moroz             DataProv.ConsumeRandomLengthString(31337));
1932136d17dSMax Moroz   size_t Offset = 141;
1942136d17dSMax Moroz   EXPECT_EQ(std::string(Data + Offset, Data + Offset + 5),
19510ed6818SMax Moroz             DataProv.ConsumeRandomLengthString(5));
1962136d17dSMax Moroz   Offset += 5;
1972136d17dSMax Moroz   EXPECT_EQ(std::string(Data + Offset, Data + Offset + 2),
19810ed6818SMax Moroz             DataProv.ConsumeRandomLengthString(2));
1992136d17dSMax Moroz   Offset += 2;
2002136d17dSMax Moroz 
2012136d17dSMax Moroz   // Call the overloaded method without arguments (uses max length available).
2022136d17dSMax Moroz   EXPECT_EQ(std::string(Data + Offset, Data + Offset + 664),
2032136d17dSMax Moroz             DataProv.ConsumeRandomLengthString());
2042136d17dSMax Moroz   Offset += 664 + 2; // +2 because of '\' character followed by any other byte.
2052136d17dSMax Moroz 
2062136d17dSMax Moroz   EXPECT_EQ(std::string(Data + Offset, Data + Offset + 92),
2072136d17dSMax Moroz             DataProv.ConsumeRandomLengthString());
2082136d17dSMax Moroz   Offset += 92 + 2;
20910ed6818SMax Moroz 
21010ed6818SMax Moroz   // Exhaust the buffer.
21110ed6818SMax Moroz   auto String = DataProv.ConsumeBytesAsString(31337);
2122136d17dSMax Moroz   EXPECT_EQ(size_t(116), String.length());
21310ed6818SMax Moroz   EXPECT_EQ(std::string(), DataProv.ConsumeRandomLengthString(1));
21410ed6818SMax Moroz }
21510ed6818SMax Moroz 
TEST(FuzzedDataProvider,ConsumeRemainingBytes)21610ed6818SMax Moroz TEST(FuzzedDataProvider, ConsumeRemainingBytes) {
21710ed6818SMax Moroz   {
21810ed6818SMax Moroz     FuzzedDataProvider DataProv(Data, sizeof(Data));
21910ed6818SMax Moroz     EXPECT_EQ(std::vector<uint8_t>(Data, Data + sizeof(Data)),
220a0eb49c2SMax Moroz               DataProv.ConsumeRemainingBytes<uint8_t>());
221a0eb49c2SMax Moroz     EXPECT_EQ(std::vector<uint8_t>(),
222a0eb49c2SMax Moroz               DataProv.ConsumeRemainingBytes<uint8_t>());
22310ed6818SMax Moroz   }
22410ed6818SMax Moroz 
22510ed6818SMax Moroz   {
22610ed6818SMax Moroz     FuzzedDataProvider DataProv(Data, sizeof(Data));
22710ed6818SMax Moroz     EXPECT_EQ(std::vector<uint8_t>(Data, Data + 123),
228a0eb49c2SMax Moroz               DataProv.ConsumeBytes<uint8_t>(123));
22910ed6818SMax Moroz     EXPECT_EQ(std::vector<char>(Data + 123, Data + sizeof(Data)),
23010ed6818SMax Moroz               DataProv.ConsumeRemainingBytes<char>());
23110ed6818SMax Moroz   }
23210ed6818SMax Moroz }
23310ed6818SMax Moroz 
TEST(FuzzedDataProvider,ConsumeRemainingBytesAsString)23410ed6818SMax Moroz TEST(FuzzedDataProvider, ConsumeRemainingBytesAsString) {
23510ed6818SMax Moroz   {
23610ed6818SMax Moroz     FuzzedDataProvider DataProv(Data, sizeof(Data));
23710ed6818SMax Moroz     EXPECT_EQ(std::string(Data, Data + sizeof(Data)),
23810ed6818SMax Moroz               DataProv.ConsumeRemainingBytesAsString());
23910ed6818SMax Moroz     EXPECT_EQ(std::string(""), DataProv.ConsumeRemainingBytesAsString());
24010ed6818SMax Moroz   }
24110ed6818SMax Moroz 
24210ed6818SMax Moroz   {
24310ed6818SMax Moroz     FuzzedDataProvider DataProv(Data, sizeof(Data));
24410ed6818SMax Moroz     EXPECT_EQ(std::vector<uint8_t>(Data, Data + 123),
245a0eb49c2SMax Moroz               DataProv.ConsumeBytes<uint8_t>(123));
24610ed6818SMax Moroz     EXPECT_EQ(std::string(Data + 123, Data + sizeof(Data)),
24710ed6818SMax Moroz               DataProv.ConsumeRemainingBytesAsString());
24810ed6818SMax Moroz   }
24910ed6818SMax Moroz }
25010ed6818SMax Moroz 
TEST(FuzzedDataProvider,ConsumeIntegral)25110ed6818SMax Moroz TEST(FuzzedDataProvider, ConsumeIntegral) {
25210ed6818SMax Moroz   FuzzedDataProvider DataProv(Data, sizeof(Data));
25310ed6818SMax Moroz   EXPECT_EQ(int32_t(-903266865), DataProv.ConsumeIntegral<int32_t>());
25410ed6818SMax Moroz   EXPECT_EQ(uint32_t(372863811), DataProv.ConsumeIntegral<uint32_t>());
25510ed6818SMax Moroz   EXPECT_EQ(uint8_t(61), DataProv.ConsumeIntegral<uint8_t>());
25610ed6818SMax Moroz   EXPECT_EQ(int16_t(22100), DataProv.ConsumeIntegral<int16_t>());
25710ed6818SMax Moroz   EXPECT_EQ(uint64_t(18252263806144500217u),
25810ed6818SMax Moroz             DataProv.ConsumeIntegral<uint64_t>());
25910ed6818SMax Moroz 
26010ed6818SMax Moroz   // Exhaust the buffer.
26110ed6818SMax Moroz   auto String = DataProv.ConsumeBytesAsString(31337);
26210ed6818SMax Moroz   EXPECT_EQ(size_t(1005), String.length());
26310ed6818SMax Moroz   EXPECT_EQ(std::numeric_limits<int64_t>::min(),
26410ed6818SMax Moroz             DataProv.ConsumeIntegral<int64_t>());
26510ed6818SMax Moroz }
26610ed6818SMax Moroz 
TEST(FuzzedDataProvider,ConsumeBool)26710ed6818SMax Moroz TEST(FuzzedDataProvider, ConsumeBool) {
26810ed6818SMax Moroz   FuzzedDataProvider DataProv(Data, sizeof(Data));
26910ed6818SMax Moroz   EXPECT_EQ(false, DataProv.ConsumeBool());
27010ed6818SMax Moroz   EXPECT_EQ(true, DataProv.ConsumeBool());
27110ed6818SMax Moroz   EXPECT_EQ(true, DataProv.ConsumeBool());
27210ed6818SMax Moroz   EXPECT_EQ(true, DataProv.ConsumeBool());
27310ed6818SMax Moroz   EXPECT_EQ(false, DataProv.ConsumeBool());
27410ed6818SMax Moroz   EXPECT_EQ(true, DataProv.ConsumeBool());
27510ed6818SMax Moroz   EXPECT_EQ(true, DataProv.ConsumeBool());
27610ed6818SMax Moroz   EXPECT_EQ(true, DataProv.ConsumeBool());
27710ed6818SMax Moroz   EXPECT_EQ(true, DataProv.ConsumeBool());
27810ed6818SMax Moroz   EXPECT_EQ(false, DataProv.ConsumeBool());
27910ed6818SMax Moroz 
28010ed6818SMax Moroz   // Exhaust the buffer.
28110ed6818SMax Moroz   auto String = DataProv.ConsumeBytesAsString(31337);
28210ed6818SMax Moroz   EXPECT_EQ(size_t(1014), String.length());
28310ed6818SMax Moroz   EXPECT_EQ(false, DataProv.ConsumeBool());
28410ed6818SMax Moroz }
28510ed6818SMax Moroz 
TEST(FuzzedDataProvider,PickValueInStdArray)286*70de7e0dSMax Moroz TEST(FuzzedDataProvider, PickValueInStdArray) {
287*70de7e0dSMax Moroz   FuzzedDataProvider DataProv(Data, sizeof(Data));
288*70de7e0dSMax Moroz   const std::array<int, 5> Array = {1, 2, 3, 4, 5};
289*70de7e0dSMax Moroz   EXPECT_EQ(5, DataProv.PickValueInArray(Array));
290*70de7e0dSMax Moroz   EXPECT_EQ(2, DataProv.PickValueInArray(Array));
291*70de7e0dSMax Moroz   EXPECT_EQ(2, DataProv.PickValueInArray(Array));
292*70de7e0dSMax Moroz   EXPECT_EQ(3, DataProv.PickValueInArray(Array));
293*70de7e0dSMax Moroz   EXPECT_EQ(3, DataProv.PickValueInArray(Array));
294*70de7e0dSMax Moroz   EXPECT_EQ(3, DataProv.PickValueInArray(Array));
295*70de7e0dSMax Moroz   EXPECT_EQ(1, DataProv.PickValueInArray(Array));
296*70de7e0dSMax Moroz   EXPECT_EQ(3, DataProv.PickValueInArray(Array));
297*70de7e0dSMax Moroz   EXPECT_EQ(2, DataProv.PickValueInArray(Array));
298*70de7e0dSMax Moroz }
299*70de7e0dSMax Moroz 
TEST(FuzzedDataProvider,PickValueInArray)30010ed6818SMax Moroz TEST(FuzzedDataProvider, PickValueInArray) {
30110ed6818SMax Moroz   FuzzedDataProvider DataProv(Data, sizeof(Data));
30210ed6818SMax Moroz   const int Array[] = {1, 2, 3, 4, 5};
30310ed6818SMax Moroz   EXPECT_EQ(5, DataProv.PickValueInArray(Array));
30410ed6818SMax Moroz   EXPECT_EQ(2, DataProv.PickValueInArray(Array));
30510ed6818SMax Moroz   EXPECT_EQ(2, DataProv.PickValueInArray(Array));
30610ed6818SMax Moroz   EXPECT_EQ(3, DataProv.PickValueInArray(Array));
30710ed6818SMax Moroz   EXPECT_EQ(3, DataProv.PickValueInArray(Array));
30810ed6818SMax Moroz   EXPECT_EQ(3, DataProv.PickValueInArray(Array));
30910ed6818SMax Moroz   EXPECT_EQ(1, DataProv.PickValueInArray(Array));
31010ed6818SMax Moroz   EXPECT_EQ(3, DataProv.PickValueInArray(Array));
31110ed6818SMax Moroz   EXPECT_EQ(2, DataProv.PickValueInArray(Array));
31210ed6818SMax Moroz 
31310ed6818SMax Moroz   EXPECT_EQ(uint8_t(0x9D), DataProv.PickValueInArray(Data));
31410ed6818SMax Moroz   EXPECT_EQ(uint8_t(0xBA), DataProv.PickValueInArray(Data));
31510ed6818SMax Moroz   EXPECT_EQ(uint8_t(0x69), DataProv.PickValueInArray(Data));
31610ed6818SMax Moroz   EXPECT_EQ(uint8_t(0xD6), DataProv.PickValueInArray(Data));
31710ed6818SMax Moroz 
318a0eb49c2SMax Moroz   EXPECT_EQ(uint32_t(777), DataProv.PickValueInArray<uint32_t>({1337, 777}));
319a0eb49c2SMax Moroz   EXPECT_EQ(uint32_t(777), DataProv.PickValueInArray<uint32_t>({1337, 777}));
320a0eb49c2SMax Moroz   EXPECT_EQ(uint64_t(1337), DataProv.PickValueInArray<uint64_t>({1337, 777}));
321a0eb49c2SMax Moroz   EXPECT_EQ(size_t(777), DataProv.PickValueInArray<size_t>({1337, 777}));
322a0eb49c2SMax Moroz   EXPECT_EQ(int16_t(1337), DataProv.PickValueInArray<int16_t>({1337, 777}));
323a0eb49c2SMax Moroz   EXPECT_EQ(int32_t(777), DataProv.PickValueInArray<int32_t>({1337, 777}));
324a0eb49c2SMax Moroz   EXPECT_EQ(int64_t(777), DataProv.PickValueInArray<int64_t>({1337, 777}));
325a0eb49c2SMax Moroz 
32610ed6818SMax Moroz   // Exhaust the buffer.
32710ed6818SMax Moroz   auto String = DataProv.ConsumeBytesAsString(31337);
328a0eb49c2SMax Moroz   EXPECT_EQ(size_t(1000), String.length());
32910ed6818SMax Moroz   EXPECT_EQ(uint8_t(0x8A), DataProv.PickValueInArray(Data));
33010ed6818SMax Moroz }
33110ed6818SMax Moroz 
TEST(FuzzedDataProvider,ConsumeEnum)33210ed6818SMax Moroz TEST(FuzzedDataProvider, ConsumeEnum) {
33310ed6818SMax Moroz   FuzzedDataProvider DataProv(Data, sizeof(Data));
33410ed6818SMax Moroz   enum class Enum {
33510ed6818SMax Moroz     Zero,
33610ed6818SMax Moroz     One,
33710ed6818SMax Moroz     Two,
33810ed6818SMax Moroz     Three,
33910ed6818SMax Moroz     Four,
34010ed6818SMax Moroz     Five,
34110ed6818SMax Moroz     Six,
34210ed6818SMax Moroz     Seven,
34310ed6818SMax Moroz     kMaxValue = Seven
34410ed6818SMax Moroz   };
34510ed6818SMax Moroz   EXPECT_EQ(Enum::Two, DataProv.ConsumeEnum<Enum>());
34610ed6818SMax Moroz   EXPECT_EQ(Enum::One, DataProv.ConsumeEnum<Enum>());
34710ed6818SMax Moroz   EXPECT_EQ(Enum::Five, DataProv.ConsumeEnum<Enum>());
34810ed6818SMax Moroz   EXPECT_EQ(Enum::Seven, DataProv.ConsumeEnum<Enum>());
34910ed6818SMax Moroz   EXPECT_EQ(Enum::Six, DataProv.ConsumeEnum<Enum>());
35010ed6818SMax Moroz   EXPECT_EQ(Enum::One, DataProv.ConsumeEnum<Enum>());
35110ed6818SMax Moroz   EXPECT_EQ(Enum::Three, DataProv.ConsumeEnum<Enum>());
35210ed6818SMax Moroz   EXPECT_EQ(Enum::Three, DataProv.ConsumeEnum<Enum>());
35310ed6818SMax Moroz   EXPECT_EQ(Enum::Five, DataProv.ConsumeEnum<Enum>());
35410ed6818SMax Moroz   EXPECT_EQ(Enum::Six, DataProv.ConsumeEnum<Enum>());
35510ed6818SMax Moroz 
35610ed6818SMax Moroz   // Exhaust the buffer.
35710ed6818SMax Moroz   auto String = DataProv.ConsumeBytesAsString(31337);
35810ed6818SMax Moroz   EXPECT_EQ(size_t(1014), String.length());
35910ed6818SMax Moroz   EXPECT_EQ(Enum::Zero, DataProv.ConsumeEnum<Enum>());
36010ed6818SMax Moroz }
36110ed6818SMax Moroz 
TEST(FuzzedDataProvider,remaining_bytes)36210ed6818SMax Moroz TEST(FuzzedDataProvider, remaining_bytes) {
36310ed6818SMax Moroz   FuzzedDataProvider DataProv(Data, sizeof(Data));
36410ed6818SMax Moroz   EXPECT_EQ(size_t(1024), DataProv.remaining_bytes());
36510ed6818SMax Moroz   EXPECT_EQ(false, DataProv.ConsumeBool());
36610ed6818SMax Moroz   EXPECT_EQ(size_t(1024 - 1), DataProv.remaining_bytes());
367a0eb49c2SMax Moroz   EXPECT_EQ(std::vector<uint8_t>(Data, Data + 8),
368a0eb49c2SMax Moroz             DataProv.ConsumeBytes<uint8_t>(8));
36910ed6818SMax Moroz   EXPECT_EQ(size_t(1024 - 1 - 8), DataProv.remaining_bytes());
37010ed6818SMax Moroz 
37110ed6818SMax Moroz   // Exhaust the buffer.
37210ed6818SMax Moroz   EXPECT_EQ(std::vector<uint8_t>(Data + 8, Data + sizeof(Data) - 1),
373a0eb49c2SMax Moroz             DataProv.ConsumeRemainingBytes<uint8_t>());
37410ed6818SMax Moroz   EXPECT_EQ(size_t(0), DataProv.remaining_bytes());
37510ed6818SMax Moroz }
37610ed6818SMax Moroz 
TEST(FuzzedDataProvider,ConsumeProbability)377df3b465cSMax Moroz TEST(FuzzedDataProvider, ConsumeProbability) {
378df3b465cSMax Moroz   FuzzedDataProvider DataProv(Data, sizeof(Data));
379df3b465cSMax Moroz   ASSERT_FLOAT_EQ(float(0.28969181), DataProv.ConsumeProbability<float>());
380df3b465cSMax Moroz   ASSERT_DOUBLE_EQ(double(0.086814121166605432),
381df3b465cSMax Moroz                    DataProv.ConsumeProbability<double>());
382df3b465cSMax Moroz   ASSERT_FLOAT_EQ(float(0.30104411), DataProv.ConsumeProbability<float>());
383df3b465cSMax Moroz   ASSERT_DOUBLE_EQ(double(0.96218831486039413),
384df3b465cSMax Moroz                    DataProv.ConsumeProbability<double>());
385df3b465cSMax Moroz   ASSERT_FLOAT_EQ(float(0.67005056), DataProv.ConsumeProbability<float>());
386df3b465cSMax Moroz   ASSERT_DOUBLE_EQ(double(0.69210584173832279),
387df3b465cSMax Moroz                    DataProv.ConsumeProbability<double>());
388df3b465cSMax Moroz 
389df3b465cSMax Moroz   // Exhaust the buffer.
390df3b465cSMax Moroz   EXPECT_EQ(std::vector<uint8_t>(Data, Data + sizeof(Data) - 36),
391df3b465cSMax Moroz             DataProv.ConsumeRemainingBytes<uint8_t>());
392df3b465cSMax Moroz   ASSERT_FLOAT_EQ(float(0.0), DataProv.ConsumeProbability<float>());
393df3b465cSMax Moroz }
394df3b465cSMax Moroz 
TEST(FuzzedDataProvider,ConsumeFloatingPoint)395df3b465cSMax Moroz TEST(FuzzedDataProvider, ConsumeFloatingPoint) {
396df3b465cSMax Moroz   FuzzedDataProvider DataProv(Data, sizeof(Data));
397df3b465cSMax Moroz   ASSERT_FLOAT_EQ(float(-2.8546307e+38),
398df3b465cSMax Moroz                   DataProv.ConsumeFloatingPoint<float>());
399df3b465cSMax Moroz   ASSERT_DOUBLE_EQ(double(8.0940194040236032e+307),
400df3b465cSMax Moroz                    DataProv.ConsumeFloatingPoint<double>());
401df3b465cSMax Moroz   ASSERT_FLOAT_EQ(float(271.49084),
402df3b465cSMax Moroz                   DataProv.ConsumeFloatingPointInRange<float>(123.0, 777.0));
403df3b465cSMax Moroz   ASSERT_DOUBLE_EQ(double(30.859126145478349),
404df3b465cSMax Moroz                    DataProv.ConsumeFloatingPointInRange<double>(13.37, 31.337));
405df3b465cSMax Moroz   ASSERT_FLOAT_EQ(
406df3b465cSMax Moroz       float(-903.47729),
407df3b465cSMax Moroz       DataProv.ConsumeFloatingPointInRange<float>(-999.9999, -777.77));
408df3b465cSMax Moroz   ASSERT_DOUBLE_EQ(
409df3b465cSMax Moroz       double(24.561393182922771),
410df3b465cSMax Moroz       DataProv.ConsumeFloatingPointInRange<double>(-13.37, 31.337));
411df3b465cSMax Moroz   ASSERT_FLOAT_EQ(float(1.0),
412df3b465cSMax Moroz                   DataProv.ConsumeFloatingPointInRange<float>(1.0, 1.0));
413df3b465cSMax Moroz   ASSERT_DOUBLE_EQ(double(-1.0),
414df3b465cSMax Moroz                    DataProv.ConsumeFloatingPointInRange<double>(-1.0, -1.0));
415df3b465cSMax Moroz 
416df3b465cSMax Moroz   // Exhaust the buffer.
417df3b465cSMax Moroz   EXPECT_EQ((std::vector<uint8_t>(Data, Data + sizeof(Data) - 50)).size(),
418df3b465cSMax Moroz             DataProv.ConsumeRemainingBytes<uint8_t>().size());
419df3b465cSMax Moroz   ASSERT_FLOAT_EQ(float(0.0), DataProv.ConsumeProbability<float>());
420df3b465cSMax Moroz   ASSERT_NEAR(std::numeric_limits<double>::lowest(),
421df3b465cSMax Moroz               DataProv.ConsumeFloatingPoint<double>(), 1e-10);
422df3b465cSMax Moroz   ASSERT_FLOAT_EQ(float(123.0),
423df3b465cSMax Moroz                   DataProv.ConsumeFloatingPointInRange<float>(123.0, 777.0));
424df3b465cSMax Moroz   ASSERT_DOUBLE_EQ(double(-13.37), DataProv.ConsumeFloatingPointInRange<double>(
425df3b465cSMax Moroz                                        -13.37, 31.337));
426df3b465cSMax Moroz }
427df3b465cSMax Moroz 
TEST(FuzzedDataProvider,ConsumeData)42820a604d3SMax Moroz TEST(FuzzedDataProvider, ConsumeData) {
42920a604d3SMax Moroz   FuzzedDataProvider DataProv(Data, sizeof(Data));
43020a604d3SMax Moroz   uint8_t Buffer[10] = {};
43120a604d3SMax Moroz   EXPECT_EQ(sizeof(Buffer), DataProv.ConsumeData(Buffer, sizeof(Buffer)));
43220a604d3SMax Moroz   std::vector<uint8_t> Expected(Data, Data + sizeof(Buffer));
43320a604d3SMax Moroz   EXPECT_EQ(Expected, std::vector<uint8_t>(Buffer, Buffer + sizeof(Buffer)));
43420a604d3SMax Moroz 
43520a604d3SMax Moroz   EXPECT_EQ(size_t(2), DataProv.ConsumeData(Buffer, 2));
43620a604d3SMax Moroz   Expected[0] = Data[sizeof(Buffer)];
43720a604d3SMax Moroz   Expected[1] = Data[sizeof(Buffer) + 1];
43820a604d3SMax Moroz   EXPECT_EQ(Expected, std::vector<uint8_t>(Buffer, Buffer + sizeof(Buffer)));
43920a604d3SMax Moroz 
44020a604d3SMax Moroz   // Exhaust the buffer.
44120a604d3SMax Moroz   EXPECT_EQ(std::vector<uint8_t>(Data + 12, Data + sizeof(Data)),
44220a604d3SMax Moroz             DataProv.ConsumeRemainingBytes<uint8_t>());
44320a604d3SMax Moroz   EXPECT_EQ(size_t(0), DataProv.ConsumeData(Buffer, sizeof(Buffer)));
44420a604d3SMax Moroz   EXPECT_EQ(Expected, std::vector<uint8_t>(Buffer, Buffer + sizeof(Buffer)));
44520a604d3SMax Moroz }
44620a604d3SMax Moroz 
main(int argc,char ** argv)44710ed6818SMax Moroz int main(int argc, char **argv) {
44810ed6818SMax Moroz   testing::InitGoogleTest(&argc, argv);
44910ed6818SMax Moroz   return RUN_ALL_TESTS();
45010ed6818SMax Moroz }
451