Skip to content

test: Server 热插拔与杂项单元测试(UT-devicemanager-30) - #924

Merged
deepin-bot[bot] merged 8 commits into
linuxdeepin:masterfrom
add-uos:ut-t30
Oct 28, 2026
Merged

deepin-bot[bot] merged 8 commits into
linuxdeepin:masterfrom
add-uos:ut-t30

Conversation

@add-uos

@add-uos add-uos commented Oct 26, 2026

Copy link
Copy Markdown
Contributor

UT-devicemanager-30:Server 热插拔与杂项单元测试(qt-autotest-generator)

基于 upstream/master 6ccddaf4 的 ut-t30 任务分支,为 deepin-devicemanager-server 补充/重写 Google Test 单元测试,覆盖 7 个目标文件:

# 目标文件 测试文件 用例数
1 deepin-deviceinfo/src/hotplug/detectthread.cpp tests/src/UsbDetect/ut_detectthread.cpp 26
2 deepin-deviceinfo/src/hotplug/monitorusb.cpp tests/src/UsbDetect/ut_monitorusb.cpp 17
3 deepin-deviceinfo/src/controlinterface.cpp tests/src/ut_controlinterface.cpp 12
4 deepin-deviceinfo/src/loadinfo/deviceinfomanager.cpp tests/src/ut_DeviceInfoManager.cpp(既有,保留) 26
5 deepin-deviceinfo/src/debugtimemanager.cpp tests/src/ut_debugtimemanager.cpp 16
6 deepin-deviceinfo/src/plugin.cpp tests/src/ut_plugin.cpp + ut_mainjob.cpp 3
7 customgpuinfo/main.cpp tests/customgpuinfo/test_customgpuinfo_main.cpp(独立测试二进制) 16

测试结果

  • deepin-devicemanager-server-test:293/293 通过
  • customgpuinfo-test:16/16 通过
  • 测试质量自检(self-check-structural):6 个测试文件 0 error
  • 测试质量审查(test-review.py):PASS 6 · WARN 0 · FAIL 0 · ERROR 0

分级覆盖率(7 个目标文件,gcovr 采集)

级别 方法数 函数覆盖 行覆盖 分支
high 4 100% 100% 55.4%*
mid 12 100% 100% 59.5%
low 17 100% 100% 61.6%
总计 33/35 匹配 100% 100% 58.3%

