#!/usr/bin/perl

# (C) Roman Arutyunyan

# Tests for http JavaScript module.

###############################################################################

use warnings;
use strict;

use Test::More;

BEGIN { use FindBin; chdir($FindBin::Bin); }

use lib 'lib';
use Test::Nginx;

###############################################################################

select STDERR; $| = 1;
select STDOUT; $| = 1;

my $t = Test::Nginx->new()->has(qw/http rewrite/)
	->write_file_expand('nginx.conf', <<'EOF');

%%TEST_GLOBALS%%

daemon off;

events {
}

http {
    %%TEST_GLOBALS_HTTP%%

    js_set $test_method  test_method;
    js_set $test_version test_version;
    js_set $test_addr    test_addr;
    js_set $test_uri     test_uri;
    js_set $test_hdr     test_hdr;
    js_set $test_ihdr    test_ihdr;
    js_set $test_arg     test_arg;
    js_set $test_iarg    test_iarg;
    js_set $test_var     test_var;
    js_set $test_log     test_log;
    js_set $test_except  test_except;

    js_include test.js;

    server {
        listen       127.0.0.1:8080;
        server_name  localhost;

        location /req_method {
            return 200 $test_method;
        }

        location /req_version {
            return 200 $test_version;
        }

        location /req_addr {
            return 200 $test_addr;
        }

        location /req_uri {
            return 200 $test_uri;
        }

        location /req_hdr {
            return 200 $test_hdr;
        }

        location /req_ihdr {
            return 200 $test_ihdr;
        }

        location /req_arg {
            return 200 $test_arg;
        }

        location /req_iarg {
            return 200 $test_iarg;
        }

        location /req_var {
            return 200 $test_var;
        }

        location /req_log {
            return 200 $test_log;
        }

        location /req_except {
            return 200 $test_except;
        }

        location /res_status {
            js_content status;
        }

        location /res_ctype {
            js_content ctype;
        }

        location /res_clen {
            js_content clen;
        }

        location /res_send {
            js_content send;
        }

        location /res_hdr {
            js_content hdr;
        }

        location /res_ihdr {
            js_content ihdr;
        }

        location /res_except {
            js_content content_except;
        }
    }
}

EOF

$t->write_file('test.js', <<EOF);
    function test_method(req, res) {
        return 'method=' + req.method;
    }

    function test_version(req, res) {
        return 'version=' + req.httpVersion;
    }

    function test_addr(req, res) {
        return 'addr=' + req.remoteAddress;
    }

    function test_uri(req, res) {
        return 'uri=' + req.uri;
    }

    function test_hdr(req, res) {
        return 'hdr=' + req.headers.foo;
    }

    function test_ihdr(req, res) {
        var s = '', h;
        for (h in req.headers) {
            if (h.substr(0, 3) == 'foo') {
                s += req.headers[h];
            }
        }
        return s;
    }

    function test_arg(req, res) {
        return 'arg=' + req.args.foo;
    }

    function test_iarg(req, res) {
        var s = '', a;
        for (a in req.args) {
            if (a.substr(0, 3) == 'foo') {
                s += req.args[a];
            }
        }
        return s;
    }

    function test_var(req, res) {
        return 'variable=' + req.variables.remote_addr;
    }

    function test_log(req, res) {
        req.log("SEE-THIS-LOG");
        req.warn("SEE-THIS-WARN");
        req.error("SEE-THIS-ERROR");
    }

    function test_except(req, res) {
        var fs = require('fs');
        fs.readFileSync();
    }

    function status(req, res) {
        res.status = 204;
        if (res.status != 204)
            res.status = 404;
        res.sendHeader();
        res.finish();
    }

    function ctype(req, res) {
        res.status = 200;
        res.contentType = 'application/foo';
        res.sendHeader();
        res.finish();
    }

    function clen(req, res) {
        res.status = 200;
        res.contentLength = 5;
        if (res.contentLength != 5)
            res.contentLength = 6;
        res.sendHeader();
        res.send('foo12');
        res.finish();
    }

    function send(req, res) {
        var a, s;
        res.status = 200;
        res.sendHeader();
        for (a in req.args) {
            if (a.substr(0, 3) == 'foo') {
                s = req.args[a];
                res.send('n=' + a + ', v=' + s.substr(0, 2) + ' ');
            }
        }
        res.finish();
    }

    function hdr(req, res) {
        res.status = 200;
        res.headers['Foo'] = req.args.fOO;

        if (req.args.bar) {
            res.headers['Bar'] = res.headers['Foo'];
        }

        if (req.args.bar == 'empty') {
            res.headers['Bar'] = res.headers['Baz'];
        }

        res.sendHeader();
        res.finish();
    }

    function ihdr(req, res) {
        res.status = 200;
        res.headers['a'] = req.args.a;
        res.headers['b'] = req.args.b;

        var s = '', h;
        for (h in res.headers) {
            s += res.headers[h];
        }

        res.sendHeader();
        res.send(s);
        res.finish();
    }

    function content_except(req, res) {
        JSON.parse({}.a.a);
    }

