Skip to content

test(DriverControl): add GTest suites for server drivercontrol module - #935

Open
add-uos wants to merge 1 commit into
linuxdeepin:masterfrom
add-uos:ut-t26
Open

add-uos wants to merge 1 commit into
linuxdeepin:masterfrom
add-uos:ut-t26

Conversation

@add-uos

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

Copy link
Copy Markdown
Contributor

概要

为 deepin-devicemanager-server 驱动工具(drivercontrol/securityutils/notifythread/main)补充 Google Test 单元测试,覆盖 Issue 指定的 6 个源文件。

变更内容

  • 新增 tests/src/DriverControl/ut_httpdriverinterface.cpp(25 用例):HTTP 驱动查询、JSON 解析、按设备类型分发、单例生命周期
  • 新增 tests/src/DriverControl/ut_notifythread.cpp(4 用例):线程启动/停止
  • 重写 ut_Utils.cpp(40 用例):os-build 解析、锁探测(跨进程 POSIX 锁)、驱动包判定等
  • 增强 ut_fdutil.cpp(19 用例):fd 复制/桥接错误分支(fstat 失败、只写 fd、mkpath 失败等)
  • 引入 vendored stub-ext(tests/3rdparty/stub/),DBus/网络/文件系统等外部依赖全部打桩,测试不依赖真实设备
  • tests/gen-ut-summary.py 增加无 lcov 环境下的纯 Python .info 解析回退

测试结果

  • 全部 21 个测试套件:281 用例,277 通过;4 项失败均为基线既有问题(CoreCpu/DetectThread/MonitorUsb/ThreadPoolTask),与本 PR 无关
  • 分级覆盖率(39 方法中 37 可测):high 90.0% / mid 97.6% / low 98.1%,函数覆盖 100%,达标线(high≥90%)

Log

UT-devicemanager-26 单元测试补充任务产物

Influence

仅新增/增强测试代码与测试基建,不改动生产逻辑

@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\""
            ]
        }
    }
}

@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

🤖 AI 代码审查报告

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

Pass


📊 总体评价

项目 结果
审查结论 代码审查通过
评分详情 本次提交为 deepin-devicemanager-server DriverControl 模块新增 GTest 测试套件, 测试代码本身采用规范的 Arrange/Act/Assert 模式,分支覆盖文档完善,stub 隔离设计合理。 但支撑脚本 run-ut.sh 存在 CMake 编译标志不匹配(BUILD_TESTS vs CMAKE_COVERAGE_ARG)和 测试二进制名 glob 模式不匹配(test_* vs 实际 -test)两个逻辑错误,导致测试运行器无法正常工作; gen-ut-summary.py 的 parse_info_pure 回退路径中 cur 计数器在 end_of_record 后未重置, 可能导致覆盖率统计不准确。3rdparty stub 框架存在未初始化变量、regcomp 返回值未检查等已知问题。 代码安全维度无漏洞,代码质量与性能维度表现良好。综合评分 79 分,审查通过。

🔍 详细分析

1. 语法逻辑 ❌

评价: 存在逻辑缺陷 ❌ 不通过

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

建议: ['run-ut.sh: 将 -DBUILD_TESTS=ON 改为 -DCMAKE_COVERAGE_ARG="CMAKE_COVERAGE_ARG_ON"', 'run-ut.sh: 将 -name "test_" 改为 -name "test" 或 -name "-test"', 'gen-ut-summary.py: 在 end_of_record 分支中累加后添加 cur_lh = cur_lf = cur_fnf = cur_fnh = 0', 'addr_any.h: 初始化 match = 0,检查 regcomp 返回值,在所有退出路径调用 regfree']


2. 代码质量 ✅

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

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

建议: ['run-ut.sh: 将 STUB_SRC 改为环境变量 STUB_EXT_SRC 或移除此同步步骤(stub 已随仓库提交)', 'ut_notifythread.cpp: 为 readAll 调用使用独立计数器 g_readAllCalls', '3rdparty stub.h: 将 throw("...") 改为 throw std::runtime_error("...")']


3. 代码性能 ✅

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

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

建议: []


4. 代码安全 🔒

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

🔐 发现 0 个安全漏洞

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

建议: []


💡 改进建议代码示例

