cdemo/tests/test_memory.cpp

72 lines
3.1 KiB
C++
Raw 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 函数
// 由于该函数存在内存泄漏,无法直接验证其正确性。
// 在实际修复后,可以验证内存分配是否成功,以及后续操作是否正确。
// 当前仅作为一个占位测试,标记该函数需要修复。
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();
}