60 lines
2.6 KiB
C++
60 lines
2.6 KiB
C++
#include "gtest/gtest.h"
|
||
#include "src/memory.cpp"
|
||
#include <cstdio>
|
||
#include <cstdlib>
|
||
#include <fstream>
|
||
|
||
// 测试 test_memory_leak 函数
|
||
// 注意:由于该函数设计上就是内存泄漏,直接调用会污染测试环境。
|
||
// 因此,我们主要测试其编译和链接,并通过外部工具(如Valgrind)验证泄漏。
|
||
// 这里我们创建一个测试来验证函数可以被调用且不会导致立即崩溃。
|
||
TEST(MemoryTest, MemoryLeakFunctionRuns) {
|
||
// 该测试仅验证函数可以被调用而不崩溃。
|
||
// 实际的内存泄漏检测应使用 Valgrind 或 AddressSanitizer 等工具。
|
||
EXPECT_NO_FATAL_FAILURE(test_memory_leak());
|
||
}
|
||
|
||
// 测试 test_double_free 函数
|
||
// 注意:重复释放是未定义行为,可能导致程序立即崩溃。
|
||
// 在测试中,我们期望它抛出信号(如SIGABRT)或导致测试失败。
|
||
// 使用 Google Test 的死亡测试来捕获这种致命错误。
|
||
TEST(MemoryTest, DoubleFreeCausesDeath) {
|
||
// 使用死亡测试来验证重复释放会导致程序终止。
|
||
// 具体的终止信号可能因平台和编译器而异,这里使用通用的 `_` 匹配器。
|
||
EXPECT_DEATH(test_double_free(), ".*");
|
||
}
|
||
|
||
// 测试 test_file_leak 函数
|
||
// 该函数会打开一个文件但不关闭,导致文件句柄泄漏。
|
||
// 与内存泄漏类似,直接测试泄漏行为是困难的。
|
||
// 我们验证函数可以运行,并且文件被成功创建(作为副作用检查)。
|
||
// 测试后需要清理创建的文件。
|
||
TEST(MemoryTest, FileLeakFunctionCreatesFile) {
|
||
const char* filename = "test.txt";
|
||
// 确保测试前文件不存在
|
||
std::remove(filename);
|
||
|
||
// 调用函数,应创建文件
|
||
EXPECT_NO_FATAL_FAILURE(test_file_leak());
|
||
|
||
// 验证文件已被创建(函数的副作用)
|
||
std::ifstream file(filename);
|
||
EXPECT_TRUE(file.good());
|
||
file.close();
|
||
|
||
// 测试后清理:删除创建的文件并关闭可能泄漏的句柄(通过系统方式)
|
||
// 注意:由于函数没有关闭文件,在某些系统上直接删除可能失败。
|
||
// 这里尝试删除,如果失败也不视为测试失败,因为主要目的是验证文件创建。
|
||
std::remove(filename);
|
||
}
|
||
|
||
// 边界/异常测试:这些函数没有参数,因此没有传统的边界值输入。
|
||
// 但我们可以考虑环境边界,例如磁盘已满时文件泄漏函数的反应。
|
||
// 由于模拟磁盘已满比较复杂,这里不包含该测试。
|
||
// 特殊场景:无参数函数,主要测试其固有的错误行为(泄漏、崩溃)。
|
||
|
||
int main(int argc, char **argv) {
|
||
::testing::InitGoogleTest(&argc, argv);
|
||
return RUN_ALL_TESTS();
|
||
}
|