xref: /aosp_15_r20/external/libprotobuf-mutator/examples/fuzzer_test.h (revision fd525a9c096e28cf6f8d8719388df0568a611e7b)
1*fd525a9cSAndroid Build Coastguard Worker // Copyright 2017 Google Inc. All rights reserved.
2*fd525a9cSAndroid Build Coastguard Worker //
3*fd525a9cSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*fd525a9cSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*fd525a9cSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*fd525a9cSAndroid Build Coastguard Worker //
7*fd525a9cSAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
8*fd525a9cSAndroid Build Coastguard Worker //
9*fd525a9cSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*fd525a9cSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*fd525a9cSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*fd525a9cSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*fd525a9cSAndroid Build Coastguard Worker // limitations under the License.
14*fd525a9cSAndroid Build Coastguard Worker 
15*fd525a9cSAndroid Build Coastguard Worker #ifndef EXAMPLES_FUZZER_TEST_H_
16*fd525a9cSAndroid Build Coastguard Worker #define EXAMPLES_FUZZER_TEST_H_
17*fd525a9cSAndroid Build Coastguard Worker 
18*fd525a9cSAndroid Build Coastguard Worker #include <dirent.h>
19*fd525a9cSAndroid Build Coastguard Worker #include <memory>
20*fd525a9cSAndroid Build Coastguard Worker #include <string>
21*fd525a9cSAndroid Build Coastguard Worker 
22*fd525a9cSAndroid Build Coastguard Worker #include "port/gtest.h"
23*fd525a9cSAndroid Build Coastguard Worker 
24*fd525a9cSAndroid Build Coastguard Worker using testing::Test;
25*fd525a9cSAndroid Build Coastguard Worker 
26*fd525a9cSAndroid Build Coastguard Worker class FuzzerTest : public testing::Test {
27*fd525a9cSAndroid Build Coastguard Worker  protected:
SetUp()28*fd525a9cSAndroid Build Coastguard Worker   void SetUp() override {
29*fd525a9cSAndroid Build Coastguard Worker     char dir_template[] = "/tmp/libxml2_example_test_XXXXXX";
30*fd525a9cSAndroid Build Coastguard Worker     auto dir = mkdtemp(dir_template);
31*fd525a9cSAndroid Build Coastguard Worker     ASSERT_TRUE(dir);
32*fd525a9cSAndroid Build Coastguard Worker     dir_ = std::string(dir) + "/";
33*fd525a9cSAndroid Build Coastguard Worker     EXPECT_EQ(0, CountFilesInDir());
34*fd525a9cSAndroid Build Coastguard Worker   }
35*fd525a9cSAndroid Build Coastguard Worker 
TearDown()36*fd525a9cSAndroid Build Coastguard Worker   void TearDown() override {
37*fd525a9cSAndroid Build Coastguard Worker     EXPECT_EQ(0, std::system((std::string("rm -rf ") + dir_).c_str()));
38*fd525a9cSAndroid Build Coastguard Worker   }
39*fd525a9cSAndroid Build Coastguard Worker 
RunFuzzer(const std::string & name,int max_len,int runs)40*fd525a9cSAndroid Build Coastguard Worker   int RunFuzzer(const std::string& name, int max_len, int runs) {
41*fd525a9cSAndroid Build Coastguard Worker     std::string cmd = "ASAN_OPTIONS=detect_leaks=0 ./" + name;
42*fd525a9cSAndroid Build Coastguard Worker     cmd += " -detect_leaks=0";
43*fd525a9cSAndroid Build Coastguard Worker     cmd += " -len_control=0";
44*fd525a9cSAndroid Build Coastguard Worker     cmd += " -max_len=" + std::to_string(max_len);
45*fd525a9cSAndroid Build Coastguard Worker     cmd += " -runs=" + std::to_string(runs);
46*fd525a9cSAndroid Build Coastguard Worker     cmd += " -artifact_prefix=" + dir_;
47*fd525a9cSAndroid Build Coastguard Worker     cmd += " " + dir_;
48*fd525a9cSAndroid Build Coastguard Worker     fprintf(stderr, "%s \n", cmd.c_str());
49*fd525a9cSAndroid Build Coastguard Worker     return std::system(cmd.c_str());
50*fd525a9cSAndroid Build Coastguard Worker   }
51*fd525a9cSAndroid Build Coastguard Worker 
CountFilesInDir()52*fd525a9cSAndroid Build Coastguard Worker   size_t CountFilesInDir() const {
53*fd525a9cSAndroid Build Coastguard Worker     size_t res = 0;
54*fd525a9cSAndroid Build Coastguard Worker     std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(dir_.c_str()),
55*fd525a9cSAndroid Build Coastguard Worker                                                   &closedir);
56*fd525a9cSAndroid Build Coastguard Worker     if (!dir) return 0;
57*fd525a9cSAndroid Build Coastguard Worker     while (readdir(dir.get())) {
58*fd525a9cSAndroid Build Coastguard Worker       ++res;
59*fd525a9cSAndroid Build Coastguard Worker     }
60*fd525a9cSAndroid Build Coastguard Worker     if (res <= 2) return 0;
61*fd525a9cSAndroid Build Coastguard Worker     res -= 2;  // . and ..
62*fd525a9cSAndroid Build Coastguard Worker     return res;
63*fd525a9cSAndroid Build Coastguard Worker   }
64*fd525a9cSAndroid Build Coastguard Worker 
65*fd525a9cSAndroid Build Coastguard Worker   std::string dir_;
66*fd525a9cSAndroid Build Coastguard Worker };
67*fd525a9cSAndroid Build Coastguard Worker 
68*fd525a9cSAndroid Build Coastguard Worker #endif  // EXAMPLES_FUZZER_TEST_H_
69