The testool is a binary cli that focus on provide tools for testing.
To use it, just compile with cargo build --release and run ../target/release/testool.
This tool at this moment has 2 main functionalities: run raw bytecode and run ethereum tests.
The oneliner spec is invoked by using --oneliner parameter
The spec has the following form
txparams account 1 account 2 ... account n
where
txparamshave the formcall|create;calldata;value;gas- if
createis specified thetofield in the tx is left blank, is not the first account specified is used as the contract to call calldata,valueandgasare optional
- if
accounthave the formaddress;code;balance;slot 1:value 1;..slot n..value naddresscan be shortened, eg.10and0x10is expanded to0x....10codeis optional, and can be specified in hex or in asm (PUSH1(1),PUSH1(1),MLOAD)balanceandvalueare optionalslotandvaluecan be specified multiple times
example
../target/release/testool --oneliner "call 12;60016002": call contract0x...12that contains the code PUSH1(1) PUSH1(2)../target/release/testool --oneliner "call;;2000 12;PUSH1(0),SLOAD,CALLVALUE,EQ,PUSH1(1),SSTORE;;00:2000": call the contract and send 2000 as value, and compare with the stored value (2000) in the slot 0, write into slot 1
Run
../target/release/testool --suite default
or
../target/release/testool --suite nightly
The "official EVM" ethereum tests are cloned as a gitmodule in testool/tests.
We are using the tests located in testool/tests/src/GeneralStateTestsFiller, but other locations can be specified, also.
These tests are written in json or yml, and, in general it specifies 4 sections:
- General environment to generate a block (blocknumber, timestamp, gaslimit, etc...)
- Initial account states (with its balance, nonce, storage, and code)
- A set of transactions to be executed from the initial state, each transaction defines one test
- The account states resulting of the execution of these transactions
You can find (here)[https://ethereum-tests.readthedocs.io/en/latest/test_filler/blockchain_filler.html] the specification for these files in detail.
Official ethereum tests are maintained by the foundation but you can write your own.
The Config.toml configuration defines which files and tests to process.
In the config file you define [[suite]]s that defines how tests will be executed.
idis the identifier of the suite. The default suite is calleddefault.max_stepsthe maximum number of executed opcodes. If this is reached, the test is marked to be ignored.max_gasthe maximum gas of a test. If the specified maximum gas is reached, the test is marked to be ignored. Put a0if you do not want to limit it.- you should define also only one of these parameters:
allow_testswith the list of tests or test sets to execute. All others will be excluded. Test sets should be prefixed with&ignore_testswith the list of test or test sets to ignore. All others will be included. Test sets should be prefixed with&
Test sets are created by using the [[set]] section and should define
idthe identification of the set (without any&). Note that ids can be duplicated, this means that are tests with the same id are joined together when used.desca description of the test settestsa list of tests
Sometimes there are some files or specific tests that we want to disable at all. Those are defined with:
[[skip_test]]defines a set of tests that are always ignored.[[skip_path]]defined a set of files/folders that are always ignored. This is useful since sometimes there are some tests with weird encodings.
When the command line parameter --report is defined, it automatically:
- After the execution, a two files are created in the
reportfolder. They are<timestamp>-<git_commit>.hmlwith the browsable results of the execution.<timestamp>-<git_commit>.csvwith the raw results of the execution
- The HTML file also contains the diff with the previous result. The previous result file is the more recent csv file with different commit from the current one
Sometimes do you want to only re-execute tests that are marked as Ignored (because you are implementing something new). In this case, you can specify --cache <>.csv to use the previous results.
NOTE: if you do not execute with --report the tool will exit the process with 1 if there is any test that is not working.
Usually we have to debug and run the tests manually to check if everything works ok. We provide a set of command line parameters to help with this.
-
testool [--suite xxx] --cache <cache_file>to execute all tests, and by default skipping Ignored tests in cache, and keeping the results (cache) CSV file. If you delete entries from the cache file, and re-run the tool again, only the deleted tests will be executed again -
testool [--suite xxx] --cache <cache_file> --levels fail,panicto execute all tests but skipping the tests in cache which status (i.g. result level) is NOT Fail or Panic. Notice levels is case insensitive. -
testool [--suite xxx] --inspect <test_id>only executed the selected test (even if cached, or ignored). UseRUST_BACKTRACE=1here to check if anything fails. Also gives a dump of the test as also to the geth steps executed.