From ae36ea593bb6c2f98a6caa41c96f036108cba106 Mon Sep 17 00:00:00 2001 From: dormando Date: Fri, 28 Apr 2023 13:42:17 -0700 Subject: proxy: remove redundancy in test code re-accepting backends was really common. --- t/proxyconfig.t | 52 ++++++++++++--------------------- t/proxyunits.t | 91 ++++++++++++++------------------------------------------- 2 files changed, 41 insertions(+), 102 deletions(-) diff --git a/t/proxyconfig.t b/t/proxyconfig.t index b71e533..29009c5 100644 --- a/t/proxyconfig.t +++ b/t/proxyconfig.t @@ -38,6 +38,17 @@ sub mock_server { return $srv; } +sub accept_backend { + my $srv = shift; + my $be = $srv->accept(); + $be->autoflush(1); + ok(defined $be, "mock backend created"); + like(<$be>, qr/version/, "received version command"); + print $be "VERSION 1.0.0-mock\r\n"; + + return $be; +} + # Put a version command down the pipe to ensure the socket is clear. # client version commands skip the proxy code sub check_version { @@ -104,19 +115,11 @@ my %keymap = (); my $keycount = 100; { # set up server backend sockets. - for my $msrv ($mocksrvs[0], $mocksrvs[1], $mocksrvs[2]) { - my $be = $msrv->accept(); - $be->autoflush(1); - ok(defined $be, "mock backend created"); - push(@mbe, $be); - } - my $s = IO::Select->new(); - - for my $be (@mbe) { + for my $msrv ($mocksrvs[0], $mocksrvs[1], $mocksrvs[2]) { + my $be = accept_backend($msrv); $s->add($be); - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; + push(@mbe, $be); } # Try sending something. @@ -172,10 +175,7 @@ my @holdbe = (); # avoid having the backends immediately disconnect and pollute like(<$watcher>, qr/ts=(\S+) gid=\d+ type=proxy_backend error=markedbad name=\S+ port=11511/, "backend was marked bad"); for my $msrv (@readable) { - my $be = $msrv->accept(); - ok(defined $be, "mock backend accepted"); - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; + my $be = accept_backend($msrv); push(@holdbe, $be); } @@ -223,10 +223,7 @@ is(<$watcher>, "OK\r\n", "watcher enabled"); for my $msrv (@readable) { my @temp = (); for (0 .. 3) { - my $be = $msrv->accept(); - ok(defined $be, "mock backend accepted"); - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; + my $be = accept_backend($msrv); $bes->add($be); push(@temp, $be); } @@ -304,23 +301,16 @@ for my $port (11511, 11512, 11513) { # Start up a clean server. # Since limits are per worker thread, cut the worker threads down to 1 to ease # testing. -$p_srv = new_memcached('-o proxy_config=./t/proxyconfig.lua -l 127.0.0.1 -t 1', 11510); +$p_srv = new_memcached('-o proxy_config=./t/proxyconfig.lua -t 1'); $ps = $p_srv->sock; $ps->autoflush(1); { for my $msrv ($mocksrvs[0], $mocksrvs[1], $mocksrvs[2]) { - my $be = $msrv->accept(); - $be->autoflush(1); - ok(defined $be, "mock backend created"); + my $be = accept_backend($msrv); push(@mbe, $be); } - for my $be (@mbe) { - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; - } - my $stats = mem_stats($ps, 'proxy'); isnt($stats->{active_req_limit}, 0, "active request limit is set"); @@ -415,11 +405,7 @@ $ps->autoflush(1); is(scalar <$ps>, "SERVER_ERROR backend failure\r\n", "first request succeeded"); # Backend gets killed from a read OOM, so we need to re-establish. - $mbe[0] = $mocksrvs[0]->accept(); - $be = $mbe[0]; - $be->autoflush(1); - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; + $be = $mbe[0] = accept_backend($mocksrvs[0]); like(<$watcher>, qr/error=outofmemory/, "OOM log line"); # Memory limits won't drop until the garbage collectors run, which diff --git a/t/proxyunits.t b/t/proxyunits.t index 992e73e..fb1f7a8 100644 --- a/t/proxyunits.t +++ b/t/proxyunits.t @@ -29,6 +29,17 @@ sub mock_server { return $srv; } +sub accept_backend { + my $srv = shift; + my $be = $srv->accept(); + $be->autoflush(1); + ok(defined $be, "mock backend created"); + like(<$be>, qr/version/, "received version command"); + print $be "VERSION 1.0.0-mock\r\n"; + + return $be; +} + # Put a version command down the pipe to ensure the socket is clear. # client version commands skip the proxy code sub check_version { @@ -53,18 +64,10 @@ $ps->autoflush(1); my @mbe = (); #diag "accepting mock backends"; for my $msrv (@mocksrvs) { - my $be = $msrv->accept(); - $be->autoflush(1); - ok(defined $be, "mock backend created"); + my $be = accept_backend($msrv); push(@mbe, $be); } -#diag "validating backends"; -for my $be (@mbe) { - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; -} - { print $ps "set with the wrong number of tokens\n"; is(scalar <$ps>, "CLIENT_ERROR parsing request\r\n", "got CLIENT_ERROR for bad syntax"); @@ -80,12 +83,7 @@ for my $be (@mbe) { is(scalar <$ps>, "SERVER_ERROR backend failure\r\n", "backend failure error"); - # re-accept the backend. - $be = $mocksrvs[0]->accept(); - $be->autoflush(1); - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; - $mbe[0] = $be; + $mbe[0] = accept_backend($mocksrvs[0]); } { @@ -106,12 +104,7 @@ for my $be (@mbe) { like(<$w>, qr/ts=(\S+) gid=\d+ type=proxy_backend error=trailingdata name=127.0.0.1 port=\d+ depth=0 rbuf=garbage/, "got backend error log line"); - # re-accept the backend. - $be = $mocksrvs[0]->accept(); - $be->autoflush(1); - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; - $mbe[0] = $be; + $mbe[0] = accept_backend($mocksrvs[0]); } SKIP: { @@ -139,12 +132,7 @@ SKIP: { like(<$w>, qr/ts=(\S+) gid=\d+ type=proxy_backend error=missingend name=127.0.0.1 port=\d+ depth=1 rbuf=/, "got missingend error log line"); - # re-accept the backend. - $be = $mocksrvs[0]->accept(); - $be->autoflush(1); - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; - $mbe[0] = $be; + $mbe[0] = accept_backend($mocksrvs[0]); } { @@ -756,12 +744,7 @@ check_version($ps); my $read = $be->read($data, 1); is($read, 0, "backend disconnected"); - # re-accept the backend. - $be = $mocksrvs[0]->accept(); - $be->autoflush(1); - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; - $mbe[0] = $be; + $be = $mbe[0] = accept_backend($mocksrvs[0]); print $ps "get /b/too\r\n"; is(scalar <$be>, "get /b/too\r\n", "received get command"); @@ -771,12 +754,7 @@ check_version($ps); $read = $be->read($data, 1); is($read, 0, "backend disconnected"); - # re-accept the backend. - $be = $mocksrvs[0]->accept(); - $be->autoflush(1); - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; - $mbe[0] = $be; + $be = $mbe[0] = accept_backend($mocksrvs[0]); # Sometimes blank ERRORS can be sent. print $ps "get /b/zoo\r\n"; @@ -787,12 +765,7 @@ check_version($ps); $read = $be->read($data, 1); is($read, 0, "backend disconnected"); - # re-accept the backend. - $be = $mocksrvs[0]->accept(); - $be->autoflush(1); - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; - $mbe[0] = $be; + $be = $mbe[0] = accept_backend($mocksrvs[0]); # Ensure garbage doesn't surface to client. print $ps "get /b/doo\r\n"; @@ -800,12 +773,7 @@ check_version($ps); print $be "garbage\r\n"; # don't need the \r\n but it makes tests easier is(scalar <$ps>, "SERVER_ERROR backend failure\r\n", "generic backend error"); - # re-accept the backend. - $be = $mocksrvs[0]->accept(); - $be->autoflush(1); - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; - $mbe[0] = $be; + $be = $mbe[0] = accept_backend($mocksrvs[0]); # Check errors from pipelined commands past a CLIENT_ERROR print $ps "get /b/quu\r\nget /b/muu\r\n"; @@ -815,12 +783,7 @@ check_version($ps); is(scalar <$ps>, "CLIENT_ERROR bad protocol\r\n", "backend error"); is(scalar <$ps>, "SERVER_ERROR backend failure\r\n", "backend error"); - # re-accept the backend. - $be = $mocksrvs[0]->accept(); - $be->autoflush(1); - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; - $mbe[0] = $be; + $be = $mbe[0] = accept_backend($mocksrvs[0]); # Check that lua handles errors properly. print $ps "get /errcheck/a\r\n"; @@ -828,24 +791,14 @@ check_version($ps); print $be "ERROR test1\r\n"; is(scalar <$ps>, "ERROR\r\n", "lua saw correct error code"); - # re-accept the backend. - $be = $mocksrvs[0]->accept(); - $be->autoflush(1); - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; - $mbe[0] = $be; + $be = $mbe[0] = accept_backend($mocksrvs[0]); print $ps "get /errcheck/b\r\n"; is(scalar <$be>, "get /errcheck/b\r\n", "received get command"); print $be "CLIENT_ERROR test2\r\n"; is(scalar <$ps>, "CLIENT_ERROR\r\n", "lua saw correct error code"); - # re-accept the backend. - $be = $mocksrvs[0]->accept(); - $be->autoflush(1); - like(<$be>, qr/version/, "received version command"); - print $be "VERSION 1.0.0-mock\r\n"; - $mbe[0] = $be; + $be = $mbe[0] = accept_backend($mocksrvs[0]); print $ps "get /errcheck/c\r\n"; is(scalar <$be>, "get /errcheck/c\r\n", "received get command"); -- cgit v1.2.1