72 lines
3.1 KiB
C++
72 lines
3.1 KiB
C++
|
|
#include "gtest/gtest.h"
|
|||
|
|
#include "src/memory.cpp"
|
|||
|
|
#include <cstdio>
|
|||
|
|
#include <cstdlib>
|
|||
|
|
#include <fstream>
|
|||
|
|
|
|||
|
|
// 注意:由于原函数存在内存泄漏、重复释放和文件泄漏等错误,
|
|||
|
|
// 直接测试这些函数会导致测试程序本身出现未定义行为或资源泄漏。
|
|||
|
|
// 因此,以下测试用例主要用于演示如何为这类函数设计测试场景,
|
|||
|
|
// 实际应用中应先修复这些函数中的错误,再进行测试。
|
|||
|
|
|
|||
|
|
// 测试 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();
|
|||
|
|
}
|