e2etest
The main crate for E2E test framework for Rust.

Getting Started
The user needs to define global fixture for all tests, initialization and
callback for test cases registration. The user needs to create a binary crate -
e2etest doesn't build directly into a binary.
The user can use the actors provided by e2etest-rs sub-crates, or create
their own actors. Most likely, the user wants to run dns server, firewall and
other testing actors - so the provided binary ought to be run in the unshared
environment. In the future e2etest will provide the unshared environment
directly, without additional setup.
Sample code for using e2etest
use e2etest::TestCase;
use std::net::Ipv4Addr;
use std::time::Duration;
#[derive(clap::Args)]
struct Args {
#[arg(short, long, default_value = "127.0.100.1")]
dns_ip: Ipv4Addr,
}
fn init(args: &Args) {
}
#[derive(Clone)]
struct Fixture {
dns_ip: Ipv4Addr,
}
async fn fixture(args: &Args) -> Fixture {
Fixture {
dns_ip: args.dns_ip,
}
}
async fn init_testcase(fixture: Fixture) {
}
async fn cleanup_testcase(fixture: Fixture) {
}
async fn dns_ip(fixture: Fixture) {
assert_eq!(fixture.dns_ip, Ipv4Addr::new(127, 0, 100, 1));
}
async fn register() -> Vec<(String, TestCase<Fixture>)> {
let timeout = Duration::from_secs(10);
let testcase = TestCase::empty()
.with_init(timeout, init_testcase)
.with_cleanup(timeout, cleanup_testcase)
.with_test("dns_ip", timeout, dns_ip);
vec![("simple".to_string(), testcase)]
}
e2etest::run(["validator", "run"], init, register, fixture);
Sample code for script to run in the unshared environment:
set -e
base_ip=127.0.1
dns_ip=127.0.1.1
tmp_resolv_conf=$(mktemp /tmp/resolv.conf.XXXXXX)
echo "nameserver $dns_ip" > $tmp_resolv_conf
sudo unshare -n -m /bin/bash <<EOF
mount --bind $tmp_resolv_conf /etc/resolv.conf
ip link set lo up
ip addr add $dns_ip/32 dev lo
for i in {1..10}; do
ip addr add $base_ip.\$i/32 dev lo
done
cat /etc/resolv.conf
$e2e_validator run --dns-ip $dns_ip --base-ip $args
EOF
rm $tmp_resolv_conf
Sample code for running tests in a docker container:
set -e
dns_ip=127.0.1.1
docker run --rm \
--cap-add NET_ADMIN \
--user root \
--security-opt seccomp=unconfined \
--dns=$dns_ip \
--dns-search=. \
--volume="$e2e_validator:/e2e-validator" \
--network=none \
--entrypoint=/e2e-validator \
$docker_image \
run --dns-ip $dns_ip $args "$@"
License
Licensed under either of
at your option.