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
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
from collections.abc import Callable

from testlib.fixtures.file_helper import AssetSymlink, CopyFile, with_files
from testlib.fixtures.nix import Nix
from testlib.fixtures.snapshot import Snapshot
from testlib.utils import get_global_asset

import re


def filter_paths(nix: Nix, output: str) -> str:
    return re.sub(
        r"/nix/store/[0-9a-z]{32}",
        "/nix/store/hashfilteredforrepeatableoutputs",
        output.replace(nix.env.dirs.test_root.as_posix(), ""),
    )


@with_files(
    {
        "import-derivation.nix": CopyFile(
            "assets/test_import_from_derivation/import-derivation.nix"
        ),
        "config.nix": get_global_asset("config.nix"),
        "error": AssetSymlink("assets/test_import_from_derivation/warn-ifd.err.exp"),
    }
)
def test_warn_ifd(nix: Nix, snapshot: Callable[[str], Snapshot]):
    error = (
        nix.nix_build(
            [
                "./import-derivation.nix",
                "--no-out-link",
                *["--option", "warn-import-from-derivation", "true"],
            ]
        )
        .run()
        .ok()
        .stderr_plain
    )

    assert snapshot("error") == filter_paths(nix, error)


@with_files(
    {
        "import-derivation.nix": CopyFile(
            "assets/test_import_from_derivation/import-derivation.nix"
        ),
        "config.nix": get_global_asset("config.nix"),
        "error": AssetSymlink("assets/test_import_from_derivation/deny-ifd.err.exp"),
    }
)
def test_deny_ifd(nix: Nix, snapshot: Callable[[str], Snapshot]):
    error = (
        nix.nix_build(
            [
                "./import-derivation.nix",
                "--no-out-link",
                *["--option", "allow-import-from-derivation", "false"],
            ]
        )
        .run()
        .expect(1)
        .stderr_plain
    )
    assert snapshot("error") == filter_paths(nix, error)


@with_files(
    {
        "import-derivation.nix": CopyFile(
            "assets/test_import_from_derivation/import-derivation.nix"
        ),
        "config.nix": get_global_asset("config.nix"),
        "error": AssetSymlink("assets/test_import_from_derivation/allow-ifd.err.exp"),
    }
)
def test_allow_ifd(nix: Nix, snapshot: Callable[[str], Snapshot]):
    build = nix.nix_build(["./import-derivation.nix", "--no-out-link"]).run().ok()
    error = build.stderr_plain
    out_path = build.stdout_plain

    assert nix.physical_store_path_for(out_path).read_text() == "FOO579"
    assert snapshot("error") == filter_paths(nix, error)


@with_files(
    {
        "import-derivation.nix": CopyFile(
            "assets/test_import_from_derivation/import-derivation.nix"
        ),
        "config.nix": get_global_asset("config.nix"),
        "error": AssetSymlink(
            "assets/test_import_from_derivation/instantiate-ifd-readonly-fail.err.exp"
        ),
    }
)
def test_instantiate_ifd_readonly_fail(nix: Nix, snapshot: Callable[[str], Snapshot]):
    error = (
        nix.nix_instantiate(["--readonly-mode", "./import-derivation.nix"])
        .run()
        .expect(1)
        .stderr_plain
    )
    assert snapshot("error") == filter_paths(nix, error)