From 4ea28107f8c9f88028a37494766faa3878b2ae1b Mon Sep 17 00:00:00 2001 From: zhanghongyuan Date: Fri, 23 Oct 2026 18:12:19 +0800 Subject: [PATCH 1/2] fix: correct packageHasInstalled false positive for uninstalled packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Root cause: packageHasInstalled used r.contains("installed") which matches dpkg's not-installed output "package 'x' is not installed" 2. Fix: change to r.contains("Status: install ok installed") for exact dpkg status line matching 3. Impact: dde-printer status detection in PageMultiInfo and PageSingleInfo now correctly returns false when the package is not installed Influence: 1. Test dde-printer detection when dde-printer is installed 2. Test dde-printer detection when dde-printer is not installed 3. Verify no regression on device manager printer menu display fix: 修复未安装包被误判为已安装的问题 1. 根因:packageHasInstalled 使用 r.contains("installed") 模糊匹配, dpkg 未安装包输出 "package 'x' is not installed" 同样包含该子串 2. 方案:改为 r.contains("Status: install ok installed") 精确匹配 dpkg 标准状态行 3. 影响:PageMultiInfo 和 PageSingleInfo 中 dde-printer 安装检测 在未安装时正确返回 false Influence: 1. 测试已安装 dde-printer 时的检测结果 2. 测试未安装 dde-printer 时的检测结果 3. 验证设备管理器打印机菜单显示无回归 PMS: BUG-DEF-DM-PAGE-001 --- deepin-devicemanager/src/Page/PageInfo.cpp | 2 +- .../tests/src/Page/ut_pageinfo.cpp | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/deepin-devicemanager/src/Page/PageInfo.cpp b/deepin-devicemanager/src/Page/PageInfo.cpp index cb74f351d..e508750c2 100644 --- a/deepin-devicemanager/src/Page/PageInfo.cpp +++ b/deepin-devicemanager/src/Page/PageInfo.cpp @@ -77,7 +77,7 @@ bool PageInfo::packageHasInstalled(const QString &packageName) p.waitForFinished(-1); QByteArray r = p.readAll(); - bool installed = r.contains("installed"); + bool installed = r.contains("Status: install ok installed"); qCDebug(appLog) << "Package" << packageName << "is" << (installed ? "installed" : "not installed"); return installed; } diff --git a/deepin-devicemanager/tests/src/Page/ut_pageinfo.cpp b/deepin-devicemanager/tests/src/Page/ut_pageinfo.cpp index bf6114338..e8f7f99b7 100644 --- a/deepin-devicemanager/tests/src/Page/ut_pageinfo.cpp +++ b/deepin-devicemanager/tests/src/Page/ut_pageinfo.cpp @@ -48,3 +48,50 @@ TEST_F(PageInfo_UT, PageInfo_UT_paintEvent) m_pageInfo->paintEvent(&paint); delete p; } + +// Parametrized test for PageInfo::packageHasInstalled +// Stub readAll to inject controlled dpkg output without running dpkg +static QByteArray g_readAllData; + +static QByteArray ut_QIODevice_readAll(void *self) +{ + Q_UNUSED(self) + return g_readAllData; +} + +struct PackageHasInstalledParam { + QByteArray dpkgOutput; + bool expected; +}; + +class PackageHasInstalled_UT + : public UT_HEAD + , public testing::WithParamInterface +{ +public: + void SetUp() override {} + void TearDown() override {} +}; + +TEST_P(PackageHasInstalled_UT, packageHasInstalled) +{ + g_readAllData = GetParam().dpkgOutput; + + Stub stub; + stub.set(ADDR(QIODevice, readAll), ut_QIODevice_readAll); + + PageMultiInfo *p = new PageMultiInfo; + PageInfo *pageInfo = dynamic_cast(p); + bool result = pageInfo->packageHasInstalled("test-package"); + EXPECT_EQ(GetParam().expected, result); + delete p; +} + +INSTANTIATE_TEST_SUITE_P(PackageHasInstalledCases, PackageHasInstalled_UT, + testing::Values( + PackageHasInstalledParam{"Status: install ok installed\n", true}, + PackageHasInstalledParam{"Package: dde-printer\nStatus: install ok installed\nPriority: optional\n", true}, + PackageHasInstalledParam{"", false}, + PackageHasInstalledParam{"package 'x' is not installed\n", false} + ) +); From 221e4be7d515ea9a706a5af76d8bbd43ce41783f Mon Sep 17 00:00:00 2001 From: zhanghongyuan Date: Mon, 26 Oct 2026 18:11:37 +0800 Subject: [PATCH 2/2] chore: update SPDX copyright year to 2022-2026 (CI SPDX check) --- deepin-devicemanager/src/Page/PageInfo.cpp | 2 +- deepin-devicemanager/tests/src/Page/ut_pageinfo.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deepin-devicemanager/src/Page/PageInfo.cpp b/deepin-devicemanager/src/Page/PageInfo.cpp index e508750c2..993d6a7ce 100644 --- a/deepin-devicemanager/src/Page/PageInfo.cpp +++ b/deepin-devicemanager/src/Page/PageInfo.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-or-later diff --git a/deepin-devicemanager/tests/src/Page/ut_pageinfo.cpp b/deepin-devicemanager/tests/src/Page/ut_pageinfo.cpp index e8f7f99b7..72d9cad44 100644 --- a/deepin-devicemanager/tests/src/Page/ut_pageinfo.cpp +++ b/deepin-devicemanager/tests/src/Page/ut_pageinfo.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2019 ~ 2020 UnionTech Software Technology Co.,Ltd +// Copyright (C) 2019-2026 ~ 2020 UnionTech Software Technology Co.,Ltd // SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later