tests: optimize building multiple tests at once

The result of `import tests.nix {}` is now an attrset of tests.
This makes it easier and more efficient to evaluate or build multiple
tests in one call to `nix build`.

Simplify tests.nix by removing the large module args scope in favor of
self-contained scenario module definitions.

Add CPU core and memory size defaults to the test configuration to
enable building tests without `run-tests.sh`.

Add the following top-level args to tests.nix:
- `extraScenarios` to provide a nix-level way to define extra scenarios.
- `pkgs` to allow building tests with custom pkgs or systems.
This commit is contained in:
Erik Arvstedt
2021-03-22 13:19:48 +01:00
parent 9ca52af523
commit 44439e2a81
5 changed files with 59 additions and 32 deletions

View File

@@ -1,14 +1,20 @@
# Integration tests, can be run without internet access.
{ scenario ? "default" }:
let
nixpkgs = (import ../pkgs/nixpkgs-pinned.nix).nixpkgs;
in
import ./lib/make-test.nix scenario (
{ config, pkgs, lib, ... }: with lib;
let testEnv = rec {
cfg = config.services;
mkIfTest = test: mkIf (config.tests.${test} or false);
{ extraScenarios ? { ... }: {}
, pkgs ? import nixpkgs { config = {}; overlays = []; }
}:
with pkgs.lib;
let
globalPkgs = pkgs;
baseConfig = {
baseConfig = { pkgs, config, ... }: let
cfg = config.services;
mkIfTest = test: mkIf (config.tests.${test} or false);
in {
imports = [
./lib/test-lib.nix
../modules/modules.nix
@@ -26,6 +32,9 @@ let testEnv = rec {
};
config = mkMerge [{
# Share the same pkgs instance among tests
nixpkgs.pkgs = mkDefault globalPkgs;
tests.bitcoind = cfg.bitcoind.enable;
services.bitcoind = {
enable = true;
@@ -183,14 +192,14 @@ let testEnv = rec {
];
};
netnsBase = {
netnsBase = { config, pkgs, ... }: {
nix-bitcoin.netns-isolation.enable = true;
test.data.netns = config.nix-bitcoin.netns-isolation.netns;
tests.netns-isolation = true;
environment.systemPackages = [ pkgs.fping ];
};
regtestBase = {
regtestBase = { config, ... }: {
tests.regtest = true;
services.bitcoind.regtest = true;
@@ -241,20 +250,29 @@ let testEnv = rec {
# You can also set the env var `scenarioOverridesFile` (used below) to define custom scenarios.
};
};
};
in
let
overrides = builtins.getEnv "scenarioOverridesFile";
scenarios = testEnv.scenarios // (optionalAttrs (overrides != "") (import overrides {
inherit testEnv config pkgs lib;
}));
autoScenario = {
services.${scenario}.enable = true;
overrides = builtins.getEnv "scenarioOverridesFile";
extraScenarios' = (if (overrides != "") then import overrides else extraScenarios) {
inherit scenarios pkgs;
inherit (pkgs) lib;
};
allScenarios = scenarios // extraScenarios';
makeTest = name: config:
makeTest' name {
imports = [
allScenarios.base
config
];
};
in {
imports = [
scenarios.base
(scenarios.${scenario} or autoScenario)
];
makeTest' = import ./lib/make-test.nix pkgs;
tests = builtins.mapAttrs makeTest allScenarios;
getTest = name: tests.${name} or (makeTest name {
services.${name}.enable = true;
});
in
tests // {
inherit getTest;
}
)