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