view js.t @ 1315:890516ca898a

Tests: reverted 3882f8f3b2bc to unbreak with njs 0.1.15.
author Sergey Kandaurov <pluknet@nginx.com>
date Mon, 02 Apr 2018 19:47:17 +0300
parents 3882f8f3b2bc
children f48d2792730e
line wrap: on
line source

#!/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");
    }

    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(22);

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

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') > 0, 'log 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
}

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