Merge branch 'gt/unit-test-urlmatch-normalization'

Another rewrite of test.

* gt/unit-test-urlmatch-normalization:
  t: migrate t0110-urlmatch-normalization to the new framework
This commit is contained in:
Junio C Hamano
2024-08-28 10:31:27 -07:00
18 changed files with 272 additions and 261 deletions

View File

@ -843,7 +843,6 @@ TEST_BUILTINS_OBJS += test-submodule.o
TEST_BUILTINS_OBJS += test-subprocess.o
TEST_BUILTINS_OBJS += test-trace2.o
TEST_BUILTINS_OBJS += test-truncate.o
TEST_BUILTINS_OBJS += test-urlmatch-normalization.o
TEST_BUILTINS_OBJS += test-userdiff.o
TEST_BUILTINS_OBJS += test-wildmatch.o
TEST_BUILTINS_OBJS += test-windows-named-pipe.o
@ -1350,6 +1349,7 @@ UNIT_TEST_PROGRAMS += t-strbuf
UNIT_TEST_PROGRAMS += t-strcmp-offset
UNIT_TEST_PROGRAMS += t-strvec
UNIT_TEST_PROGRAMS += t-trailer
UNIT_TEST_PROGRAMS += t-urlmatch-normalization
UNIT_TEST_PROGS = $(patsubst %,$(UNIT_TEST_BIN)/%$X,$(UNIT_TEST_PROGRAMS))
UNIT_TEST_OBJS = $(patsubst %,$(UNIT_TEST_DIR)/%.o,$(UNIT_TEST_PROGRAMS))
UNIT_TEST_OBJS += $(UNIT_TEST_DIR)/test-lib.o

View File

