package t::Config;

use Test::Base -Base;
use IPC::Run3 qw( run3 );

our @EXPORT = qw(
    run_tests
);

sub run_tests;
sub run_test ($);
sub shell (@);
sub cd ($);

our $BuildRoot;

sub run_tests {
    my $ver = `bash util/ver`;
    chomp $ver;

    cd "ngx_openresty-$ver";

    $BuildRoot = File::Spec->rel2abs("./build");

    for my $block (blocks()) {
        run_test($block);
    }
}

sub run_test ($) {
    my $block = shift;
    my $name = $block->name;
    my $cmd = $block->cmd or
        die "No --- cmd defined for $name\n";

    #warn "$cmd > out.txt 2>\&1";
    my ($stdout, $stderr);
    run3 $cmd, undef, \$stdout, \$stderr;
    my $retval = $?;

    my $expected_exit = $block->exit;
    if (!defined $expected_exit) {
        $expected_exit = 0;
    }

    my $expected_err = $block->err;
    if (!defined $expected_err) {
        $expected_err = '';
    } else {
        $expected_err =~ s/\$OPENRESTY_BUILD_DIR\b/$BuildRoot/gs;
    }

    my $expected_out = $block->out;
    if (!defined $expected_out) {
        $expected_out = '';
    } else {
        $expected_out =~ s/\$OPENRESTY_BUILD_DIR\b/$BuildRoot/gs;
    }

    is($stdout, $expected_out, "$name - stdout ok");
    is($stderr, $expected_err, "$name - stderr ok");
    is($retval >> 8, $expected_exit, "$name - exit code ok");

    if (defined $block->makefile) {
        open my $in, "Makefile" or
            die "cannot open Makefile for reading: $!";
        my $got = do { local $/; <$in> };
        close $in;

        my $expected_makefile = $block->makefile;
        $expected_makefile =~ s/\$OPENRESTY_BUILD_DIR\b/$BuildRoot/gs;

        is($got, $expected_makefile, "$name - Makefile ok");
    }
}

sub shell (@) {
    system(@_);
}

sub cd ($) {
    my $dir = shift;
    print("cd $dir\n");
    chdir $dir or die "failed to cd $dir: $!\n";
}