Testing Infrastructure
Relevant source files
This page documents the testing infrastructure for AxVisor, explaining how testing is automated, configured, and executed. It covers both local and remote testing setups, guest image preparation, and how to run and interpret tests. For CI/CD pipeline details beyond testing, see CI/CD Pipeline.
Overview
AxVisor employs a comprehensive testing infrastructure to ensure that changes don't break functionality across supported architectures (x86_64, aarch64, and riscv64). The testing system runs virtual machines with guest operating systems to verify that virtualization works correctly.
flowchart TD subgraph subGraph1["Testing Infrastructure"] test["Testing System"] local["Local Testing"] remote["Remote Testing"] localSetup["Setup Environment"] localRun["Run Tests"] localCheck["Check Results"] remoteSetup["Setup Environment"] remoteTransfer["Transfer Files"] remoteRun["Run Tests"] remoteCheck["Check Results"] subgraph subGraph0["Environment Setup"] setupToolchain["Set Rust Toolchain"] setupDeps["Install Dependencies"] setupQEMU["Set up QEMU"] setupGuestImage["Prepare Guest Images"] end end local --> localCheck local --> localRun local --> localSetup localSetup --> setupDeps localSetup --> setupGuestImage localSetup --> setupQEMU localSetup --> setupToolchain remote --> remoteCheck remote --> remoteRun remote --> remoteSetup remote --> remoteTransfer remoteSetup --> setupToolchain test --> local test --> remote
Sources: .github/workflows/test.yml(L1 - L150)
Testing Strategy
The AxVisor testing infrastructure is built around running actual guest virtual machines to validate functionality. Tests are executed both in local GitHub Actions runners and on specialized remote hardware for architecture-specific testing.
Test Matrix
Tests are conducted across a matrix of configurations:
Test Type | Architectures | Rust Toolchains | Hardware Acceleration |
---|---|---|---|
Local | riscv64, aarch64 | nightly-2024-12-25, nightly | No (QEMU) |
Remote | x86_64 | nightly-2024-12-25, nightly | Yes (KVM) |
Sources: .github/workflows/test.yml(L10 - L59)
Local Testing Workflow
Local testing runs on GitHub Actions runners and focuses on riscv64 and aarch64 architectures using QEMU emulation.
sequenceDiagram participant GitHubActions as "GitHub Actions" participant checkoutv4 as "checkout@v4" participant rusttoolchainstable as "rust-toolchain@stable" participant setupqemuv01 as "setup-qemu@v0.1" participant setupnimbosguestimage as "setup-nimbos-guest-image" participant TestRunner as "Test Runner" GitHubActions ->> checkoutv4: Checkout repository GitHubActions ->> rusttoolchainstable: Setup Rust toolchain Note over rusttoolchainstable: nightly-2024-12-25 or latest nightly GitHubActions ->> setupqemuv01: Setup QEMU v8.2.0 GitHubActions ->> setupnimbosguestimage: Prepare NimbOS guest image Note over setupnimbosguestimage: Download NimbOS v0.7, create disk image GitHubActions ->> TestRunner: Configure KVM permissions GitHubActions ->> TestRunner: Update rust-toolchain.toml GitHubActions ->> TestRunner: Run tests with make Note over TestRunner: ARCH=(riscv64/aarch64), ACCEL=n
Sources: .github/workflows/test.yml(L10 - L50) .github/workflows/actions/setup-nimbos-guest-image/action.yml(L1 - L70)
Local Test Execution Steps
- Check out the repository
- Set up the specified Rust toolchain with rust-src component
- Install cargo-binutils
- Set up QEMU for the target architecture
- Download and prepare NimbOS guest image
- Configure KVM permissions
- Update rust-toolchain.toml with the specified toolchain
- Run the test using make with:
- Target architecture
- Disk image path
- Verbose logging
- Block device enabled
- Hardware acceleration disabled
- VM configuration file path
- Filesystem support
Sources: .github/workflows/test.yml(L19 - L50)
Remote Testing Workflow
Remote testing targets x86_64 architecture on specialized hardware with KVM acceleration enabled.
sequenceDiagram participant GitHubActions as "GitHub Actions" participant checkoutv4 as "checkout@v4" participant setupnimbosguestimage as "setup-nimbos-guest-image" participant scpactionv017 as "scp-action@v0.1.7" participant sshactionv122 as "ssh-action@v1.2.2" participant RemoteRunner as "Remote Runner" GitHubActions ->> checkoutv4: Checkout repository GitHubActions ->> GitHubActions: Update rust-toolchain.toml GitHubActions ->> GitHubActions: Compress source code GitHubActions ->> setupnimbosguestimage: Prepare NimbOS guest image GitHubActions ->> scpactionv017: Copy files to remote runner Note over scpactionv017: Transfer disk image and source code GitHubActions ->> sshactionv122: Execute test on remote runner sshactionv122 ->> RemoteRunner: Extract source code sshactionv122 ->> RemoteRunner: Run make defconfig sshactionv122 ->> RemoteRunner: Run make with VM configs Note over RemoteRunner: ARCH=x86_64, ACCEL=y sshactionv122 ->> RemoteRunner: Check for panic in output sshactionv122 ->> RemoteRunner: Clean up
Sources: .github/workflows/test.yml(L52 - L149)
Remote Test Execution Steps
- Check out the repository
- Update rust-toolchain.toml with the specified toolchain
- Compress the source code
- Prepare NimbOS guest image locally
- Transfer files to the remote runner:
- Compressed source code
- Disk image
- On the remote runner:
- Extract the source code
- Run
make defconfig
for x86_64 - Execute test with hardware acceleration enabled
- Check output for panic messages
- Clean up temporary files
Sources: .github/workflows/test.yml(L72 - L149)
Guest VM Image Preparation
The testing infrastructure uses a custom action to prepare guest VM images (specifically NimbOS) for testing.
flowchart TD subgraph subGraph0["setup-nimbos-guest-image Action"] setupStart["Start Setup"] downloadNimbOS["Download NimbOS Release"] unzipNimbOS["Unzip NimbOS Image"] renameNimbOS["Rename to nimbos-{arch}.bin"] isX86["Is x86_64?"] downloadBIOS["Download AXVM BIOS"] createDiskImage["Create Disk Image"] mountDisk["Mount Disk Image"] copyFiles["Copy Files to Disk"] unmountDisk["Unmount Disk"] cleanup["Cleanup Temporary Files"] end copyFiles --> unmountDisk createDiskImage --> mountDisk downloadBIOS --> createDiskImage downloadNimbOS --> unzipNimbOS isX86 --> createDiskImage isX86 --> downloadBIOS mountDisk --> copyFiles renameNimbOS --> isX86 setupStart --> downloadNimbOS unmountDisk --> cleanup unzipNimbOS --> renameNimbOS
Sources: .github/workflows/actions/setup-nimbos-guest-image/action.yml(L1 - L70)
Guest Image Setup Process
The setup process:
- Creates a temporary directory
- Downloads the appropriate NimbOS release for the target architecture
- Unzips and renames the NimbOS binary
- For x86_64, also downloads the AXVM BIOS
- Creates a disk image using the makefile
- Mounts the disk image
- Copies the NimbOS binary and BIOS (if applicable) to the disk image
- Unmounts the disk image and cleans up temporary files
Sources: .github/workflows/actions/setup-nimbos-guest-image/action.yml(L32 - L70)
Running Tests Manually
To run tests manually in a local development environment, follow these steps:
- Set up a disk image with a guest OS (like NimbOS)
- Configure the test environment:
# For local testing (without hardware acceleration)
make ARCH=<arch> defconfig
make ARCH=<arch> DISK_IMG=<path_to_disk_img> LOG=info BLK=y ACCEL=n VM_CONFIGS=<path_to_vm_config> APP_FEATURES=fs run
# For testing with hardware acceleration (KVM)
make ARCH=<arch> defconfig
make ARCH=<arch> DISK_IMG=<path_to_disk_img> LOG=info BLK=y ACCEL=y VM_CONFIGS=<path_to_vm_config> APP_FEATURES=fs run
Replace <arch>
with the target architecture (x86_64, aarch64, or riscv64), <path_to_disk_img>
with the path to your guest disk image, and <path_to_vm_config>
with the path to your VM configuration file.
Sources: .github/workflows/test.yml(L45 - L50) .github/workflows/test.yml(L133 - L134)
Interpreting Test Results
Tests are considered successful if they complete without generating "panic" messages in the output. The CI system checks for these messages automatically:
if grep -q "panic" make_output.log; then
# Test failed
exit 1
else
# Test passed
fi
For debugging failed tests, examine the log output for:
- Panic messages
- Errors during VM boot
- Issues with guest OS execution
- Problems with virtual device emulation
Sources: .github/workflows/test.yml(L139 - L146)
Architecture-Specific Considerations
Each supported architecture has specific testing requirements:
x86_64
- Tested on remote runners with KVM acceleration
- Requires AXVM BIOS for guest OS boot
- Uses hardware virtualization extensions (VT-x)
aarch64
- Tested on local GitHub Actions runners
- Uses QEMU for emulation
- Leverages virtualization extensions (EL2 mode)
riscv64
- Tested on local GitHub Actions runners
- Uses QEMU for emulation
- Relies on SBI runtime for hypervisor operations
Sources: .github/workflows/test.yml(L16) .github/workflows/test.yml(L57) .github/workflows/actions/setup-nimbos-guest-image/action.yml(L52 - L58)