cdemo/tests/test_memory.cpp

60 lines
2.6 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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();
}