2
0
mirror of https://github.com/munin-monitoring/contrib.git synced 2018-11-08 00:59:34 +01:00
contrib-munin/t/test.t

183 lines
4.9 KiB
Perl
Raw Normal View History

2014-10-04 15:38:36 +02:00
# -*- perl -*-
use strict;
use warnings;
use Test::More;
use File::Find ();
use Capture::Tiny ':all';
use vars qw/*name *dir *prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*prune = *File::Find::prune;
my $num_plugins = 0;
sub wanted {
2014-10-05 00:17:23 +02:00
my ( $dev, $ino, $mode, $nlink, $uid, $gid, $interpreter, $arguments );
2014-10-04 15:38:36 +02:00
( ( $dev, $ino, $mode, $nlink, $uid, $gid ) = lstat($_) )
&& -f _
2014-10-05 00:17:23 +02:00
&& ( ( $interpreter, $arguments ) = hashbang("$_") )
&& ($interpreter)
2014-10-04 15:38:36 +02:00
&& ++$num_plugins
2014-10-05 00:17:23 +02:00
&& process_file( $_, $name, $interpreter, $arguments );
2014-10-04 15:38:36 +02:00
}
File::Find::find( { wanted => \&wanted }, 'plugins' );
sub hashbang {
my ($filename) = @_;
open my $file, '<', $filename;
my $firstline = <$file>;
close $file;
2014-10-05 00:17:23 +02:00
$firstline =~ m{ ^\#! # hashbang
\s* # optional space
(?:/usr/bin/env\s+)? # optional /usr/bin/env
(?<interpreter>\S+) # interpreter
(?:\s+
(?<arguments>[^\n]*) # optional interpreter arguments
)?
}xms;
2014-10-04 15:38:36 +02:00
2014-10-05 11:23:53 +02:00
return ( $+{interpreter}, $+{arguments} );
2014-10-04 15:38:36 +02:00
}
sub process_file {
2014-10-05 00:17:23 +02:00
my ( $file, $filename, $interpreter, $arguments ) = @_;
2014-10-04 15:38:36 +02:00
use v5.10.1;
if ( $interpreter =~ m{/bin/sh} ) {
subtest $filename => sub {
plan tests => 2;
run_check(
{ command => [ 'sh', '-n', $file ],
description => 'sh syntax check'
}
);
run_check(
{ command => [ 'checkbashisms', $file ],
description => 'checkbashisms'
}
);
2014-10-04 15:38:36 +02:00
};
}
2014-10-04 19:32:33 +02:00
elsif ( $interpreter =~ m{/bin/ksh} ) {
run_check(
{ command => [ 'ksh', '-n', $file ],
description => 'ksh syntax check',
filename => $filename
}
);
2014-10-04 19:32:33 +02:00
}
elsif ( $interpreter =~ m{bash} ) {
run_check(
{ command => [ 'bash', '-n', $file ],
description => 'bash syntax check',
filename => $filename
}
);
2014-10-04 15:38:36 +02:00
}
elsif ( $interpreter =~ m{perl} ) {
2014-10-05 00:17:23 +02:00
my $command;
2014-10-05 11:23:53 +02:00
if ( $arguments =~ m{-.*T}mx ) {
2014-10-05 00:17:23 +02:00
$command = [ 'perl', '-cwT', $file ];
}
else {
$command = [ 'perl', '-cw', $file ];
}
run_check(
2014-10-05 00:17:23 +02:00
{ command => $command,
description => 'perl syntax check',
filename => $filename
}
);
2014-10-04 15:38:36 +02:00
}
elsif ( $interpreter =~ m{python} ) {
SKIP: {
skip 'need better syntax check for python', 1;
run_check(
{ command => [
'pylint', '--rcfile=/dev/null',
'--errors-only', '--report=no',
$file
],
description => 'python syntax check',
filename => $filename
}
);
}
2014-10-04 15:38:36 +02:00
}
elsif ( $interpreter =~ m{php} ) {
run_check(
{ command => [ 'php', '-l', $file ],
description => 'php syntax check',
filename => $filename
}
);
2014-10-04 15:38:36 +02:00
}
elsif ( $interpreter =~ m{j?ruby} ) {
run_check(
{ command => [ 'ruby', '-cw', $file ],
description => 'ruby syntax check',
filename => $filename
}
);
2014-10-04 15:38:36 +02:00
}
elsif ( $interpreter =~ m{gawk} ) {
run_check(
{ command => [
'gawk', '--source', 'BEGIN { exit(0) } END { exit(0) }',
2014-10-04 15:38:36 +02:00
'--file', $file
],
description => 'gawk syntax check',
filename => $filename
}
2014-10-04 15:38:36 +02:00
);
}
elsif ( $interpreter =~ m{expect} ) {
SKIP: {
skip 'no idea how to check expect scripts', 1;
pass("No pretending everything is ok");
}
}
2014-10-04 15:38:36 +02:00
else {
fail( $filename . " unknown interpreter " . $interpreter );
}
}
sub run_check {
my ($args) = @_;
my $check_command = $args->{command};
my $description = $args->{description};
my $filename = $args->{filename};
my $message;
if ($filename) {
$message = sprintf( '%s: %s', $filename, $description );
}
else {
$message = $description;
}
2014-10-04 15:38:36 +02:00
my ( $stdout, $stderr, $exit ) = capture {
system( @{$check_command} );
};
ok( ( $exit == 0 ), $message );
if ($exit) {
2014-10-04 20:17:52 +02:00
diag(
sprintf(
"\nCommand: %s\n\nSTDOUT:\n\n%s\n\nSTDERR:\n\n%s\n\n",
join( " ", @{$check_command} ),
$stdout, $stderr
)
);
2014-10-04 15:38:36 +02:00
}
}
done_testing($num_plugins);