Merge fort-nix/nix-bitcoin#574: Add dev helper and docs
b4d7e1aa8fadd dev helper and docs (Erik Arvstedt)b35d08d3f2docs: move test docs from `examples/README` to `test/README` (Erik Arvstedt)4d76eb9183docs/configuration: fix typo (Erik Arvstedt)dc0710f3f4tests: add example scenario `customTest` (Erik Arvstedt)9e30d2728btests: formatting (Erik Arvstedt)c6d85c6fe3tests: fix broken unit file when clightning is disabled (Erik Arvstedt)a51f7b419erun-tests: use arg instead of env var for scenario overrides (Erik Arvstedt) Pull request description: ACKs for top commit: jonasnick: ACKb4d7e1aa8fTree-SHA512: f0ed8f8fe326c64eac3b7e9f48597dd00eedb9244333e199d18d1c2c06f369cd015f77aefd48e87235a68aee0b352057249525bf015e0a564fda380bdf7bb9d1
This commit is contained in:
commit
84fc4d48d3
16 changed files with 882 additions and 67 deletions
84
test/README.md
Normal file
84
test/README.md
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
The [`run-tests.sh`](./run-tests.sh) command is most convenient and versatile way to run tests.\
|
||||
It leave no traces (outside of `/nix/store`) on the host system.
|
||||
|
||||
`run-tests.sh` requires Nix >= 2.10.
|
||||
|
||||
### Summary
|
||||
```bash
|
||||
./run-tests.sh [--scenario|-s <scenario>] [build|vm|debug|container]
|
||||
```
|
||||
|
||||
See the top of [run-tests.sh](../test/run-tests.sh) for a complete documentation.\
|
||||
Test scenarios are defined in [tests.nix](./tests.nix) and [tests.py](tests.py).
|
||||
|
||||
### Tutorial
|
||||
#### Running tests
|
||||
```bash
|
||||
# Run the basic set of tests. These tests are also run on the GitHub CI server.
|
||||
./run-tests.sh
|
||||
|
||||
# Run the test for scenario `regtest`.
|
||||
# The test is run via the Nix build system. Successful runs are cached.
|
||||
./run-tests.sh -s regtest build
|
||||
./run-tests.sh -s regtest # Shorthand, equivalent
|
||||
|
||||
# To test a single service, use its name as a scenario.
|
||||
./run-tests.sh -s clightning
|
||||
|
||||
# When no scenario is specified, scenario `default` is used.
|
||||
./run-tests.sh build
|
||||
```
|
||||
#### Debugging
|
||||
```bash
|
||||
# Start a shell is inside a test VM. No tests are executed.
|
||||
./run-tests.sh -s bitcoind vm
|
||||
systemctl status bitcoind
|
||||
|
||||
# Run a Python NixOS test shell inside a VM.
|
||||
# See https://nixos.org/manual/nixos/stable/#ssec-machine-objects for available commands.
|
||||
./run-tests.sh debug
|
||||
print(succeed("systemctl status bitcoind"))
|
||||
run_test("bitcoind")
|
||||
|
||||
# Start a shell in a container node. Requires systemd and root privileges.
|
||||
./run-tests.sh container
|
||||
|
||||
# In the container shell: Run command in container (with prefix `c`)
|
||||
c systemctl status bitcoind
|
||||
|
||||
# Explore a single feature
|
||||
./run-tests.sh -s electrs container
|
||||
|
||||
# Run a command in a container.
|
||||
# The container is deleted afterwards.
|
||||
./run-tests.sh -s clightning container --run c lightning-cli getinfo
|
||||
|
||||
# Define a custom scenario
|
||||
./run-tests.sh --scenario '{
|
||||
services.clightning.enable = true;
|
||||
nix-bitcoin.nodeinfo.enable = true;
|
||||
}' container --run c nodeinfo
|
||||
```
|
||||
|
||||
# Running tests with Flakes
|
||||
|
||||
Tests can also be accessed via the nix-bitcoin flake:
|
||||
|
||||
```bash
|
||||
# Build test
|
||||
nix build --no-link ..#tests.default
|
||||
|
||||
# Run a node in a VM. No tests are executed.
|
||||
nix run ..#tests.default.vm
|
||||
|
||||
# Run a Python test shell inside a VM node
|
||||
nix run ..#tests.default.run -- --debug
|
||||
|
||||
# Run a node in a container. Requires extra-container, systemd and root privileges
|
||||
nix run ..#tests.default.container
|
||||
nix run ..#tests.default.containerLegacy # For NixOS with `system.stateVersion` <22.05
|
||||
|
||||
# Run a command in a container
|
||||
nix run ..#tests.default.container -- --run c nodeinfo
|
||||
nix run ..#tests.default.containerLegacy -- --run c nodeinfo # For NixOS with `system.stateVersion` <22.05
|
||||
```
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
# The tests (defined in ./tests.nix) use the NixOS testing framework and are executed in a VM.
|
||||
#
|
||||
# Usage:
|
||||
# Run all tests
|
||||
# Run the basic set of tests. These are also run on the CI server.
|
||||
# ./run-tests.sh
|
||||
#
|
||||
# Test specific scenario
|
||||
|
|
@ -57,7 +57,8 @@
|
|||
# and reading source files.
|
||||
# Files are copied to /tmp, a caching scheme helps minimizing copies.
|
||||
#
|
||||
# To add custom scenarios, set the environment variable `scenarioOverridesFile`.
|
||||
# Add custom scenarios from a file
|
||||
# ./run-tests.sh --extra-scenarios ~/my/scenarios.nix ...
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
|
|
@ -66,6 +67,7 @@ scriptDir=$(cd "${BASH_SOURCE[0]%/*}" && pwd)
|
|||
args=("$@")
|
||||
scenario=
|
||||
outLinkPrefix=
|
||||
scenarioOverridesFile=
|
||||
while :; do
|
||||
case $1 in
|
||||
--scenario|-s)
|
||||
|
|
@ -88,6 +90,16 @@ while :; do
|
|||
exit 1
|
||||
fi
|
||||
;;
|
||||
--extra-scenarios)
|
||||
if [[ $2 ]]; then
|
||||
scenarioOverridesFile=$2
|
||||
shift
|
||||
shift
|
||||
else
|
||||
>&2 echo "Error: $1 requires an argument."
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
--copy-src|-c)
|
||||
shift
|
||||
if [[ ! $_nixBitcoinInCopiedSrc ]]; then
|
||||
|
|
@ -113,7 +125,7 @@ makeTmpDir() {
|
|||
# Support explicit scenario definitions
|
||||
if [[ $scenario = *' '* ]]; then
|
||||
makeTmpDir
|
||||
export scenarioOverridesFile=$tmpDir/scenario-overrides.nix
|
||||
scenarioOverridesFile=$tmpDir/scenario-overrides.nix
|
||||
echo "{ scenarios, pkgs, lib, nix-bitcoin }: with lib; { tmp = $scenario; }" > "$scenarioOverridesFile"
|
||||
scenario=tmp
|
||||
fi
|
||||
|
|
@ -195,7 +207,7 @@ buildTests() {
|
|||
nixInstantiateTest() {
|
||||
local attr=$1
|
||||
shift
|
||||
if [[ ${scenarioOverridesFile:-} ]]; then
|
||||
if [[ $scenarioOverridesFile ]]; then
|
||||
local file="extraScenariosFile = \"$scenarioOverridesFile\";"
|
||||
else
|
||||
local file=
|
||||
|
|
|
|||
|
|
@ -53,12 +53,6 @@ let
|
|||
clboss.path = "${nbPkgs.clboss}/bin/clboss";
|
||||
};
|
||||
in map (plugin: pluginPkgs.${plugin}.path) enabled;
|
||||
# Torified 'dig' subprocesses of clboss don't respond to SIGTERM and keep
|
||||
# running for a long time when WAN is disabled, which prevents clightning units
|
||||
# from stopping quickly.
|
||||
# Set TimeoutStopSec for faster stopping.
|
||||
systemd.services.clightning.serviceConfig.TimeoutStopSec =
|
||||
mkIf config.services.clightning.plugins.clboss.enable "500ms";
|
||||
|
||||
tests.clightning-rest = cfg.clightning-rest.enable;
|
||||
|
||||
|
|
@ -90,6 +84,8 @@ let
|
|||
};
|
||||
};
|
||||
|
||||
nix-bitcoin.onionServices.lnd.public = true;
|
||||
|
||||
tests.lndconnect-onion-lnd = cfg.lnd.lndconnectOnion.enable;
|
||||
tests.lndconnect-onion-clightning = cfg.clightning-rest.lndconnectOnion.enable;
|
||||
|
||||
|
|
@ -97,7 +93,6 @@ let
|
|||
services.lightning-loop.certificate.extraIPs = [ "20.0.0.1" ];
|
||||
|
||||
tests.lightning-pool = cfg.lightning-pool.enable;
|
||||
nix-bitcoin.onionServices.lnd.public = true;
|
||||
|
||||
tests.charge-lnd = cfg.charge-lnd.enable;
|
||||
|
||||
|
|
@ -140,6 +135,13 @@ let
|
|||
# Avoid timeout failures on slow CI nodes
|
||||
systemd.services.postgresql.serviceConfig.TimeoutStartSec = "5min";
|
||||
}
|
||||
(mkIf config.services.clightning.plugins.clboss.enable {
|
||||
# Torified 'dig' subprocesses of clboss don't respond to SIGTERM and keep
|
||||
# running for a long time when WAN is disabled, which prevents clightning units
|
||||
# from stopping quickly.
|
||||
# Set TimeoutStopSec for faster stopping.
|
||||
systemd.services.clightning.serviceConfig.TimeoutStopSec = "500ms";
|
||||
})
|
||||
(mkIf config.test.features.clightningPlugins {
|
||||
services.clightning.plugins = {
|
||||
clboss.enable = true;
|
||||
|
|
@ -313,7 +315,9 @@ let
|
|||
services.lnd.enable = true;
|
||||
services.bitcoind.prune = 1000;
|
||||
};
|
||||
};
|
||||
} // (import ../dev/dev-scenarios.nix {
|
||||
inherit lib scenarios;
|
||||
});
|
||||
|
||||
## Example scenarios that showcase extra features
|
||||
exampleScenarios = with lib; {
|
||||
|
|
@ -333,6 +337,31 @@ let
|
|||
# See ./lib/test-lib.nix for a description
|
||||
test.container.exposeLocalhost = true;
|
||||
};
|
||||
|
||||
## Scenarios with a custom Python test
|
||||
|
||||
# Variant 1: Define testing code that always runs
|
||||
customTestSimple = {
|
||||
networking.hostName = "myhost";
|
||||
|
||||
# Variant 1: Define testing code that always runs
|
||||
test.extraTestScript = ''
|
||||
succeed("[[ $(hostname) == myhost ]]")
|
||||
'';
|
||||
};
|
||||
|
||||
# Variant 2: Define a test that can be enabled/disabled
|
||||
# via the Nix module system.
|
||||
customTestExtended = {
|
||||
networking.hostName = "myhost";
|
||||
|
||||
tests.hostName = true;
|
||||
test.extraTestScript = ''
|
||||
@test("hostName")
|
||||
def _():
|
||||
succeed("[[ $(hostname) == myhost ]]")
|
||||
'';
|
||||
};
|
||||
};
|
||||
in {
|
||||
inherit scenarios;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue