234 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			234 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
use strict;
 | 
						|
use warnings;
 | 
						|
use Setup;
 | 
						|
use Test2::V0;
 | 
						|
use Hydra::Plugin::RunCommand;
 | 
						|
 | 
						|
my $ctx = test_context();
 | 
						|
 | 
						|
my $builds = $ctx->makeAndEvaluateJobset(
 | 
						|
    expression => "runcommand-dynamic.nix",
 | 
						|
    build => 1
 | 
						|
);
 | 
						|
 | 
						|
my $build = $builds->{"runCommandHook.example"};
 | 
						|
 | 
						|
# Enable dynamic runcommand on the project and jobset
 | 
						|
$build->project->update({enable_dynamic_run_command => 1});
 | 
						|
$build->jobset->update({enable_dynamic_run_command => 1});
 | 
						|
 | 
						|
is($build->job, "runCommandHook.example", "The only job should be runCommandHook.example");
 | 
						|
is($build->finished, 1, "Build should be finished.");
 | 
						|
is($build->buildstatus, 0, "Build should have buildstatus 0.");
 | 
						|
 | 
						|
subtest "fanoutToCommands" => sub {
 | 
						|
    my $config = {
 | 
						|
        runcommand => [
 | 
						|
            {
 | 
						|
                job => "",
 | 
						|
                command => "foo"
 | 
						|
            },
 | 
						|
            {
 | 
						|
                job => "*:*:*",
 | 
						|
                command => "bar"
 | 
						|
            },
 | 
						|
            {
 | 
						|
                job => "tests:basic:nomatch",
 | 
						|
                command => "baz"
 | 
						|
            }
 | 
						|
        ]
 | 
						|
    };
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::fanoutToCommands(
 | 
						|
            $config,
 | 
						|
            "buildFinished",
 | 
						|
            $build
 | 
						|
        ),
 | 
						|
        [
 | 
						|
            {
 | 
						|
                matcher => "",
 | 
						|
                command => "foo"
 | 
						|
            },
 | 
						|
            {
 | 
						|
                matcher => "*:*:*",
 | 
						|
                command => "bar"
 | 
						|
            }
 | 
						|
        ],
 | 
						|
        "fanoutToCommands returns a command per matching job"
 | 
						|
    );
 | 
						|
};
 | 
						|
 | 
						|
subtest "fanoutToCommandsWithDynamicRunCommandSupport" => sub {
 | 
						|
    like(
 | 
						|
        $build->buildoutputs->find({name => "out"})->path,
 | 
						|
        qr/my-build-product$/,
 | 
						|
        "The way we find the out path is reasonable"
 | 
						|
    );
 | 
						|
 | 
						|
    my $config = {
 | 
						|
        dynamicruncommand => { enable => 1 },
 | 
						|
        runcommand => [
 | 
						|
            {
 | 
						|
                job => "*:*:*",
 | 
						|
                command => "baz"
 | 
						|
            }
 | 
						|
        ]
 | 
						|
    };
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::fanoutToCommands(
 | 
						|
            $config,
 | 
						|
            "buildFinished",
 | 
						|
            $build
 | 
						|
        ),
 | 
						|
        [
 | 
						|
            {
 | 
						|
                matcher => "*:*:*",
 | 
						|
                command => "baz"
 | 
						|
            },
 | 
						|
            {
 | 
						|
                matcher => "DynamicRunCommand(runCommandHook.example)",
 | 
						|
                command => $build->buildoutputs->find({name => "out"})->path
 | 
						|
            }
 | 
						|
        ],
 | 
						|
        "fanoutToCommands returns a command per matching job"
 | 
						|
    );
 | 
						|
};
 | 
						|
 | 
						|
