changeset 1693:5ac6efbe5552

Tests: removed TODO and try_run() checks for legacy versions.
author Sergey Kandaurov <pluknet@nginx.com>
date Tue, 01 Jun 2021 16:40:18 +0300
parents f6795e2e6a4b
children 3366128e526b
files auth_delay.t binary_upgrade.t body.t body_chunked.t dav.t debug_connection_unix.t fastcgi_extra_data.t geo_unix.t grpc.t grpc_pass.t h2.t h2_headers.t h2_max_requests.t h2_priority.t h2_proxy_request_buffering_redirect.t h2_request_body.t h2_request_body_js.t http_host.t http_include.t http_keepalive.t http_uri.t http_variables.t ignore_invalid_headers.t js_subrequests.t limit_conn_dry_run.t limit_rate.t limit_req_dry_run.t mail_proxy_protocol.t mail_proxy_smtp_auth.t mail_resolver.t mail_ssl_conf_command.t memcached_fake_extra.t merge_slashes.t mp4.t not_modified_finalize.t perl.t proxy_cache_min_free.t proxy_cache_use_stale.t proxy_cache_vary.t proxy_chunked_extra.t proxy_cookie_flags.t proxy_extra_data.t proxy_force_ranges.t proxy_next_upstream.t proxy_protocol2_server.t proxy_protocol_server.t proxy_ssl_conf_command.t rewrite.t scgi_extra_data.t slice.t ssl.t ssl_conf_command.t ssl_ocsp.t ssl_reject_handshake.t stream_limit_conn_dry_run.t stream_limit_rate2.t stream_proxy_next_upstream.t stream_proxy_ssl_conf_command.t stream_set.t stream_ssl_conf_command.t stream_udp_proxy.t stream_upstream_hash.t upstream_hash.t upstream_keepalive.t userid_flags.t uwsgi_ssl.t worker_shutdown_timeout_h2.t xslt.t
diffstat 68 files changed, 42 insertions(+), 471 deletions(-) [+]
line wrap: on
line diff
--- a/auth_delay.t
+++ b/auth_delay.t
@@ -55,7 +55,7 @@ EOF
 $t->write_file('index.html', '');
 $t->write_file('htpasswd', 'user:' . '{PLAIN}good' . "\n");
 
-$t->try_run('no auth_delay')->plan(4);
+$t->run()->plan(4);
 
 ###############################################################################
 
--- a/binary_upgrade.t
+++ b/binary_upgrade.t
@@ -89,11 +89,6 @@ for (1 .. 30) {
 	select undef, undef, undef, 0.2
 }
 
-TODO: {
-$TODO = 'not yet' unless $t->has_version('1.19.1');
-
 ok(-e "$d/unix.sock", 'unix socket exists on new master termination');
 
-}
-
 ###############################################################################
