This in-progress feature will run a dynamically generated set of buildFinished hooks, which must be nested under the `runCommandHook.*` attribute set. This implementation is not very good, with some to-dos: 1. Only run if the build succeeded 2. Verify the output is named $out and that it is an executable file (or a symlink to a file) 3. Require the jobset itself have a flag enabling the feature, since this feature can be a bit dangerous if various people of different trust levels can create the jobs.
		
			
				
	
	
		
			253 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			253 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
use strict;
 | 
						|
use warnings;
 | 
						|
use Setup;
 | 
						|
use Test2::V0;
 | 
						|
use Hydra::Plugin::RunCommand;
 | 
						|
 | 
						|
subtest "isEnabled" => sub {
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::isEnabled({}),
 | 
						|
        0,
 | 
						|
        "Disabled by default."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::isEnabled({ config => {}}),
 | 
						|
        0,
 | 
						|
        "Disabled by default."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::isEnabled({ config => { runcommand => {}}}),
 | 
						|
        1,
 | 
						|
        "Enabled if any runcommand blocks exist."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::isEnabled({ config => { dynamicruncommand => {}}}),
 | 
						|
        0,
 | 
						|
        "Not enabled if an empty dynamicruncommand blocks exist."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::isEnabled({ config => { dynamicruncommand => { enable => 0 }}}),
 | 
						|
        0,
 | 
						|
        "Not enabled if a dynamicruncommand blocks exist without enable being set to 1."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::isEnabled({ config => { dynamicruncommand => { enable => 1 }}}),
 | 
						|
        1,
 | 
						|
        "Enabled if a dynamicruncommand blocks exist with enable being set to 1."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::isEnabled({ config => {
 | 
						|
            runcommand => {},
 | 
						|
            dynamicruncommand => { enable => 0 }
 | 
						|
        }}),
 | 
						|
        1,
 | 
						|
        "Enabled if a runcommand config block exists, even if a dynamicruncommand is explicitly disabled."
 | 
						|
    );
 | 
						|
};
 | 
						|
 | 
						|
subtest "areStaticCommandsEnabled" => sub {
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::areStaticCommandsEnabled({}),
 | 
						|
        0,
 | 
						|
        "Disabled by default."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::areStaticCommandsEnabled({}),
 | 
						|
        0,
 | 
						|
        "Disabled by default."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::areStaticCommandsEnabled({ runcommand => {}}),
 | 
						|
        1,
 | 
						|
        "Enabled if any runcommand blocks exist."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::areStaticCommandsEnabled({ dynamicruncommand => {}}),
 | 
						|
        0,
 | 
						|
        "Not enabled by dynamicruncommand blocks."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::areStaticCommandsEnabled({ dynamicruncommand => { enable => 0 }}),
 | 
						|
        0,
 | 
						|
        "Not enabled by dynamicruncommand blocks."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::areStaticCommandsEnabled({ dynamicruncommand => { enable => 1 }}),
 | 
						|
        0,
 | 
						|
        "Not enabled by dynamicruncommand blocks."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::areStaticCommandsEnabled({
 | 
						|
            runcommand => {},
 | 
						|
            dynamicruncommand => { enable => 0 }
 | 
						|
        }),
 | 
						|
        1,
 | 
						|
        "Enabled if a runcommand config block exists, even if a dynamicruncommand is explicitly disabled."
 | 
						|
    );
 | 
						|
};
 | 
						|
 | 
						|
subtest "areDynamicCommandsEnabled" => sub {
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::areDynamicCommandsEnabled({}),
 | 
						|
        0,
 | 
						|
        "Disabled by default."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::areDynamicCommandsEnabled({ runcommand => {}}),
 | 
						|
        0,
 | 
						|
        "Disabled even if any runcommand blocks exist."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::areDynamicCommandsEnabled({ dynamicruncommand => {}}),
 | 
						|
        0,
 | 
						|
        "Not enabled if an empty dynamicruncommand blocks exist."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::areDynamicCommandsEnabled({ dynamicruncommand => { enable => 0 }}),
 | 
						|
        0,
 | 
						|
        "Not enabled if a dynamicruncommand blocks exist without enable being set to 1."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::areDynamicCommandsEnabled({ dynamicruncommand => { enable => 1 }}),
 | 
						|
        1,
 | 
						|
        "Enabled if a dynamicruncommand blocks exist with enable being set to 1."
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::areDynamicCommandsEnabled({
 | 
						|
            runcommand => {},
 | 
						|
            dynamicruncommand => { enable => 0 }
 | 
						|
        }),
 | 
						|
        0,
 | 
						|
        "Disabled if dynamicruncommand is explicitly disabled."
 | 
						|
    );
 | 
						|
};
 | 
						|
 | 
						|
