notifications.t: move to makeAndEvaluateJobset

This commit is contained in:
Graham Christensen 2021-12-14 20:41:21 -05:00
parent 008321d972
commit c2384a04d8

View file

@ -1,12 +1,12 @@
use feature 'unicode_strings';
use strict; use strict;
use warnings; use warnings;
use JSON::MaybeXS; use JSON::MaybeXS;
use Setup; use Setup;
use Test2::V0;
my $binarycachedir = File::Temp->newdir(); my $binarycachedir = File::Temp->newdir();
my %ctx = test_init( my $ctx = test_context(
nix_config => qq| nix_config => qq|
experimental-features = nix-command experimental-features = nix-command
substituters = file://${binarycachedir}?trusted=1 substituters = file://${binarycachedir}?trusted=1
@ -18,13 +18,9 @@ my %ctx = test_init(
</runcommand> </runcommand>
|); |);
require Hydra::Schema;
require Hydra::Model::DB;
use Test2::V0;
# Check that hydra's queue runner sends notifications. # Check that hydra's queue runner sends notifications.
# #
# The prelude to the test prebuilds one attribute and puts it in a # The prelude to the test prebuilds one attribute and puts it in a
# binary cache. The jobset will try to build that job plus another, # binary cache. The jobset will try to build that job plus another,
# and we'll be able to check the behavior in both cases. # and we'll be able to check the behavior in both cases.
@ -40,11 +36,11 @@ subtest "Pre-build the job, upload to the cache, and then delete locally" => sub
my $scratchlogdir = File::Temp->newdir(); my $scratchlogdir = File::Temp->newdir();
$ENV{'NIX_LOG_DIR'} = "$scratchlogdir"; $ENV{'NIX_LOG_DIR'} = "$scratchlogdir";
my $outlink = "$ctx{tmpdir}/basic-canbesubstituted"; my $outlink = $ctx->tmpdir . "/basic-canbesubstituted";
is(system("nix-build '${ctx{jobsdir}}/notifications.nix' -A canbesubstituted --out-link '${outlink}'"), 0, "Building notifications.nix succeeded"); is(system("nix-build '" . $ctx->jobsdir . "/notifications.nix' -A canbesubstituted --out-link '${outlink}'"), 0, "Building notifications.nix succeeded");
is(system("nix copy --to 'file://${binarycachedir}' '${outlink}'"), 0, "Copying the closure to the binary cache succeeded"); is(system("nix copy --to 'file://${binarycachedir}' '${outlink}'"), 0, "Copying the closure to the binary cache succeeded");
my $outpath = readlink($outlink); my $outpath = readlink($outlink);
# Delete the store path and all of the system's garbage # Delete the store path and all of the system's garbage
is(unlink($outlink), 1, "Deleting the GC root succeeds"); is(unlink($outlink), 1, "Deleting the GC root succeeds");
is(system("nix log '$outpath'"), 0, "Reading the output's log succeeds"); is(system("nix log '$outpath'"), 0, "Reading the output's log succeeds");
@ -54,8 +50,8 @@ subtest "Pre-build the job, upload to the cache, and then delete locally" => sub
subtest "Ensure substituting the job works, but reading the log fails" => sub { subtest "Ensure substituting the job works, but reading the log fails" => sub {
# Build the store path, with --max-jobs 0 to prevent builds # Build the store path, with --max-jobs 0 to prevent builds
my $outlink = "$ctx{tmpdir}/basic-canbesubstituted"; my $outlink = $ctx->tmpdir . "/basic-canbesubstituted";
is(system("nix-build '${ctx{jobsdir}}/notifications.nix' -A canbesubstituted --max-jobs 0 --out-link '${outlink}'"), 0, "Building notifications.nix succeeded"); is(system("nix-build '" . $ctx->jobsdir . "/notifications.nix' -A canbesubstituted --max-jobs 0 --out-link '${outlink}'"), 0, "Building notifications.nix succeeded");
my $outpath = readlink($outlink); my $outpath = readlink($outlink);
# Verify trying to read this path's log fails, since we substituted it # Verify trying to read this path's log fails, since we substituted it
@ -68,35 +64,27 @@ subtest "Ensure substituting the job works, but reading the log fails" => sub {
is(system("nix-collect-garbage"), 0, "Delete all the system's garbage"); is(system("nix-collect-garbage"), 0, "Delete all the system's garbage");
}; };
my $db = Hydra::Model::DB->new; my $db = $ctx->db();
hydra_setup($db);
my $jobset = createBaseJobset("queue-runner-notifs", "notifications.nix", $ctx{jobsdir});
my $dbh = $db->storage->dbh; my $dbh = $db->storage->dbh;
$dbh->do("listen build_started"); $dbh->do("listen build_started");
$dbh->do("listen build_finished"); $dbh->do("listen build_finished");
$dbh->do("listen step_finished"); $dbh->do("listen step_finished");
subtest "Evaluation of the jobset" => sub { my $builds = $ctx->makeAndEvaluateJobset(
ok(evalSucceeds($jobset), "Evaluation should exit with return code 0"); expression => "notifications.nix",
is(nrQueuedBuildsForJobset($jobset), 2, "Evaluation should result in 2 builds"); build => 1
}; );
my @builds = queuedBuildsForJobset($jobset);
subtest "Build: substitutable, canbesubstituted" => sub { subtest "Build: substitutable, canbesubstituted" => sub {
my ($build) = grep { $_->nixname eq "can-be-substituted" } @builds; my $build = $builds->{"canbesubstituted"};
ok(runBuild($build), "Build should exit with return code 0");
my $newbuild = $db->resultset('Builds')->find($build->id); is($build->finished, 1, "Build should be finished.");
is($newbuild->finished, 1, "Build should be finished."); is($build->buildstatus, 0, "Build should have buildstatus 0.");
is($newbuild->buildstatus, 0, "Build should have buildstatus 0.");
# Verify that hydra-notify will process this job, even if hydra-notify isn't # Verify that hydra-notify will process this job, even if hydra-notify isn't
# running at the time. # running at the time.
isnt($newbuild->notificationpendingsince, undef, "The build has a pending notification"); isnt($build->notificationpendingsince, undef, "The build has a pending notification");
subtest "First notification: build_finished" => sub { subtest "First notification: build_finished" => sub {
my ($channelName, $pid, $payload) = @{$dbh->func("pg_notifies")}; my ($channelName, $pid, $payload) = @{$dbh->func("pg_notifies")};
@ -106,16 +94,13 @@ subtest "Build: substitutable, canbesubstituted" => sub {
}; };
subtest "Build: not substitutable, unsubstitutable" => sub { subtest "Build: not substitutable, unsubstitutable" => sub {
my ($build) = grep { $_->nixname eq "unsubstitutable" } @builds; my $build = $builds->{"unsubstitutable"};
ok(runBuild($build), "Build should exit with return code 0"); is($build->finished, 1, "Build should be finished.");
is($build->buildstatus, 0, "Build should have buildstatus 0.");
my $newbuild = $db->resultset('Builds')->find($build->id);
is($newbuild->finished, 1, "Build should be finished.");
is($newbuild->buildstatus, 0, "Build should have buildstatus 0.");
# Verify that hydra-notify will process this job, even if hydra-notify isn't # Verify that hydra-notify will process this job, even if hydra-notify isn't
# running at the time. # running at the time.
isnt($newbuild->notificationpendingsince, undef, "The build has a pending notification"); isnt($build->notificationpendingsince, undef, "The build has a pending notification");
subtest "First notification: build_started" => sub { subtest "First notification: build_started" => sub {
my ($channelName, $pid, $payload) = @{$dbh->func("pg_notifies")}; my ($channelName, $pid, $payload) = @{$dbh->func("pg_notifies")};