# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package Apache::TestHarnessPHP;
use strict;
use warnings FATAL => 'all';
use File::Spec::Functions qw(catfile catdir);
use File::Find qw(finddepth);
use Apache::TestHarness ();
use Apache::TestTrace;
use Apache::TestConfig ();
use vars qw(@ISA);
@ISA = qw(Apache::TestHarness);
use TAP::Formatter::Console;
use TAP::Harness;
sub get_tests {
my $self = shift;
my $args = shift;
my @tests = ();
my $base = -d 't' ? catdir('t', '.') : '.';
my $ts = $args->{tests} || [];
if (@$ts) {
for (@$ts) {
if (-d $_) {
push(@tests, sort <$base/$_/*.t>);
push(@tests, sort <$base/$_/*.php>);
}
else {
$_ .= ".t" unless /(\.t|\.php)$/;
push(@tests, $_);
}
}
}
else {
if ($args->{tdirs}) {
push @tests, map { sort <$base/$_/*.t> } @{ $args->{tdirs} };
push @tests, map { sort <$base/$_/*.php> } @{ $args->{tdirs} };
}
else {
finddepth(sub {
return unless /\.(t|php)$/;
return if $File::Find::dir =~ m/\b(conf|htdocs|logs|response)\b/;
my $t = catfile $File::Find::dir, $_;
my $dotslash = catfile '.', "";
$t =~ s:^\Q$dotslash::;
push @tests, $t
}, $base);
@tests = sort @tests;
}
}
@tests = $self->prune(@tests);
if (my $skip = $self->skip) {
# Allow / \ and \\ path delimiters in SKIP file
$skip =~ s![/\\\\]+![/\\\\]!g;
@tests = grep { not /(?:$skip)/ } @tests;
}
Apache::TestSort->run(\@tests, $args);
#when running 't/TEST t/dir' shell tab completion adds a /
#dir//foo output is annoying, fix that.
s:/+:/:g for @tests;
# remove *.php tests unless we can run them with php
if (! Apache::TestConfig::which('php')) {
warning(join ' - ', 'skipping *.php tests',
'make sure php is in your PATH');
@tests = grep { not /\.php$/ } @tests;
}
elsif (! $phpclient) {
warning(join ' - ', 'skipping *.php tests',
'Test::Harness 2.38 not available');
@tests = grep { not /\.php$/ } @tests;
}
return @tests;
}
sub run {
my $self = shift;
my $args = shift || {};
my $formatter = TAP::Formatter::Console->new;
my $agg = TAP::Parser::Aggregator->new;
my $verbose = $args->{verbose} && $args->{verbose};
my $php_harness = TAP::Harness->new
({exec => $self->command_line(),
verbosity => $verbose});
my $perl_harness = TAP::Harness->new
({verbosity => $verbose});
my @tests = $self->get_tests($args, @_);
$agg->start();
$php_harness->aggregate_tests($agg, grep {m{\.php$}} @tests);
$perl_harness->aggregate_tests($agg, grep {m{\.t$}} @tests);
$agg->stop();
$formatter->summary($agg);
}
sub command_line {
my $self = shift;
my $server_root = Apache::Test::vars('serverroot');
my $conf = catfile($server_root, 'conf');
my $ini = catfile($conf, 'php.ini');
my $php = Apache::TestConfig::which('php') ||
die 'no php executable found in ' . $ENV{PATH};
return ["env", "SERVER_ROOT=$server_root",
$php, "--php-ini", $ini, "--define", "include_path=$conf"];
}
1;