2017-10-01 14:11:59 -04:00
# Running all tests
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
To run all tests, run:
2017-09-19 17:09:38 -04:00
```
2017-10-01 14:11:59 -04:00
cd /path/to/monero
make [-jn] debug-test # where n is number of compiler processes
2017-09-19 17:09:38 -04:00
```
2017-10-01 14:11:59 -04:00
To test a release build, replace `debug-test` with `release-test` in the previous command.
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
# Core tests
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
Core tests take longer than any other Monero tests, due to the high amount of computational work involved in validating core components.
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
Tests are located in `tests/core_tests/` , and follow a straightforward naming convention. Most cases cover core functionality (`block_reward.cpp`, `chaingen.cpp` , `rct.cpp` , etc.), while some cover basic security tests (`double_spend.cpp` & `integer_overflow.cpp` ).
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
To run only Monero's core tests (after building):
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
```
cd build/debug/tests/core
ctest
```
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
To run the same tests on a release build, replace `debug` with `release` .
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
# Crypto Tests
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
Crypto tests are located under the `tests/crypto` directory.
- `crypto-tests.h` contains test harness headers
- `main.cpp` implements the driver for the crypto tests
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
Tests correspond to components under `src/crypto/` . A quick comparison reveals the pattern, and new tests should continue the naming convention.
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
To run only Monero's crypto tests (after building):
2017-09-19 17:09:38 -04:00
```
2017-10-01 14:11:59 -04:00
cd build/debug/tests/crypto
2017-09-19 17:09:38 -04:00
ctest
```
2017-10-01 14:11:59 -04:00
To run the same tests on a release build, replace `debug` with `release` .
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
# Daemon tests
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
[TODO]
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
# Functional tests
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
[TODO]
2018-06-15 05:57:22 -04:00
Functional tests are located under the `tests/functional` directory.
First, run a regtest daemon in the offline mode and with a fixed difficulty:
```
monerod --regtest --offline --fixed-difficulty 1
```
Alternatively, you can run multiple daemons and let them connect with each other by using `--add-exclusive-node` . In this case, make sure that the same fixed difficulty is given to all the daemons.
Next, restore a mainnet wallet with the following seed and restore height 0 (the file path doesn't matter):
```
velvet lymph giddy number token physics poetry unquoted nibs useful sabotage limits benches lifestyle eden nitrogen anvil fewest avoid batch vials washing fences goat unquoted
```
Open the wallet file with `monero-wallet-rpc` with RPC port 18083. Finally, start tests by invoking ./blockchain.py or ./speed.py
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
# Fuzz tests
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
Fuzz tests are written using American Fuzzy Lop (AFL), and located under the `tests/fuzz` directory.
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
An additional helper utility is provided `contrib/fuzz_testing/fuzz.sh` . AFL must be installed, and some additional setup may be necessary for the script to run properly.
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
# Hash tests
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
Hash tests exist under `tests/hash` , and include a set of target hashes in text files.
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
To run only Monero's hash tests (after building):
2017-09-19 17:09:38 -04:00
```
2017-10-01 14:11:59 -04:00
cd build/debug/tests/hash
ctest
2017-09-19 17:09:38 -04:00
```
2017-10-01 14:11:59 -04:00
To run the same tests on a release build, replace `debug` with `release` .
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
# Libwallet API tests
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
[TODO]
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
# Net Load tests
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
[TODO]
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
# Performance tests
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
Performance tests are located in `tests/performance_tests` , and test features for performance metrics on the host machine.
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
To run only Monero's performance tests (after building):
2017-09-19 17:09:38 -04:00
```
2017-10-01 14:11:59 -04:00
cd build/debug/tests/performance_tests
./performance_tests
2017-09-19 17:09:38 -04:00
```
2017-10-01 14:11:59 -04:00
If the `performance_tests` binary does not exist, try running `make` in the `build/debug/tests/performance_tests` directory.
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
To run the same tests on a release build, replace `debug` with `release` .
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
# Unit tests
2017-09-19 17:09:38 -04:00
2017-10-01 14:11:59 -04:00
Unit tests are defined under the `tests/unit_tests` directory. Independent components are tested individually to ensure they work properly on their own.
To run only Monero's unit tests (after building):
2017-09-19 17:09:38 -04:00
```
2017-10-01 14:11:59 -04:00
cd build/debug/tests/unit_tests
ctest
2017-09-19 17:09:38 -04:00
```
2017-10-01 14:11:59 -04:00
To run the same tests on a release build, replace `debug` with `release` .
# Writing new tests
## Test hygiene
When writing new tests, please implement all functions in `.cpp` or `.c` files, and only put function headers in `.h` files. This will help keep the fairly complex test suites somewhat sane going forward.
2017-09-19 17:09:38 -04:00
## Writing fuzz tests
[TODO]