EOF

$t->try_run('no njs available')->plan(24);

###############################################################################

like(http_get('/req_method'), qr/method=GET/, 'req.method');
like(http_get('/req_version'), qr/version=1.0/, 'req.httpVersion');
like(http_get('/req_addr'), qr/addr=127.0.0.1/, 'req.remoteAddress');
like(http_get('/req_uri'), qr/uri=\/req_uri/, 'req.uri');
like(http_get_hdr('/req_hdr'), qr/hdr=12345/, 'req.headers');
like(http_get_ihdr('/req_ihdr'), qr/12345barz/, 'req.headers iteration');
like(http_get('/req_arg?foO=12345'), qr/arg=12345/, 'req.args');
like(http_get('/req_iarg?foo=12345&foo2=bar&nn=22&foo-3=z'), qr/12345barz/,
	'req.args iteration');
like(http_get('/req_var'), qr/variable=127.0.0.1/, 'req.variables');
like(http_get('/req_log'), qr/200 OK/, 'req.log');

like(http_get('/res_status'), qr/204 No Content/, 'res.status');
like(http_get('/res_ctype'), qr/Content-Type: application\/foo/,
	'res.contentType');
like(http_get('/res_clen'), qr/Content-Length: 5/, 'res.contentLength');
like(http_get('/res_send?foo=12345&n=11&foo-2=bar&ndd=&foo-3=z'),
	qr/n=foo, v=12 n=foo-2, v=ba n=foo-3, v=z/, 'res.send');
like(http_get('/res_hdr?foo=12345'), qr/Foo: 12345/, 'res.headers');
like(http_get('/res_hdr?foo=123&bar=copy'), qr/Bar: 123/, 'res.headers get');
like(http_get('/res_hdr?bar=empty'), qr/Bar: \x0d/, 'res.headers empty');
like(http_get('/res_ihdr?a=12&b=34'), qr/^1234$/m, 'res.headers iteration');

http_get('/req_except');
http_get('/res_except');

TODO: {
local $TODO = 'zero size buf in writer';

like(http_get('/res_ihdr'), qr/\x0d\x0a?\x0d\x0a?$/m, 'res.send zero');

$t->todo_alerts();

}

$t->stop();

ok(index($t->read_file('error.log'), 'SEE-THIS-LOG') > 0, 'log js');
ok(index($t->read_file('error.log'), 'SEE-THIS-WARN') > 0, 'warn js');
ok(index($t->read_file('error.log'), 'SEE-THIS-ERROR') > 0, 'error js');
ok(index($t->read_file('error.log'), 'at fs.readFileSync') > 0,
   'js_set backtrace');
ok(index($t->read_file('error.log'), 'at JSON.parse') > 0,
   'js_content backtrace');

###############################################################################

sub http_get_hdr {
	my ($url, %extra) = @_;
	return http(<<EOF, %extra);
GET $url HTTP/1.0
FoO: 12345

EOF
}

sub http_get_ihdr {
	my ($url, %extra) = @_;
	return http(<<EOF, %extra);
GET $url HTTP/1.0
foo: 12345
Host: localhost
foo2: bar
X-xxx: more
foo-3: z

EOF
}

###############################################################################
