Test the fake derivations channel, asserting nested packages are properly represented.
This is a breaking change. Previously, packages named `packageset.foo` would be exposed in the fake derivation channel as `packageset-foo`. Presumably this was done to avoid needing to track attribute sets, and to avoid the complexity. I think this now correctly handles the complexity and properly mirrors the input expressions layout.
This commit is contained in:
parent
88e0198a8e
commit
019aef3d41
|
@ -4,10 +4,11 @@ use strict;
|
|||
use base qw/Catalyst::View/;
|
||||
use Hydra::Helper::Nix;
|
||||
use Hydra::Helper::Escape;
|
||||
use Hydra::Helper::AttributeSet;
|
||||
use Archive::Tar;
|
||||
use IO::Compress::Bzip2 qw(bzip2);
|
||||
use Encode;
|
||||
|
||||
use Data::Dumper;
|
||||
|
||||
|
||||
sub process {
|
||||
|
@ -56,14 +57,15 @@ EOF
|
|||
foreach my $system (keys %perSystem) {
|
||||
$res .= "else " if !$first;
|
||||
$res .= "if system == ${\escapeString $system} then {\n\n";
|
||||
|
||||
my $attrsets = Hydra::Helper::AttributeSet->new();
|
||||
foreach my $job (keys %{$perSystem{$system}}) {
|
||||
my $pkg = $perSystem{$system}->{$job};
|
||||
my $build = $pkg->{build};
|
||||
$res .= " # Hydra build ${\$build->id}\n";
|
||||
my $attr = $build->get_column('job');
|
||||
$attr =~ s/\./-/g;
|
||||
$res .= " ${\escapeString $attr} = (mkFakeDerivation {\n";
|
||||
$attrsets->registerValue($attr);
|
||||
|
||||
$res .= " # Hydra build ${\$build->id}\n";
|
||||
$res .= " ${\escapeAttributePath $attr} = (mkFakeDerivation {\n";
|
||||
$res .= " type = \"derivation\";\n";
|
||||
$res .= " name = ${\escapeString ($build->get_column('releasename') or $build->nixname)};\n";
|
||||
$res .= " system = ${\escapeString $build->system};\n";
|
||||
|
@ -82,6 +84,10 @@ EOF
|
|||
$res .= " }).$out;\n\n";
|
||||
}
|
||||
|
||||
for my $attrset ($attrsets->enumerate()) {
|
||||
$res .= " ${\escapeAttributePath $attrset}.recurseForDerivations = true;\n\n";
|
||||
}
|
||||
|
||||
$res .= "}\n\n";
|
||||
$first = 0;
|
||||
}
|
||||
|
|
62
t/Controller/Jobset/channel.t
Normal file
62
t/Controller/Jobset/channel.t
Normal file
|
@ -0,0 +1,62 @@
|
|||
use feature 'unicode_strings';
|
||||
use strict;
|
||||
use Setup;
|
||||
use IO::Uncompress::Bunzip2 qw(bunzip2);
|
||||
use Archive::Tar;
|
||||
use JSON qw(decode_json);
|
||||
use Data::Dumper;
|
||||
my %ctx = test_init();
|
||||
|
||||
require Hydra::Schema;
|
||||
require Hydra::Model::DB;
|
||||
require Hydra::Helper::Nix;
|
||||
|
||||
use Test2::V0;
|
||||
require Catalyst::Test;
|
||||
Catalyst::Test->import('Hydra');
|
||||
|
||||
my $db = Hydra::Model::DB->new;
|
||||
hydra_setup($db);
|
||||
|
||||
my $project = $db->resultset('Projects')->create({name => "tests", displayname => "", owner => "root"});
|
||||
|
||||
# Most basic test case, no parameters
|
||||
my $jobset = createBaseJobset("nested-attributes", "nested-attributes.nix", $ctx{jobsdir});
|
||||
|
||||
ok(evalSucceeds($jobset));
|
||||
is(nrQueuedBuildsForJobset($jobset), 4);
|
||||
|
||||
for my $build (queuedBuildsForJobset($jobset)) {
|
||||
ok(runBuild($build), "Build '".$build->job."' should exit with code 0");
|
||||
my $newbuild = $db->resultset('Builds')->find($build->id);
|
||||
is($newbuild->finished, 1, "Build '".$build->job."' should be finished.");
|
||||
is($newbuild->buildstatus, 0, "Build '".$build->job."' should have buildstatus 0.");
|
||||
}
|
||||
|
||||
my $compressed = get('/jobset/tests/nested-attributes/channel/latest/nixexprs.tar.bz2');
|
||||
my $tarcontent;
|
||||
bunzip2(\$compressed => \$tarcontent);
|
||||
open(my $tarfh, "<", \$tarcontent);
|
||||
my $tar = Archive::Tar->new($tarfh);
|
||||
|
||||
my $defaultnix = $ctx{"tmpdir"} . "/channel-default.nix";
|
||||
$tar->extract_file("channel/default.nix", $defaultnix);
|
||||
|
||||
print STDERR $tar->get_content("channel/default.nix");
|
||||
|
||||
(my $status, my $stdout, my $stderr) = Hydra::Helper::Nix::captureStdoutStderr(5, "nix-env", "--json", "--query", "--available", "--attr-path", "--file", $defaultnix);
|
||||
is($stderr, "", "Stderr should be empty");
|
||||
is($status, 0, "Querying the packages should succeed");
|
||||
|
||||
my $packages = decode_json($stdout);
|
||||
my $keys = [sort keys %$packages];
|
||||
is($keys, [
|
||||
"packageset-nested",
|
||||
"packageset.deeper.deeper.nested",
|
||||
"packageset.nested",
|
||||
"packageset.nested2",
|
||||
]);
|
||||
is($packages->{"packageset-nested"}->{"name"}, "actually-top-level");
|
||||
is($packages->{"packageset.nested"}->{"name"}, "actually-nested");
|
||||
|
||||
done_testing;
|
36
t/jobs/nested-attributes.nix
Normal file
36
t/jobs/nested-attributes.nix
Normal file
|
@ -0,0 +1,36 @@
|
|||
with import ./config.nix;
|
||||
rec {
|
||||
# Given a jobset containing a package set named X with an interior member Y,
|
||||
# expose the interior member Y with the name X-Y. This is to exercise a bug
|
||||
# in the NixExprs view's generated Nix expression which flattens the
|
||||
# package set namespace from `X.Y` to `X-Y`. If the bug is present, the
|
||||
# resulting expression incorrectly renders two `X-Y` packages.
|
||||
packageset = {
|
||||
recurseForDerivations = true;
|
||||
deeper = {
|
||||
recurseForDerivations = true;
|
||||
deeper = {
|
||||
recurseForDerivations = true;
|
||||
|
||||
nested = mkDerivation {
|
||||
name = "much-too-deep";
|
||||
builder = ./empty-dir-builder.sh;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
nested = mkDerivation {
|
||||
name = "actually-nested";
|
||||
builder = ./empty-dir-builder.sh;
|
||||
};
|
||||
|
||||
nested2 = mkDerivation {
|
||||
name = "actually-nested2";
|
||||
builder = ./empty-dir-builder.sh;
|
||||
};
|
||||
};
|
||||
packageset-nested = mkDerivation {
|
||||
name = "actually-top-level";
|
||||
builder = ./empty-dir-builder.sh;
|
||||
};
|
||||
}
|
Loading…
Reference in a new issue