--- a/body.t
+++ b/body.t
@@ -170,9 +170,6 @@ like(http_get_body('/next', '0123456789'
 
 # discarded request body in redirect via error_page
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.7');
-
 unlike(
 	http(
 		'POST /redirect HTTP/1.1' . CRLF
@@ -184,8 +181,6 @@ unlike(
 	qr/400 Bad Request/ms, 'redirect - discard request body'
 );
 
-}
-
 ###############################################################################
 
 sub read_body_file {
--- a/body_chunked.t
+++ b/body_chunked.t
@@ -136,9 +136,6 @@ like(http_get_body('/discard', '01234567
 
 # invalid chunks
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.4');
-
 like(
 	http(
 		'GET / HTTP/1.1' . CRLF
@@ -165,8 +162,6 @@ like(
 	qr/400 Bad/, 'runaway chunk discard'
 );
 
-}
-
 # proxy_next_upstream
 
 like(http_get_body('/next', '0123456789'),
@@ -174,17 +169,12 @@ like(http_get_body('/next', '0123456789'
 
 # invalid Transfer-Encoding
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.9');
-
 like(http_transfer_encoding('identity'), qr/501 Not Implemented/,
 	'transfer encoding identity');
 
 like(http_transfer_encoding("chunked\nTransfer-Encoding: chunked"),
 	qr/400 Bad/, 'transfer encoding repeat');
 
-}
-
 like(http_transfer_encoding('chunked, identity'), qr/501 Not Implemented/,
 	'transfer encoding list');
 
--- a/dav.t
+++ b/dav.t
@@ -137,15 +137,10 @@ like($r, qr/201 Created.*(Content-Length
 SKIP: {
 skip 'perl too old', 1 if !$^V or $^V lt v5.12.0;
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.7');
-
 like($r, qr!(?(?{ $r =~ /Location/ })Location: /test/)!, 'mkcol location');
 
 }
 
-}
-
 $r = http(<<EOF);
 COPY /test/ HTTP/1.1
 Host: localhost
@@ -225,7 +220,6 @@ EOF
 
 like($r, qr/415 Unsupported/, 'copy body');
 
-
 $r = http(<<EOF . '0123456789');
 DELETE /file HTTP/1.1
 Host: localhost
@@ -236,9 +230,6 @@ EOF
 
 like($r, qr/415 Unsupported/, 'delete body');
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.7');
-
 $r = http(<<EOF);
 MKCOL /test/ HTTP/1.1
 Host: localhost
@@ -282,6 +273,4 @@ EOF
 
 like($r, qr/415 Unsupported/, 'delete body chunked');
 
-}
-
 ###############################################################################
--- a/debug_connection_unix.t
+++ b/debug_connection_unix.t
@@ -52,7 +52,7 @@ http {
 
 EOF
 
-$t->try_run('no unix support')->plan(5);
+$t->run()->plan(5);
 
 ###############################################################################
 
--- a/fastcgi_extra_data.t
+++ b/fastcgi_extra_data.t
@@ -81,32 +81,22 @@ EOF
 
 ###############################################################################
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.1');
-
 like(http_get('/'), qr/SEE-THIS(?!-BUT-NOT-THIS)/, 'response with extra data');
 like(http_get('/short'), qr/SEE-THIS(?!.*:after)/s, 'too short response');
 like(http_get('/empty'), qr/200 OK(?!.*:after)/s, 'empty too short response');
 
-}
-
 like(http_head('/'), qr/200 OK(?!.*SEE-THIS)/s, 'no data in HEAD');
 like(http_head('/short'), qr/200 OK(?!.*SEE-THIS)/s, 'too short to HEAD');
 like(http_head('/empty'), qr/200 OK/, 'empty response to HEAD');
 
 # unbuffered responses
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.1');
-
 like(http_get('/unbuf/'), qr/SEE-THIS(?!-BUT-NOT-THIS)/,
 	'unbuffered with extra data');
 like(http_get('/unbuf/short'), qr/SEE-THIS(?!.*:after)/s,
 	'unbuffered too short response');
 like(http_get('/unbuf/empty'), qr/200 OK(?!.*:after)/s,
-	'unbuffered empty too short responsde');
-
-}
+	'unbuffered empty too short response');
 
 like(http_head('/unbuf/'), qr/200 OK(?!.*SEE-THIS)/s,
 	'unbuffered no data in HEAD');
@@ -124,31 +114,17 @@ like(http_head('/head/short'), qr/200 OK
 
 like(http_get('/head/empty'), qr/200 OK/, 'head no body cached');
 like(http_get('/head/matching'), qr/SEE-THIS/, 'head matching cached');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.1');
-
 like(http_get('/head/extra'), qr/SEE-THIS(?!-BUT-NOT-THIS)/s,
 	'head extra cached');
 like(http_get('/head/short'), qr/SEE-THIS(?!.*:after)/s,
 	'head too short cached');
 
-}
-
 # "zero size buf" alerts (ticket #2018)
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.2');
-
 like(http_get('/zero'), qr/200 OK(?!.*NOT-THIS)/s, 'zero size');
 like(http_get('/unbuf/zero'), qr/200 OK(?!.*NOT-THIS)/s,
 	'unbuffered zero size');
 
-}
-
-$t->todo_alerts() unless $t->has_version('1.19.2')
-	or !$t->has_version('1.19.1');
-
 ###############################################################################
 
 sub fastcgi_daemon {
--- a/geo_unix.t
+++ b/geo_unix.t
@@ -102,11 +102,6 @@ like(http_get('/?ip=192.0.2.1'), qr/^X-A
 
 $t->stop();
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.1');
-
 is(-e $t->testdir() . '/unix.sock', undef, 'unix socket removed');
 
-}
-
 ###############################################################################
--- a/grpc.t
+++ b/grpc.t
@@ -47,8 +47,6 @@ http {
         listen       127.0.0.1:8080 http2;
         server_name  localhost;
 
-        http2_max_field_size 128k;
-        http2_max_header_size 128k;
         http2_body_preread_size 128k;
         large_client_header_buffers 4 32k;
 
@@ -92,11 +90,7 @@ http {
 
 EOF
 
-# suppress deprecation warning
-
-open OLDERR, ">&", \*STDERR; close STDERR;
 $t->run();
-open STDERR, ">&", \*OLDERR;
 
 ###############################################################################
 
@@ -284,9 +278,6 @@ ok(!$frame, 'grpc error - no DATA frame'
 
 # malformed response body length not equal to content-length
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.1');
-
 $f->{http_start}('/SayHello');
 $f->{data}('Hello');
 $frames = $f->{http_err2}(cl => 42);
@@ -299,8 +290,6 @@ ok($frame, 'response body less than cont
 ($frame) = grep { $_->{type} eq "RST_STREAM" } @$frames;
 ok($frame, 'response body more than content-length');
 
-}
-
 # continuation from backend, expect parts assembled
 
 $f->{http_start}('/SayHello');
@@ -481,10 +470,6 @@ is($frame->{flags}, 0, 'DATA padding - f
 
 # DATA padding with Content-Length
 
-TODO: {
-local $TODO = 'not yet'
-	if $t->has_version('1.19.1') and !$t->has_version('1.19.9');
-
 $f->{http_start}('/SayPadding');
 $f->{data}('Hello');
 $frames = $f->{http_end}(body_padding => 42, cl => length('Hello world'));
@@ -493,8 +478,6 @@ is($frame->{data}, 'Hello world', 'DATA 
 is($frame->{length}, 11, 'DATA padding cl - length');
 is($frame->{flags}, 0, 'DATA padding cl - flags');
 
-}
-
 # :authority inheritance
 
 $frames = $f->{http_start}('/SayHello?if=1');
@@ -548,9 +531,6 @@ is($frame->{headers}{':method'}, 'HEAD',
 $f->{data}('Hello');
 $f->{http_end}();
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.0');
-
 # receiving END_STREAM followed by WINDOW_UPDATE on incomplete request body
 
 $f->{http_start}('/Discard_WU');
@@ -565,8 +545,6 @@ is($frame->{flags}, 5, 'discard WINDOW_U
 (undef, $frame) = grep { $_->{type} eq "HEADERS" } @$frames;
 is($frame->{flags}, 5, 'discard NO_ERROR - trailers');
 
-}
-
 # receiving END_STREAM followed by several RST_STREAM NO_ERROR
 
 $f->{http_start}('/Discard_NE3');
@@ -595,14 +573,8 @@ ok($frame->{headers}{'grpc-status'}, 'ke
 
 $frames = $f->{http_start}('/KeepAlive', reuse => 1);
 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.5');
-
 ok($frame, 'keepalive 3 - connection reused');
 
-}
-
 undef $f;
 $f = grpc();
 
--- a/grpc_pass.t
+++ b/grpc_pass.t
@@ -97,7 +97,7 @@ foreach my $name ('localhost') {
 }
 
 $t->run_daemon(\&dns_daemon, port(8982), $t);
-$t->try_run('no grpc_pass variables')->plan(5);
+$t->run()->plan(5);
 
 $t->waitforfile($t->testdir . '/' . port(8982));
 
--- a/h2.t
+++ b/h2.t
@@ -229,9 +229,6 @@ is($frame->{code}, 6, 'GOAWAY invalid le
 #   An endpoint MUST treat a GOAWAY frame with a stream identifier other
 #   than 0x0 as a connection error (Section 5.4.1) of type PROTOCOL_ERROR.
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.3');
-
 $s = Test::Nginx::HTTP2->new();
 $s->h2_goaway(1, 0, 5, 'foobar');
 $frames = $s->read(all => [{ type => "GOAWAY" }], wait => 0.5);
@@ -240,8 +237,6 @@ local $TODO = 'not yet' unless $t->has_v
 ok($frame, 'GOAWAY invalid stream - GOAWAY frame');
 is($frame->{code}, 1, 'GOAWAY invalid stream - GOAWAY PROTOCOL_ERROR');
 
-}
-
 # client-initiated PUSH_PROMISE, just to ensure nothing went wrong
 # N.B. other implementation returns zero code, which is not anyhow regulated
 
@@ -592,15 +587,10 @@ ok($frame, 'client header timeout - PING
 $sid = $s->new_stream({ path => '/t2.html', split => [20], split_delay => 2.1 });
 $frames = $s->read(all => [{ type => 'RST_STREAM' }]);
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.9');
-
 ($frame) = grep { $_->{type} eq "RST_STREAM" } @$frames;
 ok($frame, 'client header timeout 2');
 is($frame->{code}, 1, 'client header timeout 2 - protocol error');
 
-}
-
 $s->h2_ping('SEE-THIS');
 $frames = $s->read(all => [{ type => 'PING' }]);
 
--- a/h2_headers.t
+++ b/h2_headers.t
@@ -42,8 +42,6 @@ http {
         listen       127.0.0.1:8082 http2 sndbuf=128;
         server_name  localhost;
 
-        http2_max_field_size 128k;
-        http2_max_header_size 128k;
         large_client_header_buffers 2 64k;
 
         location / {
@@ -94,7 +92,6 @@ http {
         listen       127.0.0.1:8084 http2;
         server_name  localhost;
 
-        http2_max_field_size 512;
         large_client_header_buffers 4 512;
     }
 
@@ -102,7 +99,6 @@ http {
         listen       127.0.0.1:8085 http2;
         server_name  localhost;
 
-        http2_max_header_size 512;
         large_client_header_buffers 1 512;
     }
 
@@ -126,14 +122,7 @@ http {
 EOF
 
 $t->run_daemon(\&http_daemon);
-
-# suppress deprecation warning
-
-open OLDERR, ">&", \*STDERR; close STDERR;
-$t->run();
-open STDERR, ">&", \*OLDERR;
-
-$t->waitforsocket('127.0.0.1:' . port(8083));
+$t->run()->waitforsocket('127.0.0.1:' . port(8083));
 
 # file size is slightly beyond initial window size: 2**16 + 80 bytes
 
--- a/h2_max_requests.t
+++ b/h2_max_requests.t
@@ -3,7 +3,7 @@
 # (C) Sergey Kandaurov
 # (C) Nginx, Inc.
 
-# Tests for HTTP/2 protocol, http2_max_requests directive.
+# Tests for HTTP/2 protocol, keepalive directives.
 
 ###############################################################################
 
@@ -42,7 +42,6 @@ http {
         listen       127.0.0.1:8080 http2 sndbuf=1m;
         server_name  localhost;
 
-        http2_max_requests 2;
         keepalive_requests 2;
 
         location / { }
@@ -74,11 +73,7 @@ EOF
 $t->write_file('index.html', 'SEE-THAT' x 50000);
 $t->write_file('t.html', 'SEE-THAT');
 
-# suppress deprecation warning
-
-open OLDERR, ">&", \*STDERR; close STDERR;
-$t->try_run('no keepalive_time')->plan(19);
-open STDERR, ">&", \*OLDERR;
+$t->run()->plan(19);
 
 ###############################################################################
 
@@ -116,42 +111,26 @@ select undef, undef, undef, 0.1;
 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
 is($frame->{headers}->{':status'}, 200, 'max requests limited');
 
-TODO: {
-local $TODO = 'not yet' if ($^O eq 'linux' or $^O eq 'freebsd')
-	and !$t->has_version('1.19.1');
-
 my @data = grep { $_->{type} eq "DATA" } @$frames;
 my $sum = eval join '+', map { $_->{length} } @data;
 is($sum, 400000, 'max requests limited - all data received');
 
-}
-
 ($frame) = grep { $_->{type} eq "GOAWAY" } @$frames;
 ok($frame, 'max requests limited - GOAWAY');
 is($frame->{last_sid}, $sid, 'max requests limited - GOAWAY last stream');
 
 # keepalive_timeout 0
 
-SKIP: {
-skip 'not yet', 2 unless $t->has_version('1.19.7');
-
 $s = Test::Nginx::HTTP2->new(port(8081));
 $sid = $s->new_stream({ path => '/t.html' });
 $frames = $s->read(all => [{ sid => $sid, fin => 1 }, { type => 'GOAWAY' }]);
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.8');
-
 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
 is($frame->{headers}->{':status'}, 200, 'keepalive_timeout 0');
 
-}
-
 ($frame) = grep { $_->{type} eq "GOAWAY" } @$frames;
 ok($frame, 'keepalive_timeout 0 - GOAWAY');
 
-}
-
 # keepalive_time
 
 $s = Test::Nginx::HTTP2->new(port(8082));
@@ -204,18 +183,12 @@ select undef, undef, undef, 0.3;
 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
 is($frame->{headers}->{':status'}, 200, 'graceful shutdown in idle');
 
-TODO: {
-local $TODO = 'not yet' if ($^O eq 'linux' or $^O eq 'freebsd')
-	and !$t->has_version('1.19.1');
-
-my @data = grep { $_->{type} eq "DATA" } @$frames;
-my $sum = eval join '+', map { $_->{length} } @data;
+@data = grep { $_->{type} eq "DATA" } @$frames;
+$sum = eval join '+', map { $_->{length} } @data;
 is($sum, 400000, 'graceful shutdown in idle - all data received');
 
 ($frame) = grep { $_->{type} eq "GOAWAY" } @$frames;
 ok($frame, 'graceful shutdown in idle - GOAWAY');
 is($frame->{last_sid}, $sid, 'graceful shutdown in idle - GOAWAY last stream');
 
-}
-
 ###############################################################################
--- a/h2_priority.t
+++ b/h2_priority.t
@@ -208,9 +208,6 @@ is($sids, "$sid $sid2", 'dependency - PR
 #   stream error of type PROTOCOL_ERROR.
 # Instead, we respond with a connection error of type PROTOCOL_ERROR.
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.4');
-
 $s = Test::Nginx::HTTP2->new();
 $sid = $s->new_stream();
 $s->read(all => [{ sid => $sid, fin => 1 }]);
@@ -222,8 +219,6 @@ my ($frame) = grep { $_->{type} eq "GOAW
 is($frame->{last_sid}, $sid, 'dependency - PRIORITY self - GOAWAY');
 is($frame->{code}, 1, 'dependency - PRIORITY self - PROTOCOL_ERROR');
 
-}
-
 # HEADERS PRIORITY flag, reprioritize prior PRIORITY frame records
 
 $s = Test::Nginx::HTTP2->new();
@@ -278,19 +273,14 @@ is($sids, "$sid $sid2", 'dependency - HE
 
 # HEADERS - self dependency
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.4');
-
 $s = Test::Nginx::HTTP2->new();
 $sid = $s->new_stream({ dep => 1 });
 $frames = $s->read(all => [{ type => 'GOAWAY' }]);
 
-my ($frame) = grep { $_->{type} eq "GOAWAY" } @$frames;
+($frame) = grep { $_->{type} eq "GOAWAY" } @$frames;
 is($frame->{last_sid}, 0, 'dependency - HEADERS self - GOAWAY');
 is($frame->{code}, 1, 'dependency - HEADERS self - PROTOCOL_ERROR');
 
-}
-
 # PRIORITY frame, weighted dependencies
 
 $s = Test::Nginx::HTTP2->new();
@@ -402,7 +392,7 @@ for (1 .. 40) {
 	{ sid => $sid3, fin => 1 },
 ]);
 
-my ($frame) = grep { $_->{type} eq "DATA" && $_->{sid} == $sid } @$frames;
+($frame) = grep { $_->{type} eq "DATA" && $_->{sid} == $sid } @$frames;
 is($frame->{length}, 81, 'removed dependency - first stream');
 
 ($frame) = grep { $_->{type} eq "DATA" && $_->{sid} == $sid3 } @$frames;
--- a/h2_proxy_request_buffering_redirect.t
+++ b/h2_proxy_request_buffering_redirect.t
@@ -72,15 +72,6 @@ EOF
 
 # unbuffered request body
 
-SKIP: {
-skip 'leaves coredump', 1 unless $t->has_version('1.17.4')
-	or $ENV{TEST_NGINX_UNSAFE};
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.4');
-
-$t->todo_alerts() unless $t->has_version('1.17.4');
-
 my $s = Test::Nginx::HTTP2->new();
 my $sid = $s->new_stream({ body_more => 1 });
 
@@ -92,8 +83,4 @@ my $frames = $s->read(all => [{ sid => $
 my ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
 is($frame->{headers}->{':status'}, 200, 'discard body rest on redirect');
 
-}
-
-}
-
 ###############################################################################
--- a/h2_request_body.t
+++ b/h2_request_body.t
@@ -168,9 +168,6 @@ is($frame->{headers}->{'x-length'}, unde
 # request body discarded
 # RST_STREAM with zero code received
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.4');
-
 $s = Test::Nginx::HTTP2->new();
 $sid = $s->new_stream({ body_more => 1 });
 $frames = $s->read(all => [{ type => 'RST_STREAM' }], wait => 0.5);
@@ -178,8 +175,6 @@ local $TODO = 'not yet' unless $t->has_v
 ($frame) = grep { $_->{type} eq "RST_STREAM" } @$frames;
 is($frame->{code}, 0, 'request body discarded - zero RST_STREAM');
 
-}
-
 # malformed request body length not equal to content-length
 
 $s = Test::Nginx::HTTP2->new();
@@ -465,10 +460,6 @@ isnt($frame->{headers}->{'x-body'}, 'xxx
 
 # request body after 400 errors redirected to a proxied location
 
-TODO: {
-todo_skip 'leaves coredump', 1 unless $ENV{TEST_NGINX_UNSAFE}
-	or $t->has_version('1.19.3');
-
 $s = Test::Nginx::HTTP2->new();
 $sid = $s->new_stream({ body => "", headers => [
 	{ name => ':method', value => "" }]});
@@ -477,8 +468,6 @@ todo_skip 'leaves coredump', 1 unless $E
 ($frame) = grep { $_->{type} eq 'DATA' } @$frames;
 is($frame->{data}, 'SEE-THIS', 'request body after 400 redirect');
 
-}
-
 ###############################################################################
 
 sub read_body_file {
--- a/h2_request_body_js.t
+++ b/h2_request_body_js.t
@@ -71,9 +71,6 @@ EOF
 
 ###############################################################################
 
-local $TODO = 'not yet' unless $t->has_version('1.19.3');
-$t->todo_alerts() unless $t->has_version('1.19.3');
-
 my $s = Test::Nginx::HTTP2->new();
 my $sid = $s->new_stream({ body => 'TEST' });
 my $frames = $s->read(all => [{ sid => $sid, fin => 1 }]);
@@ -85,6 +82,4 @@ is($frame->{headers}->{'x-body'}, 'TEST'
 ($frame) = grep { $_->{type} eq "DATA" } @$frames;
 is($frame->{data}, 'SEE-THIS', 'response body');
 
-$t->stop();
-
 ###############################################################################
--- a/http_host.t
+++ b/http_host.t
@@ -169,13 +169,8 @@ is(http_absolute_path(
 is(http_host_header('123.40.56.78:9000:80'), '123.40.56.78',
 	'double port hack');
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.9');
-
 like(http_host_header("localhost\nHost: again", 1), qr/ 400 /, 'host repeat');
 
-}
-
 ###############################################################################
 
 sub http_host_header {
--- a/http_include.t
+++ b/http_include.t
@@ -77,7 +77,7 @@ my $p = port(8080);
 $t->write_file('lmt.conf', 'deny all;');
 $t->write_file('ups.conf', "server 127.0.0.1:$p;");
 
-$t->try_run('no include in any context')->plan(5);
+$t->run()->plan(5);
 
 ###############################################################################
 
--- a/http_keepalive.t
+++ b/http_keepalive.t
@@ -85,7 +85,7 @@ EOF
 $t->write_file('safari', '');
 $t->write_file('none', '');
 $t->write_file('zero', '');
-$t->try_run('no keepalive_time')->plan(21);
+$t->run()->plan(21);
 
 ###############################################################################
 
@@ -143,14 +143,8 @@ EOF
 read_keepalive($s);
 shutdown($s, 1);
 
-TODO: {
-local $TODO = 'not yet' unless ($^O eq 'MSWin32' or $^O eq 'solaris')
-	or $t->has_version('1.19.9');
-
 ok(IO::Select->new($s)->can_read(3), 'EOF in discard body');
 
-}
-
 $t->stop();
 
 TODO: {
--- a/http_uri.t
+++ b/http_uri.t
@@ -64,30 +64,18 @@ like(http_get('/foo/bar/..'), qr!x /foo/
 
 like(http_get('http://localhost'), qr!x / x!, 'absolute');
 like(http_get('http://localhost/'), qr!x / x!, 'absolute slash');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.6');
-
 like(http_get('http://localhost?args'), qr!x / x.*y args y!ms,
 	'absolute args');
 like(http_get('http://localhost?args#frag'), qr!x / x.*y args y!ms,
 	'absolute args and frag');
 
-}
-
 like(http_get('http://localhost:8080'), qr!x / x!, 'port');
 like(http_get('http://localhost:8080/'), qr!x / x!, 'port slash');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.6');
-
 like(http_get('http://localhost:8080?args'), qr!x / x.*y args y!ms,
 	'port args');
 like(http_get('http://localhost:8080?args#frag'), qr!x / x.*y args y!ms,
 	'port args and frag');
 
-}
-
 like(http_get('/ /'), qr!x / / x!, 'space');
 
 ###############################################################################
--- a/http_variables.t
+++ b/http_variables.t
@@ -82,14 +82,8 @@ http_get('/');
 http_get('/../bad_uri');
 http_get('/redefine');
 
-TODO: {
-todo_skip 'overflow', 1 unless $ENV{TEST_NGINX_UNSAFE}
-	or $t->has_version('1.19.0');
-
 like(http_get('/arg?l=42'), qr/42:$/, 'arg');
 
-}
-
 # $limit_rate is a special variable that has its own set_handler / get_handler
 
 like(http_get('/limit_rate?l=40k'), qr/X-Rate: 40960/, 'limit_rate handlers');
--- a/ignore_invalid_headers.t
+++ b/ignore_invalid_headers.t
@@ -101,16 +101,11 @@ like(get($bad2, 8080), qr/x-bar/, 'off -
 
 # ignore_invalid_headers off; headers parsing post 8f55cb5c7e79
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.5');
-
 unlike(http('GET /v HTTP/1.0' . CRLF
 	. 'Host: localhost' . CRLF
 	. 'coo: foo' . CRLF
 	. '</kie>: x-bar' . CRLF . CRLF), qr/x-bar/, 'off - several');
 
-}
-
 # ignore_invalid_headers on;
 
 unlike(get($us, 8081), qr/x-bar/, 'on - underscore');
--- a/js_subrequests.t
+++ b/js_subrequests.t
@@ -508,20 +508,7 @@ is(get_json('/sr_options_method_head'), 
 is(get_json('/sr_body'), '{"a":{"b":1}}', 'sr_body');
 is(get_json('/sr_body_special'), '{"e":"msg"}', 'sr_body_special');
 is(get_json('/sr_in_variable_handler'), '["CB-VAR"]', 'sr_in_variable_handler');
-
-$t->todo_alerts() if $t->read_file('nginx.conf') =~ /aio (on|threads)/
-	and !$t->has_version('1.17.9');
-
-TODO: {
-local $TODO = 'header already sent' if $t->read_file('nginx.conf') =~ /aio on/
-	and !$t->has_version('1.17.9');
-local $TODO = 'open socket left' if $t->read_file('nginx.conf') =~ /aio thread/
-	and !$t->has_version('1.17.9');
-
 is(get_json('/sr_file'), '["SEE-THIS"]', 'sr_file');
-
-}
-
 is(get_json('/sr_cache?c=1'), '["SEE-THIS"]', 'sr_cache');
 is(get_json('/sr_cache?c=1'), '["SEE-THIS"]', 'sr_cached');
 is(get_json('/sr_js_in_subrequest'), '["JS-SUB"]', 'sr_js_in_subrequest');
--- a/limit_conn_dry_run.t
+++ b/limit_conn_dry_run.t
@@ -74,7 +74,7 @@ http {
 EOF
 
 $t->write_file('w', '');
-$t->try_run('no limit_conn_dry_run/limit_conn_status')->plan(6);
+$t->run()->plan(6);
 
 ###############################################################################
 
--- a/limit_rate.t
+++ b/limit_rate.t
@@ -82,7 +82,7 @@ http {
 EOF
 
 $t->write_file('data', 'X' x 30000);
-$t->try_run('no limit_rate variables')->plan(7);
+$t->run()->plan(7);
 
 ###############################################################################
 
--- a/limit_req_dry_run.t
+++ b/limit_req_dry_run.t
@@ -70,7 +70,7 @@ EOF
 
 $t->write_file('delay', 'SEE-THIS');
 $t->write_file('reject', 'SEE-THIS');
-$t->try_run('no limit_req_dry_run/limit_req_status')->plan(8);
+$t->run()->plan(8);
 
 ###############################################################################
 
--- a/mail_proxy_protocol.t
+++ b/mail_proxy_protocol.t
@@ -92,7 +92,7 @@ http {
 EOF
 
 $t->run_daemon(\&Test::Nginx::SMTP::smtp_test_daemon);
-$t->try_run('no proxy_protocol')->plan(8);
+$t->run()->plan(8);
 
 $t->waitforsocket('127.0.0.1:' . port(8026));
 
--- a/mail_proxy_smtp_auth.t
+++ b/mail_proxy_smtp_auth.t
@@ -76,7 +76,7 @@ http {
 EOF
 
 $t->run_daemon(\&Test::Nginx::SMTP::smtp_test_daemon);
-$t->try_run('no proxy_smtp_auth')->plan(7);
+$t->run()->plan(7);
 
 $t->waitforsocket('127.0.0.1:' . port(8026));
 
--- a/mail_resolver.t
+++ b/mail_resolver.t
@@ -296,10 +296,6 @@ local $TODO = 'support for CNAME RR';
 
 # before 1.17.3, read event while in resolving resulted in duplicate resolving
 
-TODO: {
-todo_skip 'leaves coredump', 1 unless $ENV{TEST_NGINX_UNSAFE}
-	or $t->has_version('1.17.3');
-
 my %ssl = (
 	SSL => 1,
 	SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE(),
@@ -319,8 +315,6 @@ my %ssl = (
 $s->send('QUIT');
 $s->read();
 
-}
-
 ###############################################################################
 
 sub reply_handler {
--- a/mail_ssl_conf_command.t
+++ b/mail_ssl_conf_command.t
@@ -88,7 +88,7 @@ foreach my $name ('localhost', 'override
 		or die "Can't create certificate for $name: $!\n";
 }
 
-$t->try_run('no ssl_conf_command')->plan(3);
+$t->run()->plan(3);
 
 ###############################################################################
 
--- a/memcached_fake_extra.t
+++ b/memcached_fake_extra.t
@@ -57,8 +57,6 @@ EOF
 
 ###############################################################################
 
-$t->todo_alerts() unless $t->has_version('1.19.1');
-
 like(http_get('/'), qr/SEE-THIS/, 'memcached data after trailer');
 
 ###############################################################################
--- a/merge_slashes.t
+++ b/merge_slashes.t
@@ -52,8 +52,6 @@ EOF
 
 ###############################################################################
 
-local $TODO = 'not yet' unless $t->has_version('1.17.5');
-
 like(http_get('/foo//../bar'), qr!x /foo/bar x!, 'merge slashes');
 like(http_get('/foo///../bar'), qr!x /foo//bar x!, 'merge slashes 2');
 
--- a/mp4.t
+++ b/mp4.t
@@ -117,16 +117,8 @@ like(http_head("$test_uri?start=21"), qr
 
 # corrupted formats
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.9');
-
 like(http_get("/bad.mp4?start=0.5"), qr/500 Internal/, 'co64 chunk beyond EOF');
 
-}
-
-$t->todo_alerts() if $t->read_file('nginx.conf') =~ /sendfile on/
-	and !$t->has_version('1.17.9');
-
 ###############################################################################
 
 sub durations {
--- a/not_modified_finalize.t
+++ b/not_modified_finalize.t
@@ -84,14 +84,8 @@ like(http_match_get('/t.html'), qr//, 'r
 
 http_get('/t.html');
 
-TODO: {
-todo_skip 'leaves coredump', 1 unless $ENV{TEST_NGINX_UNSAFE}
-	or $t->has_version('1.17.1');
-
 like(http_match_get('/t.html'), qr//, 'request 412 cached');
 
-}
-
 ###############################################################################
 
 sub http_match_get {
--- a/perl.t
+++ b/perl.t
@@ -196,29 +196,18 @@ like(http(
 ), qr/Content-Length: (?!42).*^xx\x0d.*^xxx\x0d/ms,
 	'perl header_out content-length multipart');
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.2');
-
 like(http(
 	'GET /range HTTP/1.0' . CRLF
 	. 'Host: localhost' . CRLF
 	. 'Range: bytes=100000-' . CRLF . CRLF
 ), qr|^\QHTTP/1.1 416\E.*(?!xxx)|ms, 'perl range not satisfiable');
 
-}
-
-TODO: {
-todo_skip 'leaves coredump', 1 unless $t->has_version('1.17.1')
-	or $ENV{TEST_NGINX_UNSAFE};
-
 like(http(
 	'GET / HTTP/1.0' . CRLF
 	. 'Host: localhost' . CRLF
 	. 'If-Match: tt' . CRLF . CRLF
 ), qr|200 OK|ms, 'perl precondition failed');
 
-}
-
 # various request body tests
 
 like(http_get('/body'), qr/400 Bad Request/, 'perl no body');
@@ -287,9 +276,6 @@ like(http(
 	. '0' . CRLF . CRLF
 ), qr/host: localhost/, 'perl body discard');
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.2');
-
 like(http(
 	'GET /discard HTTP/1.1' . CRLF
 	. 'Host: localhost' . CRLF
@@ -310,6 +296,4 @@ like(http(
 	. '0' . CRLF . CRLF
 ), qr/400 Bad Request/, 'perl body bad chunk');
 
-}
-
 ###############################################################################
--- a/proxy_cache_min_free.t
+++ b/proxy_cache_min_free.t
@@ -64,7 +64,7 @@ http {
 EOF
 
 $t->write_file('t.html', 'SEE-THIS');
-$t->try_run('no proxy_cache_path min_free')->plan(2);
+$t->run()->plan(2);
 
 ###############################################################################
 
--- a/proxy_cache_use_stale.t
+++ b/proxy_cache_use_stale.t
@@ -179,17 +179,11 @@ get('/regexp.html', 'max-age=1, stale-wh
 
 sleep 2;
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.3');
-
 # stale 5xx response is ignored since 1.19.3,
 # "proxy_cache_use_stale updating;" allows to get it still
 
 like(http_get('/t.html?e=1'), qr/ 500 /, 's-i-e - stale 5xx ignore');
 like(http_get('/tt.html?e=1'), qr/ 500 /, 's-i-e - stale 5xx ignore 2');
-
-}
-
 like(http_get('/updating/tt.html'), qr/STALE/, 's-i-e - stale 5xx updating');
 like(http_get('/t.html'), qr/REVALIDATED/, 's-i-e - revalidated');
 
@@ -201,14 +195,8 @@ like(get('/t4.html', 'max-age=1, stale-w
 	's-w-r - unconditional revalidate');
 like(http_get('/t4.html'), qr/HIT/, 's-w-r - unconditional revalidated');
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.3');
-
 like(http_get('/t5.html?e=1'), qr/ 500 /,
 	's-w-r - foreground revalidate error');
-
-}
-
 like(http_get('/t5.html'), qr/REVALIDATED/, 's-w-r - foreground revalidated');
 
 # proxy_pass to regular expression with named and positional captures
--- a/proxy_cache_vary.t
+++ b/proxy_cache_vary.t
@@ -262,14 +262,8 @@ like(get('/', 'bar,foo'), qr/HIT/ms, 'no
 
 get1('/cold?vary=z', 'z:1');
 like(get1('/cold?vary=x,y', 'x:1'), qr/MISS/, 'change first');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.3');
-
 like(get1('/cold?vary=x,y', 'x:1'), qr/HIT/, 'change first cached');
 
-}
-
 like(get1('/cold?vary=x,y&xtra=1', 'x:2'), qr/MISS/, 'change second');
 like(get1('/cold?vary=x,y&xtra=1', 'x:2'), qr/HIT/, 'change second cached');
 
@@ -282,23 +276,12 @@ like(get1('/cold?vary=x,y&xtra=1', 'x:2'
 # triggering "cache file .. has too long header" critical errors
 
 like(get1('/cold?vary=x,y', 'x:1'), qr/HIT/, 'cold first');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.3');
-
 like(get1('/cold?vary=x,y&xtra=1', 'x:2'), qr/HIT/, 'cold second');
 
-}
-
 $t->stop();
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.3');
-
 like(`grep -F '[crit]' ${\($t->testdir())}/error.log`, qr/^$/s, 'no crit');
 
-}
-
 ###############################################################################
 
 sub get {
--- a/proxy_chunked_extra.t
+++ b/proxy_chunked_extra.t
@@ -59,13 +59,8 @@ EOF
 
 ###############################################################################
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.1');
-
 like(http_get('/'), qr/200 OK(?!.*zzz)/s, 'chunked with extra data');
 
-}
-
 ###############################################################################
 
 sub http_chunked_daemon {
--- a/proxy_cookie_flags.t
+++ b/proxy_cookie_flags.t
@@ -77,7 +77,7 @@ http {
 
 EOF
 
-$t->try_run('no proxy_cookie_flags')->plan(14);
+$t->run()->plan(14);
 
 ###############################################################################
 
--- a/proxy_extra_data.t
+++ b/proxy_extra_data.t
@@ -74,13 +74,7 @@ EOF
 
 ###############################################################################
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.1');
-
 like(http_get('/'), qr/SEE-THIS(?!-BUT-NOT-THIS)/, 'response with extra data');
-
-}
-
 like(http_get('/short'), qr/SEE-THIS(?!.*:after)/s, 'too short response');
 like(http_get('/empty'), qr/200 OK(?!.*:after)/s, 'empty too short response');
 
@@ -90,14 +84,8 @@ like(http_head('/empty'), qr/200 OK/, 'e
 
 # unbuffered responses
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.1');
-
 like(http_get('/unbuf/'), qr/SEE-THIS(?!-BUT-NOT-THIS)/,
 	'unbuffered with extra data');
-
-}
-
 like(http_get('/unbuf/short'), qr/SEE-THIS(?!.*:after)/s,
 	'unbuffered too short response');
 like(http_get('/unbuf/empty'), qr/200 OK(?!.*:after)/s,
@@ -119,38 +107,17 @@ like(http_head('/head/short'), qr/200 OK
 
 like(http_get('/head/empty'), qr/SEE-THIS/, 'head no body cached');
 like(http_get('/head/matching'), qr/SEE-THIS/, 'head matching cached');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.1');
-
 like(http_get('/head/extra'), qr/SEE-THIS(?!-BUT-NOT-THIS)/s,
 	'head extra cached');
-
-}
-
 like(http_get('/head/short'), qr/SEE-THIS(?!.*:after)/s,
 	'head too short cached');
 
-
 # "zero size buf" alerts (ticket #2117)
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.1');
-
 like(http_get('/zero'), qr/200 OK(?!.*NOT-THIS)/s, 'zero size');
-
-}
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.7');
-
 like(http_get('/unbuf/zero'), qr/200 OK(?!.*NOT-THIS)/s,
 	'unbuffered zero size');
 
-}
-
-$t->todo_alerts() if $t->has_version('1.19.1') and !$t->has_version('1.19.7');
-
 ###############################################################################
 
 sub http_daemon {
--- a/proxy_force_ranges.t
+++ b/proxy_force_ranges.t
@@ -109,14 +109,9 @@ like(http_get_range('/proxy/t.html',
 
 # range sent using chunked transfer encoding
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.0');
-
 like(http_get_range('/proxy/t.html', 'Range: bytes=-2'),
 	qr/2${CRLF}IS${CRLF}0$CRLF$CRLF$/, 'no dublicate final chunk');
 
-}
-
 ###############################################################################
 
 sub http_get_range {
--- a/proxy_next_upstream.t
+++ b/proxy_next_upstream.t
@@ -146,11 +146,6 @@ like(http_get('/all/rr'),
 # make sure backend marked as down doesn't count towards "no live upstreams"
 # after all backends are tried with http_404
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.6');
-
 like(http_get('/down/'), qr/Not Found/, 'all tried with down');
 
-}
-
 ###############################################################################
--- a/proxy_protocol2_server.t
+++ b/proxy_protocol2_server.t
@@ -70,7 +70,7 @@ http {
 EOF
 
 $t->write_file('t1', 'SEE-THIS');
-$t->try_run('no proxy_protocol_server_addr')->plan(28);
+$t->run()->plan(28);
 
 ###############################################################################
 
--- a/proxy_protocol_server.t
+++ b/proxy_protocol_server.t
@@ -72,7 +72,7 @@ http {
 EOF
 
 $t->write_file('t1', 'SEE-THIS');
-$t->try_run('no proxy_protocol_server_addr')->plan(24);
+$t->run()->plan(24);
 
 ###############################################################################
 
--- a/proxy_ssl_conf_command.t
+++ b/proxy_ssl_conf_command.t
@@ -89,7 +89,7 @@ foreach my $name ('localhost', 'override
 }
 
 $t->write_file('index.html', '');
-$t->try_run('no proxy_ssl_conf_command')->plan(1);
+$t->run()->plan(1);
 
 ###############################################################################
 
--- a/rewrite.t
+++ b/rewrite.t
@@ -239,11 +239,6 @@ like(http_get('/capturedup/%25?a=b'),
 
 # break
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.8');
-
 like(http_get('/break'), qr/200/, 'valid_location reset');
 
-}
-
 ###############################################################################
--- a/scgi_extra_data.t
+++ b/scgi_extra_data.t
@@ -81,24 +81,16 @@ EOF
 
 ###############################################################################
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.1');
-
 like(http_get('/'), qr/SEE-THIS(?!-BUT-NOT-THIS)/, 'response with extra data');
 like(http_get('/short'), qr/SEE-THIS(?!.*:after)/s, 'too short response');
 like(http_get('/empty'), qr/200 OK(?!.*:after)/s, 'empty too short response');
 
-}
-
 like(http_head('/'), qr/200 OK(?!.*SEE-THIS)/s, 'no data in HEAD');
 like(http_head('/short'), qr/200 OK(?!.*SEE-THIS)/s, 'too short to HEAD');
 like(http_head('/empty'), qr/200 OK/, 'empty response to HEAD');
 
 # unbuffered responses
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.1');
-
 like(http_get('/unbuf/'), qr/SEE-THIS(?!-BUT-NOT-THIS)/,
 	'unbuffered with extra data');
 like(http_get('/unbuf/short'), qr/SEE-THIS(?!.*:after)/s,
@@ -106,8 +98,6 @@ like(http_get('/unbuf/short'), qr/SEE-TH
 like(http_get('/unbuf/empty'), qr/200 OK(?!.*:after)/s,
 	'unbuffered empty too short response');
 
-}
-
 like(http_head('/unbuf/'), qr/200 OK(?!.*SEE-THIS)/s,
 	'unbuffered no data in HEAD');
 like(http_head('/unbuf/short'), qr/200 OK(?!.*SEE-THIS)/s,
@@ -124,36 +114,17 @@ like(http_head('/head/short'), qr/200 OK
 
 like(http_get('/head/empty'), qr/SEE-THIS/, 'head no body cached');
 like(http_get('/head/matching'), qr/SEE-THIS/, 'head matching cached');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.1');
-
 like(http_get('/head/extra'), qr/SEE-THIS(?!-BUT-NOT-THIS)/s,
 	'head extra cached');
 like(http_get('/head/short'), qr/SEE-THIS(?!.*:after)/s,
 	'head too short cached');
 
-}
-
 # "zero size buf" alerts (ticket #2117)
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.1');
-
 like(http_get('/zero'), qr/200 OK(?!.*NOT-THIS)/s, 'zero size');
-
-}
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.7');
-
 like(http_get('/unbuf/zero'), qr/200 OK(?!.*NOT-THIS)/s,
 	'unbuffered zero size');
 
-}
-
-$t->todo_alerts() if $t->has_version('1.19.1') and !$t->has_version('1.19.7');
-
 ###############################################################################
 
 sub scgi_daemon {
--- a/slice.t
+++ b/slice.t
@@ -15,7 +15,7 @@ use Test::More;
 BEGIN { use FindBin; chdir($FindBin::Bin); }
 
 use lib 'lib';
-use Test::Nginx qw/ :DEFAULT http_end /;
+use Test::Nginx;
 
 ###############################################################################
 
@@ -134,14 +134,8 @@ like(http_get('/cache/t'), qr/ 200 .*012
 $r = get('/proxy/t', 'Range: bytes=3-4');
 like($r, qr/ 206 /, 'proxy - 206 partial reply');
 like($r, qr/^34$/m, 'proxy - correct content');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.2');
-
 unlike($r, qr/Accept-Ranges/, 'proxy - no original accept-ranges');
 
-}
-
 $r = get('/cache/t?single', "Range: bytes=0-0");
 like($r, qr/ 206 /, 'single - 206 partial reply');
 like($r, qr/^0$/m, 'single - correct content');
--- a/ssl.t
+++ b/ssl.t
@@ -318,13 +318,8 @@ is(() = $r =~ /(200 OK)/g, 1000, 'pipeli
 
 # close_notify is sent before lingering close
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.5');
-
 is(get_ssl_shutdown(8085), 1, 'ssl shutdown on lingering close');
 
-}
-
 $t->stop();
 
 TODO: {
--- a/ssl_conf_command.t
+++ b/ssl_conf_command.t
@@ -88,7 +88,7 @@ foreach my $name ('localhost', 'override
 		or die "Can't create certificate for $name: $!\n";
 }
 
-$t->try_run('no ssl_conf_command')->plan(3);
+$t->run()->plan(3);
 
 ###############################################################################
 
--- a/ssl_ocsp.t
+++ b/ssl_ocsp.t
@@ -287,7 +287,7 @@ foreach my $name ('ec', 'rsa') {
 
 $t->run_daemon(\&http_daemon, $t, port(8081));
 $t->run_daemon(\&http_daemon, $t, port(8082));
-$t->try_run('no ssl_ocsp')->plan(14);
+$t->run()->plan(14);
 
 $t->waitforsocket("127.0.0.1:" . port(8081));
 $t->waitforsocket("127.0.0.1:" . port(8082));
@@ -300,16 +300,10 @@ like(get('RSA', 'end'), qr/200 OK.*SUCCE
 
 # demonstrate that ocsp int request is failed due to missing resolver
 
-TODO: {
-todo_skip 'leaves coredump', 1 unless $t->has_version('1.19.1')
-	or $ENV{TEST_NGINX_UNSAFE};
-
 like(get('RSA', 'end', sni => 'resolver'),
 	qr/400 Bad.*FAILED:certificate status request failed/s,
 	'ocsp many failed request');
 
-}
-
 # demonstrate that ocsp int request is actually made by failing ocsp response
 
 like(get('RSA', 'end', port => 8444),
--- a/ssl_reject_handshake.t
+++ b/ssl_reject_handshake.t
@@ -109,7 +109,12 @@ foreach my $name ('localhost') {
 }
 
 $t->write_file('index.html', '');
-$t->try_run('no ssl_reject_handshake')->plan(9);
+
+# suppress deprecation warning
+
+open OLDERR, ">&", \*STDERR; close STDERR;
+$t->run()->plan(9);
+open STDERR, ">&", \*OLDERR;
 
 ###############################################################################
 
--- a/stream_limit_conn_dry_run.t
+++ b/stream_limit_conn_dry_run.t
@@ -84,7 +84,7 @@ http {
 EOF
 
 $t->write_file('index.html', 'OK');
-$t->try_run('no limit_conn_dry_run/limit_conn_status')->plan(9);
+$t->run()->plan(9);
 
 ###############################################################################
 
--- a/stream_limit_rate2.t
+++ b/stream_limit_rate2.t
@@ -102,7 +102,7 @@ EOF
 
 $t->run_daemon(\&stream_daemon, port(8080));
 $t->run_daemon(\&stream_daemon, port(8087));
-$t->try_run('no proxy_download_rate variables')->plan(9);
+$t->run()->plan(9);
 
 $t->waitforsocket('127.0.0.1:' . port(8080));
 $t->waitforsocket('127.0.0.1:' . port(8087));
--- a/stream_proxy_next_upstream.t
+++ b/stream_proxy_next_upstream.t
@@ -104,14 +104,9 @@ is(stream('127.0.0.1:' . port(8086))->io
 
 $t->stop();
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.6');
-
 is($t->read_file('test.log'), '127.0.0.1:' . port(8083) . "\n",
 	'next down log');
 
-}
-
 ###############################################################################
 
 sub stream_daemon {
--- a/stream_proxy_ssl_conf_command.t
+++ b/stream_proxy_ssl_conf_command.t
@@ -83,7 +83,7 @@ foreach my $name ('localhost', 'override
 }
 
 $t->write_file('index.html', '');
-$t->try_run('no proxy_ssl_conf_command')->plan(1);
+$t->run()->plan(1);
 
 ###############################################################################
 
--- a/stream_set.t
+++ b/stream_set.t
@@ -23,7 +23,8 @@ use Test::Nginx::Stream qw/ stream /;
 select STDERR; $| = 1;
 select STDOUT; $| = 1;
 
-my $t = Test::Nginx->new()->has(qw/stream stream_return stream_set/);
+my $t = Test::Nginx->new()
+	->has(qw/stream stream_return stream_map stream_set/);
 
 $t->write_file_expand('nginx.conf', <<'EOF');
 
@@ -37,7 +38,6 @@ events {
 stream {
     %%TEST_GLOBALS_STREAM%%
 
-
     map 0 $map_var {
         default "original";
     }
@@ -58,7 +58,7 @@ stream {
 
 EOF
 
-$t->try_run('no stream set')->plan(2);
+$t->run()->plan(2);
 
 ###############################################################################
 
--- a/stream_ssl_conf_command.t
+++ b/stream_ssl_conf_command.t
@@ -88,7 +88,7 @@ foreach my $name ('localhost', 'override
 		or die "Can't create certificate for $name: $!\n";
 }
 
-$t->try_run('no ssl_conf_command')->plan(3);
+$t->run()->plan(3);
 
 ###############################################################################
 
--- a/stream_udp_proxy.t
+++ b/stream_udp_proxy.t
@@ -79,9 +79,6 @@ is($s->io('3', read => 3), '123', 'proxy
 
 # zero-length payload
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.1');
-
 $s = dgram('127.0.0.1:' . port(8982));
 $s->write('');
 is($s->read(), 'zero', 'upstream read zero bytes');
@@ -91,8 +88,6 @@ is($s->read(), '', 'upstream sent zero b
 is($s->read(), 'zero', 'upstream read zero bytes again');
 is($s->read(), '', 'upstream sent zero bytes again');
 
-}
-
 ###############################################################################
 
 sub udp_daemon {
--- a/stream_upstream_hash.t
+++ b/stream_upstream_hash.t
@@ -102,14 +102,9 @@ like(many(10, port(8081)), qr/($port2|$p
 
 # fallback to round-robin
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.1');
-
 like(many(4, port(8084)), qr/$port2: 2, $port3: 2/, 'empty key');
 like(many(4, port(8085)), qr/$port2: 2, $port3: 2/, 'empty key - consistent');
 
-}
-
 ###############################################################################
 
 sub many {
--- a/upstream_hash.t
+++ b/upstream_hash.t
@@ -180,14 +180,9 @@ like(many('/c?a=1', 10), qr/($p1|$p2|$p3
 
 # fallback to round-robin
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.1');
-
 like(many('/?a=', 6), qr/$p1: 2, $p2: 2, $p3: 2/, 'empty key');
 like(many('/c?a=', 6), qr/$p1: 2, $p2: 2, $p3: 2/, 'empty key - consistent');
 
-}
-
 my @res = iter('/', 10);
 
 is(@res, 10, 'all hashed peers');
--- a/upstream_keepalive.t
+++ b/upstream_keepalive.t
@@ -77,7 +77,7 @@ http {
 EOF
 
 $t->write_file('index.html', 'SEE-THIS');
-$t->try_run('no keepalive_time')->plan(11);
+$t->run()->plan(11);
 
 ###############################################################################
 
--- a/userid_flags.t
+++ b/userid_flags.t
@@ -70,7 +70,7 @@ EOF
 $t->write_file('index.html', '');
 $t->write_file('lax', '');
 $t->write_file('many', '');
-$t->try_run('no userid_flags')->plan(5);
+$t->run()->plan(5);
 
 ###############################################################################
 
--- a/uwsgi_ssl.t
+++ b/uwsgi_ssl.t
@@ -112,9 +112,6 @@ open STDERR, ">&", \*OLDERR;
 
 ###############################################################################
 
-TODO: {
-todo_skip 'not yet', 7 unless $t->has_version('1.19.1');
-
 like(http_get('/'), qr/SEE-THIS/, 'uwsgi request');
 like(http_head('/head'), qr/200 OK(?!.*SEE-THIS)/s, 'no data in HEAD');
 
@@ -128,8 +125,6 @@ like(http_get('/var?b=u'), qr/SEE-THIS/,
 like(http_post('/'), qr/SEE-THIS/, 'uwsgi post');
 like(http_post_big('/'), qr/SEE-THIS/, 'uwsgi big post');
 
-}
-
 ###############################################################################
 
 sub http_get_headers {
--- a/worker_shutdown_timeout_h2.t
+++ b/worker_shutdown_timeout_h2.t
@@ -63,15 +63,8 @@ ok($s->new_stream(), 'new stream');
 
 $t->stop();
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.17.4');
-
 like($t->read_file('access.log'), qr/ (?!504)\d{3} /, 'shutdown timeout');
 
-}
-
-$t->todo_alerts() unless $t->has_version('1.17.4');
-
 ###############################################################################
 
 sub http_silent_daemon {
--- a/xslt.t
+++ b/xslt.t
@@ -118,20 +118,10 @@ like(http_get("/x2"), qr!200 OK.*param1=
 	'params');
 like(http_get("/x3"), qr!200 OK.*data=test entity!ms, 'entities');
 like(http_get("/x4"), qr!200 OK.*data=other data!ms, 'several stylesheets');
-
-TODO: {
-todo_skip 'heap-buffer-overflow', 1 unless $t->has_version('1.17.2')
-	or $ENV{TEST_NGINX_UNSAFE};
-
 like(http_get("/x5"), qr!200 OK.*param1=localhost!ms, 'params variable');
 
-}
-
 # xslt and ranges
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.19.2');
-
 unlike(http_get("/x1"), qr!Accept-Ranges!, 'no Accept-Ranges');
 like(http(<<EOF), qr!200 OK.*test xslt result!ms, 'no ranges');
 GET /x1 HTTP/1.1
@@ -141,6 +131,4 @@ Range: bytes=-10
 
 EOF
 
-}
-
 ###############################################################################