mirror of https://github.com/OISF/suricata
devguide: add page about rust unittests
Part of the task to offer better guidance on how and when to write unit tests or suricata-verify tests Also updated linking and index files, as well as testing page to refer to the unit tests pages Doc: #4590pull/6581/head
parent
747d225c84
commit
c6e97222b7
@ -0,0 +1,90 @@
|
|||||||
|
*****************
|
||||||
|
Unit tests - Rust
|
||||||
|
*****************
|
||||||
|
|
||||||
|
Rust tests with Cargo check
|
||||||
|
===========================
|
||||||
|
|
||||||
|
Rust offers a built-in tool for running unit and integration tests. To do so, one makes usage of:
|
||||||
|
|
||||||
|
.. code-block:: rust
|
||||||
|
|
||||||
|
cargo test [options][testname][-- test-options]
|
||||||
|
|
||||||
|
`The Cargo Book <https://doc.rust-lang.org/cargo/commands/cargo-test.html>`_ explains all options in more detail.
|
||||||
|
|
||||||
|
For testing a specific Rust module from Suricata, it suffices to go to the ``rust`` directory and run the above command,
|
||||||
|
specifying the desired module (like ``http2``).
|
||||||
|
|
||||||
|
.. code-block:: rust
|
||||||
|
|
||||||
|
cargo test http2
|
||||||
|
|
||||||
|
The line above will make *rustc* compile the Rust side of Suricata and run unit tests in the ``http2`` rust module.
|
||||||
|
|
||||||
|
For running all Suricata unit tests from our Rust codebase, just run ``cargo test``.
|
||||||
|
|
||||||
|
Adding unit tests
|
||||||
|
=================
|
||||||
|
|
||||||
|
.. note:: If you want to understand *when* to use a unit test, please read the devguide section on :doc:`testing`.
|
||||||
|
|
||||||
|
In general, it is preferable to have the unit tests in the same file that they test. At the end of the file, after all other functions. Add a ``tests`` module, if there isn't one yet, and add the ``#[test]`` attribute before the unit test
|
||||||
|
function. It is also necessary to import (``use``) the module to test, as well as any other modules used. As seen in the example below:
|
||||||
|
|
||||||
|
Example
|
||||||
|
-------
|
||||||
|
|
||||||
|
From ``nfs > rpc_records.rs``:
|
||||||
|
|
||||||
|
.. code-block:: rust
|
||||||
|
|
||||||
|
mod tests {
|
||||||
|
use crate::nfs::rpc_records::*;
|
||||||
|
use nom::Err::Incomplete;
|
||||||
|
use nom::Needed::Size;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_partial_input_ok() {
|
||||||
|
let buf: &[u8] = &[
|
||||||
|
0x80, 0x00, 0x00, 0x9c, // flags
|
||||||
|
0x8e, 0x28, 0x02, 0x7e, // xid
|
||||||
|
0x00, 0x00, 0x00, 0x01, // msgtype
|
||||||
|
0x00, 0x00, 0x00, 0x02, // rpcver
|
||||||
|
0x00, 0x00, 0x00, 0x03, // program
|
||||||
|
0x00, 0x00, 0x00, 0x04, // progver
|
||||||
|
0x00, 0x00, 0x00, 0x05, // procedure
|
||||||
|
];
|
||||||
|
let expected = RpcRequestPacketPartial {
|
||||||
|
hdr: RpcPacketHeader {
|
||||||
|
frag_is_last: true,
|
||||||
|
frag_len: 156,
|
||||||
|
xid: 2384986750,
|
||||||
|
msgtype: 1
|
||||||
|
},
|
||||||
|
rpcver: 2,
|
||||||
|
program: 3,
|
||||||
|
progver: 4,
|
||||||
|
procedure: 5
|
||||||
|
};
|
||||||
|
let r = parse_rpc_request_partial(buf);
|
||||||
|
match r {
|
||||||
|
Ok((rem, hdr)) => {
|
||||||
|
assert_eq!(rem.len(), 0);
|
||||||
|
assert_eq!(hdr, expected);
|
||||||
|
},
|
||||||
|
_ => { panic!("failed {:?}",r); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Once that is done, Rust should recognize the new test. If you want to check a single test, run::
|
||||||
|
|
||||||
|
cargo test module::test_name
|
||||||
|
|
||||||
|
or even::
|
||||||
|
|
||||||
|
cargo test test_name
|
||||||
|
|
||||||
|
if you know it's a unique function name. Following the same idea, it is also possible to test specific modules or
|
||||||
|
submodules.
|
||||||
Loading…
Reference in New Issue