From 3cce822c6470f7488a607290ef5d82d47115fe61 Mon Sep 17 00:00:00 2001 From: Erik Arvstedt Date: Fri, 26 Mar 2021 23:23:22 +0100 Subject: [PATCH] run-tests: add 'vm' command --- examples/README.md | 5 +++++ test/lib/make-test.nix | 18 ++++++++++++++++++ test/run-tests.sh | 26 ++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/examples/README.md b/examples/README.md index aca0366..b9bcfeb 100644 --- a/examples/README.md +++ b/examples/README.md @@ -45,9 +45,14 @@ the host system. git clone https://github.com/fort-nix/nix-bitcoin cd nix-bitcoin/test +# Run a node in a VM. No tests are executed. +./run-tests.sh vm +systemctl status bitcoind + # Run a Python test shell inside a VM node ./run-tests.sh debug print(succeed("systemctl status bitcoind")) +run_test("bitcoind") # Run a node in a container. Requires systemd and root privileges. ./run-tests.sh container diff --git a/test/lib/make-test.nix b/test/lib/make-test.nix index 4635607..7666755 100644 --- a/test/lib/make-test.nix +++ b/test/lib/make-test.nix @@ -61,5 +61,23 @@ name: testConfig: }; }; + # This allows running a test scenario in a regular NixOS VM. + # No tests are executed. + vmWithoutTests = (pkgs.nixos { + imports = [ + testConfig + "${toString pkgs.path}/nixos/modules/virtualisation/qemu-vm.nix" + ]; + virtualisation.graphics = false; + services.mingetty.autologinUser = "root"; + + # Provide a shortcut for instant poweroff from within the machine + environment.systemPackages = with pkgs; [ + (lowPrio (writeScriptBin "q" '' + echo o >/proc/sysrq-trigger + '')) + ]; + }).vm; + config = testConfig; } diff --git a/test/run-tests.sh b/test/run-tests.sh index f07c835..15e7283 100755 --- a/test/run-tests.sh +++ b/test/run-tests.sh @@ -42,6 +42,14 @@ # For now, creating NixOS containers requires root permissions. # See ./lib/make-container.sh for a complete documentation. # +# Run a test scenario in a regular NixOS VM. +# No tests are executed, the machine's serial console is attached to your terminal. +# ./run-tests.sh [--scenario ] vm +# +# This is useful for directly exploring a test configuration without the +# intermediate Python REPL layer. +# Run command 'q' inside the machine for instant poweroff. +# # Run tests from a snapshot copy of the source files # ./run-tests.sh --copy-src|-c ... # @@ -170,6 +178,24 @@ container() { "$scriptDir/lib/make-container.sh" "$@" } +# Run a regular NixOS VM +vm() { + export TMPDIR=$(mktemp -d /tmp/nix-bitcoin-vm.XXX) + runAtExit+="rm -rf $TMPDIR;" + + nix-build --out-link $TMPDIR/vm -E "((import \"$scriptDir/tests.nix\" {}).getTest \"$scenario\").vmWithoutTests" + + echo "VM stats: CPUs: $numCPUs, memory: $memoryMiB MiB" + extraNetOpts= + [[ $NB_TEST_ENABLE_NETWORK ]] || extraNetOpts='restrict=on' + + USE_TMPDIR=1 \ + NIX_DISK_IMAGE=$TMPDIR/img.qcow2 \ + QEMU_OPTS="-smp $numCPUs -m $memoryMiB -nographic $QEMU_OPTS" \ + QEMU_NET_OPTS="$extraNetOpts $QEMU_NET_OPTS" \ + $TMPDIR/vm/bin/run-*-vm +} + doBuild() { name=$1 shift