diff options
Diffstat (limited to 'tests/unit')
-rw-r--r-- | tests/unit/Makefile.am | 4 | ||||
-rw-r--r-- | tests/unit/Makefile.inc | 5 | ||||
-rw-r--r-- | tests/unit/unit1307.c | 18 | ||||
-rw-r--r-- | tests/unit/unit1309.c | 14 | ||||
-rw-r--r-- | tests/unit/unit1607.c | 213 |
5 files changed, 241 insertions, 13 deletions
diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am index 61b72c0d..fab82d2b 100644 --- a/tests/unit/Makefile.am +++ b/tests/unit/Makefile.am @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al. +# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms @@ -50,6 +50,8 @@ endif EXTRA_DIST = Makefile.inc CMakeLists.txt +CFLAGS += @CURL_CFLAG_EXTRAS@ + # Prevent LIBS from being used for all link targets LIBS = $(BLANK_AT_MAKETIME) diff --git a/tests/unit/Makefile.inc b/tests/unit/Makefile.inc index bfb5c4d4..9a19f51d 100644 --- a/tests/unit/Makefile.inc +++ b/tests/unit/Makefile.inc @@ -9,7 +9,7 @@ UNITPROGS = unit1300 unit1301 unit1302 unit1303 unit1304 unit1305 unit1307 \ unit1308 unit1309 unit1323 \ unit1330 unit1394 unit1395 unit1396 unit1397 unit1398 \ unit1399 \ - unit1600 unit1601 unit1602 unit1603 unit1604 unit1605 unit1606 + unit1600 unit1601 unit1602 unit1603 unit1604 unit1605 unit1606 unit1607 unit1300_SOURCES = unit1300.c $(UNITFILES) unit1300_CPPFLAGS = $(AM_CPPFLAGS) @@ -85,3 +85,6 @@ unit1605_CPPFLAGS = $(AM_CPPFLAGS) unit1606_SOURCES = unit1606.c $(UNITFILES) unit1606_CPPFLAGS = $(AM_CPPFLAGS) + +unit1607_SOURCES = unit1607.c $(UNITFILES) +unit1607_CPPFLAGS = $(AM_CPPFLAGS) diff --git a/tests/unit/unit1307.c b/tests/unit/unit1307.c index 266eed39..0d2257bf 100644 --- a/tests/unit/unit1307.c +++ b/tests/unit/unit1307.c @@ -25,7 +25,6 @@ #define MATCH CURL_FNMATCH_MATCH #define NOMATCH CURL_FNMATCH_NOMATCH -#define RE_ERR CURL_FNMATCH_FAIL struct testcase { const char *pattern; @@ -36,8 +35,8 @@ struct testcase { static const struct testcase tests[] = { /* brackets syntax */ { "\\[", "[", MATCH }, - { "[", "[", RE_ERR }, - { "[]", "[]", RE_ERR }, + { "[", "[", MATCH }, + { "[]", "[]", MATCH }, { "[][]", "[", MATCH }, { "[][]", "]", MATCH }, { "[[]", "[", MATCH }, @@ -49,6 +48,8 @@ static const struct testcase tests[] = { { "[][[[]", "[", MATCH }, { "[[]", "]", NOMATCH }, + { "[a@]", "a", MATCH }, + { "[a-z]", "a", MATCH }, { "[a-z]", "A", NOMATCH }, { "?[a-z]", "?Z", NOMATCH }, @@ -77,6 +78,7 @@ static const struct testcase tests[] = { { "[][?*-]", "*", MATCH }, { "[][?*-]", "-", MATCH }, { "[]?*-]", "-", MATCH }, + { "[\xFF]", "\xFF", MATCH }, { "?/b/c", "a/b/c", MATCH }, { "^_{}~", "^_{}~", MATCH }, { "!#%+,-./01234567889", "!#%+,-./01234567889", MATCH }, @@ -97,8 +99,10 @@ static const struct testcase tests[] = { { "*[^a].t?t", "a.txt", NOMATCH }, { "*[^a].t?t", "ba.txt", NOMATCH }, { "*[^a].t?t", "ab.txt", MATCH }, - { "*[^a]", "", MATCH }, - { "[!ΓΏ]", "", MATCH }, + { "*[^a]", "", NOMATCH }, + { "[!\xFF]", "", NOMATCH }, + { "[!\xFF]", "\xFF", NOMATCH }, + { "[!\xFF]", "a", MATCH }, { "[!?*[]", "?", NOMATCH }, { "[!!]", "!", NOMATCH }, { "[!!]", "x", MATCH }, @@ -130,6 +134,8 @@ static const struct testcase tests[] = { { "[^[:blank:]]", "\t", NOMATCH }, { "[^[:print:]]", "\10", MATCH }, { "[[:lower:]][[:lower:]]", "ll", MATCH }, + { "[[:foo:]]", "bar", NOMATCH }, + { "[[:foo:]]", "f]", MATCH }, { "Curl[[:blank:]];-)", "Curl ;-)", MATCH }, { "*[[:blank:]]*", " ", MATCH }, @@ -167,7 +173,7 @@ static const struct testcase tests[] = { { "x", "", NOMATCH }, /* backslash */ - { "\\", "\\", RE_ERR }, + { "\\", "\\", MATCH }, { "\\\\", "\\", MATCH }, { "\\\\", "\\\\", NOMATCH }, { "\\?", "?", MATCH }, diff --git a/tests/unit/unit1309.c b/tests/unit/unit1309.c index c53cbcbc..9a07c933 100644 --- a/tests/unit/unit1309.c +++ b/tests/unit/unit1309.c @@ -22,6 +22,7 @@ #include "curlcheck.h" #include "splay.h" +#include "warnless.h" static CURLcode unit_setup(void) @@ -86,7 +87,8 @@ UNITTEST_START key.tv_usec = (541*i)%1023; payload = (size_t) key.tv_usec; - nodes[i].payload = (void *)payload; /* for simplicity */ + /* for simplicity */ + nodes[i].payload = CURLX_INTEGER_TO_POINTER_CAST(payload); root = Curl_splayinsert(key, root, &nodes[i]); } @@ -98,7 +100,7 @@ UNITTEST_START printf("Tree look:\n"); splayprint(root, 0, 1); printf("remove pointer %d, payload %ld\n", rem, - (long)(nodes[rem].payload)); + CURLX_POINTER_TO_INTEGER_CAST(nodes[rem].payload)); rc = Curl_splayremovebyaddr(root, &nodes[rem], &root); if(rc) { /* failed! */ @@ -119,7 +121,8 @@ UNITTEST_START /* add some nodes with the same key */ for(j = 0; j <= i % 3; j++) { size_t payload = key.tv_usec*10 + j; - nodes[i * 3 + j].payload = (void *)payload; /* for simplicity */ + /* for simplicity */ + nodes[i * 3 + j].payload = CURLX_INTEGER_TO_POINTER_CAST(payload); root = Curl_splayinsert(key, root, &nodes[i * 3 + j]); } } @@ -130,8 +133,9 @@ UNITTEST_START tv_now.tv_usec = i; root = Curl_splaygetbest(tv_now, root, &removed); while(removed != NULL) { - printf("removed payload %ld[%ld]\n", (long)(removed->payload) / 10, - (long)(removed->payload) % 10); + printf("removed payload %ld[%ld]\n", + CURLX_POINTER_TO_INTEGER_CAST(removed->payload) / 10, + CURLX_POINTER_TO_INTEGER_CAST(removed->payload) % 10); root = Curl_splaygetbest(tv_now, root, &removed); } } diff --git a/tests/unit/unit1607.c b/tests/unit/unit1607.c new file mode 100644 index 00000000..71c59939 --- /dev/null +++ b/tests/unit/unit1607.c @@ -0,0 +1,213 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "curlcheck.h" + +#include "urldata.h" +#include "connect.h" +#include "share.h" + +#include "memdebug.h" /* LAST include file */ + +static struct Curl_easy *easy; +static struct curl_hash *hostcache; + +static void unit_stop(void) +{ + curl_easy_cleanup(easy); + curl_global_cleanup(); +} + +static CURLcode unit_setup(void) +{ + int res = CURLE_OK; + + global_init(CURL_GLOBAL_ALL); + + easy = curl_easy_init(); + if(!easy) { + curl_global_cleanup(); + return CURLE_OUT_OF_MEMORY; + } + + hostcache = Curl_global_host_cache_init(); + if(!hostcache) { + unit_stop(); + return CURLE_OUT_OF_MEMORY; + } + + return res; +} + +struct testcase { + /* host:port:address[,address]... */ + const char *optval; + + /* lowercase host and port to retrieve the addresses from hostcache */ + const char *host; + int port; + + /* 0 to 9 addresses expected from hostcache */ + const char *address[10]; +}; + + +/* In builds without IPv6 support CURLOPT_RESOLVE should skip over those + addresses, so we have to do that as well. */ +static const char skip = 0; +#ifdef ENABLE_IPV6 +#define IPV6ONLY(x) x +#else +#define IPV6ONLY(x) &skip +#endif + +/* CURLOPT_RESOLVE address parsing tests */ +static const struct testcase tests[] = { + /* spaces aren't allowed, for now */ + { "test.com:80:127.0.0.1, 127.0.0.2", + "test.com", 80, { NULL, } + }, + { "TEST.com:80:,,127.0.0.1,,,127.0.0.2,,,,::1,,,", + "test.com", 80, { "127.0.0.1", "127.0.0.2", IPV6ONLY("::1"), } + }, + { "test.com:80:::1,127.0.0.1", + "test.com", 80, { IPV6ONLY("::1"), "127.0.0.1", } + }, + { "test.com:80:[::1],127.0.0.1", + "test.com", 80, { IPV6ONLY("::1"), "127.0.0.1", } + }, + { "test.com:80:::1", + "test.com", 80, { IPV6ONLY("::1"), } + }, + { "test.com:80:[::1]", + "test.com", 80, { IPV6ONLY("::1"), } + }, + { "test.com:80:127.0.0.1", + "test.com", 80, { "127.0.0.1", } + }, + { "test.com:80:,127.0.0.1", + "test.com", 80, { "127.0.0.1", } + }, + { "test.com:80:127.0.0.1,", + "test.com", 80, { "127.0.0.1", } + }, + { "test.com:0:127.0.0.1", + "test.com", 0, { "127.0.0.1", } + }, +}; + +UNITTEST_START + int i; + int testnum = sizeof(tests) / sizeof(struct testcase); + + for(i = 0; i < testnum; ++i, curl_easy_reset(easy)) { + int j; + int addressnum = sizeof tests[i].address / sizeof *tests[i].address; + struct Curl_addrinfo *addr; + struct Curl_dns_entry *dns; + struct curl_slist *list; + void *entry_id; + bool problem = false; + + Curl_hostcache_clean(easy, hostcache); + easy->dns.hostcache = hostcache; + easy->dns.hostcachetype = HCACHE_GLOBAL; + + list = curl_slist_append(NULL, tests[i].optval); + if(!list) + goto unit_test_abort; + curl_easy_setopt(easy, CURLOPT_RESOLVE, list); + + Curl_loadhostpairs(easy); + + entry_id = (void *)aprintf("%s:%d", tests[i].host, tests[i].port); + if(!entry_id) { + curl_slist_free_all(list); + goto unit_test_abort; + } + dns = Curl_hash_pick(easy->dns.hostcache, entry_id, strlen(entry_id) + 1); + free(entry_id); + entry_id = NULL; + + addr = dns ? dns->addr : NULL; + + for(j = 0; j < addressnum; ++j) { + long port = 0; + char ipaddress[MAX_IPADR_LEN] = {0}; + + if(!addr && !tests[i].address[j]) + break; + + if(tests[i].address[j] == &skip) + continue; + + if(addr && !Curl_getaddressinfo(addr->ai_addr, + ipaddress, &port)) { + fprintf(stderr, "%s:%d tests[%d] failed. getaddressinfo failed.\n", + __FILE__, __LINE__, i); + problem = true; + break; + } + + if(addr && !tests[i].address[j]) { + fprintf(stderr, "%s:%d tests[%d] failed. the retrieved addr " + "is %s but tests[%d].address[%d] is NULL.\n", + __FILE__, __LINE__, i, ipaddress, i, j); + problem = true; + break; + } + + if(!addr && tests[i].address[j]) { + fprintf(stderr, "%s:%d tests[%d] failed. the retrieved addr " + "is NULL but tests[%d].address[%d] is %s.\n", + __FILE__, __LINE__, i, i, j, tests[i].address[j]); + problem = true; + break; + } + + if(!curl_strequal(ipaddress, tests[i].address[j])) { + fprintf(stderr, "%s:%d tests[%d] failed. the retrieved addr " + "%s is not equal to tests[%d].address[%d] %s.\n", + __FILE__, __LINE__, i, ipaddress, i, j, tests[i].address[j]); + problem = true; + break; + } + + if(port != tests[i].port) { + fprintf(stderr, "%s:%d tests[%d] failed. the retrieved port " + "for tests[%d].address[%d] is %ld but tests[%d].port is %d.\n", + __FILE__, __LINE__, i, i, j, port, i, tests[i].port); + problem = true; + break; + } + + addr = addr->ai_next; + } + + Curl_hostcache_clean(easy, easy->dns.hostcache); + curl_slist_free_all(list); + + if(problem) { + unitfail++; + continue; + } + } +UNITTEST_STOP |