Some test fixing on os x
[gruntmaster-daemon.git] / t / 01-jobs.t
CommitLineData
5c5cd38a
MG
1use v5.14;
2use strict;
3use warnings;
4
5use Gruntmaster::Daemon;
6
fe29da7c 7use Cwd qw/getcwd/;
10c4f6f5
MG
8use File::Basename qw/fileparse/;
9use File::Slurp qw/read_file/;
5c5cd38a 10use File::Temp qw/tempdir/;
b8f7001a 11use File::Which qw/which/;
7aa03ec1 12use FindBin;
7be5f054 13use Hash::Merge qw/merge/;
5c5cd38a
MG
14use List::Util qw/sum/;
15use Log::Log4perl;
16use Test::More;
64871a33 17use YAML::Tiny qw/LoadFile/;
5c5cd38a
MG
18
19##################################################
20
b8f7001a 21use constant COMPILER => {
fb85e61f
S
22 qw/BRAINFUCK bfc
23 C gcc
b8f7001a 24 CPP g++
49b65824 25 D dmd
f8b954a9 26 GOLFSCRIPT golfscript
b8f7001a
MG
27 MONO gmcs
28 JAVA javac
6d1f2d94 29 JULIA julia
b8f7001a
MG
30 PASCAL fpc
31 GOLANG go
32 GCCGO gccgo
33 HASKELL ghc
34 PERL perl
8473542d 35 PHP php
92fbf933 36 PYTHON python2.7
cd0623f0 37 RUBY ruby
27be8560 38 RUST rustc
0220f51a 39 OBERON obc
34e16771 40 OCAML ocaml
c88da74d 41 SBCL sbcl/};
b8f7001a 42
6d1f2d94 43my %needs_fork = map { $_ => 1 } qw/GOLANG GOLFSCRIPT GCCGO JAVA JULIA RUBY/;
f8b954a9 44
d5200925 45my $loglevel = $ENV{TEST_LOG_LEVEL} // ($ENV{TEST_VERBOSE} ? 'TRACE' : 'OFF');
5c5cd38a
MG
46my $log_conf = <<CONF;
47log4perl.category.Gruntmaster.Daemon = $loglevel, stderr
48
49log4perl.appender.stderr = Log::Log4perl::Appender::Screen
50log4perl.appender.stderr.layout = Log::Log4perl::Layout::PatternLayout
51log4perl.appender.stderr.layout.ConversionPattern = [\%d] [\%F{1}:\%M{1}:\%L] [\%p] \%m\%n
52CONF
53Log::Log4perl->init(\$log_conf);
54
fe29da7c 55$ENV{PATH} = getcwd . ':' . $ENV{PATH};
7aa03ec1 56$ENV{PATH} = "$FindBin::Bin/../blib/script:" . $ENV{PATH};
436deb11 57umask 0022;
da905f9e 58
5c5cd38a 59sub check_job{
7be5f054 60 my $meta = shift;
197cd6a3 61 if (defined $meta->{results}) {
56187177 62 delete $meta->{results}[$_]{time} for keys @{$meta->{results}};
197cd6a3 63 }
ee638edb
MG
64 my $desc = $meta->{name} . ': ' . $meta->{test_name};
65 is $meta->{result}, $meta->{expected_result}, "Result is correct ($desc)";
66 is $meta->{result_text}, $meta->{expected_result_text}, "Result text is correct ($desc)";
67 is_deeply $meta->{results}, $meta->{expected_results}, "Results are correct ($desc)";
5c5cd38a
MG
68}
69
70my @problems = exists $ENV{TEST_PROBLEMS} ? map {"t/problems/$_"} split ' ', $ENV{TEST_PROBLEMS} : <t/problems/*>;
b8f7001a
MG
71@problems = grep { $_ !~ /hello/ } @problems unless $ENV{RELEASE_TESTING} || $ENV{TEST_PROBLEMS};
72
5c5cd38a
MG
73plan tests => 3 * sum map { my @temp = <$_/tests/*>; scalar @temp } @problems;
74note "Problems to be tested: " . join ', ', @problems;
75
23b3dc5a 76my $tempdir = tempdir "gruntmasterd-testingXXXX", TMPDIR => 1, CLEANUP => 1;
f028e0a8 77chmod 0777, $tempdir;
10c4f6f5
MG
78
79my $job = 0;
5c5cd38a
MG
80
81for my $problem (@problems) {
7be5f054
MG
82 my $pbmeta = LoadFile "$problem/meta.yml";
83 for (1 .. $pbmeta->{testcnt}) {
84 $pbmeta->{infile}[$_ - 1] = read_file "$problem/$_.in" if $pbmeta->{generator} eq 'File';
00a45f89 85 $pbmeta->{okfile}[$_ - 1] = read_file "$problem/$_.ok" if $pbmeta->{runner} && $pbmeta->{runner} eq 'File';
197cd6a3 86 }
7be5f054 87 if (exists $pbmeta->{files}) {
759d3ca5 88 $_->{content} = read_file "$problem/$_->{name}" for values %{$pbmeta->{files}}
197cd6a3 89 }
10c4f6f5 90
197cd6a3 91 TODO: {
7be5f054 92 note "Now testing problem $pbmeta->{name} ($pbmeta->{description})";
10c4f6f5 93
197cd6a3 94 for my $source (<$problem/tests/*>) {
b8f7001a
MG
95 SKIP: {
96 my $meta = LoadFile "$source/meta.yml";
fcfcfb93 97 if ($meta->{files}{prog}) {
fd807ac9
MG
98 my $format = $meta->{files}{prog}{format};
99 my $compiler = COMPILER->{$format};
fcfcfb93 100 skip "$compiler not found in path", 3 unless $ENV{GRUNTMASTER_VM} || which $compiler;
f8b954a9 101 skip "$format requires multiple processes. Set GRUNTMASTER_KILL_USER and GRUNTMASTER_SUDO to allow multiple processes.", 3 if !$ENV{GRUNTMASTER_KILL_USER} && $needs_fork{$format};
fcfcfb93
MG
102 $meta->{files}{prog}{content} = read_file "$source/$meta->{files}{prog}{name}";
103 }
b8f7001a 104 $meta = merge $meta, $pbmeta;
fd807ac9 105 local $TODO = $meta->{todo} if exists $meta->{todo};
b8f7001a 106 note "Running $meta->{test_name} ($meta->{test_description})...";
fe29da7c 107 my $savedcwd = getcwd;
b8f7001a
MG
108 chdir $tempdir;
109 Gruntmaster::Daemon::process $meta;
110 chdir $savedcwd;
111 check_job $meta;
112 }
197cd6a3 113 }
5c5cd38a 114 }
5c5cd38a 115}
This page took 0.025868 seconds and 4 git commands to generate.