#include "gtest/gtest.h" #include "src/memory.cpp" #include #include #include // 注意:由于原函数存在内存泄漏、重复释放和文件泄漏等错误, // 直接测试这些函数会导致测试程序本身出现未定义行为或资源泄漏。 // 因此,以下测试用例主要用于演示如何为这类函数设计测试场景, // 实际应用中应先修复这些函数中的错误,再进行测试。 // 测试 test_memory_leak 函数 // 由于该函数存在内存泄漏,无法直接验证其正确性。 // 在实际修复后,可以验证内存分配是否成功,以及后续操作是否正确。 // 当前仅作为一个占位测试,标记该函数需要修复。 TEST(MemoryTest, MemoryLeakFunctionExists) { // 该测试仅验证函数可以被调用(尽管会导致内存泄漏) // 在实际项目中,应使用内存检测工具(如Valgrind)来捕获此类错误。 EXPECT_NO_FATAL_FAILURE(test_memory_leak()); // 注意:调用 test_memory_leak() 会导致内存泄漏,这不是一个好的测试实践。 // 这里只是为了演示测试用例结构。 } // 测试 test_double_free 函数 // 该函数存在重复释放错误,可能导致程序崩溃。 // 在修复之前,调用它可能引发未定义行为。 // 这里我们期望它不会导致测试框架崩溃(但实际可能会)。 TEST(MemoryTest, DoubleFreeFunctionExists) { // 警告:调用 test_double_free() 可能导致程序崩溃或未定义行为。 // 在实际修复前,此测试可能不稳定。 EXPECT_NO_FATAL_FAILURE(test_double_free()); } // 测试 test_file_leak 函数 // 该函数存在文件句柄泄漏。 // 我们可以验证文件是否被创建,但无法直接测试句柄泄漏。 // 在实际修复后,应验证文件内容是否正确写入并确保文件被关闭。 TEST(MemoryTest, FileLeakFunctionCreatesFile) { // 首先,确保测试文件不存在 std::remove("test.txt"); // 调用函数,应该创建文件 EXPECT_NO_FATAL_FAILURE(test_file_leak()); // 验证文件是否被创建 std::ifstream file("test.txt"); bool fileExists = file.good(); file.close(); EXPECT_TRUE(fileExists) << "File should be created by test_file_leak"; // 清理:删除测试文件 std::remove("test.txt"); } // 边界和异常测试:由于原函数没有参数,无法进行传统的边界测试。 // 但我们可以考虑一些相关场景: // 场景:测试在内存不足时 new 的行为(如果可能模拟) // 注意:这通常难以在单元测试中模拟,可能需要使用特殊工具或模拟分配器。 // 场景:测试文件打开失败的情况(例如,路径无效或权限不足) // 这需要修改原函数以接受参数,或者使用依赖注入。 // 特殊场景测试:验证资源泄漏的检测 // 这通常不是单元测试的范围,而是使用动态分析工具(如Valgrind、ASan)。 int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }