Skip to content

Conversation

@ComixHe
Copy link
Contributor

@ComixHe ComixHe commented Jan 28, 2026

Summary by Sourcery

Adjust test utilities to resolve data and tools directories via QDir navigation to stable absolute paths.

Tests:

  • Update desktop entry tests to locate test data and desktop files using parent directory traversal into tests/data.
  • Update application manager tests to derive the tools working directory and pid file path via QDir and absolute paths.
  • Update hook-loading test to resolve the hooks.d directory via QDir traversal into tests/data/hooks.d for loading JSON hooks.

Signed-off-by: ComixHe <heyuming@deepin.org>
@sourcery-ai
Copy link

sourcery-ai bot commented Jan 28, 2026

Reviewer's Guide

Refactors test data path handling in several tests to use directory traversal from the build directory and QDir’s absolute paths, ensuring correct relative paths when tests are run from different working directories.

File-Level Changes

Change Details Files
Normalize test data directory resolution in ut_desktopentry to use QDir traversal and absolute paths.
  • In SetUpTestCase, replace construction of XDG_DATA_DIRS from current/data with a QDir that moves two levels up and into tests/data, then exports its absolute path via qputenv.
  • In desktopFile test, replace manual string concatenation of current/data/applications/deepin-editor.desktop with a QDir that moves two levels up, enters tests/data/applications, and uses absoluteFilePath for the desktop file path.
tests/ut_desktopentry.cpp
Make ut_applicationmanager test working directory resolution robust by using QDir navigation and absolute paths.
  • Replace QDir::cleanPath string composition of ../tools from current directory with a QDir that moves two levels up and cd("tools").
  • Update QFile, QProcess::setWorkingDirectory, and systemd-run --working-directory arguments to use the QDir’s absolute path and absoluteFilePath for pid.txt.
  • Update the helper call that previously took workingDir to pass workingDir.absolutePath() instead.
tests/ut_applicationmanager.cpp
Update ut_hook test to locate hook configuration via QDir traversal instead of relative path string concatenation.
  • Add explicit gtest include before Qt headers (reordering includes slightly).
  • Replace QDir::currentPath-based concatenation of data/hooks.d/1-test.json with a QDir that moves two levels up, enters tests/data/hooks.d, and uses absoluteFilePath for the JSON file path.
tests/ut_hook.cpp

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@deepin-ci-robot
Copy link

deepin pr auto review

这段代码主要修改了测试用例中获取资源文件路径的方式,从手动拼接字符串改为使用 QDir 的导航方法。以下是对这段 diff 的详细审查,包括语法逻辑、代码质量、代码性能和代码安全方面的改进意见。

1. 总体评价

这次修改的主要目的是提高代码的可移植性和健壮性。原代码通过字符串拼接(QDir::separator())来构建路径,这在不同操作系统或不同构建目录结构下容易出错。新代码使用了 QDir::cdUp()QDir::cd() 进行相对路径导航,这是一种更符合 Qt 风格的做法,减少了硬编码的路径层级假设。

2. 代码审查与改进意见

A. 语法逻辑

  • 现状:逻辑正确。QDir::cdUp()QDir::cd() 返回布尔值表示操作是否成功,代码中使用 ASSERT_TRUE 进行了检查,符合单元测试的逻辑。
  • 潜在风险:代码中连续使用了两次 cdUp()(例如 ut_applicationmanager.cpput_desktopentry.cpp)。这意味着测试代码强依赖当前的构建目录结构。
    • 如果测试运行在构建目录的子目录中(例如 build/tests/unit),两次 cdUp() 会到达 build 目录,再进入 tools 是合理的。
    • 如果构建目录结构发生变化(例如变成 build/debug/tests),或者直接在源码目录运行测试(某些 IDE 配置),路径导航就会失败。
  • 改进建议
    • 尽量减少对构建目录结构的硬编码依赖。如果可能,使用 CMake 在构建时生成一个 config.h 或通过环境变量传递资源文件的绝对路径。
    • 如果必须使用相对路径,建议封装一个辅助函数,并在注释中明确说明预期的目录结构。

