changeset 604:b96c4739ca85

Tests: some userid tests.
author Andrey Zelenkov <zelenkov@nginx.com>
date Wed, 10 Jun 2015 18:53:02 +0300
parents cc722d0c557d
children a77f19282f63
files userid.t
diffstat 1 files changed, 270 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
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(<<EOF);
+GET $url HTTP/1.0
+Host: localhost
+Cookie: uid=$uid
+
+EOF
+}
+
+###############################################################################