LQEYBAEL73DCWQMK4PM6GOKIADZMHAL7O7KIIBNXN756CVOGOKDAC GE7LFZHQHT2ENWSZRNF6KWNBRXTHLA2SQGHT5ARACU4CZWDPWOZQC OPSWSU4LKI2F6UJXL7B7MH4C3L7DVVKYW5FARAJ44XYH4WXELLCQC EKHD4I44MLSLT6TIEXGJR3BVRFPGOQQOU6J2M7DNDN5YC6EJRDEQC NTEDD7T4M7XXYCWNZN57EJOEH3KI3UYMHOANV4MY2LSUPWX3JRDQC IE2PRAQUCQVFPJ4CAIJRPXXEFC5VBAE3EO5I5FG4XWEDRNONNHKQC 32KJOERMPFWZZZCIN6TGGVX72GMAJT6VCCIP7S65EHNF3KM42KWAC PXTSKX4GBDOBMI4MDO64DBIHSEVTM6IZ5O6GUFXK6UL63GHWBMBAC 7Q2PXRZAERQFX53OEZGY26ZELA2KRWGXDA5QEYQQVUF5ME65Z7TQC CQZQE32VR5JFHR2AQZVPXCGBHLJCLIZ3IX6NA3SWO2R44XVBSAGAC FCTX433OH7QIVWHXL23DKVSUKBQSLQTRK3PFCKKSMLX6A634456QC 4ZCUCACYWDLCZUKIH2OLFC4NCPBE2YO7Y7AZ7WL3AESZQ3TSIYXQC return bless { "build_id" => $build_id, "step_number" => $step_number, "log_path" => $log_path }, $self;
$log_path = undef if $log_path eq "-";return bless {"build_id" => $build_id,"step_number" => $step_number,"log_path" => $log_path,"step" => undef,}, $self;}sub load {my ($self, $db) = @_;if (!defined($self->{"step"})) {my $build = $db->resultset('Builds')->find($self->{"build_id"})or die "build $self->{'build_id'} does not exist\n";$self->{"step"} = $build->buildsteps->find({stepnr => $self->{"step_number"}})or die "step $self->{'step_number'} does not exist\n";}}sub execute {my ($self, $db, $plugin) = @_;$self->load($db);$plugin->stepFinished($self->{"step"}, $self->{"log_path"});return 1;
my $build = $db->resultset('Builds')->find($buildId)or die "build $buildId does not exist\n";my $step = $build->buildsteps->find({stepnr => $stepNr})or die "step $stepNr does not exist\n";$logPath = undef if $logPath eq "-";foreach my $plugin (@plugins) {eval {$plugin->stepFinished($step, $logPath);1;} or do {print STDERR "error with $plugin->stepFinished: $@\n";}}}
use strict;use Setup;my %ctx = test_init();require Hydra::Schema;require Hydra::Model::DB;use Hydra::Event;use Hydra::Event::BuildStarted;use Test2::V0;use Test2::Tools::Exception;use Test2::Tools::Mock qw(mock_obj);my $db = Hydra::Model::DB->new;hydra_setup($db);my $project = $db->resultset('Projects')->create({name => "tests", displayname => "", owner => "root"});my $jobset = createBaseJobset("basic", "basic.nix", $ctx{jobsdir});ok(evalSucceeds($jobset), "Evaluating jobs/basic.nix should exit with return code 0");is(nrQueuedBuildsForJobset($jobset), 3, "Evaluating jobs/basic.nix should result in 3 builds");for my $build (queuedBuildsForJobset($jobset)) {ok(runBuild($build), "Build '".$build->job."' from jobs/basic.nix should exit with return code 0");}subtest "Parsing step_finished" => sub {like(dies { Hydra::Event::parse_payload("step_finished", "") },qr/three arguments/,"empty payload");like(dies { Hydra::Event::parse_payload("step_finished", "abc123") },qr/three arguments/,"one argument");like(dies { Hydra::Event::parse_payload("step_finished", "abc123\tabc123") },qr/three arguments/,"two arguments");like(dies { Hydra::Event::parse_payload("step_finished", "abc123\tabc123\tabc123\tabc123") },qr/three arguments/,"four arguments");like(dies { Hydra::Event::parse_payload("step_finished", "abc123\t123\t/path/to/log") },qr/should be an integer/,"not an integer: first position");like(dies { Hydra::Event::parse_payload("step_finished", "123\tabc123\t/path/to/log") },qr/should be an integer/,"not an integer: second argument");is(Hydra::Event::parse_payload("step_finished", "123\t456\t/path/to/logfile"),Hydra::Event::StepFinished->new(123, 456, "/path/to/logfile"));};subtest "load" => sub {my $step = $db->resultset('BuildSteps')->search({ },{ limit => 1 })->next;my $build = $step->build;my $event = Hydra::Event::StepFinished->new($build->id, $step->stepnr, "/foo/bar/baz");$event->load($db);is($event->{"step"}->get_column("build"), $build->id, "The build record matches.");# Create a fake "plugin" with a stepFinished sub, the sub sets this# "global" passedStep, passedLogPath variables.my $passedStep;my $passedLogPath;my $plugin = {};my $mock = mock_obj $plugin => (add => ["stepFinished" => sub {my ($self, $step, $log_path) = @_;$passedStep = $step;$passedLogPath = $log_path;}]);$event->execute($db, $plugin);is($passedStep->get_column("build"), $build->id, "The plugin's stepFinished hook is called with a step from the expected build");is($passedStep->stepnr, $step->stepnr, "The plugin's stepFinished hook is called with the proper step of the build");is($passedLogPath, "/foo/bar/baz", "The plugin's stepFinished hook is called with the proper log path");};done_testing;
subtest "Payload type: step_finished" => sub {like(dies { Hydra::Event::parse_payload("step_finished", "") },qr/three arguments/,"empty payload");like(dies { Hydra::Event::parse_payload("step_finished", "abc123") },qr/three arguments/,"one argument");like(dies { Hydra::Event::parse_payload("step_finished", "abc123\tabc123") },qr/three arguments/,"two arguments");like(dies { Hydra::Event::parse_payload("step_finished", "abc123\tabc123\tabc123\tabc123") },qr/three arguments/,"four arguments");like(dies { Hydra::Event::parse_payload("step_finished", "abc123\t123\t/path/to/log") },qr/should be an integer/,"not an integer: first position");like(dies { Hydra::Event::parse_payload("step_finished", "123\tabc123\t/path/to/log") },qr/should be an integer/,"not an integer: second argument");is(Hydra::Event::parse_payload("step_finished", "123\t456\t/path/to/logfile"),Hydra::Event::StepFinished->new(123, 456, "/path/to/logfile"));};