blob: a8b5a149cffbd70e1305f9f95fa9cdd8378a37aa [file] [log] [blame]
Mike Aizatskyb8627a82016-03-03 23:45:29 +00001#include "FuzzerFnAdapter.h"
2#include "gtest/gtest-spi.h"
3#include "gtest/gtest.h"
4
5namespace fuzzer {
6namespace impl {
7
8template <typename... Args>
9bool Unpack(std::tuple<Args...> *Tuple, std::initializer_list<uint8_t> data) {
10 std::vector<uint8_t> V(data);
11 return Unpack(V.data(), V.size(), Tuple);
12}
13
14TEST(Unpack, Bool) {
15 std::tuple<bool> T;
16 EXPECT_TRUE(Unpack(&T, {1}));
17 EXPECT_TRUE(std::get<0>(T));
18
19 EXPECT_TRUE(Unpack(&T, {0}));
20 EXPECT_FALSE(std::get<0>(T));
21
22 EXPECT_FALSE(Unpack(&T, {}));
23}
24
25TEST(Unpack, BoolBool) {
26 std::tuple<bool, bool> T;
27 EXPECT_TRUE(Unpack(&T, {1, 0}));
28 EXPECT_TRUE(std::get<0>(T));
29 EXPECT_FALSE(std::get<1>(T));
30
31 EXPECT_TRUE(Unpack(&T, {0, 1}));
32 EXPECT_FALSE(std::get<0>(T));
33 EXPECT_TRUE(std::get<1>(T));
34
35 EXPECT_FALSE(Unpack(&T, {}));
36 EXPECT_FALSE(Unpack(&T, {10}));
37}
38
39TEST(Unpack, BoolInt) {
40 std::tuple<bool, int> T;
41 EXPECT_TRUE(Unpack(&T, {1, 16, 2, 0, 0}));
42 EXPECT_TRUE(std::get<0>(T));
43 EXPECT_EQ(528, std::get<1>(T));
44
45 EXPECT_FALSE(Unpack(&T, {1, 2}));
46}
47
48TEST(Unpack, Vector) {
49 std::tuple<std::vector<uint8_t>> T;
50 const auto &V = std::get<0>(T);
51
52 EXPECT_FALSE(Unpack(&T, {}));
53
54 EXPECT_TRUE(Unpack(&T, {0}));
55 EXPECT_EQ(0ul, V.size());
56
57 EXPECT_TRUE(Unpack(&T, {0, 1, 2, 3}));
58 EXPECT_EQ(0ul, V.size());
59
60 EXPECT_TRUE(Unpack(&T, {2}));
61 EXPECT_EQ(0ul, V.size());
62
63 EXPECT_TRUE(Unpack(&T, {2, 3}));
64 EXPECT_EQ(1ul, V.size());
65 EXPECT_EQ(3, V[0]);
66
67 EXPECT_TRUE(Unpack(&T, {2, 9, 8}));
68 EXPECT_EQ(2ul, V.size());
69 EXPECT_EQ(9, V[0]);
70 EXPECT_EQ(8, V[1]);
71}
72
Mike Aizatsky243fe2b2016-03-04 23:18:01 +000073TEST(Unpack, String) {
74 std::tuple<std::string> T;
75 const auto &S = std::get<0>(T);
76
77 EXPECT_TRUE(Unpack(&T, {2, 3}));
78 EXPECT_EQ(1ul, S.size());
79 EXPECT_EQ(3, S[0]);
80}
81
Mike Aizatskyb8627a82016-03-03 23:45:29 +000082template <typename Fn>
83bool UnpackAndApply(Fn F, std::initializer_list<uint8_t> Data) {
84 std::vector<uint8_t> V(Data);
85 return UnpackAndApply(F, V.data(), V.size());
86}
87
88static void fnBool(bool b) { EXPECT_TRUE(b); }
89
90TEST(Apply, Bool) {
91 EXPECT_FALSE(UnpackAndApply(fnBool, {}));
92 EXPECT_TRUE(UnpackAndApply(fnBool, {1}));
93 EXPECT_NONFATAL_FAILURE(UnpackAndApply(fnBool, {0}),
94 "Actual: false\nExpected: true");
95}
96
97static void fnInt(int i) { EXPECT_EQ(42, i); }
98
99TEST(Apply, Int) {
100 EXPECT_FALSE(UnpackAndApply(fnInt, {}));
101 EXPECT_TRUE(UnpackAndApply(fnInt, {42, 0, 0, 0}));
102 EXPECT_NONFATAL_FAILURE(UnpackAndApply(fnInt, {10, 0, 0, 0}),
103 "Actual: 10\nExpected: 42");
104}
105
106} // namespace impl
107} // namespace fuzzer