changeset 1987:a095b971fbcc default tip

Tests: removed TODO and try_run() checks for legacy versions. For h2_http2.t, try_run() is preserved to ensure that deprecation warnings for "listen ... http2" are suppressed, yet plan() is reported before try_run(), so failure to start will be properly reported.
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 04 Jun 2024 18:38:01 +0300
parents 11463d379570
children
files auth_request.t autoindex_win32.t body_chunked.t dav_utf8.t fastcgi_header_params.t h2.t h2_error_page.t h2_headers.t h2_http2.t h2_proxy_protocol.t http_headers_multi.t http_request.t image_filter_finalize.t mail_max_commands.t mail_smtp.t perl.t proxy_available.t proxy_cache_control.t proxy_cache_use_stale.t proxy_cache_vary.t proxy_duplicate_headers.t proxy_intercept_errors.t proxy_protocol2_tlv.t quic_retry.t range_clearing.t scgi.t ssl_certificate.t ssl_session_ticket_key.t stream_proxy_protocol2_tlv.t stream_ssl_certificate.t uwsgi.t
diffstat 31 files changed, 10 insertions(+), 209 deletions(-) [+]
line wrap: on
line diff
--- a/auth_request.t
+++ b/auth_request.t
@@ -203,14 +203,9 @@ like(http_post_big('/proxy-double'), qr/
 
 # Multiple WWW-Authenticate headers (ticket #485).
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 like(http_get('/proxy-multi-auth'), qr/WWW-Authenticate: foo.*bar/s,
 	'multiple www-authenticate headers');
 
-}
-
 SKIP: {
 	eval { require FCGI; };
 	skip 'FCGI not installed', 2 if $@;
--- a/autoindex_win32.t
+++ b/autoindex_win32.t
@@ -76,9 +76,6 @@ my $r = http_get('/');
 like($r, qr!href="test-file"!ms, 'file');
 like($r, qr!href="test-dir/"!ms, 'directory');
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.4');
-
 like($r, qr!href="test-file-(%d0%bc%d0%b8){3}"!msi, 'utf file link');
 like($r, qr!test-file-(\xd0\xbc\xd0\xb8){3}</a>!ms, 'utf file name');
 
@@ -92,8 +89,6 @@ like($r, qr!Index of /test-dir-(\xd0\xbc
 like($r, qr!href="test-subfile-(%d0%bc%d0%b8){3}"!msi, 'utf subdir link');
 like($r, qr!test-subfile-(\xd0\xbc\xd0\xb8){3}</a>!msi, 'utf subdir name');
 
-}
-
 ###############################################################################
 
 sub win32_mkdir {
--- a/body_chunked.t
+++ b/body_chunked.t
@@ -179,9 +179,6 @@ like(
 	qr/ 200 /, 'chunk extensions'
 );
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.25.5');
-
 like(
 	http(
 		'GET /large HTTP/1.1' . CRLF
@@ -194,8 +191,6 @@ like(
 	qr/ 413 /, 'too many chunk extensions'
 );
 
-}
-
 like(
 	http(
 		'GET /large HTTP/1.1' . CRLF
@@ -208,9 +203,6 @@ like(
 	qr/ 200 /, 'trailers'
 );
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.25.5');
-
 like(
 	http(
 		'GET /large HTTP/1.1' . CRLF
@@ -223,8 +215,6 @@ like(
 	qr/ 413 /, 'too many trailers'
 );
 
-}
-
 # proxy_next_upstream
 
 like(http_get_body('/next', '0123456789'),
--- a/dav_utf8.t
+++ b/dav_utf8.t
@@ -57,8 +57,6 @@ EOF
 
 ###############################################################################
 
-local $TODO = 'not yet' if $^O eq 'MSWin32' and !$t->has_version('1.23.4');
-
 my $d = $t->testdir();
 my $r;
 
--- a/fastcgi_header_params.t
+++ b/fastcgi_header_params.t
@@ -59,9 +59,6 @@ EOF
 like(http_get_headers('/'), qr/SEE-THIS/,
 	'fastcgi request with many ignored headers');
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 my $r;
 
 $r = http(<<EOF);
@@ -88,8 +85,6 @@ like($r, qr/X-Cookie: foo; bar; bazz/,
 like($r, qr/X-Foo: foo, bar, bazz/,
 	'fastcgi with multiple unknown headers');
 
-}
-
 ###############################################################################
 
 sub http_get_headers {
--- a/h2.t
+++ b/h2.t
@@ -1014,15 +1014,10 @@ is($frame->{headers}->{':status'}, 200, 
 
 # invalid connection preface
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.25.1');
-
 like(http('x' x 16), qr/400 Bad Request/, 'invalid preface');
 like(http('PRI * HTTP/2.0' . CRLF . CRLF . 'x' x 8), qr/400 Bad Request/,
 	'invalid preface 2');
 
-}
-
 # GOAWAY on SYN_STREAM with even StreamID
 
 $s = Test::Nginx::HTTP2->new();
--- a/h2_error_page.t
+++ b/h2_error_page.t
@@ -85,19 +85,13 @@ my $s2 = Test::Nginx::HTTP2->new();
 $sid = $s2->new_stream({ method => 'foo' });
 $frames = $s2->read(all => [{ type => 'RST_STREAM' }]);
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.4');
-
 ($frame) = grep { $_->{type} eq "RST_STREAM" } @$frames;
 is($frame->{sid}, $sid, 'error 400 return 444 - invalid header');
 
-}
-
 # while keeping $s1 and $s2, stop nginx; this should result in
 # "open socket ... left in connection ..." alerts if any of these
 # sockets are still open
 
 $t->stop();
-$t->todo_alerts() unless $t->has_version('1.23.4');
 
 ###############################################################################
--- a/h2_headers.t
+++ b/h2_headers.t
@@ -959,13 +959,8 @@ ok($frame, 'HPACK table boundary - heade
 
 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
 isnt($frame->{headers}->{'x-referer'}, 'see-this', 'newline in request header');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.4');
-
-is($frame->{headers}->{':status'}, 400, 'newline in request header - bad request');
-
-}
+is($frame->{headers}->{':status'}, 400,
+	'newline in request header - bad request');
 
 # invalid header name as seen with underscore should not lead to ignoring rest
 
@@ -984,9 +979,6 @@ is($frame->{headers}->{'x-referer'}, 'se
 
 # other invalid header name characters as seen with ':'
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.4');
-
 $s = Test::Nginx::HTTP2->new();
 $sid = $s->new_stream({ headers => [
 	{ name => ':method', value => 'GET', mode => 0 },
@@ -1024,8 +1016,6 @@ is($frame->{headers}->{':status'}, 400, 
 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
 is($frame->{headers}->{':status'}, 400, 'control in header name');
 
-}
-
 # header name with underscore - underscores_in_headers on
 
 $s = Test::Nginx::HTTP2->new(port(8086));
--- a/h2_http2.t
+++ b/h2_http2.t
@@ -24,7 +24,8 @@ select STDERR; $| = 1;
 select STDOUT; $| = 1;
 
 my $t = Test::Nginx->new()->has(qw/http http_ssl http_v2 socket_ssl_alpn/)
-	->has_daemon('openssl');
+	->has_daemon('openssl')
+	->plan(11);
 
 $t->write_file_expand('nginx.conf', <<'EOF');
 
@@ -108,7 +109,7 @@ foreach my $name ('localhost') {
 }
 
 $t->write_file('index.html', '');
-$t->try_run('no http2')->plan(11);
+$t->try_run();
 
 ###############################################################################
 
--- a/h2_proxy_protocol.t
+++ b/h2_proxy_protocol.t
@@ -71,12 +71,7 @@ is($frame->{headers}->{'x-pp'}, '192.0.2
 
 # invalid PROXY protocol string
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.25.1');
-
 $proxy = 'BOGUS TCP4 192.0.2.1 192.0.2.2 1234 5678' . CRLF;
 ok(!http($proxy), 'PROXY invalid protocol');
 
-}
-
 ###############################################################################
--- a/http_headers_multi.t
+++ b/http_headers_multi.t
@@ -144,15 +144,9 @@ like(get('/', map { "X-Forwarded-For: $_
 	qr/X-Forwarded-For: foo, bar, bazz/, 'multi $http_x_forwarded_for');
 like(get('/', 'Cookie: foo=1', 'Cookie: bar=2', 'Cookie: bazz=3'),
 	qr/X-Cookie: foo=1; bar=2; bazz=3/, 'multi $http_cookie');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 like(get('/', 'Foo: foo', 'Foo: bar', 'Foo: bazz'),
 	qr/X-Foo: foo, bar, bazz/, 'multi $http_foo');
 
-}
-
 # request cookies, $cookie_*
 
 my $r = get('/', 'Cookie: foo=1', 'Cookie: bar=2', 'Cookie: bazz=3');
@@ -167,27 +161,16 @@ like($r, qr/X-Cookie-Bazz: 3/, '$cookie_
 
 like($r, qr/X-Sent-CC: foo, bar, bazz/, 'multi $sent_http_cache_control');
 like($r, qr/X-Sent-Link: foo, bar, bazz/, 'multi $sent_http_link');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 like($r, qr/X-Sent-Foo: foo, bar, bazz/, 'multi $sent_http_foo');
 
-}
-
 # upstream response headers, $upstream_http_*
 
 $r = get('/u');
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 like($r, qr/X-Upstream-Set-Cookie: foo=1, bar=2, bazz=3/,
 	'multi $upstream_http_set_cookie');
 like($r, qr/X-Upstream-Bar: foo, bar, bazz/, 'multi $upstream_http_bar');
 
-}
-
 # upstream response cookies, $upstream_cookie_*
 
 like($r, qr/X-Upstream-Cookie-Foo: 1/, '$upstream_cookie_foo');
@@ -196,14 +179,9 @@ like($r, qr/X-Upstream-Cookie-Bazz: 3/, 
 
 # response trailers, $sent_trailer_*
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 like(get('/t'), qr/X-Sent-Trailer-Foo: foo, bar, bazz/,
 	'multi $sent_trailer_foo');
 
-}
-
 # various variables for request headers:
 #
 # $http_host, $http_user_agent, $http_referer
@@ -216,19 +194,12 @@ like(get('/t'), qr/X-Sent-Trailer-Foo: f
 like(get('/v'), qr/X-HTTP-Host: localhost/, '$http_host');
 like(get('/v', 'Host: foo', 'Host: bar'),
 	qr/400 Bad/, 'duplicate host rejected');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 like(get('/v', 'User-Agent: foo', 'User-Agent: bar'),
 	qr/X-User-Agent: foo, bar/, 'multi $http_user_agent (invalid)');
 like(get('/v', 'Referer: foo', 'Referer: bar'),
 	qr/X-Referer: foo, bar/, 'multi $http_referer (invalid)');
 like(get('/v', 'Via: foo', 'Via: bar', 'Via: bazz'),
 	qr/X-Via: foo, bar, bazz/, 'multi $http_via');
-
-}
-
 like(get('/v', 'Cookie: foo', 'Cookie: bar', 'Cookie: bazz'),
 	qr/X-Cookie: foo; bar; bazz/, 'multi $http_cookie');
 like(get('/v', 'X-Forwarded-For: foo', 'X-Forwarded-For: bar',
@@ -246,15 +217,9 @@ like(get('/v', 'Content-Length: 0', 'Con
 
 like(get('/v', 'Content-Type: foo'),
 	qr/X-Content-Type: foo/, '$content_type');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 like(get('/v', 'Content-Type: foo', 'Content-Type: bar'),
 	qr/X-Content-Type: foo, bar/, 'multi $content_type (invalid)');
 
-}
-
 like(http("GET /v HTTP/1.0" . CRLF . CRLF),
 	qr/X-Host: localhost/, '$host from server_name');
 like(http("GET /v HTTP/1.0" . CRLF . "Host: foo" . CRLF . CRLF),
--- a/http_request.t
+++ b/http_request.t
@@ -91,10 +91,6 @@ like(http(CRLF . "GET / HTTP/1.0" . CRLF
 	'empty line ignored');
 like(http(LF . "GET / HTTP/1.0" . CRLF . CRLF), qr/ 200 /,
 	'empty line with just LF ignored');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.25.5');
-
 like(http(CR . "GET / HTTP/1.0" . CRLF . CRLF), qr/ 400 /,
 	'empty line with just CR rejected');
 like(http(CRLF . CRLF . "GET / HTTP/1.0" . CRLF . CRLF), qr/ 400 /,
@@ -104,8 +100,6 @@ like(http(LF . LF . "GET / HTTP/1.0" . C
 like(http(CR . CR . "GET / HTTP/1.0" . CRLF . CRLF), qr/ 400 /,
 	'multiple CRs rejected');
 
-}
-
 # method
 
 like(http("FOO / HTTP/1.0" . CRLF . CRLF), qr/ 200 /, 'method');
--- a/image_filter_finalize.t
+++ b/image_filter_finalize.t
@@ -142,10 +142,4 @@ http_get('/slow');
 http_get('/t3');
 like(http_get('/time.log'), qr!/t3:.*, [1-9]\.!, 'upstream response time');
 
-# "aio_write" is used to produce the following alert on some platforms:
-# "readv() failed (9: Bad file descriptor) while reading upstream"
-
-$t->todo_alerts() if $t->read_file('nginx.conf') =~ /aio_write on/
-	and $t->read_file('nginx.conf') =~ /aio threads/;
-
 ###############################################################################
--- a/mail_max_commands.t
+++ b/mail_max_commands.t
@@ -60,7 +60,7 @@ mail {
 
 EOF
 
-$t->try_run('no max_commands')->plan(18);
+$t->run()->plan(18);
 
 ###############################################################################
 
--- a/mail_smtp.t
+++ b/mail_smtp.t
@@ -297,15 +297,9 @@ my $s = Test::Nginx::SMTP->new();
 	. 'RSET');
 
 $s->read();
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.25.5');
-
 $s->ok('pipelined long rcpt to');
 $s->ok('pipelined long rset');
 
-}
-
 # Connection must stay even if error returned to rcpt to command
 
 $s = Test::Nginx::SMTP->new();
--- a/perl.t
+++ b/perl.t
@@ -153,9 +153,6 @@ like(http(
 	. 'Host: localhost' . CRLF . CRLF
 ), qr/xfoo: foo/, 'perl header_in unknown');
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 like(http(
 	'GET / HTTP/1.0' . CRLF
 	. 'X-Foo: foo' . CRLF
@@ -163,8 +160,6 @@ like(http(
 	. 'Host: localhost' . CRLF . CRLF
 ), qr/xfoo: foo, bar/, 'perl header_in unknown2');
 
-}
-
 like(http(
 	'GET / HTTP/1.0' . CRLF
 	. 'Cookie: foo' . CRLF
@@ -191,9 +186,6 @@ like(http(
 	. 'Host: localhost' . CRLF . CRLF
 ), qr/xff: foo1, foo2/, 'perl header_in xff2');
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 like(http(
 	'GET / HTTP/1.0' . CRLF
 	. 'Connection: close' . CRLF
@@ -207,8 +199,6 @@ like(http(
 	. 'Host: localhost' . CRLF . CRLF
 ), qr/connection: close, foo/, 'perl header_in connection2');
 
-}
-
 # headers_out content-length tests with range filter
 
 like(http_get('/range'), qr/Content-Length: 42.*^x{42}$/ms,
--- a/proxy_available.t
+++ b/proxy_available.t
@@ -76,13 +76,8 @@ IO::Select->new($s)->can_read(3);
 
 $t->reload();
 
-TODO: {
-local $TODO = 'not yet' if $^O eq 'linux' and !$t->has_version('1.23.1');
-
 like(http_end($s), qr/AND-THIS/, 'zero available - buffered');
 
-}
-
 $s = http_get('/unbuffered', start => 1);
 IO::Select->new($s)->can_read(3);
 
@@ -90,8 +85,6 @@ IO::Select->new($s)->can_read(3);
 
 like(http_end($s), qr/AND-THIS/, 'zero available - unbuffered');
 
-$t->todo_alerts() if $^O eq 'linux' and !$t->has_version('1.23.1');
-
 ###############################################################################
 
 sub http_daemon {
--- a/proxy_cache_control.t
+++ b/proxy_cache_control.t
@@ -194,15 +194,10 @@ like(get('/cache-control'), qr/HIT/, 'ca
 like(get('/x-accel-expires'), qr/HIT/, 'x-accel-expires');
 like(get('/x-accel-expires-at'), qr/EXPIRED/, 'x-accel-expires at');
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 # the second header to disable cache is duplicate and ignored
 
 like(get('/x-accel-expires-duplicate'), qr/HIT/, 'x-accel-expires duplicate');
 
-}
-
 # with cache headers ignored, the response will be fresh
 
 like(get('/ignore'), qr/MISS/, 'cache headers ignored');
@@ -211,15 +206,8 @@ like(get('/ignore'), qr/MISS/, 'cache he
 
 like(get('/cache-control-before-expires'), qr/HIT/,
 	'cache-control before expires');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 like(get('/cache-control-after-expires'), qr/HIT/,
 	'cache-control after expires');
-
-}
-
 like(get('/cache-control-no-cache-before-expires'), qr/MISS/,
 	'cache-control no-cache before expires');
 like(get('/cache-control-no-cache-after-expires'), qr/MISS/,
@@ -228,14 +216,7 @@ like(get('/cache-control-no-cache-after-
 # X-Accel-Expires is preferred over both Cache-Control and Expires
 
 like(get('/x-accel-expires-before'), qr/HIT/, 'x-accel-expires before');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 like(get('/x-accel-expires-after'), qr/HIT/, 'x-accel-expires after');
-
-}
-
 like(get('/x-accel-expires-0-before'), qr/MISS/, 'x-accel-expires 0 before');
 like(get('/x-accel-expires-0-after'), qr/MISS/, 'x-accel-expires 0 after');
 
@@ -250,15 +231,9 @@ like(get('/cache-control-no-cache-multi'
 
 like(get('/extension-before-x-accel-expires'),
 	qr/STALE/, 'cache-control extensions before x-accel-expires');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 like(get('/extension-after-x-accel-expires'),
 	qr/STALE/, 'cache-control extensions after x-accel-expires');
 
-}
-
 # Set-Cookie is considered when caching with Cache-Control
 
 like(get('/set-cookie'), qr/MISS/, 'set-cookie not cached');
--- a/proxy_cache_use_stale.t
+++ b/proxy_cache_use_stale.t
@@ -247,11 +247,6 @@ like($r, qr/STALE.*^(SEE-THIS){1024}$/ms
 $r = read_all(http_get('/ssi.html', start => 1));
 like($r, qr/^xxx (SEE-THIS){1024} xxx$/ms, 's-w-r - not blocked in subrequest');
 
-# "aio_write" is used to produce "open socket ... left in connection" alerts.
-
-$t->todo_alerts() if $t->read_file('nginx.conf') =~ /aio_write on/
-        and $t->read_file('nginx.conf') =~ /aio threads/ and $^O eq 'freebsd';
-
 # due to the missing content_handler inheritance in a cloned subrequest,
 # this used to access a static file in the update request
 
--- a/proxy_cache_vary.t
+++ b/proxy_cache_vary.t
@@ -266,14 +266,8 @@ like(get('/', 'bar,foo'), qr/HIT/ms, 'no
 
 like(get('/multi', 'foo'), qr/MISS/ms, 'multi first');
 like(get('/multi', 'foo'), qr/HIT/ms, 'multi second');
-
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 like(get('/multi', 'bar'), qr/MISS/ms, 'multi other');
 
-}
-
 # keep c->body_start when Vary changes (ticket #2029)
 
 # before 1.19.3, this prevented updating c->body_start of a main key
--- a/proxy_duplicate_headers.t
+++ b/proxy_duplicate_headers.t
@@ -57,9 +57,6 @@ EOF
 
 like(http_get('/'), qr/200 OK/, 'normal');
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 like(http_get('/invalid-length'), qr/502 Bad/, 'invalid length');
 like(http_get('/duplicate-length'), qr/502 Bad/, 'duplicate length');
 like(http_get('/unknown-transfer-encoding'), qr/502 Bad/,
@@ -74,8 +71,6 @@ like(http_get('/transfer-encoding-and-le
 like(http_get('/duplicate-expires'), qr/Expires: foo(?!.*bar)/s,
 	'duplicate expires ignored');
 
-}
-
 ###############################################################################
 
 sub http_daemon {
--- a/proxy_intercept_errors.t
+++ b/proxy_intercept_errors.t
@@ -94,12 +94,7 @@ like(http_get('/auth'), qr/401.*WWW-Auth
 # make sure multiple WWW-Authenticate headers are returned
 # along with intercepted response (ticket #485)
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 like(http_get('/auth-multi'), qr/401.*WWW-Authenticate: foo.*bar.*intercept/s,
 	'intercepted 401 multi');
 
-}
-
 ###############################################################################
--- a/proxy_protocol2_tlv.t
+++ b/proxy_protocol2_tlv.t
@@ -23,7 +23,7 @@ use Test::Nginx;
 select STDERR; $| = 1;
 select STDOUT; $| = 1;
 
-my $t = Test::Nginx->new()->has(qw/http map/)
+my $t = Test::Nginx->new()->has(qw/http map/)->plan(14)
 	->write_file_expand('nginx.conf', <<'EOF');
 
 %%TEST_GLOBALS%%
@@ -80,7 +80,7 @@ http {
 EOF
 
 $t->write_file('t1', 'SEE-THIS');
-$t->try_run('no proxy_protocol tlv')->plan(14);
+$t->run();
 
 ###############################################################################
 
--- a/quic_retry.t
+++ b/quic_retry.t
@@ -110,9 +110,6 @@ is($frame->{error}, 11, 'retry token inv
 
 # connection with retry token, corrupted
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.25.2');
-
 substr($retry_token, 32) ^= "\xff";
 $s = Test::Nginx::HTTP3->new(8980, token => $retry_token, probe => 1);
 $frames = $s->read(all => [{ type => 'CONNECTION_CLOSE' }]);
@@ -120,16 +117,11 @@ substr($retry_token, 32) ^= "\xff";
 ($frame) = grep { $_->{type} eq "CONNECTION_CLOSE" } @$frames;
 is($frame->{error}, 11, 'retry token decrypt error');
 
-}
-
 # resending client Initial packets after receiving a Retry packet
 # to simulate server Initial packet loss triggering its retransmit,
 # used to create extra nginx connections before 8f7e6d8c061e,
 # caught by CRYPTO stream mismatch among server Initial packets
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.25.3');
-
 $s = new_connection_resend();
 $sid = $s->new_stream();
 
@@ -141,8 +133,6 @@ eval {
 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
 is($frame->{headers}->{':status'}, 403, 'resend initial');
 
-}
-
 ###############################################################################
 
 # expanded handshake version to send repetitive Initial packets
--- a/range_clearing.t
+++ b/range_clearing.t
@@ -62,8 +62,6 @@ EOF
 
 ###############################################################################
 
-local $TODO = 'not yet' unless $t->has_version('1.23.1');
-
 like(http_get_range('/', 'Range: bytes=0-4'),
 	qr/ 206 (?!.*stub)/s, 'content range cleared - range request');
 like(http_get_range('/', 'Range: bytes=0-2,4-'),
--- a/scgi.t
+++ b/scgi.t
@@ -81,9 +81,6 @@ like(http_get('/var?b=127.0.0.1:' . port
 	'scgi with variables');
 like(http_get('/var?b=u'), qr/SEE-THIS/, 'scgi with variables to upstream');
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 my $r = http(<<EOF);
 GET / HTTP/1.0
 Host: localhost
@@ -106,8 +103,6 @@ like($r, qr/X-Cookie: foo; bar; bazz/,
 like($r, qr/X-Foo: foo, bar, bazz/,
 	'scgi with multiple unknown headers');
 
-}
-
 ###############################################################################
 
 sub http_get_headers {
--- a/ssl_certificate.t
+++ b/ssl_certificate.t
@@ -179,7 +179,6 @@ like(get('default', 8080, $s), qr/defaul
 
 TODO: {
 # ticket key name mismatch prevents session resumption
-local $TODO = 'not yet' unless $t->has_version('1.23.2');
 local $TODO = 'no SSL_session_key, old IO::Socket::SSL'
 	if $IO::Socket::SSL::VERSION < 1.965;
 
--- a/ssl_session_ticket_key.t
+++ b/ssl_session_ticket_key.t
@@ -90,8 +90,6 @@ foreach my $name ('localhost') {
 #
 # with a single worker process it is only the 2nd test that fails
 
-local $TODO = 'not yet' unless $t->has_version('1.23.2');
-
 my $key = get_ticket_key_name();
 
 select undef, undef, undef, 0.5;
--- a/stream_proxy_protocol2_tlv.t
+++ b/stream_proxy_protocol2_tlv.t
@@ -24,7 +24,7 @@ use Test::Nginx::Stream qw/ stream /;
 select STDERR; $| = 1;
 select STDOUT; $| = 1;
 
-my $t = Test::Nginx->new()->has(qw/stream stream_return map/)
+my $t = Test::Nginx->new()->has(qw/stream stream_return map/)->plan(14)
 	->write_file_expand('nginx.conf', <<'EOF');
 
 %%TEST_GLOBALS%%
@@ -63,7 +63,7 @@ stream {
 
 EOF
 
-$t->try_run('no proxy_protocol tlv')->plan(14);
+$t->run();
 
 ###############################################################################
 
@@ -86,9 +86,6 @@ like($r, qr/x:\x0d?$/m, 'non-existent');
 
 # big proxy protocol header with TLVs
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.3');
-
 my $sub = pp2_create_tlv(0x21, "TLSv1.2");
 $sub .= pp2_create_tlv(0x22, "example.com");
 $sub .= pp2_create_tlv(0x23, "AES256-SHA");
@@ -107,8 +104,6 @@ like($r, qr/ssl-sig-alg:SHA1\x0d?$/m, 'S
 like($r, qr/ssl-key-alg:RSA512\x0d?$/m, 'SSL_KEY_ALG');
 like($r, qr/ssl-binary:true/, 'SSL_BINARY');
 
-}
-
 ###############################################################################
 
 sub pp_get {
--- a/stream_ssl_certificate.t
+++ b/stream_ssl_certificate.t
@@ -156,7 +156,6 @@ like(get('default', 8080, $s), qr/defaul
 
 TODO: {
 # ticket key name mismatch prevents session resumption
-local $TODO = 'not yet' unless $t->has_version('1.23.2');
 local $TODO = 'no SSL_session_key, old IO::Socket::SSL'
 	if $IO::Socket::SSL::VERSION < 1.965;
 
--- a/uwsgi.t
+++ b/uwsgi.t
@@ -102,9 +102,6 @@ like(http_get('/var?b=127.0.0.1:' . port
 	'uwsgi with variables');
 like(http_get('/var?b=u'), qr/SEE-THIS/, 'uwsgi with variables to upstream');
 
-TODO: {
-local $TODO = 'not yet' unless $t->has_version('1.23.0');
-
 my $r = http(<<EOF);
 GET / HTTP/1.0
 Host: localhost
@@ -127,8 +124,6 @@ like($r, qr/X-Cookie: foo; bar; bazz/,
 like($r, qr/X-Foo: foo, bar, bazz/,
 	'uwsgi with multiple unknown headers');
 
-}
-
 ###############################################################################
 
 sub http_get_headers {