@ -83,7 +83,6 @@ static struct test_cmd cmds[] = {
{ "trace2", cmd__trace2 },
{ "truncate", cmd__truncate },
{ "userdiff", cmd__userdiff },
{ "urlmatch-normalization", cmd__urlmatch_normalization },
{ "xml-encode", cmd__xml_encode },
{ "wildmatch", cmd__wildmatch },
#ifdef GIT_WINDOWS_NATIVE

View File

@ -76,7 +76,6 @@ int cmd__subprocess(int argc, const char **argv);
int cmd__trace2(int argc, const char **argv);
int cmd__truncate(int argc, const char **argv);
int cmd__userdiff(int argc, const char **argv);
int cmd__urlmatch_normalization(int argc, const char **argv);
int cmd__xml_encode(int argc, const char **argv);
int cmd__wildmatch(int argc, const char **argv);
#ifdef GIT_WINDOWS_NATIVE

View File

@ -1,56 +0,0 @@
#include "test-tool.h"
#include "git-compat-util.h"
#include "urlmatch.h"
int cmd__urlmatch_normalization(int argc, const char **argv)
{
const char usage[] = "test-tool urlmatch-normalization [-p | -l] <url1> | <url1> <url2>";
char *url1 = NULL, *url2 = NULL;
int opt_p = 0, opt_l = 0;
int ret = 0;
/*
* For one url, succeed if url_normalize succeeds on it, fail otherwise.
* For two urls, succeed only if url_normalize succeeds on both and
* the results compare equal with strcmp. If -p is given (one url only)
* and url_normalize succeeds, print the result followed by "\n". If
* -l is given (one url only) and url_normalize succeeds, print the
* returned length in decimal followed by "\n".
*/
if (argc > 1 && !strcmp(argv[1], "-p")) {
opt_p = 1;
argc--;
argv++;
} else if (argc > 1 && !strcmp(argv[1], "-l")) {
opt_l = 1;
argc--;
argv++;
}
if (argc < 2 || argc > 3)
die("%s", usage);
if (argc == 2) {
struct url_info info;
url1 = url_normalize(argv[1], &info);
if (!url1)
return 1;
if (opt_p)
printf("%s\n", url1);
if (opt_l)
printf("%u\n", (unsigned)info.url_len);
goto cleanup;
}
if (opt_p || opt_l)
die("%s", usage);
url1 = url_normalize(argv[1], NULL);
url2 = url_normalize(argv[2], NULL);
ret = (url1 && url2 && !strcmp(url1, url2)) ? 0 : 1;
cleanup:
free(url1);
free(url2);
return ret;
}

View File

@ -1,182 +0,0 @@
#!/bin/sh
test_description='urlmatch URL normalization'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh
# The base name of the test url files
tu="$TEST_DIRECTORY/t0110/url"
# Note that only file: URLs should be allowed without a host
test_expect_success 'url scheme' '
! test-tool urlmatch-normalization "" &&
! test-tool urlmatch-normalization "_" &&
! test-tool urlmatch-normalization "scheme" &&
! test-tool urlmatch-normalization "scheme:" &&
! test-tool urlmatch-normalization "scheme:/" &&
! test-tool urlmatch-normalization "scheme://" &&
! test-tool urlmatch-normalization "file" &&
! test-tool urlmatch-normalization "file:" &&
! test-tool urlmatch-normalization "file:/" &&
test-tool urlmatch-normalization "file://" &&
! test-tool urlmatch-normalization "://acme.co" &&
! test-tool urlmatch-normalization "x_test://acme.co" &&
! test-tool urlmatch-normalization "-test://acme.co" &&
! test-tool urlmatch-normalization "0test://acme.co" &&
! test-tool urlmatch-normalization "+test://acme.co" &&
! test-tool urlmatch-normalization ".test://acme.co" &&
! test-tool urlmatch-normalization "schem%6e://" &&
test-tool urlmatch-normalization "x-Test+v1.0://acme.co" &&
test "$(test-tool urlmatch-normalization -p "AbCdeF://x.Y")" = "abcdef://x.y/"
'
test_expect_success 'url authority' '
! test-tool urlmatch-normalization "scheme://user:pass@" &&
! test-tool urlmatch-normalization "scheme://?" &&
! test-tool urlmatch-normalization "scheme://#" &&
! test-tool urlmatch-normalization "scheme:///" &&
! test-tool urlmatch-normalization "scheme://:" &&
! test-tool urlmatch-normalization "scheme://:555" &&
test-tool urlmatch-normalization "file://user:pass@" &&
test-tool urlmatch-normalization "file://?" &&
test-tool urlmatch-normalization "file://#" &&
test-tool urlmatch-normalization "file:///" &&
test-tool urlmatch-normalization "file://:" &&
! test-tool urlmatch-normalization "file://:555" &&
test-tool urlmatch-normalization "scheme://user:pass@host" &&
test-tool urlmatch-normalization "scheme://@host" &&
test-tool urlmatch-normalization "scheme://%00@host" &&
! test-tool urlmatch-normalization "scheme://%%@host" &&
test-tool urlmatch-normalization "scheme://host_" &&
test-tool urlmatch-normalization "scheme://user:pass@host/" &&
test-tool urlmatch-normalization "scheme://@host/" &&
test-tool urlmatch-normalization "scheme://host/" &&
test-tool urlmatch-normalization "scheme://host?x" &&
test-tool urlmatch-normalization "scheme://host#x" &&
test-tool urlmatch-normalization "scheme://host/@" &&
test-tool urlmatch-normalization "scheme://host?@x" &&
test-tool urlmatch-normalization "scheme://host#@x" &&
test-tool urlmatch-normalization "scheme://[::1]" &&
test-tool urlmatch-normalization "scheme://[::1]/" &&
! test-tool urlmatch-normalization "scheme://hos%41/" &&
test-tool urlmatch-normalization "scheme://[invalid....:/" &&
test-tool urlmatch-normalization "scheme://invalid....:]/" &&
! test-tool urlmatch-normalization "scheme://invalid....:[/" &&
! test-tool urlmatch-normalization "scheme://invalid....:["
'
test_expect_success 'url port checks' '
test-tool urlmatch-normalization "xyz://q@some.host:" &&
test-tool urlmatch-normalization "xyz://q@some.host:456/" &&
! test-tool urlmatch-normalization "xyz://q@some.host:0" &&
! test-tool urlmatch-normalization "xyz://q@some.host:0000000" &&
test-tool urlmatch-normalization "xyz://q@some.host:0000001?" &&
test-tool urlmatch-normalization "xyz://q@some.host:065535#" &&
test-tool urlmatch-normalization "xyz://q@some.host:65535" &&
! test-tool urlmatch-normalization "xyz://q@some.host:65536" &&
! test-tool urlmatch-normalization "xyz://q@some.host:99999" &&
! test-tool urlmatch-normalization "xyz://q@some.host:100000" &&
! test-tool urlmatch-normalization "xyz://q@some.host:100001" &&
test-tool urlmatch-normalization "http://q@some.host:80" &&
test-tool urlmatch-normalization "https://q@some.host:443" &&
test-tool urlmatch-normalization "http://q@some.host:80/" &&
test-tool urlmatch-normalization "https://q@some.host:443?" &&
! test-tool urlmatch-normalization "http://q@:8008" &&
! test-tool urlmatch-normalization "http://:8080" &&
! test-tool urlmatch-normalization "http://:" &&
test-tool urlmatch-normalization "xyz://q@some.host:456/" &&
test-tool urlmatch-normalization "xyz://[::1]:456/" &&
test-tool urlmatch-normalization "xyz://[::1]:/" &&
! test-tool urlmatch-normalization "xyz://[::1]:000/" &&
! test-tool urlmatch-normalization "xyz://[::1]:0%300/" &&
! test-tool urlmatch-normalization "xyz://[::1]:0x80/" &&
! test-tool urlmatch-normalization "xyz://[::1]:4294967297/" &&
! test-tool urlmatch-normalization "xyz://[::1]:030f/"
'
test_expect_success 'url port normalization' '
test "$(test-tool urlmatch-normalization -p "http://x:800")" = "http://x:800/" &&
test "$(test-tool urlmatch-normalization -p "http://x:0800")" = "http://x:800/" &&
test "$(test-tool urlmatch-normalization -p "http://x:00000800")" = "http://x:800/" &&
test "$(test-tool urlmatch-normalization -p "http://x:065535")" = "http://x:65535/" &&
test "$(test-tool urlmatch-normalization -p "http://x:1")" = "http://x:1/" &&
test "$(test-tool urlmatch-normalization -p "http://x:80")" = "http://x/" &&
test "$(test-tool urlmatch-normalization -p "http://x:080")" = "http://x/" &&
test "$(test-tool urlmatch-normalization -p "http://x:000000080")" = "http://x/" &&
test "$(test-tool urlmatch-normalization -p "https://x:443")" = "https://x/" &&
test "$(test-tool urlmatch-normalization -p "https://x:0443")" = "https://x/" &&
test "$(test-tool urlmatch-normalization -p "https://x:000000443")" = "https://x/"
'
test_expect_success 'url general escapes' '
! test-tool urlmatch-normalization "http://x.y?%fg" &&
test "$(test-tool urlmatch-normalization -p "X://W/%7e%41^%3a")" = "x://w/~A%5E%3A" &&
test "$(test-tool urlmatch-normalization -p "X://W/:/?#[]@")" = "x://w/:/?#[]@" &&
test "$(test-tool urlmatch-normalization -p "X://W/$&()*+,;=")" = "x://w/$&()*+,;=" &&
test "$(test-tool urlmatch-normalization -p "X://W/'\''")" = "x://w/'\''" &&
test "$(test-tool urlmatch-normalization -p "X://W?'\!'")" = "x://w/?'\!'"
'
test_expect_success !MINGW 'url high-bit escapes' '
test "$(test-tool urlmatch-normalization -p "$(cat "$tu-1")")" = "x://q/%01%02%03%04%05%06%07%08%0E%0F%10%11%12" &&
test "$(test-tool urlmatch-normalization -p "$(cat "$tu-2")")" = "x://q/%13%14%15%16%17%18%19%1B%1C%1D%1E%1F%7F" &&
test "$(test-tool urlmatch-normalization -p "$(cat "$tu-3")")" = "x://q/%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F" &&
test "$(test-tool urlmatch-normalization -p "$(cat "$tu-4")")" = "x://q/%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F" &&
test "$(test-tool urlmatch-normalization -p "$(cat "$tu-5")")" = "x://q/%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF" &&
test "$(test-tool urlmatch-normalization -p "$(cat "$tu-6")")" = "x://q/%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF" &&
test "$(test-tool urlmatch-normalization -p "$(cat "$tu-7")")" = "x://q/%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF" &&
test "$(test-tool urlmatch-normalization -p "$(cat "$tu-8")")" = "x://q/%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF" &&
test "$(test-tool urlmatch-normalization -p "$(cat "$tu-9")")" = "x://q/%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF" &&
test "$(test-tool urlmatch-normalization -p "$(cat "$tu-10")")" = "x://q/%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF"
'
test_expect_success 'url utf-8 escapes' '
test "$(test-tool urlmatch-normalization -p "$(cat "$tu-11")")" = "x://q/%C2%80%DF%BF%E0%A0%80%EF%BF%BD%F0%90%80%80%F0%AF%BF%BD"
'
test_expect_success 'url username/password escapes' '
test "$(test-tool urlmatch-normalization -p "x://%41%62(^):%70+d@foo")" = "x://Ab(%5E):p+d@foo/"
'
test_expect_success 'url normalized lengths' '
test "$(test-tool urlmatch-normalization -l "Http://%4d%65:%4d^%70@The.Host")" = 25 &&
test "$(test-tool urlmatch-normalization -l "http://%41:%42@x.y/%61/")" = 17 &&
test "$(test-tool urlmatch-normalization -l "http://@x.y/^")" = 15
'
test_expect_success 'url . and .. segments' '
test "$(test-tool urlmatch-normalization -p "x://y/.")" = "x://y/" &&
test "$(test-tool urlmatch-normalization -p "x://y/./")" = "x://y/" &&
test "$(test-tool urlmatch-normalization -p "x://y/a/.")" = "x://y/a" &&
test "$(test-tool urlmatch-normalization -p "x://y/a/./")" = "x://y/a/" &&
test "$(test-tool urlmatch-normalization -p "x://y/.?")" = "x://y/?" &&
test "$(test-tool urlmatch-normalization -p "x://y/./?")" = "x://y/?" &&
test "$(test-tool urlmatch-normalization -p "x://y/a/.?")" = "x://y/a?" &&
test "$(test-tool urlmatch-normalization -p "x://y/a/./?")" = "x://y/a/?" &&
test "$(test-tool urlmatch-normalization -p "x://y/a/./b/.././../c")" = "x://y/c" &&
test "$(test-tool urlmatch-normalization -p "x://y/a/./b/../.././c/")" = "x://y/c/" &&
test "$(test-tool urlmatch-normalization -p "x://y/a/./b/.././../c/././.././.")" = "x://y/" &&
! test-tool urlmatch-normalization "x://y/a/./b/.././../c/././.././.." &&
test "$(test-tool urlmatch-normalization -p "x://y/a/./?/././..")" = "x://y/a/?/././.." &&
test "$(test-tool urlmatch-normalization -p "x://y/%2e/")" = "x://y/" &&
test "$(test-tool urlmatch-normalization -p "x://y/%2E/")" = "x://y/" &&
test "$(test-tool urlmatch-normalization -p "x://y/a/%2e./")" = "x://y/" &&
test "$(test-tool urlmatch-normalization -p "x://y/b/.%2E/")" = "x://y/" &&
test "$(test-tool urlmatch-normalization -p "x://y/c/%2e%2E/")" = "x://y/"
'
# http://@foo specifies an empty user name but does not specify a password
# http://foo specifies neither a user name nor a password
# So they should not be equivalent
test_expect_success 'url equivalents' '
test-tool urlmatch-normalization "httP://x" "Http://X/" &&
test-tool urlmatch-normalization "Http://%4d%65:%4d^%70@The.Host" "hTTP://Me:%4D^p@the.HOST:80/" &&
! test-tool urlmatch-normalization "https://@x.y/^" "httpS://x.y:443/^" &&
test-tool urlmatch-normalization "https://@x.y/^" "httpS://@x.y:0443/^" &&
test-tool urlmatch-normalization "https://@x.y/^/../abc" "httpS://@x.y:0443/abc" &&
test-tool urlmatch-normalization "https://@x.y/^/.." "httpS://@x.y:0443/"
'
test_done

View File

@ -1,9 +0,0 @@
The url data files in this directory contain URLs with characters
in the range 0x01-0x1f and 0x7f-0xff to test the proper normalization
of unprintable characters.
A select few characters in the 0x01-0x1f range are skipped to help
avoid problems running the test itself.
The urls are in test files in this directory rather than being
embedded in the test script for portability.

View File

@ -1 +0,0 @@
x://q/

View File

@ -1 +0,0 @@
x://q/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@ -1 +0,0 @@
x://q/€߿ࠀ<DFBF>𐀀𯿽

View File

@ -1 +0,0 @@
x://q/

View File

@ -1 +0,0 @@
x://q/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@ -1 +0,0 @@
x://q/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@ -1 +0,0 @@
x://q/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@ -1 +0,0 @@
x://q/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@ -1 +0,0 @@
x://q/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@ -1 +0,0 @@
x://q/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@ -1 +0,0 @@
x://q/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@ -0,0 +1,271 @@
#include "test-lib.h"
#include "urlmatch.h"
static void check_url_normalizable(const char *url, unsigned int normalizable)
{
char *url_norm = url_normalize(url, NULL);
if (!check_int(normalizable, ==, url_norm ? 1 : 0))
test_msg("input url: %s", url);
free(url_norm);
}
static void check_normalized_url(const char *url, const char *expect)
{
char *url_norm = url_normalize(url, NULL);
if (!check_str(url_norm, expect))
test_msg("input url: %s", url);
free(url_norm);
}
static void compare_normalized_urls(const char *url1, const char *url2,
unsigned int equal)
{
char *url1_norm = url_normalize(url1, NULL);
char *url2_norm = url_normalize(url2, NULL);
if (equal) {
if (!check_str(url1_norm, url2_norm))
test_msg("input url1: %s\n input url2: %s", url1,
url2);
} else if (!check_int(strcmp(url1_norm, url2_norm), !=, 0)) {
test_msg(" normalized url1: %s\n normalized url2: %s\n"
" input url1: %s\n input url2: %s",
url1_norm, url2_norm, url1, url2);
}
free(url1_norm);
free(url2_norm);
}
static void check_normalized_url_length(const char *url, size_t len)
{
struct url_info info;
char *url_norm = url_normalize(url, &info);
if (!check_int(info.url_len, ==, len))
test_msg(" input url: %s\n normalized url: %s", url,
url_norm);
free(url_norm);
}
/* Note that only "file:" URLs should be allowed without a host */
static void t_url_scheme(void)
{
check_url_normalizable("", 0);
check_url_normalizable("_", 0);
check_url_normalizable("scheme", 0);
check_url_normalizable("scheme:", 0);
check_url_normalizable("scheme:/", 0);
check_url_normalizable("scheme://", 0);
check_url_normalizable("file", 0);
check_url_normalizable("file:", 0);
check_url_normalizable("file:/", 0);
check_url_normalizable("file://", 1);
check_url_normalizable("://acme.co", 0);
check_url_normalizable("x_test://acme.co", 0);
check_url_normalizable("-test://acme.co", 0);
check_url_normalizable("0test://acme.co", 0);
check_url_normalizable("+test://acme.co", 0);
check_url_normalizable(".test://acme.co", 0);
check_url_normalizable("schem%6e://", 0);
check_url_normalizable("x-Test+v1.0://acme.co", 1);
check_normalized_url("AbCdeF://x.Y", "abcdef://x.y/");
}
static void t_url_authority(void)
{
check_url_normalizable("scheme://user:pass@", 0);
check_url_normalizable("scheme://?", 0);
check_url_normalizable("scheme://#", 0);
check_url_normalizable("scheme:///", 0);
check_url_normalizable("scheme://:", 0);
check_url_normalizable("scheme://:555", 0);
check_url_normalizable("file://user:pass@", 1);
check_url_normalizable("file://?", 1);
check_url_normalizable("file://#", 1);
check_url_normalizable("file:///", 1);
check_url_normalizable("file://:", 1);
check_url_normalizable("file://:555", 0);
check_url_normalizable("scheme://user:pass@host", 1);
check_url_normalizable("scheme://@host", 1);
check_url_normalizable("scheme://%00@host", 1);
check_url_normalizable("scheme://%%@host", 0);
check_url_normalizable("scheme://host_", 1);
check_url_normalizable("scheme://user:pass@host/", 1);
check_url_normalizable("scheme://@host/", 1);
check_url_normalizable("scheme://host/", 1);
check_url_normalizable("scheme://host?x", 1);
check_url_normalizable("scheme://host#x", 1);
check_url_normalizable("scheme://host/@", 1);
check_url_normalizable("scheme://host?@x", 1);
check_url_normalizable("scheme://host#@x", 1);
check_url_normalizable("scheme://[::1]", 1);
check_url_normalizable("scheme://[::1]/", 1);
check_url_normalizable("scheme://hos%41/", 0);
check_url_normalizable("scheme://[invalid....:/", 1);
check_url_normalizable("scheme://invalid....:]/", 1);
check_url_normalizable("scheme://invalid....:[/", 0);
check_url_normalizable("scheme://invalid....:[", 0);
}
static void t_url_port(void)
{
check_url_normalizable("xyz://q@some.host:", 1);
check_url_normalizable("xyz://q@some.host:456/", 1);
check_url_normalizable("xyz://q@some.host:0", 0);
check_url_normalizable("xyz://q@some.host:0000000", 0);
check_url_normalizable("xyz://q@some.host:0000001?", 1);
check_url_normalizable("xyz://q@some.host:065535#", 1);
check_url_normalizable("xyz://q@some.host:65535", 1);
check_url_normalizable("xyz://q@some.host:65536", 0);
check_url_normalizable("xyz://q@some.host:99999", 0);
check_url_normalizable("xyz://q@some.host:100000", 0);
check_url_normalizable("xyz://q@some.host:100001", 0);
check_url_normalizable("http://q@some.host:80", 1);
check_url_normalizable("https://q@some.host:443", 1);
check_url_normalizable("http://q@some.host:80/", 1);
check_url_normalizable("https://q@some.host:443?", 1);
check_url_normalizable("http://q@:8008", 0);
check_url_normalizable("http://:8080", 0);
check_url_normalizable("http://:", 0);
check_url_normalizable("xyz://q@some.host:456/", 1);
check_url_normalizable("xyz://[::1]:456/", 1);
check_url_normalizable("xyz://[::1]:/", 1);
check_url_normalizable("xyz://[::1]:000/", 0);
check_url_normalizable("xyz://[::1]:0%300/", 0);
check_url_normalizable("xyz://[::1]:0x80/", 0);
check_url_normalizable("xyz://[::1]:4294967297/", 0);
check_url_normalizable("xyz://[::1]:030f/", 0);
}
static void t_url_port_normalization(void)
{
check_normalized_url("http://x:800", "http://x:800/");
check_normalized_url("http://x:0800", "http://x:800/");
check_normalized_url("http://x:00000800", "http://x:800/");
check_normalized_url("http://x:065535", "http://x:65535/");
check_normalized_url("http://x:1", "http://x:1/");
check_normalized_url("http://x:80", "http://x/");
check_normalized_url("http://x:080", "http://x/");
check_normalized_url("http://x:000000080", "http://x/");
check_normalized_url("https://x:443", "https://x/");
check_normalized_url("https://x:0443", "https://x/");
check_normalized_url("https://x:000000443", "https://x/");
}
static void t_url_general_escape(void)
{
check_url_normalizable("http://x.y?%fg", 0);
check_normalized_url("X://W/%7e%41^%3a", "x://w/~A%5E%3A");
check_normalized_url("X://W/:/?#[]@", "x://w/:/?#[]@");
check_normalized_url("X://W/$&()*+,;=", "x://w/$&()*+,;=");
check_normalized_url("X://W/'", "x://w/'");
check_normalized_url("X://W?!", "x://w/?!");
}
static void t_url_high_bit(void)
{
check_normalized_url(
"x://q/\x01\x02\x03\x04\x05\x06\x07\x08\x0e\x0f\x10\x11\x12",
"x://q/%01%02%03%04%05%06%07%08%0E%0F%10%11%12");
check_normalized_url(
"x://q/\x13\x14\x15\x16\x17\x18\x19\x1b\x1c\x1d\x1e\x1f\x7f",
"x://q/%13%14%15%16%17%18%19%1B%1C%1D%1E%1F%7F");
check_normalized_url(
"x://q/\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f",
"x://q/%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F");
check_normalized_url(
"x://q/\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f",
"x://q/%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F");
check_normalized_url(
"x://q/\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf",
"x://q/%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF");
check_normalized_url(
"x://q/\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf",
"x://q/%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF");
check_normalized_url(
"x://q/\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
"x://q/%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF");
check_normalized_url(
"x://q/\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf",
"x://q/%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF");
check_normalized_url(
"x://q/\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef",
"x://q/%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF");
check_normalized_url(
"x://q/\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
"x://q/%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF");
}
static void t_url_utf8_escape(void)
{
check_normalized_url(
"x://q/\xc2\x80\xdf\xbf\xe0\xa0\x80\xef\xbf\xbd\xf0\x90\x80\x80\xf0\xaf\xbf\xbd",
"x://q/%C2%80%DF%BF%E0%A0%80%EF%BF%BD%F0%90%80%80%F0%AF%BF%BD");
}
static void t_url_username_pass(void)
{
check_normalized_url("x://%41%62(^):%70+d@foo", "x://Ab(%5E):p+d@foo/");
}
static void t_url_length(void)
{
check_normalized_url_length("Http://%4d%65:%4d^%70@The.Host", 25);
check_normalized_url_length("http://%41:%42@x.y/%61/", 17);
check_normalized_url_length("http://@x.y/^", 15);
}
static void t_url_dots(void)
{
check_normalized_url("x://y/.", "x://y/");
check_normalized_url("x://y/./", "x://y/");
check_normalized_url("x://y/a/.", "x://y/a");
check_normalized_url("x://y/a/./", "x://y/a/");
check_normalized_url("x://y/.?", "x://y/?");
check_normalized_url("x://y/./?", "x://y/?");
check_normalized_url("x://y/a/.?", "x://y/a?");
check_normalized_url("x://y/a/./?", "x://y/a/?");
check_normalized_url("x://y/a/./b/.././../c", "x://y/c");
check_normalized_url("x://y/a/./b/../.././c/", "x://y/c/");
check_normalized_url("x://y/a/./b/.././../c/././.././.", "x://y/");
check_url_normalizable("x://y/a/./b/.././../c/././.././..", 0);
check_normalized_url("x://y/a/./?/././..", "x://y/a/?/././..");
check_normalized_url("x://y/%2e/", "x://y/");
check_normalized_url("x://y/%2E/", "x://y/");
check_normalized_url("x://y/a/%2e./", "x://y/");
check_normalized_url("x://y/b/.%2E/", "x://y/");
check_normalized_url("x://y/c/%2e%2E/", "x://y/");
}
/*
* "http://@foo" specifies an empty user name but does not specify a password.
* "http://foo" specifies neither a user name nor a password.
* So they should not be equivalent.
*/
static void t_url_equivalents(void)
{
compare_normalized_urls("httP://x", "Http://X/", 1);
compare_normalized_urls("Http://%4d%65:%4d^%70@The.Host", "hTTP://Me:%4D^p@the.HOST:80/", 1);
compare_normalized_urls("https://@x.y/^", "httpS://x.y:443/^", 0);
compare_normalized_urls("https://@x.y/^", "httpS://@x.y:0443/^", 1);
compare_normalized_urls("https://@x.y/^/../abc", "httpS://@x.y:0443/abc", 1);
compare_normalized_urls("https://@x.y/^/..", "httpS://@x.y:0443/", 1);
}
int cmd_main(int argc UNUSED, const char **argv UNUSED)
{
TEST(t_url_scheme(), "url scheme");
TEST(t_url_authority(), "url authority");
TEST(t_url_port(), "url port checks");
TEST(t_url_port_normalization(), "url port normalization");
TEST(t_url_general_escape(), "url general escapes");
TEST(t_url_high_bit(), "url high-bit escapes");
TEST(t_url_utf8_escape(), "url utf8 escapes");
TEST(t_url_username_pass(), "url username/password escapes");
TEST(t_url_length(), "url normalized lengths");
TEST(t_url_dots(), "url . and .. segments");
TEST(t_url_equivalents(), "url equivalents");
return test_done();
}