subtest "isBuildEligibleForDynamicRunCommand" => sub {
 | 
						|
    subtest "Non-matches based on name alone ..." => sub {
 | 
						|
        my $build = $builds->{"foo-bar-baz"};
 | 
						|
        is(
 | 
						|
            Hydra::Plugin::RunCommand::isBuildEligibleForDynamicRunCommand($build),
 | 
						|
            0,
 | 
						|
            "The job name does not match"
 | 
						|
        );
 | 
						|
 | 
						|
        $build->set_column("job", "runCommandHook");
 | 
						|
        is(
 | 
						|
            Hydra::Plugin::RunCommand::isBuildEligibleForDynamicRunCommand($build),
 | 
						|
            0,
 | 
						|
            "The job name does not match"
 | 
						|
        );
 | 
						|
 | 
						|
        $build->set_column("job", "runCommandHook.");
 | 
						|
        is(
 | 
						|
            Hydra::Plugin::RunCommand::isBuildEligibleForDynamicRunCommand($build),
 | 
						|
            0,
 | 
						|
            "The job name does not match"
 | 
						|
        );
 | 
						|
    };
 | 
						|
 | 
						|
    subtest "On outputs ..." => sub {
 | 
						|
        ok(!warns {
 | 
						|
            is(
 | 
						|
                Hydra::Plugin::RunCommand::isBuildEligibleForDynamicRunCommand($builds->{"runCommandHook.example"}),
 | 
						|
                1,
 | 
						|
                "out is an executable file"
 | 
						|
            );
 | 
						|
        }, "No warnings for an executable file.");
 | 
						|
 | 
						|
        ok(!warns {
 | 
						|
            is(
 | 
						|
                Hydra::Plugin::RunCommand::isBuildEligibleForDynamicRunCommand($builds->{"runCommandHook.symlink"}),
 | 
						|
                1,
 | 
						|
                "out is a symlink to an executable file"
 | 
						|
            );
 | 
						|
        }, "No warnings for a symlink to an executable file.");
 | 
						|
 | 
						|
        like(warning {
 | 
						|
            is(
 | 
						|
                Hydra::Plugin::RunCommand::isBuildEligibleForDynamicRunCommand($builds->{"runCommandHook.no-out"}),
 | 
						|
                0,
 | 
						|
                "No output named out"
 | 
						|
            );
 | 
						|
        }, qr/rejected: no output named 'out'/, "A relevant warning is provided for a missing output");
 | 
						|
 | 
						|
        like(warning {
 | 
						|
            is(
 | 
						|
                Hydra::Plugin::RunCommand::isBuildEligibleForDynamicRunCommand($builds->{"runCommandHook.out-is-directory"}),
 | 
						|
                0,
 | 
						|
                "out is a directory"
 | 
						|
            );
 | 
						|
        }, qr/output is not a regular file or symlink/, "A relevant warning is provided for a directory output");
 | 
						|
 | 
						|
        like(warning {
 | 
						|
            is(
 | 
						|
                Hydra::Plugin::RunCommand::isBuildEligibleForDynamicRunCommand($builds->{"runCommandHook.out-is-not-executable-file"}),
 | 
						|
                0,
 | 
						|
                "out is a file which is not a regular file or symlink"
 | 
						|
            );
 | 
						|
        }, qr/output is not executable/, "A relevant warning is provided if the file isn't executable");
 | 
						|
 | 
						|
        like(warning {
 | 
						|
            is(
 | 
						|
                Hydra::Plugin::RunCommand::isBuildEligibleForDynamicRunCommand($builds->{"runCommandHook.symlink-non-executable"}),
 | 
						|
                0,
 | 
						|
                "out is a symlink to a non-executable file"
 | 
						|
            );
 | 
						|
        }, qr/output is not executable/, "A relevant warning is provided for symlinks to non-executables");
 | 
						|
 | 
						|
        like(warning {
 | 
						|
            is(
 | 
						|
                Hydra::Plugin::RunCommand::isBuildEligibleForDynamicRunCommand($builds->{"runCommandHook.symlink-directory"}),
 | 
						|
                0,
 | 
						|
                "out is a symlink to a directory"
 | 
						|
            );
 | 
						|
        }, qr/output is not a regular file or symlink/, "A relevant warning is provided for symlinks to directories");
 | 
						|
    };
 | 
						|
 | 
						|
    subtest "On build status ..." => sub {
 | 
						|
        is(
 | 
						|
            Hydra::Plugin::RunCommand::isBuildEligibleForDynamicRunCommand($builds->{"runCommandHook.failed"}),
 | 
						|
            0,
 | 
						|
            "Failed builds don't get run"
 | 
						|
        );
 | 
						|
    };
 | 
						|
 | 
						|
    subtest "With dynamic runcommand disabled ..." => sub {
 | 
						|
        subtest "disabled on the project, enabled on the jobset" => sub {
 | 
						|
            $build->project->update({enable_dynamic_run_command => 0});
 | 
						|
            $build->jobset->update({enable_dynamic_run_command => 1});
 | 
						|
 | 
						|
 | 
						|
            like(warning {
 | 
						|
                is(
 | 
						|
                    Hydra::Plugin::RunCommand::isBuildEligibleForDynamicRunCommand($builds->{"runCommandHook.example"}),
 | 
						|
                    0,
 | 
						|
                    "Builds don't run from a jobset with disabled dynamic runcommand"
 | 
						|
                );
 | 
						|
            }, qr/project or jobset don't have dynamic runcommand enabled./, "A relevant warning is provided for a disabled runcommand support")
 | 
						|
        };
 | 
						|
 | 
						|
        subtest "enabled on the project, disabled on the jobset" => sub {
 | 
						|
            $build->project->update({enable_dynamic_run_command => 1});
 | 
						|
            $build->jobset->update({enable_dynamic_run_command => 0});
 | 
						|
 | 
						|
            like(warning {
 | 
						|
                is(
 | 
						|
                    Hydra::Plugin::RunCommand::isBuildEligibleForDynamicRunCommand($builds->{"runCommandHook.example"}),
 | 
						|
                    0,
 | 
						|
                    "Builds don't run from a jobset with disabled dynamic runcommand"
 | 
						|
                );
 | 
						|
            }, qr/project or jobset don't have dynamic runcommand enabled./, "A relevant warning is provided for a disabled runcommand support")
 | 
						|
        };
 | 
						|
 | 
						|
        subtest "disabled on the project, disabled on the jobset" => sub {
 | 
						|
            $build->project->update({enable_dynamic_run_command => 0});
 | 
						|
            $build->jobset->update({enable_dynamic_run_command => 0});
 | 
						|
 | 
						|
            like(warning {
 | 
						|
                is(
 | 
						|
                    Hydra::Plugin::RunCommand::isBuildEligibleForDynamicRunCommand($builds->{"runCommandHook.example"}),
 | 
						|
                    0,
 | 
						|
                    "Builds don't run from a jobset with disabled dynamic runcommand"
 | 
						|
                );
 | 
						|
            }, qr/project or jobset don't have dynamic runcommand enabled./, "A relevant warning is provided for a disabled runcommand support")
 | 
						|
        };
 | 
						|
    };
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
done_testing;
 |