args@{
  system,
  pkgs ? import ../.. { inherit system config; },
  # Use a minimal kernel?
  minimal ? false,
  # Ignored
  config ? { },
  # !!! See comment about args in lib/modules.nix
  specialArgs ? throw "legacy - do not use, see error below",
  # Modules to add to each VM
  extraConfigurations ? [ ],
}:
let
  nixos-lib = import ./default.nix { inherit (pkgs) lib; };
in

pkgs.lib.throwIf (args ? specialArgs)
  ''
    testing-python.nix: `specialArgs` is not supported anymore. If you're looking
    for the public interface to the NixOS test framework, use `runTest`, and
    `node.specialArgs`.
    See https://nixos.org/manual/nixos/unstable/index.html#sec-calling-nixos-tests
    and https://nixos.org/manual/nixos/unstable/index.html#test-opt-node.specialArgs
  ''
  rec {

    inherit pkgs;

    evalTest =
      module:
      nixos-lib.evalTest {
        imports = [
          extraTestModule
          module
        ];
      };
    runTest =
      module:
      nixos-lib.runTest {
        imports = [
          extraTestModule
          module
        ];
      };

    extraTestModule = {
      config = {
        hostPkgs = pkgs;
      };
    };

    # Make a full-blown test (legacy)
    # For an official public interface to the tests, see
    # https://nixos.org/manual/nixos/unstable/index.html#sec-calling-nixos-tests
    makeTest =
      {
        machine ? null,
        nodes ? { },
        testScript,
        enableOCR ? false,
        globalTimeout ? (60 * 60),
        name ? "unnamed",
        skipTypeCheck ? false,
        # Skip linting (mainly intended for faster dev cycles)
        skipLint ? false,
        passthru ? { },
        meta ? { },
        # For meta.position
        pos ? # position used in error messages and for meta.position
          (
            if meta.description or null != null then
              builtins.unsafeGetAttrPos "description" meta
            else
              builtins.unsafeGetAttrPos "testScript" t
          ),
        extraPythonPackages ? (_: [ ]),
        interactive ? { },
        sshBackdoor ? { },
      }@t:
      let
        testConfig =
          (evalTest {
            imports = [
              {
                _file = "makeTest parameters";
                config = t;
              }
              {
                defaults = {
                  _file = "makeTest: extraConfigurations";
                  imports = extraConfigurations;
                };
              }
            ];
          }).config;
      in
      testConfig.test # For nix-build
      // testConfig; # For all-tests.nix

    simpleTest = as: (makeTest as).test;

  }