B. 代码质量

  • 可读性显著提升

    • 原代码:QDir::cleanPath(QDir::current().absolutePath() + QDir::separator() + ".." + ...)
    • 新代码:workingDir.cdUp(); workingDir.cd("tools");
    • 新代码更清晰地表达了"向上两级目录然后进入 tools"的意图。
  • 可维护性提升。如果需要修改目录结构,只需修改 cd 的参数,而不是去修改复杂的字符串拼接。

  • 重复代码

    • 在三个文件中(ut_applicationmanager.cpp, ut_desktopentry.cpp, ut_hook.cpp),都出现了相似的 cdUp(); cdUp(); cd("...") 模式。
  • 改进建议

    • 提取公共辅助函数:建议在测试基类或一个公共的头文件中创建一个静态辅助函数,用于定位测试资源目录。这样可以集中管理路径逻辑,便于未来修改。
    // 建议在某个公共头文件中添加
    inline QDir GetTestResourceDir(const QString &relativePath) {
        auto dir = QDir::current();
        // 假设测试总是运行在 build/tests/... 下,需要回到 build 根目录
        // 这里的逻辑需要根据实际构建系统调整,或者通过 CMake 传递深度
        if (dir.cdUp() && dir.cdUp()) {
            if (dir.cd(relativePath)) {
                return dir;
            }
        }
        // 如果失败,返回空目录或抛出异常,取决于测试框架的处理方式
        return QDir();
    }
    
    // 使用示例
    // auto workingDir = GetTestResourceDir("tools");
    // ASSERT_FALSE(workingDir.absolutePath().isEmpty());

C. 代码性能

  • 现状:性能影响极小。QDir 的操作主要涉及字符串处理,在单元测试的 Setup 阶段执行,对整体性能影响可以忽略不计。
  • 改进意见:无需特别优化。

D. 代码安全

  • 路径注入/遍历:原代码和新代码都使用了 InstanceIdarg 来拼接字符串作为参数传给 systemd-run
    • QString{R"(--unit=app-DDE-test\x2dApplication@%1.service)"}.arg(InstanceId)
    • 虽然这是测试代码,但如果 InstanceId 包含特殊字符(虽然来源是 InstancePath,通常较安全),可能会造成意外的命令行为。
    • 建议:确保 InstanceId 的来源是可信的,或者对其进行严格的格式校验(例如只允许字母数字和特定符号)。

3. 具体文件审查细节

ut_applicationmanager.cpp

  • 观察:使用了 workingDir.absolutePath() 传递给外部进程。
  • 建议:这是正确的做法,因为外部进程需要绝对路径来定位工作目录。

ut_desktopentry.cpp

  • 观察:修改了环境变量 XDG_DATA_DIRS

  • 建议

    • SetUpTestCase 中修改了环境变量,但没有看到对应的 TearDownTestCase 恢复环境变量。
    • 虽然代码开头保存了 env = qgetenv("XDG_DATA_DIRS"),但似乎没有在测试后恢复。
    • 改进:确保在测试结束后恢复环境变量,以免影响后续运行的测试或进程。
    static void TearDownTestCase() {
        if (!env.isEmpty()) {
            qputenv("XDG_DATA_DIRS", env);
        } else {
            qunsetenv("XDG_DATA_DIRS");
        }
    }

ut_hook.cpp

  • 观察:头文件顺序调整。
  • 建议:将 #include <gtest/gtest.h> 放在更靠前的位置是好的做法(符合 Google Test 风格指南),因为它是测试框架的主头文件。

4. 总结建议

  1. 封装路径逻辑:将重复的 cdUp 逻辑封装成一个公共的辅助函数,避免代码重复并提高可维护性。
  2. 环境变量恢复:在 ut_desktopentry.cpp 中添加 TearDownTestCase 以恢复被修改的环境变量。
  3. 注释目录结构:在测试文件顶部添加注释,明确说明该测试预期的运行目录结构(例如:Expected to run from build/tests/...),防止其他开发者因目录结构不同导致测试失败。
  4. 使用 absoluteFilePath:继续保持使用 absoluteFilePath 而不是字符串拼接,这是本次 diff 的亮点,值得保持。

Copy link

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 3 issues, and left some high level feedback:

  • The repeated cdUp()/cd(<subdir>) sequences to locate tests/data and tools directories could be centralized into a small helper (e.g. testRootDir() or testDataDir()), which would reduce duplication and make future path changes easier to manage.
  • These path calculations still assume the test working directory is two levels under the repository root; if the tests are ever run from a different CWD this will break, so consider basing paths on a more stable reference (e.g. a CMake-configured test data root or the executable location) instead of QDir::current().
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The repeated `cdUp()`/`cd(<subdir>)` sequences to locate `tests/data` and `tools` directories could be centralized into a small helper (e.g. `testRootDir()` or `testDataDir()`), which would reduce duplication and make future path changes easier to manage.
- These path calculations still assume the test working directory is two levels under the repository root; if the tests are ever run from a different CWD this will break, so consider basing paths on a more stable reference (e.g. a CMake-configured test data root or the executable location) instead of `QDir::current()`.

## Individual Comments

### Comment 1
<location> `tests/ut_desktopentry.cpp:19-23` </location>
<code_context>
-        auto curDir = QDir::current();
-        QByteArray fakeXDG = (curDir.absolutePath() + QDir::separator() + "data").toLocal8Bit();
-        ASSERT_TRUE(qputenv("XDG_DATA_DIRS", fakeXDG));
+        auto fakeXDG = QDir::current();
+        ASSERT_TRUE(fakeXDG.cdUp());
+        ASSERT_TRUE(fakeXDG.cdUp());
+        ASSERT_TRUE(fakeXDG.cd("tests/data"));
+        ASSERT_TRUE(qputenv("XDG_DATA_DIRS", fakeXDG.absolutePath().toLocal8Bit()));
         ParserError err;
         auto file = DesktopFile::searchDesktopFileById("deepin-editor", err);
</code_context>

<issue_to_address>
**suggestion (testing):** Consider using a shared helper or QFINDTESTDATA-style lookup for the test data root instead of hardcoding `cdUp()` hops.

These `cdUp()` calls still rely on a fixed directory layout (two levels up, then `tests/data`), which can break under different IDE/CTest/build setups. Centralizing the lookup in a helper (e.g. `QDir testDataRoot()`) or using `QFINDTESTDATA` would make the tests more portable and avoid duplicating this logic later in the file.

Suggested implementation:

```cpp
    static QDir testDataRoot()
    {
        const QString marker = QLatin1String("tests/data");

#ifdef QFINDTESTDATA
        // Try to locate the tests/data directory using QFINDTESTDATA in a
        // build-system independent way. We use "." as a neutral marker and
        // then walk up to find a matching tests/data directory.
        const QString candidate = QFINDTESTDATA(".");
        if (!candidate.isEmpty()) {
            QDir dir(candidate);
            const int idx = candidate.indexOf(marker);
            if (idx != -1) {
                // If the resolved path already contains "tests/data", cut it there.
                return QDir(candidate.left(idx + marker.size()));
            }

            // Otherwise walk upwards until we find a tests/data directory.
            while (!dir.isRoot()) {
                QDir probe(dir);
                if (probe.cd(marker)) {
                    return probe;
                }
                dir.cdUp();
            }
        }
#endif

        // Fallback: walk up from the current directory until we find tests/data.
        QDir dir = QDir::current();
        while (!dir.isRoot()) {
            QDir probe(dir);
            if (probe.cd(marker)) {
                return probe;
            }
            dir.cdUp();
        }

        // As a last resort, return the current directory (tests may fail visibly).
        return QDir::current();
    }

    static void SetUpTestCase()

```

```cpp
        env = qgetenv("XDG_DATA_DIRS");
        const auto fakeXDG = testDataRoot();
        ASSERT_TRUE(qputenv("XDG_DATA_DIRS", fakeXDG.absolutePath().toLocal8Bit()));

```

```cpp
    auto desktopFileDir = testDataRoot();

```

1. Ensure that this file includes the necessary Qt headers if they are not already present:
   - `<QDir>`
   - `<QString>`
   - `<QTest>` (or a header that provides the `QFINDTESTDATA` macro).
2. If your project’s QtTest setup doesn’t define `QFINDTESTDATA` in this compilation unit, either:
   - Add the proper QtTest include, or
   - Remove/adjust the `#ifdef QFINDTESTDATA` block and rely solely on the fallback directory walk as appropriate for your environment.
3. If your actual test data root is not literally `tests/data` or uses a different relative structure, update the `marker` constant in `testDataRoot()` accordingly so it resolves the correct directory.
</issue_to_address>

### Comment 2
<location> `tests/ut_desktopentry.cpp:47-51` </location>
<code_context>
-    auto curDir = QDir::current();
-    QString path{curDir.absolutePath() + QDir::separator() + "data" + QDir::separator() + "applications" + QDir::separator() +
-                 "deepin-editor.desktop"};
+    auto desktopFileDir = QDir::current();
+    ASSERT_TRUE(desktopFileDir.cdUp());
+    ASSERT_TRUE(desktopFileDir.cdUp());
+    ASSERT_TRUE(desktopFileDir.cd("tests/data/applications"));
+    const auto& path = desktopFileDir.absoluteFilePath("deepin-editor.desktop");
     EXPECT_EQ(exampleFile->sourcePath(), path);
     EXPECT_EQ(exampleFile->desktopId().toStdString(), "deepin-editor");
</code_context>

<issue_to_address>
**suggestion:** Reuse the same data-root resolution as in `SetUpTestCase` to keep the desktop file path logic consistent.

This test now resolves the path differently from `SetUpTestCase` (manual `cdUp()` twice into `tests/data/applications` vs. using the shared data-root logic). If the directory layout changes, both places must be updated in lockstep. Consider reusing the same helper or deriving `applications` from the directory used in `SetUpTestCase` to avoid divergence between setup and the expected `sourcePath()` value.

Suggested implementation:

```cpp
    const auto &fileptr = file();
    ASSERT_FALSE(fileptr.isNull());
    const auto &exampleFile = file();

    // Resolve the desktop file path based on the same data-root used to set XDG_DATA_DIRS.
    QDir applicationsDir{fakeXDG};
    ASSERT_TRUE(applicationsDir.cd("applications"));
    const auto &path = applicationsDir.absoluteFilePath("deepin-editor.desktop");

    EXPECT_EQ(exampleFile->sourcePath(), path);
    EXPECT_EQ(exampleFile->desktopId().toStdString(), "deepin-editor");
}

```

If `fakeXDG` is not the same directory used in `SetUpTestCase` as the data-root, replace `fakeXDG` with the actual data-root `QDir` (e.g., a static member initialized in `SetUpTestCase`) so that both the environment (`XDG_DATA_DIRS`) and the expected `sourcePath()` derive from the same root.
</issue_to_address>

### Comment 3
<location> `tests/ut_hook.cpp:12-17` </location>
<code_context>
 {
-    auto file =
-        QDir::currentPath() + QDir::separator() + "data" + QDir::separator() + "hooks.d" + QDir::separator() + "1-test.json";
+    auto hooksDir = QDir::current();
+    ASSERT_TRUE(hooksDir.cdUp());
+    ASSERT_TRUE(hooksDir.cdUp());
+    ASSERT_TRUE(hooksDir.cd("tests/data/hooks.d"));
+
+    auto file = hooksDir.absoluteFilePath("1-test.json");
     auto hook = ApplicationHook::loadFromFile(file);
     EXPECT_TRUE(hook);
</code_context>

<issue_to_address>
**suggestion (testing):** Make hook test data lookup resilient to different working directories (e.g. via a shared helper or QFINDTESTDATA).

This test currently assumes the process starts two levels below the project root and that `tests/data/hooks.d` exists there, which can be brittle under different runners. Consider resolving `1-test.json` via a shared `testDataRoot()` helper (as used in other tests) or a `QFINDTESTDATA`-style approach so it no longer depends on the initial working directory.

Suggested implementation:

```cpp
#include "applicationHooks.h"
#include <gtest/gtest.h>
#include <QDir>
#include <QStringList>
#include <QtTest/QTest>

```

```cpp
TEST(ApplicationHookTest, load)
{
    const auto file = QFINDTESTDATA("data/hooks.d/1-test.json");
    ASSERT_FALSE(file.isEmpty());

    auto hook = ApplicationHook::loadFromFile(QString::fromUtf8(file));

```

To fully support this change, ensure that `data/hooks.d/1-test.json` is correctly registered as test data in your build system so that `QFINDTESTDATA("data/hooks.d/1-test.json")` can locate it. For example, with qmake you would add it to `TESTDATA += data/hooks.d/1-test.json`, and with CMake/Qt6 you would typically use `qt_add_test()` / `qt_add_resources()` or `set_tests_properties()` equivalents to install or expose the test data at runtime.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment on lines +19 to +23
auto fakeXDG = QDir::current();
ASSERT_TRUE(fakeXDG.cdUp());
ASSERT_TRUE(fakeXDG.cdUp());
ASSERT_TRUE(fakeXDG.cd("tests/data"));
ASSERT_TRUE(qputenv("XDG_DATA_DIRS", fakeXDG.absolutePath().toLocal8Bit()));
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): Consider using a shared helper or QFINDTESTDATA-style lookup for the test data root instead of hardcoding cdUp() hops.

These cdUp() calls still rely on a fixed directory layout (two levels up, then tests/data), which can break under different IDE/CTest/build setups. Centralizing the lookup in a helper (e.g. QDir testDataRoot()) or using QFINDTESTDATA would make the tests more portable and avoid duplicating this logic later in the file.

Suggested implementation:

    static QDir testDataRoot()
    {
        const QString marker = QLatin1String("tests/data");

#ifdef QFINDTESTDATA
        // Try to locate the tests/data directory using QFINDTESTDATA in a
        // build-system independent way. We use "." as a neutral marker and
        // then walk up to find a matching tests/data directory.
        const QString candidate = QFINDTESTDATA(".");
        if (!candidate.isEmpty()) {
            QDir dir(candidate);
            const int idx = candidate.indexOf(marker);
            if (idx != -1) {
                // If the resolved path already contains "tests/data", cut it there.
                return QDir(candidate.left(idx + marker.size()));
            }

            // Otherwise walk upwards until we find a tests/data directory.
            while (!dir.isRoot()) {
                QDir probe(dir);
                if (probe.cd(marker)) {
                    return probe;
                }
                dir.cdUp();
            }
        }
#endif

        // Fallback: walk up from the current directory until we find tests/data.
        QDir dir = QDir::current();
        while (!dir.isRoot()) {
            QDir probe(dir);
            if (probe.cd(marker)) {
                return probe;
            }
            dir.cdUp();
        }

        // As a last resort, return the current directory (tests may fail visibly).
        return QDir::current();
    }

    static void SetUpTestCase()
        env = qgetenv("XDG_DATA_DIRS");
        const auto fakeXDG = testDataRoot();
        ASSERT_TRUE(qputenv("XDG_DATA_DIRS", fakeXDG.absolutePath().toLocal8Bit()));
    auto desktopFileDir = testDataRoot();
  1. Ensure that this file includes the necessary Qt headers if they are not already present:
    • <QDir>
    • <QString>
    • <QTest> (or a header that provides the QFINDTESTDATA macro).
  2. If your project’s QtTest setup doesn’t define QFINDTESTDATA in this compilation unit, either:
    • Add the proper QtTest include, or
    • Remove/adjust the #ifdef QFINDTESTDATA block and rely solely on the fallback directory walk as appropriate for your environment.
  3. If your actual test data root is not literally tests/data or uses a different relative structure, update the marker constant in testDataRoot() accordingly so it resolves the correct directory.

Comment on lines +47 to +51
auto desktopFileDir = QDir::current();
ASSERT_TRUE(desktopFileDir.cdUp());
ASSERT_TRUE(desktopFileDir.cdUp());
ASSERT_TRUE(desktopFileDir.cd("tests/data/applications"));
const auto& path = desktopFileDir.absoluteFilePath("deepin-editor.desktop");
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Reuse the same data-root resolution as in SetUpTestCase to keep the desktop file path logic consistent.

This test now resolves the path differently from SetUpTestCase (manual cdUp() twice into tests/data/applications vs. using the shared data-root logic). If the directory layout changes, both places must be updated in lockstep. Consider reusing the same helper or deriving applications from the directory used in SetUpTestCase to avoid divergence between setup and the expected sourcePath() value.

Suggested implementation:

    const auto &fileptr = file();
    ASSERT_FALSE(fileptr.isNull());
    const auto &exampleFile = file();

    // Resolve the desktop file path based on the same data-root used to set XDG_DATA_DIRS.
    QDir applicationsDir{fakeXDG};
    ASSERT_TRUE(applicationsDir.cd("applications"));
    const auto &path = applicationsDir.absoluteFilePath("deepin-editor.desktop");

    EXPECT_EQ(exampleFile->sourcePath(), path);
    EXPECT_EQ(exampleFile->desktopId().toStdString(), "deepin-editor");
}

If fakeXDG is not the same directory used in SetUpTestCase as the data-root, replace fakeXDG with the actual data-root QDir (e.g., a static member initialized in SetUpTestCase) so that both the environment (XDG_DATA_DIRS) and the expected sourcePath() derive from the same root.

Comment on lines +12 to +17
auto hooksDir = QDir::current();
ASSERT_TRUE(hooksDir.cdUp());
ASSERT_TRUE(hooksDir.cdUp());
ASSERT_TRUE(hooksDir.cd("tests/data/hooks.d"));

auto file = hooksDir.absoluteFilePath("1-test.json");
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): Make hook test data lookup resilient to different working directories (e.g. via a shared helper or QFINDTESTDATA).

This test currently assumes the process starts two levels below the project root and that tests/data/hooks.d exists there, which can be brittle under different runners. Consider resolving 1-test.json via a shared testDataRoot() helper (as used in other tests) or a QFINDTESTDATA-style approach so it no longer depends on the initial working directory.

Suggested implementation:

#include "applicationHooks.h"
#include <gtest/gtest.h>
#include <QDir>
#include <QStringList>
#include <QtTest/QTest>
TEST(ApplicationHookTest, load)
{
    const auto file = QFINDTESTDATA("data/hooks.d/1-test.json");
    ASSERT_FALSE(file.isEmpty());

    auto hook = ApplicationHook::loadFromFile(QString::fromUtf8(file));

To fully support this change, ensure that data/hooks.d/1-test.json is correctly registered as test data in your build system so that QFINDTESTDATA("data/hooks.d/1-test.json") can locate it. For example, with qmake you would add it to TESTDATA += data/hooks.d/1-test.json, and with CMake/Qt6 you would typically use qt_add_test() / qt_add_resources() or set_tests_properties() equivalents to install or expose the test data at runtime.

@deepin-ci-robot
Copy link

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: BLumia, ComixHe

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

@BLumia BLumia merged commit 2a478ed into linuxdeepin:master Jan 28, 2026
15 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