view js.t @ 836:a9c4cebcfe69

Tests: adjusted http resolver test with resend. Don't bother with socket error to force resolver resend. Nginx doesn't handle well ECONNREFUSED send() error, which results in "500 Internal Server Error". It may deserve a separate test, though.
author Sergey Kandaurov <pluknet@nginx.com>
date Fri, 29 Jan 2016 00:40:05 +0300
parents ad8134cd6f45
children 460a9cadbd2f
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 njs/)->plan(13)
	->write_file_expand('nginx.conf', <<'EOF');

%%TEST_GLOBALS%%

daemon off;

events {
}

http {
    %%TEST_GLOBALS_HTTP%%

    js_set $test_method  "'method=' + $r.method";
    js_set $test_version "'version=' + $r.httpVersion";
    js_set $test_addr    "'addr=' + $r.remoteAddress";
    js_set $test_uri     "'uri=' + $r.uri";
    js_set $test_hdr     "'hdr=' + $r.headers.foo";
    js_set $test_ihdr    "var s;
                          s = '';
                          for (h in $r.headers) {
                              if (h.substr(0, 3) == 'foo') {
                                  s += $r.headers[h];
                              }
                          }
                          s;";
    js_set $test_arg     "'arg=' + $r.args.foo";
    js_set $test_iarg    "var s;
                          s = '';
                          for (a in $r.args) {
                              if (a.substr(0, 3) == 'foo') {
                                  s += $r.args[a];
                              }
                          }
                          s;";

    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 /res_status {
            js_run "
                var res;
                res = $r.response;
                res.status = 204;
                res.sendHeader();
                res.finish();
            ";
        }

        location /res_ctype {
            js_run "
                var res;
                res = $r.response;
                res.status = 200;
                res.contentType = 'application/foo';
                res.sendHeader();
                res.finish();
            ";
        }

        location /res_clen {
            js_run "
                var res;
                res = $r.response;
                res.status = 200;
                res.contentLength = 5;
                res.sendHeader();
                res.send('foo12');
                res.finish();
            ";
        }

        location /res_send {
            js_run "
                var res, a, s;
                res = $r.response;
                res.status = 200;
                res.sendHeader();
                for (a in $r.args) {
                    if (a.substr(0, 3) == 'foo') {
                        s = $r.args[a];
                        res.send('n=' + a + ', v=' + s.substr(0, 2) + ' ');
                    }
                }
                res.finish();
            ";
        }

        location /res_hdr {
            js_run "
                var res;
                res = $r.response;
                res.status = 200;
                res.headers['Foo'] = $r.args.fOO;
                res.sendHeader();
                res.finish();
            ";
        }
    }
}

EOF

$t->run();

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

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

like(http_get('/res_status'), qr/204 No Content/, 'r.response.status');
like(http_get('/res_ctype'), qr/Content-Type: application\/foo/,
	'r.response.contentType');
like(http_get('/res_clen'), qr/Content-Length: 5/, 'r.response.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/, 'r.response.send');
like(http_get('/res_hdr?foo=12345'), qr/Foo: 12345/, 'r.response.headers');

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

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
}

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