Test the fake derivations channel, asserting nested packages are properly represented.

[?]
Mar 17, 2021, 3:20 PM
MQLCUSZLZWVUI6OE4TVYRJWEGBF3GF4MWWSZGF4WLC35TIOKE3IAC

Dependencies

  • [2] VMBIK4GU NixExprs.pm: encode default.nix as utf-8 to fix missing chars/data. (#455)
  • [3] S2KNQCPB NixExprs: extract the `escape` function and test it
  • [4] UZENK33P * Generate a .tar.bz2 file for the channel Nix expression, since
  • [5] I42G2Z7P * Escape string literals.[
  • [6] L5Z6CN7M In Hydra channels, show only packages matching the user's system type
  • [7] PDZXZZPZ Shut up some Perl 5.20 warnings
  • [8] FG4JZPWS Handle builds with multiple outputs correctly in Hydra channels
  • [9] LVJKRTIK * Generate a Nix expression for the channel.
  • [*] 2JJP7673 tests: move to t, allow `yath test` from root

Change contents

  • edit in src/lib/Hydra/View/NixExprs.pm at line 7
    [3.302]
    [4.70]
    use Hydra::Helper::AttributeSet;
  • replacement in src/lib/Hydra/View/NixExprs.pm at line 11
    [2.12][4.0:1](),[4.123][4.0:1](),[4.479][4.0:1]()
    [2.12]
    [4.1]
    use Data::Dumper;
  • replacement in src/lib/Hydra/View/NixExprs.pm at line 60
    [3.371][4.2244:2245](),[4.1072][4.2244:2245]()
    [3.371]
    [4.84]
    my $attrsets = Hydra::Helper::AttributeSet->new();
  • edit in src/lib/Hydra/View/NixExprs.pm at line 64
    [4.2388][4.2388:2444]()
    $res .= " # Hydra build ${\$build->id}\n";
  • replacement in src/lib/Hydra/View/NixExprs.pm at line 65
    [4.2494][4.2494:2525](),[4.2525][3.372:444]()
    $attr =~ s/\./-/g;
    $res .= " ${\escapeString $attr} = (mkFakeDerivation {\n";
    [4.2494]
    [4.2591]
    $attrsets->registerValue($attr);
    $res .= " # Hydra build ${\$build->id}\n";
    $res .= " ${\escapeAttributePath $attr} = (mkFakeDerivation {\n";
  • edit in src/lib/Hydra/View/NixExprs.pm at line 85
    [4.3655]
    [4.3655]
    }
    for my $attrset ($attrsets->enumerate()) {
    $res .= " ${\escapeAttributePath $attrset}.recurseForDerivations = true;\n\n";
  • file addition: Controller (d--r------)
    [11.697]
  • file addition: Jobset (d--r------)
    [0.451]
  • file addition: channel.t (----------)
    [0.475]
    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;
  • file addition: nested-attributes.nix (----------)
    [11.1263]
    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;
    };
    }