diff --git a/nixos/lib/build-vms.nix b/nixos/lib/build-vms.nix index 933f8139249..024f4414ebe 100644 --- a/nixos/lib/build-vms.nix +++ b/nixos/lib/build-vms.nix @@ -1,4 +1,13 @@ -{ system, pkgs, minimal ? false, config ? {} }: +{ system +, # Use a minimal kernel? + minimal ? false +, # Ignored + config ? null + # Nixpkgs, for qemu, lib and more +, pkgs +, # NixOS configuration to add to the VMs + extraConfigurations ? [] +}: with pkgs.lib; with import ../lib/qemu-flags.nix { inherit pkgs; }; @@ -28,7 +37,8 @@ rec { ../modules/testing/test-instrumentation.nix # !!! should only get added for automated test runs { key = "no-manual"; documentation.nixos.enable = false; } { key = "qemu"; system.build.qemu = qemu; } - ] ++ optional minimal ../modules/testing/minimal-kernel.nix; + ] ++ optional minimal ../modules/testing/minimal-kernel.nix + ++ extraConfigurations; extraArgs = { inherit nodes; }; }; diff --git a/nixos/lib/testing.nix b/nixos/lib/testing.nix index f90fc9f7df0..690f7dfd5fa 100644 --- a/nixos/lib/testing.nix +++ b/nixos/lib/testing.nix @@ -1,6 +1,13 @@ -{ system, pkgs, minimal ? false, config ? {} }: +{ system +, pkgs + # Use a minimal kernel? +, minimal ? false + # Ignored +, config ? null + # Modules to add to each VM +, extraConfigurations ? [] }: -with import ./build-vms.nix { inherit system pkgs minimal config; }; +with import ./build-vms.nix { inherit system pkgs minimal extraConfigurations; }; with pkgs; let diff --git a/pkgs/test/default.nix b/pkgs/test/default.nix index 24948ce9aa4..9315595f8ec 100644 --- a/pkgs/test/default.nix +++ b/pkgs/test/default.nix @@ -30,5 +30,7 @@ with pkgs; cross = callPackage ./cross {}; + nixos-functions = callPackage ./nixos-functions {}; + patch-shebangs = callPackage ./patch-shebangs {}; } diff --git a/pkgs/test/nixos-functions/default.nix b/pkgs/test/nixos-functions/default.nix new file mode 100644 index 00000000000..c8f7122006f --- /dev/null +++ b/pkgs/test/nixos-functions/default.nix @@ -0,0 +1,33 @@ +/* + +This file is a test that makes sure that the `pkgs.nixos` and +`pkgs.nixosTest` functions work. It's far from a perfect test suite, +but better than not checking them at all on hydra. + +To run this test: + + nixpkgs$ nix-build -A tests.nixos-functions + + */ +{ pkgs, lib, stdenv, ... }: + +lib.optionalAttrs stdenv.hostPlatform.isLinux ( + pkgs.recurseIntoAttrs { + + nixos-test = (pkgs.nixos { + boot.loader.grub.enable = false; + fileSystems."/".device = "/dev/null"; + }).toplevel; + + nixosTest-test = pkgs.nixosTest ({ lib, pkgs, ... }: { + name = "nixosTest-test"; + machine = { pkgs, ... }: { + environment.systemPackages = [ pkgs.hello ]; + }; + testScript = '' + $machine->succeed("hello"); + ''; + }); + + } +) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index fe367ebbb32..b5a45a02084 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -22219,6 +22219,61 @@ with pkgs; ); }).config.system.build; + + /* + * Run a NixOS VM network test using this evaluation of Nixpkgs. + * + * It is mostly equivalent to `import ./make-test.nix` from the + * NixOS manual[1], except that your `pkgs` will be used instead of + * letting NixOS invoke Nixpkgs again. If a test machine needs to + * set NixOS options under `nixpkgs`, it must set only the + * `nixpkgs.pkgs` option. For the details, see the Nixpkgs + * `pkgs.nixos` documentation. + * + * Parameter: + * A NixOS VM test network, or path to it. Example: + * + * { lib, ... }: + * { name = "my-test"; + * nodes = { + * machine-1 = someNixOSConfiguration; + * machine-2 = ...; + * } + * } + * + * Result: + * A derivation that runs the VM test. + * + * [1]: For writing NixOS tests, see + * https://nixos.org/nixos/manual/index.html#sec-nixos-tests + */ + nixosTest = + let + /* The nixos/lib/testing.nix module, preapplied with arguments that + * make sense for this evaluation of Nixpkgs. + */ + nixosTesting = + (import ../../nixos/lib/testing.nix { + inherit (pkgs.stdenv.hostPlatform) system; + inherit pkgs; + extraConfigurations = [( + { lib, ... }: { + config.nixpkgs.pkgs = lib.mkDefault pkgs; + } + )]; + }); + in + test: + let + loadedTest = if builtins.typeOf test == "path" + then import test + else test; + calledTest = if pkgs.lib.isFunction loadedTest + then callPackage loadedTest {} + else loadedTest; + in + nixosTesting.makeTest calledTest; + nixui = callPackage ../tools/package-management/nixui { node_webkit = nwjs_0_12; }; nixdoc = callPackage ../tools/nix/nixdoc {};