Files
kaizen/tests
irisz64 16a2cf3873 Squashed 'external/capstone/' changes from b102f1b8..5af28808
5af28808 Update Auto-Sync to Python 3.13 and tree-sitter-py 24.0 (#2705)
99f018ac Python binding: (#2742)
a07baf83 Auto-Sync update Sparc LLVM-18 (#2704)
81c5c93d Enable to generate legacy MC tests for the fuzzer. (#2733)
a25d4980 Add warning about naive search and replace to patch reg names. (#2728)
7ac87d17 Print immediate only memory operands for AArch64. (#2732)
c34034c8 Add x30 implicit read to the RET alias. (#2739)
95a4ca3e Update source list before installing valgrind. (#2730)
6909724e Make assertion hit warnings optional in release builds. (#2729)
fe6bdc6e Make SStream respect the CS_OPT_UNSIGNED flag. (#2723)
21ce3624 Use cs_ac_type for operand access mode in all arches and use cs_xtensa_op_type for Xtensa operand type (#2721)
df26583f clang-format: change license to BSD-3-Clause (#2724)
280b749e Remove unused files. (#2709)
87908ece Add flag for the SoftFail case of the LLVM disassembler. (#2707)
efc0ba44 Fix missing operand for smstart, due to space replaced by tab (#2720)
2ae64133 Fix missing sp register read in ret instruction (#2719)
8df252a6 Fix arm pop reg access (#2718)
14612272 ARM: fix typo, cspr -> cpsr (#2716)
f2f0a3c3 Fix LoongArch ld/st instructions register info (#2701)
829be2bf LoongArch: Compute absolute address for address operand (#2699)
42fbce6c Add jump group for generic jirl (#2698)
fc525c73 Apple AArch64 proprietary (#2692)
895f2f2e Build PDB for debugging on Windows (#2685)
5c3aef03 Version: Update to v6.0.0-alpha4 (#2682)
106f7d3b Update read/written registers for x87 comparison instructions (#2680)
ebe3ef2a Add workflow for building on Windows (#2675)
72f7d305 Revert "Add a script to compare the inc file content with the latest generate…" (#2678)
5b5c5ed8 Fix nanomips decoding of jalrc (#2672)
ae03cca4 Mips32r6_64r632 is for both mips32r6 and mips64r6 (#2673)
21178aea Add a script to compare the inc file content with the latest generated ones. (#2667)
81a6ba03 MIPS: Fix MIPS16 decoding, wrong flags and ghost registers (#2665)
98a393e3 Stringify BH fields when printing ppc details (#2663)
2607d0f3 Remove undefined constants in riscv_const.py (#2660) (#2661)
5058c634 Decode BH field in print_insn_detail_ppc (#2662)
6461ed08 Add Call group to svc, smc and hvc. (#2651)
e2f1dc8d Tms32c64x Little Endian (#2648)
5464c91d Fix build for compilers requiring explicit static for inline functions.. (#2645)
bb2f6579 Enhance shift value and types of shift instructions. (#2638)
cd282ef5 Update operand type enums of all arch modules to the one in `capstone.h` (#2633)
dc0c0909 cmake: Fix building capstone as sub-project (#2629)
cd8dd20c - Added missing files for sdist archive (#2624)
9affd99b Give the user some guidance where to add missing enumeration values. (#2639)
1bea3fab Add checks for MIPS details on cstest_py (#2640)
ace8056c Add aliases mapping for MIPS & test for id, alias_id (#2635)
1abe1868 Build Tarball before DEB/RPM package. (#2627)
0a012190 Switch to ubuntu-24.04-arm runner image (#2625)
4e0b8c48 Fix wrong version requirement of tricore instructions: (#2620)
8ac2843b chore(version): Update Version to 6.0.0-Alpha3 (#2616)
d7ef910b Rebased #2570 (#2614)
c831cd5e Fix SystemZ macro in Makefile (#2603)
30601176 Apply new EVM opcode updates (#2602)
3c4d7fc8 Add tricore tc1.8 instructions (#2595)
5f290cad Create debian and rpm package on releases (#2590)
0f09210a delete travis (#2600)
5c5f756f Downgrade labeler to v4 due to https://github.com/actions/labeler/issues/710. (#2598)

git-subtree-dir: external/capstone
git-subtree-split: 5af288083e9f03e32723f9708c305692f866b666
2025-06-26 22:15:44 +02:00
..

Testing in Capstone

Running tests

Types of test and their location

YAML test files

These test files are consumed by the various cstest tools. They contain all detail tests. As well as the LLVM regression tests (MC tests).

Directories group tests by the category they intent to test.

Legacy (integration)

Legacy tests which only printed to stdout. In practice they only test if the code segfaults. Checking the produced output was not implemented.

Testing tools and usage

cstest

cstest is the testing tool written in C. It is implemented in suite/cstest/ It consumes the yaml files and reports errors or mismatches for disassembled instructions and their details.

Building

Dependencies: cstest requires the libyaml library.

You build cstest by adding the -DCAPSTONE_BUILD_CSTEST=1 option during configuration of the Capstone build.

If you build and install Capstone cstest gets installed as well. Otherwise you find it in the build directory.

# Install libyaml
# sudo apt install libyaml-dev
# or
# sudo dnf install libyaml-devel
cd "<capstone-repo-root>"
# Optionally add the `-DENABLE_ASAN=1` flag.
cmake -B build -DCMAKE_BUILD_TYPE=Debug -DCAPSTONE_BUILD_CSTEST=ON
cmake --build build --config Debug
cmake --install build --prefix "<install-prefix>"

Run the integration tests for cstest itself

./suite/cstest/test/integration_tests.py cstest

Run the tests

# Check supported options
cstest -h
# Run all
cstest tests/

Alternatively, you can use the CMake test manager.

# List available tests
ctest --test-dir build -N
# Run a specific test
ctest --test-dir build -R "<name>"

cstest_py

cstest_py is the testing tool written in Python. It is implemented in bindings/python/cstest_py It consumes the yaml files and reports errors or mismatches for disassembled instructions and their details.

Installing

You need to install the Capstone Python bindings first and afterwards the cstest_py.

# Optionally, create a new virtual environment
python3 -m venv .venv
source .venv/bin/activate

cd bindings/python
pip install -e .
pip install -e cstest_py
cd ../..

Run the integration tests for cstest_py itself

./suite/cstest/test/integration_tests.py cstest_py

And run the tests

# Check supported options
cstest_py -h
# Run all
cstest_py tests/

Add new tests

Unit and integration tests

Add the source into test/integration or test/unit respectively and update the CMakeLists.txt file.

YAML

There are very few fields which are mandatory to fill. Check suite/cstest/test/min_valid_test_file.yaml to see which one.

  • In general it is useful to just copy a previous test file and rewrite it accordingly.
  • If you assign C enumeration identifiers to some fields (to check enumeration values), ensure they are added on the suite/cstest/include/test_mapping.h. Otherwise, cstest cannot map the strings to the values for comparison.
  • Rarely used, but useful fields are: name, skip, skip_reason.

MC regression tests

The MCUpdater translates most test files of the LLVM MC regression tests into our YAML files.

The LLVM regression tests, check the bytes and assembly for all instructions of an architecture. They do it by passing bytes or assembly to the llvm-mc and FileCheck tool and compare the output. We capture this output and process it into YAML. So you need to install llvm-mc and FileCheck for our updater to work.

To update the YAML MC regression tests, you need to install Auto-Sync and run the MCUpdater.

cd suite/auto-sync/
# Follow install instructions of Auto-Sync described in the README
# And run the updater:
./src/autosync/MCUpdater.py -a ARCH
ls build/mc_out/
# The produce yaml files. Copy them manually to tests/MC/ARCH

Please note:

Each of the LLVM test files can contain several llvm-mc commands to run on the same file. This is done to test the same file with different CPU features enabled. So it can test different assembly flavors etc.

In Capstone all modules enable always all CPU features (even if this is not possible in reality). Due to this, we always parse all llvm-mc commands but only write the last version of them to disk. So if the same test file is tested with three different features enables, once with FeatureA, FeatureB and FeatureC we only save the output with FeatureC enabled.

This might give you MC test files which fail due to valid but mismatching disassembly. You can set the skip field for those tests and add a skip_reason.

Once https://github.com/capstone-engine/capstone/issues/1992 is resolved, we can test all variants.