nixosTest.nix-upgrade: init

Test out both nix upgrade-nix and a NixOS upgrade.

Inject a fake fallback-paths.nix assuming a stable -> latest upgrade.

The NixOS upgrade does not use nixos-rebuild switch due to the
cost+annoyance of the instantiation needing
system.includeBuildDependencies.
This commit is contained in:
Tom Bereknyei 2024-08-18 00:31:38 -04:00 committed by Jörg Thalheim
parent 1a01fa89b5
commit c4dffb6513
2 changed files with 105 additions and 0 deletions

View file

@ -672,6 +672,7 @@ in {
nix-config = handleTest ./nix-config.nix {};
nix-ld = handleTest ./nix-ld.nix {};
nix-misc = handleTest ./nix/misc.nix {};
nix-upgrade = handleTest ./nix/upgrade.nix {inherit (pkgs) nixVersions;};
nix-required-mounts = runTest ./nix-required-mounts;
nix-serve = handleTest ./nix-serve.nix {};
nix-serve-ssh = handleTest ./nix-serve-ssh.nix {};

104
nixos/tests/nix/upgrade.nix Normal file
View file

@ -0,0 +1,104 @@
{ pkgs, nixVersions, ... }:
let
lib = pkgs.lib;
fallback-paths-external = pkgs.writeTextDir "fallback-paths.nix" ''
{
${pkgs.system} = "${nixVersions.latest}";
}'';
inputDrv = import ../.. {
configuration =
{
imports = [ nixos-module ];
nix.package = nixVersions.latest;
boot.isContainer = true;
};
system = pkgs.system;
};
nixos-module = builtins.toFile "nixos-module.nix" ''
{ lib, pkgs, modulesPath, ... }:
{
imports = [
(modulesPath + "/profiles/minimal.nix")
(modulesPath + "/testing/test-instrumentation.nix")
];
hardware.enableAllFirmware = lib.mkForce false;
nix.settings.substituters = lib.mkForce [];
nix.settings.hashed-mirrors = null;
nix.settings.connect-timeout = 1;
nix.extraOptions = "experimental-features = nix-command";
environment.localBinInPath = true;
users.users.alice = {
isNormalUser = true;
packages = [ pkgs.nixVersions.latest ];
};
documentation.enable = false;
}
'';
in
pkgs.testers.nixosTest {
name = "nix-upgrade-${nixVersions.stable.version}-${nixVersions.latest.version}";
meta.maintainers = with lib.maintainers; [ tomberek ];
nodes.machine = {
imports = [ nixos-module ];
nix.package = nixVersions.stable;
system.extraDependencies = [
fallback-paths-external
inputDrv.system
];
};
testScript = ''
machine.start()
machine.wait_for_unit("multi-user.target")
with subtest("nix-current"):
# Create a profile to pretend we are on non-NixOS
print(machine.succeed("nix --version"))
print(machine.succeed("nix-env -i /run/current-system/sw/bin/nix -p /root/.local"))
with subtest("nix-upgrade"):
print(machine.succeed("nix upgrade-nix --nix-store-paths-url file://${fallback-paths-external}/fallback-paths.nix --profile /root/.local"))
result = machine.succeed("nix --version")
print(result)
import re
match = re.match(r".*${nixVersions.latest.version}$",result)
if not match: raise Exception("Couldn't find new version in output: " + result)
with subtest("nix-build-with-mismatch-daemon"):
machine.succeed("nix build --expr 'derivation {name =\"test\"; system = \"${pkgs.system}\";builder = \"/bin/sh\"; args = [\"-c\" \"echo test > $out\"];}' --print-out-paths")
with subtest("remove-new-nix"):
machine.succeed("rm -rf /root/.local")
result = machine.succeed("nix --version")
print(result)
import re
match = re.match(r".*${nixVersions.stable.version}$",result)
with subtest("upgrade-via-switch-to-configuration"):
# not using nixos-rebuild due to nix-instantiate being called and forcing all drv's to be rebuilt
print(machine.succeed("${inputDrv.system.outPath}/bin/switch-to-configuration switch"))
result = machine.succeed("nix --version")
print(result)
import re
match = re.match(r".*${nixVersions.latest.version}$",result)
if not match: raise Exception("Couldn't find new version in output: " + result)
with subtest("nix-build-with-new-daemon"):
machine.succeed("nix build --expr 'derivation {name =\"test-new\"; system = \"${pkgs.system}\";builder = \"/bin/sh\"; args = [\"-c\" \"echo test > $out\"];}' --print-out-paths")
'';
}