aboutsummaryrefslogtreecommitdiff
path: root/tests/nixos/nix-upgrade-nix.nix
blob: 039b2d9b324ae9c7cc600cfc1ca4a6b4b3bbe6a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
{ lib, config, ... }:

/**
 * Test that nix upgrade-nix works regardless of whether /nix/var/nix/profiles/default
 * is a nix-env style profile or a nix profile style profile.
 */

let
  pkgs = config.nodes.machine.nixpkgs.pkgs;

  lix = pkgs.nix;
  lixVersion = lib.getVersion lix;

  newNix = pkgs.nixVersions.unstable;
  newNixVersion = lib.getVersion newNix;

in {
  name = "nix-upgrade-nix";

  nodes = {
    machine = { config, lib, pkgs, ... }: {
      virtualisation.writableStore = true;
      virtualisation.additionalPaths = [ pkgs.hello.drvPath ];
      nix.settings.substituters = lib.mkForce [ ];
      nix.settings.experimental-features = [ "nix-command" "flakes" ];
      services.getty.autologinUser = "root";

    };
  };

  testScript = { nodes }: ''
    # fmt: off

    start_all()

    machine.succeed("nix --version >&2")

    # Install Lix into the default profile, overriding /run/current-system/sw/bin/nix,
    # and thus making Lix think we're not on NixOS.
    machine.succeed("nix-env --install '${lib.getBin lix}' --profile /nix/var/nix/profiles/default >&2")

    # Make sure that correctly got inserted into our PATH.
    default_profile_nix_path = machine.succeed("command -v nix")
    print(default_profile_nix_path)
    assert default_profile_nix_path.strip() == "/nix/var/nix/profiles/default/bin/nix", \
      f"{default_profile_nix_path.strip()=} != /nix/var/nix/profiles/default/bin/nix"

    # And that it's the Nix we specified.
    default_profile_version = machine.succeed("nix --version")
    assert "${lixVersion}" in default_profile_version, f"${lixVersion} not in {default_profile_version}"

    # Upgrade to a different version of Nix, and make sure that also worked.

    machine.succeed("nix upgrade-nix --store-path ${newNix} >&2")
    default_profile_version = machine.succeed("nix --version")
    print(default_profile_version)
    assert "${newNixVersion}" in default_profile_version, f"${newNixVersion} not in {default_profile_version}"

    # Now 'break' this profile -- use nix profile on it so nix-env will no longer work on it.
    machine.succeed(
      "nix profile install --profile /nix/var/nix/profiles/default '${pkgs.hello.drvPath}^*' >&2"
    )

    # Confirm that nix-env is broken.
    machine.fail(
      "nix-env --query --installed --profile /nix/var/nix/profiles/default >&2"
    )

    # And use nix upgrade-nix one more time, on the `nix profile` style profile.
    # (Specifying Lix by full path so we can use --store-path.)
    machine.succeed(
      "${lib.getBin lix}/bin/nix upgrade-nix --store-path '${lix}' >&2"
    )

    default_profile_version = machine.succeed("nix --version")
    print(default_profile_version)
    assert "${lixVersion}" in default_profile_version, f"${lixVersion} not in {default_profile_version}"
  '';

}