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