# run-ut.sh 修复:CMake 编译标志与二进制名匹配
step_2_configure_cmake() {
    print_step 2 "Configuring CMake..."
    mkdir -p "$BUILD_DIR"
    cd "$BUILD_DIR"
    cmake "$PROJECT_ROOT" \
        -DCMAKE_BUILD_TYPE=Debug \
        -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
        -DCMAKE_COVERAGE_ARG="CMAKE_COVERAGE_ARG_ON" \
        -DCMAKE_SAFETYTEST_ARG="CMAKE_SAFETYTEST_ARG_ON" \
        -DCMAKE_C_FLAGS="--coverage" \
        -DCMAKE_CXX_FLAGS="--coverage" \
        -DCMAKE_EXE_LINKER_FLAGS="--coverage" \
        -DCMAKE_SHARED_LINKER_FLAGS="--coverage"
    print_success "CMake configuration completed"
}

discover_test_binaries() {
    local found
    found=$(find "$BUILD_DIR/$TEST_DIR/src" -maxdepth 1 -type f -executable -name "*test*" 2>/dev/null | sort)
    if [ -z "$found" ]; then
        found=$(find "$BUILD_DIR" -maxdepth 4 -type f -executable -name "*test*" \
            -not -name "*.so" -not -name "*.a" -not -name "*.cmake" 2>/dev/null | sort)
    fi
    echo "$found"
}

# gen-ut-summary.py 修复:end_of_record 后重置计数器
def _parse_info_pure(coverage_info):
    lh = lf = fnf = fnh = 0
    cur_lh = cur_lf = cur_fnf = cur_fnh = 0
    with open(coverage_info, encoding="utf-8", errors="replace") as fp:
        for raw in fp:
            line = raw.strip()
            if line == "end_of_record":
                lh += cur_lh; lf += cur_lf; fnf += cur_fnf; fnh += cur_fnh
                cur_lh = cur_lf = cur_fnf = cur_fnh = 0  # FIX: reset counters
            elif line.startswith("LH:"):
                try: cur_lh = int(line[3:])
                except ValueError: pass
            elif line.startswith("LF:"):
                try: cur_lf = int(line[3:])
                except ValueError: pass
            elif line.startswith("FNF:"):
                try: cur_fnf = int(line[4:])
                except ValueError: pass
            elif line.startswith("FNH:"):
                try: cur_fnh = int(line[4:])
                except ValueError: pass
    # ... rest unchanged

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

新增 deepin-devicemanager-server DriverControl 模块单元测试:
- ut_Utils:40 用例(getUrl/kernelRelease/getOsBuild/getVersion/isFileLocked/
  executeServerCmd/file2PackageName/getModuleFilePath/unInstallPackage/
  updateModDeps/isDpkgLocked/isDriverPackage/hierarchicalEnabled/addModBlackList,
  含跨进程 POSIX 锁探测与 find 兜底分支)
- ut_fdutil:19 用例(isValidComponentName/sanitizedFileName/copyFileByFd/
  copyDebsFromDirFd/bridgeFdToTempFile/removeBridgedTempFile 等 fdutil 导出
  函数,含 fd EOF 重读、fstat 失败、只写 fd、mkpath 失败等错误分支回归)
- ut_httpdriverinterface:28 用例(单例生命周期/getRequestBoard(V25+legacy)/
  getRequestPrinter/getRequestCamera/getRequestJson/getDriverInfoFromJson/
  checkDriverInfo 按设备类型分发,网络层经 stub-ext 全量打桩)
- ut_notifythread:3 用例(线程启动/命令执行/异常路径,QThread::sleep 打桩)
- 测试基建:3rdparty/stub(stub-ext)、run-ut.sh、gen-ut-summary.py(含无 lcov
  回退解析)、lsan_suppressions.txt,tests/CMakeLists.txt 追加 server 测试目标

self-check-structural 全部 0 error;受影响 4 套件 90/90 通过;
全部 21 套件 281 用例、277 通过(4 项失败为基线既有,与本提交无关);
分级覆盖率 high 90.0% / mid 97.6% / low 98.1%,函数覆盖 100%;
外部依赖(QProcess/DBus/网络/文件锁/QThread)全部打桩隔离,不依赖真实设备。

Log: 补充 DriverControl 模块单元测试
Influence: deepin-devicemanager-server-tests
@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

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