diff --git a/src/tests/logmanagertest.cpp b/src/tests/logmanagertest.cpp index 0d3dea43..04d7f13d 100644 --- a/src/tests/logmanagertest.cpp +++ b/src/tests/logmanagertest.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2022-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-only @@ -21,7 +21,9 @@ TEST_F(LogManagerTest, setSystemlog) // EXPECT_EQ(DBMLogManager::setSystemLog(),true); DBMLogManager::setSystemLog(true); - + // 恢复状态,避免影响后续 registerFileAppender 测试 + // systemLog=true 时日志路径切换到 /var/log/deepin/,普通用户无写权限 + DBMLogManager::setSystemLog(false); } TEST_F(LogManagerTest, registerConsoleAppender) diff --git a/src/tests/main.cpp b/src/tests/main.cpp index 2cd5a4a1..da3f5334 100644 --- a/src/tests/main.cpp +++ b/src/tests/main.cpp @@ -1,21 +1,49 @@ -// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2022-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-only #include #include +#include #ifdef QT_DEBUG #include #endif +// 覆盖率数据刷新:确保程序退出(含异常退出)时 .gcda 文件被正确写入 +extern "C" void __gcov_dump(); + +static void flushCoverage() +{ + __gcov_dump(); +} + +// 信号处理:捕获段错误等致命信号,先刷新覆盖率数据再退出 +static void crashHandler(int sig) +{ + __gcov_dump(); + _exit(128 + sig); +} + int main(int argc, char *argv[]) { + // 注册信号处理器,确保崩溃时覆盖率数据不丢失 + signal(SIGSEGV, crashHandler); + signal(SIGABRT, crashHandler); + signal(SIGBUS, crashHandler); + + // 注册 atexit 回调,在程序正常退出时刷新覆盖率数据 + atexit(flushCoverage); + QCoreApplication a(argc, argv); a.setOrganizationName("deepin"); a.setApplicationName("deepin-boot-maker"); ::testing::InitGoogleTest(&argc,argv); int ret = RUN_ALL_TESTS(); + + // 主动刷新覆盖率数据 + __gcov_dump(); + #ifdef QT_DEBUG __sanitizer_set_report_path("asan_loader.log"); #endif diff --git a/src/tests/test-recoverage.sh b/src/tests/test-recoverage.sh index 3bbf22f2..980570a8 100644 --- a/src/tests/test-recoverage.sh +++ b/src/tests/test-recoverage.sh @@ -1,40 +1,45 @@ #!/bin/bash -# SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +# SPDX-FileCopyrightText: 2022-2026 UnionTech Software Technology Co., Ltd. # # SPDX-License-Identifier: GPL-3.0-only BUILD_DIR=build REPORT_DIR=report -cd ../../ +# 自动检测 qmake6 / qmake +if command -v qmake6 &>/dev/null; then + QMAKE=qmake6 +else + QMAKE=qmake +fi -rm -rf $BUILD_DIR -mkdir $BUILD_DIR - -cd $BUILD_DIR +echo "Using qmake: $QMAKE ($($QMAKE --version 2>&1 | tail -1))" -qmake ../ -make +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" -cd ../src/tests/ rm -rf $BUILD_DIR mkdir $BUILD_DIR cd $BUILD_DIR -qmake CONFIG+=debug ../ - -TESTARGS="--gtest_output=xml:deepin_test_report_boot_maker.xml" make check -j$(nproc) +# 覆盖率构建不用 CONFIG+=debug,避免 ASAN 导致退出时崩溃、.gcda 文件丢失 +$QMAKE CONFIG+=release ../tests.pro -mv asan_loader.log* asan_dde-boot-maker.log +TESTARGS="--gtest_output=xml:deepin_test_report_boot_maker.xml" make check -j$(nproc) -[ -e asan_loader.log* ] && mv asan_loader.log* asan_dde-boot-maker.log || touch asan_dde-boot-maker.log +# ASAN 日志处理 +if ls asan_loader.log* 1>/dev/null 2>&1; then + mv asan_loader.log* asan_dde-boot-maker.log +else + touch asan_dde-boot-maker.log +fi +# 生成覆盖率报告 lcov -d ./ -c -o coverage_all.info - lcov --remove coverage_all.info "*/tests/*" "*/usr/include*" --output-file coverage.info cd .. genhtml -o $REPORT_DIR $BUILD_DIR/coverage.info #rm -rf $BUILD_DIR -exit 0 \ No newline at end of file +exit 0 diff --git a/src/tests/unittestobj.cpp b/src/tests/unittestobj.cpp index 83a90211..a6fb8306 100644 --- a/src/tests/unittestobj.cpp +++ b/src/tests/unittestobj.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2022-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-only @@ -18,7 +18,7 @@ void UnitTestObj::SetUpTestCase() void UnitTestObj::TearDownTestCase() { - delete m_pBMinterFace; + // BMInterface::ref() 返回单例引用,不能 delete,由 DSingleton 自动管理生命周期 m_pBMinterFace = nullptr; }