Mercurial > hg > nginx-tests
changeset 1937:2a0a6035a1af
Tests: removed TODO and try_run() checks for legacy versions.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Fri, 25 Aug 2023 18:12:08 +0400 |
parents | 716d7500317d |
children | e1059682aeef |
files | body_chunked.t dav.t grpc.t h2.t h2_absolute_redirect.t h2_headers.t h2_request_body_extra.t h2_ssl.t http_absolute_redirect.t http_host.t http_keepalive_shutdown.t http_method.t http_uri.t ignore_invalid_headers.t mail_imap.t mail_imap_ssl.t mail_max_errors.t mail_pop3.t mail_smtp.t mail_ssl.t mp4_start_key_frame.t proxy_ssl_certificate_empty.t proxy_ssl_certificate_vars.t ssi.t ssl_curve.t stream_proxy_half_close.t stream_proxy_ssl_certificate_vars.t stream_ssl_alpn.t uwsgi_ssl_certificate_vars.t |
diffstat | 29 files changed, 9 insertions(+), 192 deletions(-) [+] |
line wrap: on
line diff
--- a/body_chunked.t Fri Aug 25 18:12:06 2023 +0400 +++ b/body_chunked.t Fri Aug 25 18:12:08 2023 +0400 @@ -178,22 +178,12 @@ like(http_transfer_encoding('chunked, identity'), qr/501 Not Implemented/, 'transfer encoding list'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.1'); - like(http_transfer_encoding("chunked\nContent-Length: 5"), qr/400 Bad/, 'transfer encoding with content-length'); -} - -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.2'); - like(http_transfer_encoding("chunked", "1.0"), qr/400 Bad/, 'transfer encoding in HTTP/1.0 requests'); -} - ############################################################################### sub read_body_file {
--- a/dav.t Fri Aug 25 18:12:06 2023 +0400 +++ b/dav.t Fri Aug 25 18:12:08 2023 +0400 @@ -108,9 +108,6 @@ is(-s $t->testdir() . '/file', 10, 'put file extra data size'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - $r = http(<<EOF . '0123456789'); PUT /file%20sp HTTP/1.1 Host: localhost @@ -121,8 +118,6 @@ like($r, qr!Location: /file%20sp\x0d?$!ms, 'put file escaped'); -} - # 201 replies contain body, response should indicate it's empty $r = http(<<EOF);
--- a/grpc.t Fri Aug 25 18:12:06 2023 +0400 +++ b/grpc.t Fri Aug 25 18:12:08 2023 +0400 @@ -503,17 +503,12 @@ ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; is($frame->{headers}{':status'}, 502, 'invalid header name ctl'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.1'); - $f->{http_start}('/'); $f->{data}('Hello'); $frames = $f->{field_bad}(n => "n n"); ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; is($frame->{headers}{':status'}, 502, 'invalid header name space'); -} - $f->{http_start}('/'); $f->{data}('Hello'); $frames = $f->{field_bad}(v => "v\nv");
--- a/h2.t Fri Aug 25 18:12:06 2023 +0400 +++ b/h2.t Fri Aug 25 18:12:08 2023 +0400 @@ -304,9 +304,6 @@ # CONNECT -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.1'); - $s = Test::Nginx::HTTP2->new(); $sid = $s->new_stream({ method => 'CONNECT' }); $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); @@ -314,8 +311,6 @@ ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; is($frame->{headers}->{':status'}, 405, 'CONNECT - not allowed'); -} - # TRACE $s = Test::Nginx::HTTP2->new();
--- a/h2_absolute_redirect.t Fri Aug 25 18:12:06 2023 +0400 +++ b/h2_absolute_redirect.t Fri Aug 25 18:12:08 2023 +0400 @@ -121,32 +121,22 @@ like(get('on', '/i/dir'), qr!Location: http://on:$p/i/dir/\x0d?$!m, 'directory alias'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - like(get('on', '/dir%20sp'), qr!Location: http://on:$p/dir%20sp/\x0d?$!m, 'directory escaped'); like(get('on', '/dir%20sp?a=b'), qr!Location: http://on:$p/dir%20sp/\?a=b\x0d?$!m, 'directory escaped args'); -} - like(get('on', '/auto'), qr!Location: http://on:$p/auto/\x0d?$!m, 'auto'); like(get('on', '/auto?a=b'), qr!Location: http://on:$p/auto/\?a=b\x0d?$!m, 'auto args'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - like(get('on', '/auto%20sp'), qr!Location: http://on:$p/auto%20sp/\x0d?$!m, 'auto escaped'); like(get('on', '/auto%20sp?a=b'), qr!Location: http://on:$p/auto%20sp/\?a=b\x0d?$!m, 'auto escaped args'); -} - like(get('on', '/return301'), qr!Location: http://on:$p/redirect\x0d?$!m, 'return'); @@ -163,30 +153,20 @@ like(get('off', '/dir'), qr!Location: /dir/\x0d?$!m, 'off directory'); like(get('off', '/i/dir'), qr!Location: /i/dir/\x0d?$!m, 'off directory alias'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - like(get('off', '/dir%20sp'), qr!Location: /dir%20sp/\x0d?$!m, 'off directory escaped'); like(get('off', '/dir%20sp?a=b'), qr!Location: /dir%20sp/\?a=b\x0d?$!m, 'off directory escaped args'); -} - like(get('off', '/auto'), qr!Location: /auto/\x0d?$!m, 'off auto'); like(get('off', '/auto?a=b'), qr!Location: /auto/\?a=b\x0d?$!m, 'off auto args'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - like(get('off', '/auto%20sp'), qr!Location: /auto%20sp/\x0d?$!m, 'auto escaped'); like(get('off', '/auto%20sp?a=b'), qr!Location: /auto%20sp/\?a=b\x0d?$!m, 'auto escaped args'); -} - like(get('off', '/return301'), qr!Location: /redirect\x0d?$!m, 'off return'); # per RFC 3986, these characters are not allowed unescaped: @@ -196,17 +176,12 @@ SKIP: { skip 'win32', 1 if $^O eq 'MSWin32'; -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.1'); - like(get('off', '/auto%20%22%23%25%3C%3E%3F%5C%5E%60%7B%7C%7D'), qr!Location: /auto%20%22%23%25%3C%3E%3F%5C%5E%60%7B%7C%7D/\x0d?$!m, 'auto escaped strict'); } -} - ############################################################################### sub get {
--- a/h2_headers.t Fri Aug 25 18:12:06 2023 +0400 +++ b/h2_headers.t Fri Aug 25 18:12:08 2023 +0400 @@ -1090,17 +1090,12 @@ ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; is($frame->{headers}->{':status'}, 400, 'invalid path'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.1'); - $sid = $s->new_stream({ path => "/t1.html\x02" }); $frames = $s->read(all => [{ sid => $sid, fin => 1 }]); ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; is($frame->{headers}->{':status'}, 400, 'invalid path control'); -} - # ngx_http_v2_parse_int() error handling # NGX_ERROR
--- a/h2_request_body_extra.t Fri Aug 25 18:12:06 2023 +0400 +++ b/h2_request_body_extra.t Fri Aug 25 18:12:08 2023 +0400 @@ -87,7 +87,6 @@ EOF -plan(skip_all => 'not yet') unless $t->has_version('1.21.2'); $t->plan(50); # suppress deprecation warning
--- a/h2_ssl.t Fri Aug 25 18:12:06 2023 +0400 +++ b/h2_ssl.t Fri Aug 25 18:12:08 2023 +0400 @@ -94,15 +94,10 @@ if $t->has_module('OpenSSL') and not $t->has_feature('openssl:1.1.0'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.4'); - ok(!get_ssl_socket(['unknown']), 'alpn rejected'); } -} - like(http_get('/', socket => get_ssl_socket(['http/1.1'])), qr/200 OK/, 'alpn to HTTP/1.1 fallback');
--- a/http_absolute_redirect.t Fri Aug 25 18:12:06 2023 +0400 +++ b/http_absolute_redirect.t Fri Aug 25 18:12:08 2023 +0400 @@ -116,32 +116,22 @@ like(get('on', '/i/dir'), qr!Location: http://on:$p/i/dir/\x0d?$!m, 'directory alias'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - like(get('on', '/dir%20sp'), qr!Location: http://on:$p/dir%20sp/\x0d?$!m, 'directory escaped'); like(get('on', '/dir%20sp?a=b'), qr!Location: http://on:$p/dir%20sp/\?a=b\x0d?$!m, 'directory escaped args'); -} - like(get('on', '/auto'), qr!Location: http://on:$p/auto/\x0d?$!m, 'auto'); like(get('on', '/auto?a=b'), qr!Location: http://on:$p/auto/\?a=b\x0d?$!m, 'auto args'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - like(get('on', '/auto%20sp'), qr!Location: http://on:$p/auto%20sp/\x0d?$!m, 'auto escaped'); like(get('on', '/auto%20sp?a=b'), qr!Location: http://on:$p/auto%20sp/\?a=b\x0d?$!m, 'auto escaped args'); -} - like(get('on', '/return301'), qr!Location: http://on:$p/redirect\x0d?$!m, 'return'); @@ -158,30 +148,20 @@ like(get('off', '/dir'), qr!Location: /dir/\x0d?$!m, 'off directory'); like(get('off', '/i/dir'), qr!Location: /i/dir/\x0d?$!m, 'off directory alias'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - like(get('off', '/dir%20sp'), qr!Location: /dir%20sp/\x0d?$!m, 'off directory escaped'); like(get('off', '/dir%20sp?a=b'), qr!Location: /dir%20sp/\?a=b\x0d?$!m, 'off directory escaped args'); -} - like(get('off', '/auto'), qr!Location: /auto/\x0d?$!m, 'off auto'); like(get('off', '/auto?a=b'), qr!Location: /auto/\?a=b\x0d?$!m, 'off auto args'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - like(get('off', '/auto%20sp'), qr!Location: /auto%20sp/\x0d?$!m, 'auto escaped'); like(get('off', '/auto%20sp?a=b'), qr!Location: /auto%20sp/\?a=b\x0d?$!m, 'auto escaped args'); -} - like(get('off', '/return301'), qr!Location: /redirect\x0d?$!m, 'off return'); # per RFC 3986, these characters are not allowed unescaped: @@ -191,17 +171,12 @@ SKIP: { skip 'win32', 1 if $^O eq 'MSWin32'; -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.1'); - like(get('off', '/auto%20%22%23%25%3C%3E%3F%5C%5E%60%7B%7C%7D'), qr!Location: /auto%20%22%23%25%3C%3E%3F%5C%5E%60%7B%7C%7D/\x0d?$!m, 'auto escaped strict'); } -} - ############################################################################### sub get {
--- a/http_host.t Fri Aug 25 18:12:06 2023 +0400 +++ b/http_host.t Fri Aug 25 18:12:08 2023 +0400 @@ -170,14 +170,8 @@ 'double port hack'); like(http_host_header("localhost\nHost: again", 1), qr/ 400 /, 'host repeat'); - -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.1'); - like(http_host_header("localhost\x02", 1), qr/ 400 /, 'control'); -} - ############################################################################### sub http_host_header {
--- a/http_keepalive_shutdown.t Fri Aug 25 18:12:06 2023 +0400 +++ b/http_keepalive_shutdown.t Fri Aug 25 18:12:08 2023 +0400 @@ -55,8 +55,6 @@ ############################################################################### -local $TODO = 'not yet' unless $t->has_version('1.21.6'); - # signaling on graceful shutdown to client that keepalive connection is closing my $s = http(<<EOF, start => 1);
--- a/http_method.t Fri Aug 25 18:12:06 2023 +0400 +++ b/http_method.t Fri Aug 25 18:12:08 2023 +0400 @@ -59,9 +59,6 @@ EOF -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.1'); - like(http(<<EOF), qr/405 Not Allowed(?!.*200 OK)/s, 'connect'); CONNECT / HTTP/1.1 Host: localhost @@ -72,6 +69,4 @@ EOF -} - ###############################################################################
--- a/http_uri.t Fri Aug 25 18:12:06 2023 +0400 +++ b/http_uri.t Fri Aug 25 18:12:08 2023 +0400 @@ -76,20 +76,9 @@ like(http_get('http://localhost:8080?args#frag'), qr!x / x.*y args y!ms, 'port args and frag'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.1'); - like(http_get('/ /'), qr/400 Bad/, 'space'); - -} - -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.1'); - like(http_get("/\x02"), qr/400 Bad/, 'control'); -} - like(http_get('/%02'), qr!x /\x02 x!, 'control escaped'); ###############################################################################
--- a/ignore_invalid_headers.t Fri Aug 25 18:12:06 2023 +0400 +++ b/ignore_invalid_headers.t Fri Aug 25 18:12:08 2023 +0400 @@ -125,15 +125,10 @@ my $bad5 = 'GET / HTTP/1.0' . CRLF . "foo\x02: x-bar" . CRLF . CRLF; -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.1'); - like(http($bad3), qr/400 Bad/, 'colon first'); like(http($bad4), qr/400 Bad/, 'space'); like(http($bad5), qr/400 Bad/, 'control'); -} - ############################################################################### sub get {
--- a/mail_imap.t Fri Aug 25 18:12:06 2023 +0400 +++ b/mail_imap.t Fri Aug 25 18:12:08 2023 +0400 @@ -223,14 +223,8 @@ $s->send('a01 LOGIN {18+}' . CRLF . 'te\"st@example.com' . ' "se\\\\\"cret"'); - -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - $s->ok('backslash in literal'); -} - # pipelining $s = Test::Nginx::IMAP->new(); @@ -239,23 +233,14 @@ $s->send('a01 INVALID COMMAND WITH ARGUMENTS' . CRLF . 'a02 NOOP'); $s->check(qr/^a01 BAD/, 'pipelined invalid command'); - -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - $s->ok('pipelined noop after invalid command'); -} - $s->send('a03 FOOBAR {10+}' . CRLF . 'test test ' . CRLF . 'a04 NOOP'); $s->check(qr/^a03 BAD/, 'invalid with non-sync literal'); $s->check(qr/^(a04 |$)/, 'literal not command'); -TODO: { -todo_skip('not yet', 2) unless $t->has_version('1.21.0'); - # skipped without a fix, since with level-triggered event methods # this hogs cpu till the connection is closed by the backend server, # and generates a lot of debug logs @@ -268,6 +253,4 @@ $s->ok('pipelined login'); $s->ok('pipelined logout'); -} - ###############################################################################
--- a/mail_imap_ssl.t Fri Aug 25 18:12:06 2023 +0400 +++ b/mail_imap_ssl.t Fri Aug 25 18:12:08 2023 +0400 @@ -228,12 +228,7 @@ like($f, qr!^on:SUCCESS:(/?CN=3.example.com):\1:\w+:\w+:[^:]+:s5$!m, 'log - trusted cert'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.2'); - $f = $t->read_file('auth2.log'); like($f, qr|^$cipher:$sslversion$|m, 'log - cipher sslversion'); -} - ###############################################################################
--- a/mail_max_errors.t Fri Aug 25 18:12:06 2023 +0400 +++ b/mail_max_errors.t Fri Aug 25 18:12:08 2023 +0400 @@ -61,7 +61,7 @@ EOF -$t->try_run('no max_errors')->plan(18); +$t->run()->plan(18); ###############################################################################
--- a/mail_pop3.t Fri Aug 25 18:12:06 2023 +0400 +++ b/mail_pop3.t Fri Aug 25 18:12:08 2023 +0400 @@ -202,27 +202,15 @@ $s->send('INVALID COMMAND WITH ARGUMENTS' . CRLF . 'NOOP'); $s->check(qr/^-ERR/, 'pipelined invalid command'); - -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - $s->ok('pipelined noop after invalid command'); -} - $s->send('USER test@example.com' . CRLF . 'PASS secret' . CRLF . 'QUIT'); $s->ok('pipelined user'); - -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - $s->ok('pipelined pass'); $s->ok('pipelined quit'); -} - $s = Test::Nginx::POP3->new(); $s->read(); @@ -230,15 +218,9 @@ . encode_base64('test@example.com', '') . CRLF . encode_base64('secret', '')); $s->check(qr/\+ VXNlcm5hbWU6/, 'pipelined auth username challenge'); - -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - $s->check(qr/\+ UGFzc3dvcmQ6/, 'pipelined auth password challenge'); $s->ok('pipelined auth'); -} - ############################################################################### sub get_auth_caps {
--- a/mail_smtp.t Fri Aug 25 18:12:06 2023 +0400 +++ b/mail_smtp.t Fri Aug 25 18:12:08 2023 +0400 @@ -258,16 +258,9 @@ $s->print('MAIL FROM:<test@example.com> SIZE=100' . CRLF . 'RCPT TO:<test@example.com>' . CRLF . 'RS'); - $s->ok('split pipelined mail from'); - -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - $s->ok('split pipelined rcpt to'); -} - $s->send('ET'); $s->ok('split pipelined rset'); @@ -284,10 +277,6 @@ . 'RCPT TO:<baz@example.com>' . CRLF . 'RCPT TO:<foobar@example.com>' . CRLF . 'RSET'); - -TODO: { -todo_skip 'long pipelined - not yet', 6 unless $t->has_version('1.21.0'); - $s->ok('long pipelined mail from'); $s->ok('long pipelined rcpt to'); $s->ok('long pipelined rcpt to 2'); @@ -295,8 +284,6 @@ $s->ok('long pipelined rcpt to 4'); $s->ok('long pipelined rset'); -} - # Connection must stay even if error returned to rcpt to command $s = Test::Nginx::SMTP->new(); @@ -333,12 +320,7 @@ $s->send('AR'); $s->check(qr/^5.. /, 'invalid split command'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.0'); - $s->send('HELO example.com'); $s->ok('good after invalid split command'); -} - ###############################################################################
--- a/mail_ssl.t Fri Aug 25 18:12:06 2023 +0400 +++ b/mail_ssl.t Fri Aug 25 18:12:08 2023 +0400 @@ -174,9 +174,6 @@ ); $s->ok('alpn'); -TODO: { -local $TODO = 'not yet' unless $t->has_version('1.21.4'); - $s = Test::Nginx::IMAP->new( PeerAddr => '127.0.0.1:' . port(8148), SSL => 1, @@ -186,8 +183,6 @@ } -} - # starttls imap $s = Test::Nginx::IMAP->new(PeerAddr => '127.0.0.1:' . port(8149));
--- a/mp4_start_key_frame.t Fri Aug 25 18:12:06 2023 +0400 +++ b/mp4_start_key_frame.t Fri Aug 25 18:12:08 2023 +0400 @@ -61,7 +61,7 @@ . '-pix_fmt yuv420p -g 15 -c:v libx264 ' . "${\($t->testdir())}/test.mp4") == 0 or die "Can't create mp4 file: $!"; -$t->try_run('no mp4_start_key_frame')->plan(4); +$t->run()->plan(4); ###############################################################################
--- a/proxy_ssl_certificate_empty.t Fri Aug 25 18:12:06 2023 +0400 +++ b/proxy_ssl_certificate_empty.t Fri Aug 25 18:12:08 2023 +0400 @@ -98,7 +98,7 @@ $t->write_file('index.html', ''); -$t->try_run('no empty value support')->plan(2); +$t->run()->plan(2); ###############################################################################
--- a/proxy_ssl_certificate_vars.t Fri Aug 25 18:12:06 2023 +0400 +++ b/proxy_ssl_certificate_vars.t Fri Aug 25 18:12:08 2023 +0400 @@ -132,7 +132,7 @@ $t->write_file('password', '3.example.com'); $t->write_file('index.html', ''); -$t->try_run('no upstream ssl_certificate variables')->plan(4); +$t->run()->plan(4); ###############################################################################
--- a/ssi.t Fri Aug 25 18:12:06 2023 +0400 +++ b/ssi.t Fri Aug 25 18:12:08 2023 +0400 @@ -148,14 +148,9 @@ like(http_get('/test4-echo-none.html'), qr/^X<test>X$/m, 'echo encoding none'); -TODO: { -local $TODO = 'no strict URI escaping yet' unless $t->has_version('1.21.1'); - like(http_get('/test5-echo-url.html'), qr/^X%3Ctest%3EX$/m, 'echo encoding url'); -} - like(http_get('/test6-echo-entity.html'), qr/^X<test>X$/m, 'echo encoding entity');
--- a/ssl_curve.t Fri Aug 25 18:12:06 2023 +0400 +++ b/ssl_curve.t Fri Aug 25 18:12:08 2023 +0400 @@ -71,7 +71,7 @@ or die "Can't create certificate for $name: $!\n"; } -$t->try_run('no $ssl_curve')->plan(1); +$t->run()->plan(1); ###############################################################################
--- a/stream_proxy_half_close.t Fri Aug 25 18:12:06 2023 +0400 +++ b/stream_proxy_half_close.t Fri Aug 25 18:12:08 2023 +0400 @@ -48,7 +48,7 @@ EOF -$t->try_run('no proxy_half_close')->plan(2); +$t->run()->plan(2); ###############################################################################
--- a/stream_proxy_ssl_certificate_vars.t Fri Aug 25 18:12:06 2023 +0400 +++ b/stream_proxy_ssl_certificate_vars.t Fri Aug 25 18:12:08 2023 +0400 @@ -146,7 +146,7 @@ $t->write_file('password', '3.example.com'); $t->write_file('index.html', ''); -$t->try_run('no upstream ssl_certificate variables')->plan(4); +$t->run()->plan(4); ###############################################################################
--- a/stream_ssl_alpn.t Fri Aug 25 18:12:06 2023 +0400 +++ b/stream_ssl_alpn.t Fri Aug 25 18:12:08 2023 +0400 @@ -71,7 +71,7 @@ or die "Can't create certificate for $name: $!\n"; } -$t->try_run('no ssl_alpn')->plan(6); +$t->run()->plan(6); ###############################################################################
--- a/uwsgi_ssl_certificate_vars.t Fri Aug 25 18:12:06 2023 +0400 +++ b/uwsgi_ssl_certificate_vars.t Fri Aug 25 18:12:08 2023 +0400 @@ -130,7 +130,7 @@ $t->write_file('password', '3.example.com'); $t->write_file('index.html', ''); -$t->try_run('no upstream ssl_certificate variables')->plan(4); +$t->run()->plan(4); ###############################################################################