# HG changeset patch # User Andrey Zelenkov # Date 1433951582 -10800 # Node ID b96c4739ca85e57ce8bc4ef9fb9b7e6531ee7e57 # Parent cc722d0c557dda15da0844ee3c4f54190c2cdb11 Tests: some userid tests. diff --git a/userid.t b/userid.t new file mode 100644 --- /dev/null +++ b/userid.t @@ -0,0 +1,270 @@ +#!/usr/bin/perl + +# (C) Andrey Zelenkov +# (C) Nginx, Inc. + +# Tests for userid filter module. + +############################################################################### + +use warnings; +use strict; + +use Test::More; + +use MIME::Base64; +use Time::Local; + +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 userid map/)->plan(33); + +$t->write_file_expand('nginx.conf', <<'EOF'); + +%%TEST_GLOBALS%% + +daemon off; + +events { +} + +http { + %%TEST_GLOBALS_HTTP%% + + log_format uid '$uid_got:$uid_set'; + access_log %%TESTDIR%%/userid.log uid; + + map $args $uid_reset { + default 0; + value 1; + log log; + } + + server { + listen 127.0.0.1:8080; + server_name localhost; + + userid on; + + location / { + add_header X-Reset $uid_reset; + } + + location /name { + userid_name test; + } + + location /path { + userid_path /0123456789; + + location /path/r { + userid_path /9876543210; + } + } + + location /domain { + userid_domain test.domain; + } + + location /mark_off { + userid_mark off; + } + location /mark_eq { + userid_mark =; + } + location /mark_let { + userid_mark t; + } + location /mark_num { + userid_mark 9; + } + + location /expires_time { + add_header X-Msec $msec; + userid_expires 100; + } + location /expires_max { + userid_expires max; + + location /expires_max/r { + userid_expires off; + } + } + location /expires_off { + userid_expires off; + } + + location /p3p { + userid_p3p policyref="/w3c/p3p.xml"; + } + + location /service { + userid_service 65534; + } + + location /cv1 { + userid v1; + userid_mark t; + } + + location /clog { + userid log; + } + + location /coff { + userid off; + } + } +} + +EOF + +$t->write_file('index.html', ''); +$t->write_file('expires_time', ''); +$t->run(); + +############################################################################### + +# userid + +like(http_get('/'), qr/Set-Cookie:/, 'on cookie'); +like(http_get('/cv1'), qr/Set-Cookie:/, 'v1 cookie'); +unlike(http_get('/clog'), qr/Set-Cookie:/, 'log no cookie'); +unlike(http_get('/coff'), qr/Set-Cookie:/, 'off no cookie'); + +# default + +my %cookie = get_cookie('/'); +isnt($cookie{'uid'}, undef, 'name default'); +is($cookie{'path'}, '/', 'path default'); +is($cookie{'domain'}, undef, 'domain default'); +is($cookie{'expires'}, undef, 'expires default'); +like($cookie{'uid'}, '/\w+={0,2}$/', 'mark default'); +unlike(http_get('/'), qr/P3P/, 'p3p default'); +like(http_get('/'), qr/X-Reset: 0/, 'reset var default'); + +# name, path, domain and p3p + +isnt(get_cookie('/name', 'test'), undef, 'name'); +is(get_cookie('/path', 'path'), '/0123456789', 'path'); +is(get_cookie('/domain', 'domain'), 'test.domain', 'domain'); +like(http_get('/p3p'), qr!P3P: policyref="/w3c/p3p.xml"!, 'p3p'); + +# mark + +like(get_cookie('/mark_off', 'uid'), '/\w+={0,2}$/', 'mark off'); +like(get_cookie('/mark_eq', 'uid'), '/==$/', 'mark equal'); +like(get_cookie('/mark_let', 'uid'), '/t=$/', 'mark letter'); +like(get_cookie('/mark_num', 'uid'), '/9=$/', 'mark number'); + +# expires + +my $r = http_get('/expires_time'); +my ($t1) = $r =~ /X-Msec: (\d+)/; +is(expires2timegm(cookie($r, 'expires')), $t1 + 100, 'expires time'); +is(get_cookie('/expires_max', 'expires'), 'Thu, 31-Dec-37 23:55:55 GMT', + 'expires max'); +is(get_cookie('/expires_off', 'expires'), undef, 'expires off'); + +# redefinition + +unlike(http_get('/expires_max/r'), qr/expires/, 'redefine expires'); +like(http_get('/path/r'), qr!/9876543210!, 'redefine path'); + +# log and requests + +my $uidc = get_cookie('/', 'uid'); +my $uidl = last_set($t); +isnt($uidl, undef, 'log uid_set'); + +$r = send_uid('/', $uidc); +is(last_got($t), $uidl, 'log uid_got'); +unlike($r, qr/Set-Cookie:/, 'same path request'); + +$r = send_uid('/coff', $uidc); +unlike($r, qr/Set-Cookie:/, 'other path request'); + +$r = send_uid('/?value', $uidc); +like($r, qr/Set-Cookie:/, 'reset request'); + +$uidc = cookie($r, 'uid'); +$r = send_uid('/?log', $uidc); +isnt(last_got($t), $uidc, 'log reset request'); + +# service + +http_get('/cv1'); +is(substr(last_set($t), 0, 8), '00000000', 'service default v1'); + +http_get('/'); +like(substr(last_set($t), 0, 8), '/[0100007F|F7000010|00000000]/', + 'service default v2'); + +http_get('/service'); +like(substr(last_set($t), 0, 8), '/[0000FEFF|FEFF0000]/', 'service custom'); + +############################################################################### + +sub cookie { + my ($r, $key) = @_; + my %cookie; + + $r =~ /(Set-Cookie:[^\x0d]*).*\x0d\x0a?\x0d/ms; + if ($1) { + %cookie = $1 =~ /(\w+)=([^;]+)/g; + } + + return $cookie{$key} if defined $key; + return %cookie; +} + +sub get_cookie { + my ($url, $key) = @_; + return cookie(http_get($url), $key); +} + +sub expires2timegm { + my ($e) = @_; + my %months = (Jan => 0, Feb => 1, Mar => 2, Apr => 3, May =>4, Jun => 5, + Jul => 6, Aug => 7, Sep => 8, Oct => 9, Nov => 10, Dec => 11); + + my ($w, $date, $time) = split(" ", $e); + my ($day, $month, $year) = split("-", $date); + my ($hour, $min, $sec) = split(":", $time); + + return timegm($sec, $min, $hour, $day, $months{$month}, $year); +} + +sub last_got { + my ($t) = @_; + my $log = $t->read_file('userid.log'); + my ($uid) = $log =~ /uid=(.*):.*\n$/m; + return $uid; +} + +sub last_set { + my ($t) = @_; + my $log = $t->read_file('userid.log'); + my ($uid) = $log =~ /:uid=(.*)\n$/m; + return $uid; +} + +sub send_uid { + my ($url, $uid) = @_; + return http(<