subtest "configSectionMatches" => sub {
 | 
						|
    subtest "Expected matches" => sub {
 | 
						|
        my @examples = (
 | 
						|
            # Exact match
 | 
						|
            ["project:jobset:job", "project", "jobset", "job"],
 | 
						|
 | 
						|
            # One wildcard
 | 
						|
            ["project:jobset:*", "project", "jobset", "job"],
 | 
						|
            ["project:*:job", "project", "jobset", "job"],
 | 
						|
            ["*:jobset:job", "project", "jobset", "job"],
 | 
						|
 | 
						|
            # Two wildcards
 | 
						|
            ["project:*:*", "project", "jobset", "job"],
 | 
						|
            ["*:*:job", "project", "jobset", "job"],
 | 
						|
 | 
						|
            # Three wildcards
 | 
						|
            ["*:*:*", "project", "jobset", "job"],
 | 
						|
 | 
						|
            # Implicit wildcards
 | 
						|
            ["", "project", "jobset", "job"],
 | 
						|
            ["project", "project", "jobset", "job"],
 | 
						|
            ["project:jobset", "project", "jobset", "job"],
 | 
						|
        );
 | 
						|
 | 
						|
        for my $example (@examples) {
 | 
						|
            my ($matcher, $project, $jobset, $job) = @$example;
 | 
						|
 | 
						|
            is(
 | 
						|
                Hydra::Plugin::RunCommand::configSectionMatches(
 | 
						|
                    $matcher, $project, $jobset, $job
 | 
						|
                ),
 | 
						|
                1,
 | 
						|
                "Expecting $matcher to match $project:$jobset:$job"
 | 
						|
            );
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
    subtest "Fails to match" => sub {
 | 
						|
        my @examples = (
 | 
						|
            # Literal string non-matches
 | 
						|
            ["project:jobset:job", "project", "jobset", "nonmatch"],
 | 
						|
            ["project:jobset:job", "project", "nonmatch", "job"],
 | 
						|
            ["project:jobset:job", "nonmatch", "jobset", "job"],
 | 
						|
 | 
						|
            # Wildcard based non-matches
 | 
						|
            ["*:*:job", "project", "jobset", "nonmatch"],
 | 
						|
            ["*:jobset:*", "project", "nonmatch", "job"],
 | 
						|
            ["project:*:*", "nonmatch", "jobset", "job"],
 | 
						|
 | 
						|
            # These wildcards are NOT regular expressions
 | 
						|
            ["*:*:j.*", "project", "jobset", "job"],
 | 
						|
            [".*:.*:.*", "project", "nonmatch", "job"],
 | 
						|
        );
 | 
						|
 | 
						|
        for my $example (@examples) {
 | 
						|
            my ($matcher, $project, $jobset, $job) = @$example;
 | 
						|
 | 
						|
            is(
 | 
						|
                Hydra::Plugin::RunCommand::configSectionMatches(
 | 
						|
                    $matcher, $project, $jobset, $job
 | 
						|
                ),
 | 
						|
                0,
 | 
						|
                "Expecting $matcher to not match $project:$jobset:$job"
 | 
						|
            );
 | 
						|
        }
 | 
						|
 | 
						|
        like(
 | 
						|
            dies {
 | 
						|
                Hydra::Plugin::RunCommand::configSectionMatches(
 | 
						|
                    "foo:bar:baz:tux", "foo", "bar", "baz"
 | 
						|
                ),
 | 
						|
            },
 | 
						|
            qr/invalid section name/,
 | 
						|
            "A matcher must have no more than 3 sections"
 | 
						|
        );
 | 
						|
    };
 | 
						|
};
 | 
						|
 | 
						|
subtest "eventMatches" => sub {
 | 
						|
    # This is probably a misfeature that isn't very useful but let's test
 | 
						|
    # it anyway. At best this lets you make a RunCommand event not work
 | 
						|
    # by specifying the "events" key. Note: By testing it I'm not promising
 | 
						|
    # it'll keep working. In fact, I wouldn't be surprised if we chose to
 | 
						|
    # delete this support since RunCommand never runs on any event other
 | 
						|
    # than buildFinished.
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::eventMatches({}, "buildFinished"),
 | 
						|
        1,
 | 
						|
        "An unspecified events key matches"
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::eventMatches({ events => ""}, "buildFinished"),
 | 
						|
        0,
 | 
						|
        "An empty events key does not match"
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::eventMatches({ events => "foo bar buildFinished baz"}, "buildFinished"),
 | 
						|
        1,
 | 
						|
        "An events key with multiple events does match when buildFinished is present"
 | 
						|
    );
 | 
						|
 | 
						|
    is(
 | 
						|
        Hydra::Plugin::RunCommand::eventMatches({ events => "foo bar baz"}, "buildFinished"),
 | 
						|
        0,
 | 
						|
        "An events key with multiple events does not match when buildFinished is missing"
 | 
						|
    );
 | 
						|
};
 | 
						|
 | 
						|
done_testing;
 |