The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*-
package TestCompat::apache;

# Apache->"method" and Apache::"function" compat layer tests

# these tests are all run and validated on the server side.

use strict;
use warnings FATAL => 'all';

use Apache::TestUtil;
use Apache::Test;

use ModPerl::Util ();
use Apache2::compat ();
use Apache::Constants qw(DIR_MAGIC_TYPE OPT_EXECCGI :common :response);

use File::Spec::Functions qw(catfile canonpath);

sub fixup {
    my $r = shift;
    Apache->httpd_conf('Options +ExecCGI');
    OK;
}

sub handler {
    my $r = shift;

    plan $r, tests => 24;

    $r->send_http_header('text/plain');

    ### Apache-> tests
    my $fh = Apache->gensym;
    ok t_cmp(ref($fh), 'GLOB', "Apache->gensym");

    ok t_cmp(Apache->module('mod_perl.c'), 1,
             "Apache2::module('mod_perl.c')");
    ok t_cmp(Apache->module('mod_ne_exists.c'), 0,
             "Apache2::module('mod_ne_exists.c')");

    ok t_cmp(Apache->define('MODPERL2'),
             Apache2::ServerUtil::exists_config_define('MODPERL2'),
             'Apache->define');

    ok t_cmp($r->current_callback,
             'PerlResponseHandler',
             'inside PerlResponseHandler');

    t_server_log_error_is_expected();
    Apache::log_error("Apache::log_error test ok");
    ok 1;

    t_server_log_warn_is_expected();
    Apache->warn('Apache->warn ok');
    ok 1;

    t_server_log_warn_is_expected();
    Apache::warn('Apache::warn ok');
    ok 1;

    t_server_log_warn_is_expected();
    Apache::Server->warn('Apache::Server->warn ok');
    ok 1;

    t_server_log_warn_is_expected();
    Apache::Server::warn('Apache::Server::warn ok');
    ok 1;

    # explicitly imported
    ok t_cmp(DIR_MAGIC_TYPE, "httpd/unix-directory",
             'DIR_MAGIC_TYPE');

    # :response is ignored, but is now aliased in :common
    ok t_cmp(REDIRECT, "302",
             'REDIRECT');

    # from :common
    ok t_cmp(AUTH_REQUIRED, "401",
             'AUTH_REQUIRED');

    ok t_cmp(OK, "0",
             'OK');

    my $exec_cgi = $r->allow_options & Apache2::Const::OPT_EXECCGI;
    ok t_cmp($exec_cgi, Apache2::Const::OPT_EXECCGI, 'Apache->httpd_conf');

    # (Apache||$r)->server_root_relative
    {
        my $server_root = Apache::Test::config()->{vars}->{serverroot};
        ok t_filepath_cmp(canonpath($Apache::Server::CWD),
                          canonpath($server_root),
                          '$server_root');

        ok t_filepath_cmp(canonpath($r->server_root_relative),
                          canonpath($server_root),
                          '$r->server_root_relative()');

        ok t_filepath_cmp(canonpath($r->server_root_relative('conf')),
                          catfile($server_root, 'conf'),
                          "\$r->server_root_relative('conf')");

        ok t_filepath_cmp(canonpath(Apache->server_root_relative('conf')),
                          catfile($server_root, 'conf'),
                          "Apache2::ServerUtil->server_root_relative('conf')");

        ok t_filepath_cmp(canonpath(Apache->server_root_relative),
                          canonpath($server_root),
                          'Apache2::ServerUtil->server_root_relative()');

        my $path = catfile(Apache2::ServerUtil::server_root, 'logs');
        ok t_filepath_cmp(canonpath(Apache->server_root_relative($path)),
                          canonpath($path),
                          "Apache->server_root_relative('$path')");
    }

    ok t_cmp(Apache->unescape_url_info("/foo+bar%20baz"),
             '/foo bar baz',
             'Apache->unescape_url_info');

    ok t_cmp $Apache::Server::Starting,   0, '$Apache::Server::Starting';
    ok t_cmp $Apache::Server::ReStarting, 1, '$Apache::Server::ReStarting';

    OK;
}

1;

__END__
# so we can test whether send_httpd_header() works fine
PerlOptions +ParseHeaders +GlobalRequest
PerlModule TestCompat::apache
PerlFixupHandler TestCompat::apache::fixup