/* * test_base_class.cpp * * Copyright (C) 2023 charlie-foxtrot * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "logging.h" #include "test_base_class.h" using namespace std; void delete_directory(const string& root) { DIR* dp = NULL; dp = opendir(root.c_str()); if (dp == NULL) { cerr << "Error opening directory " << root << endl; return; } string current_dir = "."; string parent_dir = ".."; struct dirent* entry = NULL; while ((entry = readdir(dp))) { if (current_dir.compare(entry->d_name) == 0 || parent_dir.compare(entry->d_name) == 0) { continue; } struct stat info; string filepath = root + "/" + string(entry->d_name); if (stat(filepath.c_str(), &info) != 0) { cerr << "Error getting info on " << filepath.c_str() << ": " << strerror(errno) << endl; continue; } if (S_ISDIR(info.st_mode)) { delete_directory(filepath); } else { unlink(filepath.c_str()); } } closedir(dp); rmdir(root.c_str()); } string make_temp_dir(void) { char temp_path_template[] = "/tmp/temp_unittest_dir_XXXXXX"; if (mkdtemp(temp_path_template) == NULL) { cerr << "Error making temp dir for test files: " << strerror(errno) << endl; return ""; } return string(temp_path_template); } void TestBaseClass::SetUp(void) { ::testing::Test::SetUp(); // setup debug log file for each test temp_dir = make_temp_dir(); ASSERT_FALSE(temp_dir.empty()); string debug_filepath = temp_dir + "/debug_file.log"; init_debug(debug_filepath.c_str()); // point logging to stderr log_destination = STDERR; } void TestBaseClass::TearDown(void) { ::testing::Test::TearDown(); close_debug(); delete_directory(temp_dir); } TEST(TestHelpers, make_temp_dir) { // make a temp dir string temp_dir = make_temp_dir(); // path should not be empty string ASSERT_FALSE(temp_dir.empty()); // a directory should exist at the path struct stat info; ASSERT_EQ(stat(temp_dir.c_str(), &info), 0); EXPECT_TRUE(S_ISDIR(info.st_mode)); delete_directory(temp_dir); } TEST(TestHelpers, delete_directory) { // make a temp dir string temp_dir = make_temp_dir(); ASSERT_FALSE(temp_dir.empty()); // build a bunch of nested sub-dirs and files string path = temp_dir; for (int i = 0; i < 5; ++i) { path = path + "/sub_dir"; mkdir(path.c_str(), 0777); string filename = path + "/some_file"; fclose(fopen(filename.c_str(), "w")); } // last sub-dir should exist and be a directory struct stat info; ASSERT_EQ(stat(path.c_str(), &info), 0); EXPECT_TRUE(S_ISDIR(info.st_mode)); // last sub-dir should have a file in it string filename = path + "/some_file"; ASSERT_EQ(stat(filename.c_str(), &info), 0); EXPECT_TRUE(S_ISREG(info.st_mode)); // delete the root temp dir delete_directory(temp_dir); // root temp dir should no longer exist ASSERT_NE(stat(temp_dir.c_str(), &info), 0); }