The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -T

use strict;
use warnings;

BEGIN {
  our %ips = ('1.2.3.4' => '1.2.3.4',
              '012.034.01.055' => '10.28.1.45',
              '0x12.0x43.0x44.0x01' => '18.67.68.1',
              '167838211' => '10.1.2.3',
              '12.0x12.01234' => '12.18.2.156',
              '276.2.3' => '20.2.3.0',
              '0x10000000b' => '0.0.0.11');
  our %uris = ('http://google.com/' => 'http://google.com/',
               'http://GOOgle.com' => 'http://google.com/',
               'http://..google..com../' => 'http://google.com/',
               'http://google.com/%25%34%31%25%31%46' => 'http://google.com/A%1F',
               'http://google^.com/' => 'http://google%5E.com/',
               'http://google.com/1/../2/././' => 'http://google.com/2/',
               'http://google.com/1//2?3//4' => 'http://google.com/1/2?3//4');
};
our (%ips, %uris);

use Test::More tests => scalar(keys(%ips) + 2 * keys(%uris));
use Net::Google::SafeBrowsing::Blocklist;

diag("Testing IP address canonicalization...");
while (my($in, $exp) = each(%ips)) {
  diag("Canonicalize IP '$in' => '$exp'");
  is(Net::Google::SafeBrowsing::Blocklist::canonicalized_ip($in), $exp);
}
while (my($in, $exp) = each(%uris)) {
  diag("URI escape '$in' => '$exp'");
  my ($ip, @host_parts, @path, $qry);
  ok(Net::Google::SafeBrowsing::Blocklist::canonicalized_http_uri(
    $in, \$ip, \@host_parts, \@path, \$qry));
  my $res = 'http://' . join('.', @host_parts) . join('', @path);
  if (defined($qry)) {
    $res .= '?' . $qry;
  }
  is($res, $exp);
}