* 高分支数主要来自 QString/QMap 等 Qt 内联模板展开的从未执行分支记录(taken0=0),目标源码分支已全部双向覆盖;2 个未匹配方法为 plugin.cpp 的 extern "C" 自由函数(脚本按 class::name( 匹配所致),实际均已覆盖。

打桩策略(不依赖真实设备/DBus/文件系统)

  • udev 库函数、select 等 C 层依赖:mangled-name extern "C" 打桩
  • QDBusAbstractInterface::call:经私有导出 doCall 打桩(不依赖真实总线)
  • QProcess/QFile/QDateTime/定时器:stub-ext(tests/3rdparty/stub)set_lamda 打桩
  • customgpuinfo 自带 main():经 #define main 重命名引入,独立 customgpuinfo-test 二进制

既有用例修复

  • ut_mainjob:SetUp 打桩 monitorWorkingDBFlag,修复收尾 SIGABRT
  • ut_CoreCpu:修正一处与被测语义不符的错误断言命名

CMake

仅追加([ut-t30] 注释段),不改既有行;inventory-summary.md、覆盖率报告等中间产物不入库。

@sourcery-ai

sourcery-ai Bot commented Oct 26, 2026

Copy link
Copy Markdown

Sorry @add-uos, your pull request is larger than the review limit of 150,000 diff characters

@github-actions

Copy link
Copy Markdown
  • 检测到敏感词export变动
详情
    {
    "export": {
        "deepin-devicemanager-server/tests/run-ut.sh": {
            "b": [
                "export QT_QPA_PLATFORM=${QT_QPA_PLATFORM:-offscreen}",
                "export ASAN_OPTIONS=${ASAN_OPTIONS:-detect_leaks=1}",
                "    export LSAN_OPTIONS=suppressions=\"$SCRIPT_DIR/lsan_suppressions.txt\"",
                "    export projectdir=\"$PROJECT_ROOT\"",
                "    export builddir=\"build-${TEST_DIR}\"",
                "    export reportdir=\"build-${TEST_DIR}\"",
                "    export GTEST_XML_DIR=\"$GTEST_XML_DIR\"",
                "    export COVERAGE_INFO=\"$BUILD_DIR/coverage.info\""
            ]
        }
    }
}

@github-actions

Copy link
Copy Markdown
  • 检测到敏感词export变动
详情
    {
    "export": {
        "deepin-devicemanager-server/tests/run-ut.sh": {
            "b": [
                "export QT_QPA_PLATFORM=${QT_QPA_PLATFORM:-offscreen}",
                "export ASAN_OPTIONS=${ASAN_OPTIONS:-detect_leaks=1}",
                "    export LSAN_OPTIONS=suppressions=\"$SCRIPT_DIR/lsan_suppressions.txt\"",
                "    export projectdir=\"$PROJECT_ROOT\"",
                "    export builddir=\"build-${TEST_DIR}\"",
                "    export reportdir=\"build-${TEST_DIR}\"",
                "    export GTEST_XML_DIR=\"$GTEST_XML_DIR\"",
                "    export COVERAGE_INFO=\"$BUILD_DIR/coverage.info\""
            ]
        }
    }
}

@github-actions

Copy link
Copy Markdown
  • 检测到敏感词export变动
详情
    {
    "export": {
        "deepin-devicemanager-server/tests/run-ut.sh": {
            "b": [
                "export QT_QPA_PLATFORM=${QT_QPA_PLATFORM:-offscreen}",
                "export ASAN_OPTIONS=${ASAN_OPTIONS:-detect_leaks=1}",
                "    export LSAN_OPTIONS=suppressions=\"$SCRIPT_DIR/lsan_suppressions.txt\"",
                "    export projectdir=\"$PROJECT_ROOT\"",
                "    export builddir=\"build-${TEST_DIR}\"",
                "    export reportdir=\"build-${TEST_DIR}\"",
                "    export GTEST_XML_DIR=\"$GTEST_XML_DIR\"",
                "    export COVERAGE_INFO=\"$BUILD_DIR/coverage.info\""
            ]
        }
    }
}

@github-actions

Copy link
Copy Markdown
  • 检测到敏感词export变动
详情
    {
    "export": {
        "deepin-devicemanager-server/tests/run-ut.sh": {
            "b": [
                "export QT_QPA_PLATFORM=${QT_QPA_PLATFORM:-offscreen}",
                "export ASAN_OPTIONS=${ASAN_OPTIONS:-detect_leaks=1}",
                "    export LSAN_OPTIONS=suppressions=\"$SCRIPT_DIR/lsan_suppressions.txt\"",
                "    export projectdir=\"$PROJECT_ROOT\"",
                "    export builddir=\"build-${TEST_DIR}\"",
                "    export reportdir=\"build-${TEST_DIR}\"",
                "    export GTEST_XML_DIR=\"$GTEST_XML_DIR\"",
                "    export COVERAGE_INFO=\"$BUILD_DIR/coverage.info\""
            ]
        }
    }
}

- 引入 tests/3rdparty/stub(stub-ext:set_lamda/ADDR 等标准打桩能力)
- tests/CMakeLists.txt 末尾追加:测试目标接入 stub-ext、QtTest 模块、plugin.cpp 重新纳入、新增 customgpuinfo-test 独立二进制(仅追加,不改既有行)
- 新增 run-ut.sh 一键编译/运行/覆盖率脚本与 LSan 抑制清单、ut-summary 生成脚本
- 26 用例覆盖构造初始缓存、curHwinfoUsbInfo(base64(MD5) 唯一键生成、hub 过滤、行数不足跳过、SysFS Device Link 优先)、getMapInfo、isUsbDevicesChanged、run、setWorkingFlag、slotUsbChanged(信号转发/超时窗口)、updateMemUsbInfo
- 每用例注入 // Arrange/Act/Assert 三段注释,每用例 ≥2 有效断言,顶部附用例计数声明表格
- hwinfo 输出、QProcess、定时器等外部依赖全部打桩,不依赖真实设备
- 覆盖构造初始化(udev 上下文/监听器/1s 轮询定时器)、monitor 主循环(工作标志退出、select 超时重入、fd 未就绪、空设备、连接/断开/蓝牙事件)、setWorkingFlag、slotTimeout(10s 防抖窗口)
- udev 库函数、select、QProcess 等 C 层依赖以 mangled-name extern C 打桩;注入 AAA 注释与用例计数声明
- 覆盖构造建立 DBus 接口、单例获取、disableOutDevice/disableInDevice/updateWakeup/setMonitorWorkingDBFlag 的无效接口与空接口跳过路径、monitorWorkingDBFlag 的有效回复/无效回复/无效接口/空接口四路径
- QDBusAbstractInterface::call 经私有导出 doCall(mangled-name)打桩,不依赖真实 DBus 总线
- DSMRegister 创建 MainJob 服务对象并返回 0、空名称路径、DSMUnRegister deleteLater 清理路径
- MainJob::SetUp 打桩 monitorWorkingDBFlag 为 false,防止 DetectThread 监听循环导致用例收尾 SIGABRT(修复既有用例)
- 新增 fixture 继承 ::testing::Test(SetUp/TearDown 内 stub.clear() 收口)
- beginPointQt/endPointQt 经 QDateTime::currentMSecsSinceEpoch 打桩控制时钟,覆盖耗时计算与 0ms 边界;beginPointLinux 多点位独立记录;clear 清空语义
- 既有 UT_001-003 空断言用例重写为双断言;全部用例补齐 AAA 注释与三段式命名
- 经 #define main 重命名引入 main(),覆盖 getGpuBaseInfo(QProcess 打桩:进程未结束/字段解析)、getGpuMemInfoForFTDTM(QFile 打桩:打开失败/空内容/无匹配/MB 转换/循环边界多元素)、main 退出码与 stdout 输出(成功/失败/空映射/多元素)
- getGpuMemInfoForFTDTM 打桩覆盖 main 的循环路径与退出码
The stub helper files (stub-shadow.cpp, stub-shadow.h, stubext.h) added by
this PR reuse headers inherited from an older copy, whose copyright range
"2021 - 2023" no longer satisfies the license-check CI. Replace it with a
single 2026 SPDX-FileCopyrightText year since these files are effectively
new in this PR, so the SPDX summary reports 0 failures.
@github-actions

Copy link
Copy Markdown
  • 检测到敏感词export变动
详情
    {
    "export": {
        "deepin-devicemanager-server/tests/run-ut.sh": {
            "b": [
                "export QT_QPA_PLATFORM=${QT_QPA_PLATFORM:-offscreen}",
                "export ASAN_OPTIONS=${ASAN_OPTIONS:-detect_leaks=1}",
                "    export LSAN_OPTIONS=suppressions=\"$SCRIPT_DIR/lsan_suppressions.txt\"",
                "    export projectdir=\"$PROJECT_ROOT\"",
                "    export builddir=\"build-${TEST_DIR}\"",
                "    export reportdir=\"build-${TEST_DIR}\"",
                "    export GTEST_XML_DIR=\"$GTEST_XML_DIR\"",
                "    export COVERAGE_INFO=\"$BUILD_DIR/coverage.info\""
            ]
        }
    }
}

@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

🤖 AI 代码审查报告

总体评分: 98 分 (通过阈值: 70分)

Pass


📊 总体评价

项目 结果
审查结论 代码审查通过
评分详情 本次提交为 deepin-devicemanager 服务端热插拔检测与杂项组件的单元测试补充(UT-devicemanager-30), 新增 18 个文件、8851 行代码,涵盖第三方 stub 打桩库、GPU 信息测试、USB 热插拔检测测试、 ControlInterface DBus 测试、DebugTimeManager 测试及插件入口测试。测试用例结构清晰、 边界覆盖全面、打桩策略合理,未发现安全漏洞。仅存在 1 处硬编码开发者路径的质量问题, 不影响测试编译与运行(有回退机制)。

🔍 详细分析

1. 语法逻辑 ✅

评价: 语法正确,逻辑清晰 ✅ 通过

潜在问题:
✅ 未发现明显问题

建议: []


2. 代码质量 ✅

评价: 代码结构清晰,注释完整 ✅ 通过

潜在问题:
✅ 未发现明显问题

建议: ['1. 将 run-ut.sh 中的 STUB_SRC 改为环境变量或相对路径,如 STUB_SRC=${STUB_SRC:-$SCRIPT_DIR/3rdparty/stub}', '2. 将 stubQProcessOutput 等公共打桩辅助函数提取到 tests/common/stub_helpers.h 中复用']


3. 代码性能 ✅

评价: 性能良好,资源使用合理 ✅ 通过

潜在问题:
✅ 未发现明显问题

建议: []


4. 代码安全 🔒

评价: 存在0个安全漏洞 ✅ 通过

🔐 发现 0 个安全漏洞

安全漏洞详情:
✅ 未发现安全漏洞

建议: []


💡 改进建议代码示例

# run-ut.sh 建议修复:将硬编码路径改为环境变量回退 # 修改前: #   STUB_SRC="/home/ut005769@uos/.agents/skills/qt-autotest-generator/scripts/../templates/stub-ext" # 修改后: STUB_SRC="${STUB_SRC:-$SCRIPT_DIR/3rdparty/stub}" STUB_DST="$SCRIPT_DIR/3rdparty/stub" if [ -d "$STUB_DST" ]; then
    print_info "stub-ext already present: $STUB_DST"
elif [ -d "$STUB_SRC" ]; then
    mkdir -p "$STUB_DST"
    cp -r "$STUB_SRC/." "$STUB_DST/"
    print_info "Synced stub-ext from: $STUB_SRC"
else
    print_warning "stub-ext source not found: $STUB_SRC"
    print_warning "Manual copy: cp -r <stub-ext>/ ${TEST_DIR}/3rdparty/stub/"
fi

本报告由 AI 代码审查工具自动生成

@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: add-uos, lzwind

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@add-uos

add-uos commented Oct 28, 2026

Copy link
Copy Markdown
Contributor Author

/forcemerge

@deepin-bot

deepin-bot Bot commented Oct 28, 2026

Copy link
Copy Markdown
Contributor

This pr force merged! (status: unstable)

@deepin-bot
deepin-bot Bot merged commit 66862b9 into linuxdeepin:master Oct 28, 2026
16 of 17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants