在 Fuchsia 上运行 Rust 测试套件

本指南详细介绍了在模拟的 Fuchsia 映像上运行 Rust 编译器测试套件的过程。

前提条件

在 Fuchsia 上运行 Rust 测试套件之前,您需要为 Fuchsia 构建自定义 Rust 工具链。运行测试套件不需要构建 Fuchsia 映像。

运行 Rust 测试套件

  1. (可选)设置自定义临时目录:

    export TEST_TOOLCHAIN_TMP_DIR=TEMP_DIR

    如果未设置临时目录,则该目录将命名为 tmp~,并将在 rust_toolchain.py 旁边创建。如果您使用自定义临时目录,则需要在用于与同一测试环境交互的每个 shell 中将 TEST_TOOLCHAIN_TMP_DIR 设置为同一路径。

    您可以在不同的 shell 中将 TEST_TOOLCHAIN_TMP_DIR 设置为不同的值,以便同时管理多个测试环境。

  2. 确保 zlib 可供 lld 访问

    DEV_ROOT=DEV_ROOT
    export LIBRARY_PATH=$LIBRARY_PATH:$DEV_ROOT/install/zlib/lib
  3. 启动测试环境:

    DEV_ROOT=DEV_ROOT
    TEST_TOOLCHAIN=$DEV_ROOT/rust/src/ci/docker/scripts/fuchsia-test-runner.py
    python3 $TEST_TOOLCHAIN start \
      --rust-build $DEV_ROOT/rust/build/fuchsia-rust \
      --sdk $DEV_ROOT/cipd/sdk \
      --target x86_64|aarch64-unknown-fuchsia \
      --toolchain-dir $DEV_ROOT/rust
  4. 运行 Rust 测试套件:

    DEV_ROOT=DEV_ROOT
    TEST_TOOLCHAIN=$DEV_ROOT/rust/src/ci/docker/scripts/fuchsia-test-runner.py
    ( \
      source $DEV_ROOT/fuchsia-env.sh && \
      $DEV_ROOT/rust/x.py \
        --config $DEV_ROOT/fuchsia-config.toml \
        --stage=2 \
        test TEST_SUITE \
        --target x86_64|aarch64-unknown-fuchsia \
        --run=always \
        --jobs 1 \
        --test-args --target-rustcflags \
        --test-args -L \
        --test-args --target-rustcflags \
        --test-args $DEV_ROOT/cipd/sdk/arch/x64|a64/sysroot/lib \
        --test-args --target-rustcflags \
        --test-args -L \
        --test-args --target-rustcflags \
        --test-args $DEV_ROOT/cipd/sdk/arch/x64|a64/lib \
        --test-args --target-rustcflags \
        --test-args -Cpanic=abort \
        --test-args --target-rustcflags \
        --test-args -Zpanic_abort_tests \
        --test-args --remote-test-client  \
        --test-args $TEST_TOOLCHAIN \
    )

    测试结果将打印到标准输出。

  5. 停止测试环境:

    DEV_ROOT=DEV_ROOT
    TEST_TOOLCHAIN=$DEV_ROOT/rust/src/ci/docker/scripts/fuchsia-test-runner.py
    python3 $TEST_TOOLCHAIN stop

调查测试失败情况

运行测试套件会生成许多日志和其他制品,有助于调查失败的测试套件测试。如果在启动测试环境时使用了 --verbose 标志,则可以在 fuchsia-test-runner.py stop 期间将这些内容转储到标准输出。

路径 说明
emulator_log 正在运行的模拟器的日志。此文件通常包含有关测试崩溃或无法启动的详细信息。
ffx_daemon_log 正在运行的 ffx 守护程序的日志。
package_server_log 正在运行的 pm 服务器的日志。
test_env.json 测试环境的配置设置。这有助于找到特定详细信息,例如正在使用的 libstdlibtest,或模拟器的地址。
vdl_output 已启动的设备 proto。
ffx_isolate ffx 的隔离环境。您可以在此处找到 ffx 配置设置。
output 来自 ffx test 的原始输出,适用于每个测试套件测试。每个测试目录都包含收到的有关测试执行的所有详细信息 ffx。这些信息有助于在 emulator_log 中找到特定测试的相关部分。
packages 每个测试的软件包阶段。
rust-testing 提供服务的代码库目录。
ssh 测试运行程序用于访问正在运行的模拟器的 SSH 密钥。这些凭据可用于通过 ssh -i ssh/fuchsia_ed25519 EMULATOR_ADDRESS 登录模拟器。模拟器地址可在 test_env.json 中找到。

调试测试失败问题

  1. 读取测试的标准输出和错误。此文件位于测试的 output 目录中,并且还会由 compiletest 报告。
  2. 检查详细的模拟器日志。您可以在 emulator_log 中找到这些测试,方法是搜索与 output 目录名称匹配的测试名称。
  3. 使用 zxdb 调试测试。您可以通过运行以下命令轻松附加到测试:

    DEV_ROOT=DEV_ROOT
    TEST_TOOLCHAIN=$DEV_ROOT/rust/src/ci/docker/scripts/fuchsia-test-runner.py
    python3 $TEST_TOOLCHAIN debug \
      --rust-src $DEV_ROOT/rust \
      --test TEST_PATH

    然后,设置任何相关的断点,并运行以下测试:

    DEV_ROOT=DEV_ROOT
    TEST_TOOLCHAIN=$DEV_ROOT/rust/src/ci/docker/scripts/fuchsia-test-runner.py
    ( \
      source $DEV_ROOT/fuchsia-env.sh && \
      $DEV_ROOT/rust/x.py \
        --config $DEV_ROOT/fuchsia-config.toml \
        --stage=2 \
        test TEST_SUITE \
        --target x86_64|aarch64-fuchsia \
        --run=always \
        --jobs 1 \
        --test-args --target-rustcflags \
        --test-args -L \
        --test-args --target-rustcflags \
        --test-args $DEV_ROOT/cipd/sdk/arch/x64|a64/sysroot/lib \
        --test-args --target-rustcflags \
        --test-args -L \
        --test-args --target-rustcflags \
        --test-args $DEV_ROOT/cipd/sdk/arch/x64|a64/lib \
        --test-args --target-rustcflags \
        --test-args -Cpanic=abort \
        --test-args --target-rustcflags \
        --test-args -Zpanic_abort_tests \
        --test-args --remote-test-client  \
        --test-args $TEST_TOOLCHAIN \
        --rustc-args -Cdebuginfo=2 \
        --rustc-args -Copt-level=0 \
        --rustc-args  -Cstrip=none \
    )

    zxdb 会捕获所有崩溃,并在您定义的任何断点处中断。 此命令与上述命令相同,但添加了用于调试的 -C debuginfo=2 -C opt-level=0 标志。

提示

为了缩短迭代周期,您可以运行带有 -vv 实参的 x.py test,让 compiletest 打印其在整个过程中运行的确切命令。您可以运行在测试运行之前立即打印的 compiletest 调用,快速重新运行单个测试。