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