Annotation of embedaddon/curl/tests/unit/unit1607.c, revision 1.1.1.1
1.1 misho 1: /***************************************************************************
2: * _ _ ____ _
3: * Project ___| | | | _ \| |
4: * / __| | | | |_) | |
5: * | (__| |_| | _ <| |___
6: * \___|\___/|_| \_\_____|
7: *
8: * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
9: *
10: * This software is licensed as described in the file COPYING, which
11: * you should have received as part of this distribution. The terms
12: * are also available at https://curl.haxx.se/docs/copyright.html.
13: *
14: * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15: * copies of the Software, and permit persons to whom the Software is
16: * furnished to do so, under the terms of the COPYING file.
17: *
18: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19: * KIND, either express or implied.
20: *
21: ***************************************************************************/
22: #include "curlcheck.h"
23:
24: #include "urldata.h"
25: #include "connect.h"
26: #include "share.h"
27:
28: #include "memdebug.h" /* LAST include file */
29:
30: static void unit_stop(void)
31: {
32: curl_global_cleanup();
33: }
34:
35: static CURLcode unit_setup(void)
36: {
37: int res = CURLE_OK;
38:
39: global_init(CURL_GLOBAL_ALL);
40:
41: return res;
42: }
43:
44: struct testcase {
45: /* host:port:address[,address]... */
46: const char *optval;
47:
48: /* lowercase host and port to retrieve the addresses from hostcache */
49: const char *host;
50: int port;
51:
52: /* 0 to 9 addresses expected from hostcache */
53: const char *address[10];
54: };
55:
56:
57: /* In builds without IPv6 support CURLOPT_RESOLVE should skip over those
58: addresses, so we have to do that as well. */
59: static const char skip = 0;
60: #ifdef ENABLE_IPV6
61: #define IPV6ONLY(x) x
62: #else
63: #define IPV6ONLY(x) &skip
64: #endif
65:
66: /* CURLOPT_RESOLVE address parsing tests */
67: static const struct testcase tests[] = {
68: /* spaces aren't allowed, for now */
69: { "test.com:80:127.0.0.1, 127.0.0.2",
70: "test.com", 80, { NULL, }
71: },
72: { "TEST.com:80:,,127.0.0.1,,,127.0.0.2,,,,::1,,,",
73: "test.com", 80, { "127.0.0.1", "127.0.0.2", IPV6ONLY("::1"), }
74: },
75: { "test.com:80:::1,127.0.0.1",
76: "test.com", 80, { IPV6ONLY("::1"), "127.0.0.1", }
77: },
78: { "test.com:80:[::1],127.0.0.1",
79: "test.com", 80, { IPV6ONLY("::1"), "127.0.0.1", }
80: },
81: { "test.com:80:::1",
82: "test.com", 80, { IPV6ONLY("::1"), }
83: },
84: { "test.com:80:[::1]",
85: "test.com", 80, { IPV6ONLY("::1"), }
86: },
87: { "test.com:80:127.0.0.1",
88: "test.com", 80, { "127.0.0.1", }
89: },
90: { "test.com:80:,127.0.0.1",
91: "test.com", 80, { "127.0.0.1", }
92: },
93: { "test.com:80:127.0.0.1,",
94: "test.com", 80, { "127.0.0.1", }
95: },
96: { "test.com:0:127.0.0.1",
97: "test.com", 0, { "127.0.0.1", }
98: },
99: };
100:
101: UNITTEST_START
102: {
103: int i;
104: int testnum = sizeof(tests) / sizeof(struct testcase);
105: struct Curl_multi *multi = NULL;
106: struct Curl_easy *easy = NULL;
107: struct curl_slist *list = NULL;
108:
109: for(i = 0; i < testnum; ++i) {
110: int j;
111: int addressnum = sizeof(tests[i].address) / sizeof(*tests[i].address);
112: struct Curl_addrinfo *addr;
113: struct Curl_dns_entry *dns;
114: void *entry_id;
115: bool problem = false;
116: easy = curl_easy_init();
117: if(!easy)
118: goto error;
119:
120: /* create a multi handle and add the easy handle to it so that the
121: hostcache is setup */
122: multi = curl_multi_init();
123: curl_multi_add_handle(multi, easy);
124:
125: list = curl_slist_append(NULL, tests[i].optval);
126: if(!list)
127: goto error;
128: curl_easy_setopt(easy, CURLOPT_RESOLVE, list);
129:
130: Curl_loadhostpairs(easy);
131:
132: entry_id = (void *)aprintf("%s:%d", tests[i].host, tests[i].port);
133: if(!entry_id)
134: goto error;
135: dns = Curl_hash_pick(easy->dns.hostcache, entry_id, strlen(entry_id) + 1);
136: free(entry_id);
137: entry_id = NULL;
138:
139: addr = dns ? dns->addr : NULL;
140:
141: for(j = 0; j < addressnum; ++j) {
142: long port = 0;
143: char ipaddress[MAX_IPADR_LEN] = {0};
144:
145: if(!addr && !tests[i].address[j])
146: break;
147:
148: if(tests[i].address[j] == &skip)
149: continue;
150:
151: if(addr && !Curl_addr2string(addr->ai_addr, addr->ai_addrlen,
152: ipaddress, &port)) {
153: fprintf(stderr, "%s:%d tests[%d] failed. getaddressinfo failed.\n",
154: __FILE__, __LINE__, i);
155: problem = true;
156: break;
157: }
158:
159: if(addr && !tests[i].address[j]) {
160: fprintf(stderr, "%s:%d tests[%d] failed. the retrieved addr "
161: "is %s but tests[%d].address[%d] is NULL.\n",
162: __FILE__, __LINE__, i, ipaddress, i, j);
163: problem = true;
164: break;
165: }
166:
167: if(!addr && tests[i].address[j]) {
168: fprintf(stderr, "%s:%d tests[%d] failed. the retrieved addr "
169: "is NULL but tests[%d].address[%d] is %s.\n",
170: __FILE__, __LINE__, i, i, j, tests[i].address[j]);
171: problem = true;
172: break;
173: }
174:
175: if(!curl_strequal(ipaddress, tests[i].address[j])) {
176: fprintf(stderr, "%s:%d tests[%d] failed. the retrieved addr "
177: "%s is not equal to tests[%d].address[%d] %s.\n",
178: __FILE__, __LINE__, i, ipaddress, i, j, tests[i].address[j]);
179: problem = true;
180: break;
181: }
182:
183: if(port != tests[i].port) {
184: fprintf(stderr, "%s:%d tests[%d] failed. the retrieved port "
185: "for tests[%d].address[%d] is %ld but tests[%d].port is %d.\n",
186: __FILE__, __LINE__, i, i, j, port, i, tests[i].port);
187: problem = true;
188: break;
189: }
190:
191: if(dns->timestamp != 0) {
192: fprintf(stderr, "%s:%d tests[%d] failed. the timestamp is not zero. "
193: "for tests[%d].address[%d\n",
194: __FILE__, __LINE__, i, i, j);
195: problem = true;
196: break;
197: }
198:
199: addr = addr->ai_next;
200: }
201:
202: curl_easy_cleanup(easy);
203: easy = NULL;
204: curl_multi_cleanup(multi);
205: multi = NULL;
206: curl_slist_free_all(list);
207: list = NULL;
208:
209: if(problem) {
210: unitfail++;
211: continue;
212: }
213: }
214: error:
215: curl_easy_cleanup(easy);
216: curl_multi_cleanup(multi);
217: curl_slist_free_all(list);
218: }
219: UNITTEST_STOP
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>