testing: migrate flakes/build-paths.sh
Change-Id: Ia7f15abd8f5444c69fef4da0d080a2933ac264d8
This commit is contained in:
@@ -1,96 +0,0 @@
|
||||
source ./common.sh
|
||||
|
||||
flake1Dir=$TEST_ROOT/flake1
|
||||
flake2Dir=$TEST_ROOT/flake2
|
||||
|
||||
mkdir -p $flake1Dir $flake2Dir
|
||||
|
||||
writeSimpleFlake $flake2Dir
|
||||
tar cfz $TEST_ROOT/flake.tar.gz -C $TEST_ROOT flake2
|
||||
hash=$(nix hash path $flake2Dir)
|
||||
|
||||
dep=$(nix store add-path ./common.sh)
|
||||
|
||||
cat > $flake1Dir/flake.nix <<EOF
|
||||
{
|
||||
inputs.flake2.url = "file://$TEST_ROOT/flake.tar.gz";
|
||||
|
||||
outputs = { self, flake2 }: {
|
||||
|
||||
a1 = builtins.fetchTarball {
|
||||
#type = "tarball";
|
||||
url = "file://$TEST_ROOT/flake.tar.gz";
|
||||
sha256 = "$hash";
|
||||
};
|
||||
|
||||
a2 = ./foo;
|
||||
|
||||
a3 = ./.;
|
||||
|
||||
a4 = self.outPath;
|
||||
|
||||
# FIXME
|
||||
a5 = self;
|
||||
|
||||
a6 = flake2.outPath;
|
||||
|
||||
# FIXME
|
||||
a7 = "\${flake2}/config.nix";
|
||||
|
||||
# This is only allowed in impure mode.
|
||||
a8 = builtins.storePath $dep;
|
||||
|
||||
a9 = "$dep";
|
||||
|
||||
drvCall = with import ./config.nix; mkDerivation {
|
||||
name = "simple";
|
||||
builder = ./simple.builder.sh;
|
||||
PATH = "";
|
||||
goodPath = path;
|
||||
};
|
||||
|
||||
a10 = builtins.unsafeDiscardOutputDependency self.drvCall.drvPath;
|
||||
|
||||
a11 = self.drvCall.drvPath;
|
||||
|
||||
a12 = self.drvCall.outPath;
|
||||
|
||||
a13 = "\${self.drvCall.drvPath}\${self.drvCall.outPath}";
|
||||
};
|
||||
}
|
||||
EOF
|
||||
|
||||
cp ../simple.nix ../simple.builder.sh ../config.nix $flake1Dir/
|
||||
|
||||
echo bar > $flake1Dir/foo
|
||||
|
||||
nix build --json --out-link $TEST_ROOT/result $flake1Dir#a1
|
||||
[[ -e $TEST_ROOT/result/simple.nix ]]
|
||||
|
||||
nix build --json --out-link $TEST_ROOT/result $flake1Dir#a2
|
||||
[[ $(cat $TEST_ROOT/result) = bar ]]
|
||||
|
||||
nix build --json --out-link $TEST_ROOT/result $flake1Dir#a3
|
||||
|
||||
nix build --json --out-link $TEST_ROOT/result $flake1Dir#a4
|
||||
|
||||
nix build --json --out-link $TEST_ROOT/result $flake1Dir#a6
|
||||
[[ -e $TEST_ROOT/result/simple.nix ]]
|
||||
|
||||
nix build --impure --json --out-link $TEST_ROOT/result $flake1Dir#a8
|
||||
diff common.sh $TEST_ROOT/result
|
||||
|
||||
expectStderr 1 nix build --impure --json --out-link $TEST_ROOT/result $flake1Dir#a9 \
|
||||
| grepQuiet "has 0 entries in its context. It should only have exactly one entry"
|
||||
|
||||
nix build --json --out-link $TEST_ROOT/result $flake1Dir#a10
|
||||
[[ $(readlink -e $TEST_ROOT/result) = *simple.drv ]]
|
||||
|
||||
expectStderr 1 nix build --json --out-link $TEST_ROOT/result $flake1Dir#a11 \
|
||||
| grepQuiet "has a context which refers to a complete source and binary closure"
|
||||
|
||||
nix build --json --out-link $TEST_ROOT/result $flake1Dir#a12
|
||||
[[ -e $TEST_ROOT/result/hello ]]
|
||||
|
||||
expectStderr 1 nix build --impure --json --out-link $TEST_ROOT/result $flake1Dir#a13 \
|
||||
| grepQuiet "has 2 entries in its context. It should only have exactly one entry"
|
||||
@@ -37,7 +37,6 @@ functional_tests_scripts = [
|
||||
'flakes/develop-r8854.sh',
|
||||
'flakes/mercurial.sh',
|
||||
'flakes/follow-paths.sh',
|
||||
'flakes/build-paths.sh',
|
||||
'flakes/flake-in-submodule.sh',
|
||||
'flakes/flake-registry.sh',
|
||||
'gc.sh',
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
from testlib.fixtures.nix import Nix
|
||||
from testlib.fixtures.file_helper import with_files, File
|
||||
from testlib.fixtures.command import CommandResult
|
||||
from pathlib import Path
|
||||
from .common import simple_flake
|
||||
import tarfile
|
||||
import pytest
|
||||
|
||||
flake_nix = """
|
||||
{
|
||||
inputs.flake2.url = "file://$TEST_ROOT/flake.tar.gz";
|
||||
|
||||
outputs = { self, flake2 }: {
|
||||
|
||||
a1 = builtins.fetchTarball {
|
||||
#type = "tarball";
|
||||
url = "file://$TEST_ROOT/flake.tar.gz";
|
||||
sha256 = "$hash";
|
||||
};
|
||||
|
||||
a2 = ./foo;
|
||||
|
||||
a3 = ./.;
|
||||
|
||||
a4 = self.outPath;
|
||||
|
||||
# FIXME
|
||||
a5 = self;
|
||||
|
||||
a6 = flake2.outPath;
|
||||
|
||||
# FIXME
|
||||
a7 = "${flake2}/config.nix";
|
||||
|
||||
# This is only allowed in impure mode.
|
||||
a8 = builtins.storePath $dep;
|
||||
|
||||
a9 = "$dep";
|
||||
|
||||
drvCall = with import ./config.nix; mkDerivation {
|
||||
name = "simple";
|
||||
builder = ./simple.builder.sh;
|
||||
PATH = "";
|
||||
goodPath = path;
|
||||
};
|
||||
|
||||
a10 = builtins.unsafeDiscardOutputDependency self.drvCall.drvPath;
|
||||
|
||||
a11 = self.drvCall.drvPath;
|
||||
|
||||
a12 = self.drvCall.outPath;
|
||||
|
||||
a13 = "${self.drvCall.drvPath}${self.drvCall.outPath}";
|
||||
};
|
||||
}
|
||||
"""
|
||||
|
||||
files = {
|
||||
"flake1": simple_flake() | {"foo": File("bar")},
|
||||
"flake2": simple_flake(),
|
||||
"common.sh": File("nothing important"),
|
||||
}
|
||||
|
||||
|
||||
@with_files(files)
|
||||
class TestBuild:
|
||||
@pytest.fixture(autouse=True)
|
||||
def common_init(self, nix: Nix, files: Path):
|
||||
self.nix = nix
|
||||
self.out = nix.env.dirs.home / "result"
|
||||
|
||||
nix.settings.add_xp_feature("nix-command", "flakes")
|
||||
|
||||
with tarfile.open(files / "flake.tar.gz", "w:gz") as tar:
|
||||
|
||||
def drop_prefix(ti: tarfile.TarInfo) -> tarfile.TarInfo:
|
||||
ti.name = ti.name.replace(str(files)[1:] + "/", "")
|
||||
return ti
|
||||
|
||||
tar.add(files / "flake2", filter=drop_prefix)
|
||||
|
||||
flake_hash = nix.hash_path(files / "flake2")
|
||||
dep = nix.nix(["store", "add-path", files / "common.sh"]).run().ok().stdout_s.strip()
|
||||
|
||||
flake = files / "flake1/flake.nix"
|
||||
flake.write_text(
|
||||
flake_nix.replace("$TEST_ROOT", str(files))
|
||||
.replace("$hash", flake_hash)
|
||||
.replace("$dep", dep)
|
||||
)
|
||||
|
||||
def build(self, *args) -> CommandResult:
|
||||
return self.nix.nix(["build", "--json", "--out-link", self.out, *args]).run()
|
||||
|
||||
@pytest.mark.parametrize("attr", ["a1", "a6"])
|
||||
def test_build_simple_nix(self, files: Path, attr: str):
|
||||
self.build(f"{files}/flake1#{attr}").ok()
|
||||
assert (self.out / "simple.nix").exists()
|
||||
|
||||
def test_build_a2(self, files: Path):
|
||||
self.build(f"{files}/flake1#a2").ok()
|
||||
assert self.out.read_text() == "bar"
|
||||
|
||||
@pytest.mark.parametrize("attr", ["a3", "a4"])
|
||||
def test_build_plain(self, files: Path, attr: str):
|
||||
self.build(f"{files}/flake1#{attr}").ok()
|
||||
|
||||
def test_build_a8(self, files: Path):
|
||||
self.build("--impure", f"{files}/flake1#a8").ok()
|
||||
assert self.out.read_text() == "nothing important"
|
||||
|
||||
def test_build_a9(self, files: Path):
|
||||
result = self.build(f"{files}/flake1#a9").expect(1)
|
||||
assert (
|
||||
"has 0 entries in its context. It should only have exactly one entry" in result.stderr_s
|
||||
)
|
||||
|
||||
def test_build_a10(self, files: Path):
|
||||
self.build(f"{files}/flake1#a10").ok()
|
||||
assert str(self.out.readlink()).endswith("simple.drv")
|
||||
|
||||
def test_build_a11(self, files: Path):
|
||||
result = self.build(f"{files}/flake1#a11").expect(1)
|
||||
assert (
|
||||
"has a context which refers to a complete source and binary closure" in result.stderr_s
|
||||
)
|
||||
|
||||
def test_build_a12(self, files: Path):
|
||||
self.build(f"{files}/flake1#a12").ok()
|
||||
assert (self.out / "hello").exists()
|
||||
|
||||
def test_build_a13(self, files: Path):
|
||||
result = self.build("--impure", f"{files}/flake1#a13").expect(1)
|
||||
assert (
|
||||
"has 2 entries in its context. It should only have exactly one entry" in result.stderr_s
|
||||
)
|
||||
Reference in New Issue
Block a user