tests: update_nics: Test number of web*
queries
This will be used in a future commit to test deduplication of of `use*` strategies.
This commit is contained in:
parent
b6ac0e6d05
commit
8b7581287c
1 changed files with 61 additions and 1 deletions
|
@ -2,6 +2,8 @@ use Test::More;
|
||||||
use File::Temp;
|
use File::Temp;
|
||||||
use List::Util qw(max);
|
use List::Util qw(max);
|
||||||
use Scalar::Util qw(refaddr);
|
use Scalar::Util qw(refaddr);
|
||||||
|
eval { require JSON::PP; } or plan(skip_all => $@);
|
||||||
|
JSON::PP->import(qw(decode_json encode_json));
|
||||||
eval { require ddclient::Test::Fake::HTTPD; } or plan(skip_all => $@);
|
eval { require ddclient::Test::Fake::HTTPD; } or plan(skip_all => $@);
|
||||||
SKIP: { eval { require Test::Warnings; } or skip($@, 1); }
|
SKIP: { eval { require Test::Warnings; } or skip($@, 1); }
|
||||||
eval { require 'ddclient'; } or BAIL_OUT($@);
|
eval { require 'ddclient'; } or BAIL_OUT($@);
|
||||||
|
@ -19,6 +21,9 @@ my $http_daemon_supports_ipv6 = eval {
|
||||||
HTTP::Daemon->VERSION(6.12);
|
HTTP::Daemon->VERSION(6.12);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
my @httpd_requests; # Log of received requests.
|
||||||
|
my @httpd_responses; # Script of responses to play back.
|
||||||
|
my $textplain = ['content-type' => 'text/plain; charset=utf-8'];
|
||||||
sub run_httpd {
|
sub run_httpd {
|
||||||
my ($ipv) = @_;
|
my ($ipv) = @_;
|
||||||
return undef if $ipv eq '6' && (!$ipv6_supported || !$http_daemon_supports_ipv6);
|
return undef if $ipv eq '6' && (!$ipv6_supported || !$http_daemon_supports_ipv6);
|
||||||
|
@ -27,7 +32,26 @@ sub run_httpd {
|
||||||
daemon_args => {V6Only => 1},
|
daemon_args => {V6Only => 1},
|
||||||
);
|
);
|
||||||
my $ip = $ipv eq '4' ? '192.0.2.1' : '2001:db8::1';
|
my $ip = $ipv eq '4' ? '192.0.2.1' : '2001:db8::1';
|
||||||
$httpd->run(sub { return [200, ['content-type' => 'text/plain; charset=utf-8'], [$ip]]; });
|
$httpd->run(sub {
|
||||||
|
my ($req) = @_;
|
||||||
|
if ($req->uri()->path() eq '/control') {
|
||||||
|
if ($req->method() eq 'PUT') {
|
||||||
|
return [400, $textplain, ['content must be json']]
|
||||||
|
if $req->headers()->content_type() ne 'application/json';
|
||||||
|
eval { @httpd_responses = @{decode_json($req->content())}; 1; }
|
||||||
|
or return [400, $textplain, ['content is not valid json']];
|
||||||
|
@httpd_requests = ();
|
||||||
|
return [200, $textplain, []];
|
||||||
|
} elsif ($req->method() eq 'GET') {
|
||||||
|
my @reqs = map($_->as_string(), @httpd_requests);
|
||||||
|
return [200, ['content-type' => 'application/json'], [encode_json(\@reqs)]];
|
||||||
|
} else {
|
||||||
|
return [405, $textplain, ['unsupported method: ' . $req->method()]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
push(@httpd_requests, $req);
|
||||||
|
return shift(@httpd_responses) // [500, $textplain, ['ran out of scripted responses']];
|
||||||
|
});
|
||||||
diag("started IPv$ipv HTTP server running at " . $httpd->endpoint());
|
diag("started IPv$ipv HTTP server running at " . $httpd->endpoint());
|
||||||
return $httpd;
|
return $httpd;
|
||||||
}
|
}
|
||||||
|
@ -97,6 +121,7 @@ my @test_cases = (
|
||||||
'protocol' => 'legacy',
|
'protocol' => 'legacy',
|
||||||
%cfg,
|
%cfg,
|
||||||
}},
|
}},
|
||||||
|
want_reqs_webv4 => 1,
|
||||||
want_updates => [['host']],
|
want_updates => [['host']],
|
||||||
want_recap_changes => {host => {
|
want_recap_changes => {host => {
|
||||||
'atime' => $ddclient::now,
|
'atime' => $ddclient::now,
|
||||||
|
@ -115,6 +140,7 @@ my @test_cases = (
|
||||||
'use' => 'web',
|
'use' => 'web',
|
||||||
'web' => 'v6',
|
'web' => 'v6',
|
||||||
}},
|
}},
|
||||||
|
want_reqs_webv6 => 1,
|
||||||
want_updates => [['host']],
|
want_updates => [['host']],
|
||||||
want_recap_changes => {host => {
|
want_recap_changes => {host => {
|
||||||
'atime' => $ddclient::now,
|
'atime' => $ddclient::now,
|
||||||
|
@ -130,6 +156,7 @@ my @test_cases = (
|
||||||
'protocol' => 'legacy',
|
'protocol' => 'legacy',
|
||||||
'usev6' => 'webv6',
|
'usev6' => 'webv6',
|
||||||
}},
|
}},
|
||||||
|
want_reqs_webv6 => 1,
|
||||||
want_updates => [['host']],
|
want_updates => [['host']],
|
||||||
want_recap_changes => {host => {
|
want_recap_changes => {host => {
|
||||||
'atime' => $ddclient::now,
|
'atime' => $ddclient::now,
|
||||||
|
@ -146,6 +173,8 @@ my @test_cases = (
|
||||||
'usev4' => 'webv4',
|
'usev4' => 'webv4',
|
||||||
'usev6' => 'webv6',
|
'usev6' => 'webv6',
|
||||||
}},
|
}},
|
||||||
|
want_reqs_webv4 => 1,
|
||||||
|
want_reqs_webv6 => 1,
|
||||||
want_updates => [['host']],
|
want_updates => [['host']],
|
||||||
want_recap_changes => {host => {
|
want_recap_changes => {host => {
|
||||||
'atime' => $ddclient::now,
|
'atime' => $ddclient::now,
|
||||||
|
@ -169,6 +198,7 @@ my @test_cases = (
|
||||||
'protocol' => 'legacy',
|
'protocol' => 'legacy',
|
||||||
%cfg,
|
%cfg,
|
||||||
}},
|
}},
|
||||||
|
want_reqs_webv4 => 1,
|
||||||
%$_,
|
%$_,
|
||||||
};
|
};
|
||||||
} {cfg => {use => 'web'}}, {cfg => {usev4 => 'webv4'}}),
|
} {cfg => {use => 'web'}}, {cfg => {usev4 => 'webv4'}}),
|
||||||
|
@ -187,6 +217,7 @@ my @test_cases = (
|
||||||
'protocol' => 'legacy',
|
'protocol' => 'legacy',
|
||||||
%cfg,
|
%cfg,
|
||||||
}},
|
}},
|
||||||
|
want_reqs_webv4 => 1,
|
||||||
%$_,
|
%$_,
|
||||||
};
|
};
|
||||||
} {cfg => {use => 'web'}}, {cfg => {usev4 => 'webv4'}}),
|
} {cfg => {use => 'web'}}, {cfg => {usev4 => 'webv4'}}),
|
||||||
|
@ -205,6 +236,7 @@ my @test_cases = (
|
||||||
'protocol' => 'legacy',
|
'protocol' => 'legacy',
|
||||||
%cfg,
|
%cfg,
|
||||||
}},
|
}},
|
||||||
|
want_reqs_webv4 => 1,
|
||||||
want_recap_changes => {host => {
|
want_recap_changes => {host => {
|
||||||
'warned-min-interval' => $ddclient::now,
|
'warned-min-interval' => $ddclient::now,
|
||||||
}},
|
}},
|
||||||
|
@ -226,6 +258,7 @@ my @test_cases = (
|
||||||
'protocol' => 'legacy',
|
'protocol' => 'legacy',
|
||||||
%cfg,
|
%cfg,
|
||||||
}},
|
}},
|
||||||
|
want_reqs_webv4 => 1,
|
||||||
want_updates => [['host']],
|
want_updates => [['host']],
|
||||||
want_recap_changes => {host => {
|
want_recap_changes => {host => {
|
||||||
'atime' => $ddclient::now,
|
'atime' => $ddclient::now,
|
||||||
|
@ -251,6 +284,7 @@ my @test_cases = (
|
||||||
'protocol' => 'legacy',
|
'protocol' => 'legacy',
|
||||||
%cfg,
|
%cfg,
|
||||||
}},
|
}},
|
||||||
|
want_reqs_webv4 => 1,
|
||||||
want_recap_changes => {host => {
|
want_recap_changes => {host => {
|
||||||
'warned-min-error-interval' => $ddclient::now,
|
'warned-min-error-interval' => $ddclient::now,
|
||||||
}},
|
}},
|
||||||
|
@ -272,6 +306,7 @@ my @test_cases = (
|
||||||
'protocol' => 'legacy',
|
'protocol' => 'legacy',
|
||||||
%cfg,
|
%cfg,
|
||||||
}},
|
}},
|
||||||
|
want_reqs_webv4 => 1,
|
||||||
want_updates => [['host']],
|
want_updates => [['host']],
|
||||||
want_recap_changes => {host => {
|
want_recap_changes => {host => {
|
||||||
'atime' => $ddclient::now,
|
'atime' => $ddclient::now,
|
||||||
|
@ -291,6 +326,19 @@ for my $tc (@test_cases) {
|
||||||
if $tc->{ipv6} && !$http_daemon_supports_ipv6;
|
if $tc->{ipv6} && !$http_daemon_supports_ipv6;
|
||||||
subtest($tc->{desc} => sub {
|
subtest($tc->{desc} => sub {
|
||||||
local $ddclient::_l = ddclient::pushlogctx($tc->{desc});
|
local $ddclient::_l = ddclient::pushlogctx($tc->{desc});
|
||||||
|
for my $ipv ('4', '6') {
|
||||||
|
$tc->{"want_reqs_webv$ipv"} //= 0;
|
||||||
|
my $want = $tc->{"want_reqs_webv$ipv"};
|
||||||
|
next if !defined($httpd{$ipv}) && $want == 0;
|
||||||
|
local $ddclient::_l = ddclient::pushlogctx("IPv$ipv");
|
||||||
|
my $ip = $ipv eq '4' ? '192.0.2.1' : '2001:db8::1';
|
||||||
|
ddclient::header_ok(ddclient::geturl(
|
||||||
|
url => $httpd{$ipv}->endpoint() . '/control',
|
||||||
|
method => 'PUT',
|
||||||
|
headers => ['content-type: application/json'],
|
||||||
|
data => encode_json([([200, $textplain, [$ip]]) x $want]),
|
||||||
|
)) or BAIL_OUT('failed to prepare the test http server');
|
||||||
|
}
|
||||||
$tc->{recap}{$_}{host} //= $_ for keys(%{$tc->{recap} // {}});
|
$tc->{recap}{$_}{host} //= $_ for keys(%{$tc->{recap} // {}});
|
||||||
# Deep copy `%{$tc->{recap}}` so that updates to `%ddclient::recap` don't mutate it.
|
# Deep copy `%{$tc->{recap}}` so that updates to `%ddclient::recap` don't mutate it.
|
||||||
local %ddclient::recap = %{mergecfg($tc->{recap})};
|
local %ddclient::recap = %{mergecfg($tc->{recap})};
|
||||||
|
@ -312,6 +360,18 @@ for my $tc (@test_cases) {
|
||||||
|
|
||||||
ddclient::update_nics();
|
ddclient::update_nics();
|
||||||
|
|
||||||
|
for my $ipv ('4', '6') {
|
||||||
|
next if !defined($httpd{$ipv});
|
||||||
|
local $ddclient::_l = ddclient::pushlogctx("IPv$ipv");
|
||||||
|
my $gotreqs = ddclient::geturl(url => $httpd{$ipv}->endpoint() . '/control');
|
||||||
|
ddclient::header_ok($gotreqs)
|
||||||
|
or BAIL_OUT("failed to get log of IPv$ipv http requests");
|
||||||
|
$gotreqs =~ s/^.*?\n\n//s;
|
||||||
|
my @gotreqs = map(HTTP::Request->parse($_), @{decode_json($gotreqs)});
|
||||||
|
my $got = @gotreqs;
|
||||||
|
my $want = $tc->{"want_reqs_webv$ipv"};
|
||||||
|
is($got, $want, "number of requests to webv$ipv service");
|
||||||
|
}
|
||||||
TODO: {
|
TODO: {
|
||||||
local $TODO = $tc->{want_updates_TODO};
|
local $TODO = $tc->{want_updates_TODO};
|
||||||
is_deeply(\@updates, $tc->{want_updates} // [], 'got expected updates')
|
is_deeply(\@updates, $tc->{want_updates} // [], 'got expected updates')
|
||||||
|
|
Loading…
Reference in a new issue