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