Skip to content

dunitest userspace test framework ​

dunitest is DragonOS's userspace unit-test framework. It runs Google Test C++ cases and writes structured reports.

Status ​

  • The runner discovers and executes binaries under bin/
  • Default timeout is 60 seconds and can be overridden with --timeout-sec
  • Filter order: white list -> block list -> --pattern
  • Summary counts use gtest case counts (not the number of test programs)
  • The runner returns non-zero on failure or timeout

Layout ​

text
user/apps/tests/dunitest/
├── runner/                 # Rust test runner
├── suites/                 # Test sources (one directory per suite)
├── bin/                    # Build outputs (auto-discovered)
├── whitelist.txt           # Default white list
├── scripts/run_tests.sh    # In-guest entry
└── Makefile

Rules ​

  1. Sources live in suites/<suite>/*.cc
  2. Binaries are bin/<suite>/<case>_test
  3. Runner case names are <suite>/<case> (_test suffix stripped)

Examples:

  • Binary: bin/demo/gtest_demo_test
  • Case name: demo/gtest_demo
  • White-list entry: demo/gtest_demo

Adding a case ​

Prefer the normal suite ​

  • Put general functional tests in suites/normal/
  • Example: suites/normal/capability.cc
  • White-list entry: normal/capability

1. Add gtest source ​

text
suites/normal/capability.cc

2. Register the suite in the Makefile ​

Edit SUITES in user/apps/tests/dunitest/Makefile:

makefile
# Add new suite directories here
SUITES = demo normal

3. Build and run (parallel-safe) ​

From the repo root:

bash
make test-dunit-local

Or in the dunitest directory:

bash
make run -j$(nproc)

Example build log:

text
compile: suites/normal/capability.cc -> bin/normal/capability_test

4. Add a white-list entry ​

text
demo/gtest_demo
normal/capability

Runner flags ​

text
dunitest-runner [OPTIONS]

  --bin-dir <PATH>       test binary directory (default: bin)
  --timeout-sec <SEC>    per-case timeout (default: 60)
  --whitelist <PATH>     white list path (default: whitelist.txt)
  --blocklist <PATH>     block list path (default: blocklist.txt)
  --results-dir <PATH>   report directory (default: results)
  --list                 list cases only
  --verbose              verbose output
  --pattern <PATTERN>    substring filter (repeatable)

Reports ​

After a run, results/ contains:

  • test_report.txt: text report
  • summary.json: JSON summary
  • failed_cases.txt: failed/timed-out cases
  • <case>.log: per-case logs

Summary rules:

  • totals/passed/failed/skipped use gtest case counts
  • if a program emits no gtest stats, the runner falls back to program-level counts

Install ​

Run make install in user/apps/tests/dunitest/.