webservices: Implement WsDecodeUrl.
[wine.git] / dlls / webservices / tests / url.c
blob45b6745ec59cae53d97848ef70df00fa86fa1f14
1 /*
2 * Copyright 2016 Hans Leidekker for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include <stdio.h>
20 #include "windows.h"
21 #include "webservices.h"
22 #include "wine/test.h"
24 static void test_WsDecodeUrl(void)
26 static WCHAR url1[] = {'h','t','t','p',':','/','/','h','o','s','t',0};
27 static WCHAR url2[] = {'h','t','t','p','s',':','/','/','h','o','s','t',0};
28 static WCHAR url3[] = {'h','t','t','p',':','/','/','h','o','s','t',':','8','0',0};
29 static WCHAR url4[] = {'h','t','t','p','s',':','/','/','h','o','s','t',':','8','0',0};
30 static WCHAR url5[] = {'h','t','t','p',':','/','/','h','o','s','t','/','p','a','t','h',0};
31 static WCHAR url6[] = {'h','t','t','p',':','/','/','h','o','s','t','/','p','a','t','h','?',
32 'q','u','e','r','y',0};
33 static WCHAR url7[] = {'h','t','t','p',':','/','/','h','o','s','t','/','p','a','t','h','?',
34 'q','u','e','r','y','#','f','r','a','g',0};
35 static WCHAR url8[] = {'H','T','T','P',':','/','/','h','o','s','t',0};
36 static WCHAR url9[] = {'h','t','t','q',':','/','/','h','o','s','t',0};
37 static WCHAR url10[] = {'h','t','t','p',':',0};
38 static WCHAR url11[] = {'h','t','t','p',0};
39 static WCHAR url12[] = {'n','e','t','.','t','c','p',':','/','/','h','o','s','t',0};
40 static WCHAR url13[] = {'s','o','a','p','.','u','d','p',':','/','/','h','o','s','t',0};
41 static WCHAR url14[] = {'n','e','t','.','p','i','p','e',':','/','/','h','o','s','t',0};
42 static WCHAR url15[] = {'h','t','t','p',':','/','h','o','s','t',0};
43 static WCHAR url16[] = {'h','t','t','p',':','h','o','s','t',0};
44 static WCHAR url17[] = {'h','t','t','p',':','/','/','/','h','o','s','t',0};
45 static WCHAR url18[] = {'h','t','t','p',':','/','/','h','o','s','t','/',0};
46 static WCHAR url19[] = {'h','t','t','p',':','/','/','h','o','s','t',':','/',0};
47 static WCHAR url20[] = {'h','t','t','p',':','/','/','h','o','s','t',':','6','5','5','3','6',0};
48 static WCHAR url21[] = {'h','t','t','p',':','/','/','h','o','s','t','?','q','u','e','r','y',0};
49 static WCHAR url22[] = {'h','t','t','p',':','/','/','h','o','s','t','#','f','r','a','g',0};
50 static WCHAR url23[] = {'h','t','t','p',':','/','/','h','o','s','t','%','2','0','2',0};
51 static WCHAR url24[] = {'h','t','t','p',':','/','/','h','o','s','t','/','p','a','t','h',
52 '%','2','0','2',0};
53 static WCHAR url25[] = {'h','t','t','p',':','/','/','h','o','s','t','?','q','u','e','r','y',
54 '%','2','0','2',0};
55 static WCHAR url26[] = {'h','t','t','p',':','/','/','h','o','s','t','#','f','r','a','g',
56 '%','2','0','2',0};
57 static WCHAR host2[] = {'h','o','s','t',' ','2'};
58 static WCHAR path2[] = {'/','p','a','t','h',' ','2'};
59 static WCHAR query2[] = {'q','u','e','r','y',' ','2'};
60 static WCHAR frag2[] = {'f','r','a','g',' ','2'};
61 static const struct
63 WCHAR *str;
64 HRESULT hr;
65 WS_URL_SCHEME_TYPE scheme;
66 WCHAR *host;
67 ULONG host_len;
68 USHORT port;
69 WCHAR *port_str;
70 ULONG port_len;
71 WCHAR *path;
72 ULONG path_len;
73 WCHAR *query;
74 ULONG query_len;
75 WCHAR *fragment;
76 ULONG fragment_len;
78 tests[] =
80 { url1, S_OK, WS_URL_HTTP_SCHEME_TYPE, url1 + 7, 4, 80 },
81 { url2, S_OK, WS_URL_HTTPS_SCHEME_TYPE, url2 + 8, 4, 443 },
82 { url3, S_OK, WS_URL_HTTP_SCHEME_TYPE, url3 + 7, 4, 80, url3 + 12, 2 },
83 { url4, S_OK, WS_URL_HTTPS_SCHEME_TYPE, url4 + 8, 4, 80, url4 + 13, 2 },
84 { url5, S_OK, WS_URL_HTTP_SCHEME_TYPE, url5 + 7, 4, 80, NULL, 0, url5 + 11, 5 },
85 { url6, S_OK, WS_URL_HTTP_SCHEME_TYPE, url5 + 7, 4, 80, NULL, 0, url6 + 11, 5, url6 + 17, 5 },
86 { url7, S_OK, WS_URL_HTTP_SCHEME_TYPE, url5 + 7, 4, 80, NULL, 0, url7 + 11, 5, url7 + 17, 5,
87 url7 + 23, 4 },
88 { url8, S_OK, WS_URL_HTTP_SCHEME_TYPE, url1 + 7, 4, 80 },
89 { url9, WS_E_INVALID_FORMAT },
90 { url10, WS_E_INVALID_FORMAT },
91 { url11, WS_E_INVALID_FORMAT },
92 { url12, S_OK, WS_URL_NETTCP_SCHEME_TYPE, url12 + 10, 4, 808 },
93 { url13, S_OK, WS_URL_SOAPUDP_SCHEME_TYPE, url13 + 11, 4, 65535 },
94 { url14, S_OK, WS_URL_NETPIPE_SCHEME_TYPE, url14 + 11, 4, 65535 },
95 { url15, WS_E_INVALID_FORMAT },
96 { url16, WS_E_INVALID_FORMAT },
97 { url17, WS_E_INVALID_FORMAT },
98 { url18, S_OK, WS_URL_HTTP_SCHEME_TYPE, url18 + 7, 4, 80, NULL, 0, url18 + 11, 1 },
99 { url19, S_OK, WS_URL_HTTP_SCHEME_TYPE, url19 + 7, 4, 80, NULL, 0, url19 + 12, 1 },
100 { url20, WS_E_INVALID_FORMAT },
101 { url21, S_OK, WS_URL_HTTP_SCHEME_TYPE, url21 + 7, 4, 80, NULL, 0, NULL, 0, url21 + 12, 5 },
102 { url22, S_OK, WS_URL_HTTP_SCHEME_TYPE, url22 + 7, 4, 80, NULL, 0, NULL, 0, NULL, 0,
103 url22 + 12, 4 },
104 { url23, S_OK, WS_URL_HTTP_SCHEME_TYPE, host2, 6, 80 },
105 { url24, S_OK, WS_URL_HTTP_SCHEME_TYPE, url24 + 7, 4, 80, NULL, 0, path2, 7 },
106 { url25, S_OK, WS_URL_HTTP_SCHEME_TYPE, url24 + 7, 4, 80, NULL, 0, NULL, 0, query2, 7 },
107 { url26, S_OK, WS_URL_HTTP_SCHEME_TYPE, url24 + 7, 4, 80, NULL, 0, NULL, 0, NULL, 0, frag2, 6 },
109 WS_HEAP *heap;
110 WS_STRING str;
111 WS_HTTP_URL *url;
112 HRESULT hr;
113 UINT i;
115 hr = WsCreateHeap( 1 << 16, 0, NULL, 0, &heap, NULL );
116 ok( hr == S_OK, "got %08x\n", hr );
118 hr = WsDecodeUrl( NULL, 0, heap, (WS_URL **)&url, NULL );
119 ok( hr == E_INVALIDARG, "got %08x\n", hr );
121 str.chars = NULL;
122 str.length = 0;
123 hr = WsDecodeUrl( &str, 0, heap, (WS_URL **)&url, NULL );
124 ok( hr == WS_E_INVALID_FORMAT, "got %08x\n", hr );
126 str.chars = url1;
127 str.length = lstrlenW( url1 );
128 hr = WsDecodeUrl( &str, 0, NULL, (WS_URL **)&url, NULL );
129 ok( hr == E_INVALIDARG, "got %08x\n", hr );
131 for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
133 static const WCHAR netpipe[] = {'n','e','t','.','p','i','p','e'};
135 str.length = lstrlenW( tests[i].str );
136 str.chars = tests[i].str;
137 url = NULL;
138 hr = WsDecodeUrl( &str, 0, heap, (WS_URL **)&url, NULL );
139 ok( hr == tests[i].hr ||
140 broken(hr == WS_E_INVALID_FORMAT && str.length >= 8 && !memcmp(netpipe, str.chars, 8)),
141 "%u: got %08x\n", i, hr );
142 if (hr != S_OK) continue;
144 ok( url->url.scheme == tests[i].scheme, "%u: got %u\n", i, url->url.scheme );
145 ok( url->port == tests[i].port, "%u: got %u\n", i, url->port );
147 if (tests[i].host)
149 ok( url->host.length == tests[i].host_len, "%u: got %u\n", i, url->host.length );
150 ok( !memcmp( url->host.chars, tests[i].host, url->host.length * sizeof(WCHAR) ),
151 "%u: got %s\n", i, wine_dbgstr_wn(url->host.chars, url->host.length) );
153 else ok( !url->host.length, "%u: got %u\n", i, url->host.length );
155 if (tests[i].port_str)
157 ok( url->portAsString.length == tests[i].port_len, "%u: got %u\n", i, url->portAsString.length );
158 ok( !memcmp( url->portAsString.chars, tests[i].port_str, url->portAsString.length * sizeof(WCHAR) ),
159 "%u: got %s\n", i, wine_dbgstr_wn(url->portAsString.chars, url->portAsString.length) );
161 else ok( !url->portAsString.length, "%u: got %u\n", i, url->portAsString.length );
163 if (tests[i].path)
165 ok( url->path.length == tests[i].path_len, "%u: got %u\n", i, url->path.length );
166 ok( !memcmp( url->path.chars, tests[i].path, url->path.length * sizeof(WCHAR) ),
167 "%u: got %s\n", i, wine_dbgstr_wn(url->path.chars, url->path.length) );
169 else ok( !url->path.length, "%u: got %u\n", i, url->path.length );
171 if (tests[i].query)
173 ok( url->query.length == tests[i].query_len, "%u: got %u\n", i, url->query.length );
174 ok( !memcmp( url->query.chars, tests[i].query, url->query.length * sizeof(WCHAR) ),
175 "%u: got %s\n", i, wine_dbgstr_wn(url->query.chars, url->query.length) );
177 else ok( !url->query.length, "%u: got %u\n", i, url->query.length );
179 if (tests[i].fragment)
181 ok( url->fragment.length == tests[i].fragment_len, "%u: got %u\n", i, url->fragment.length );
182 ok( !memcmp( url->fragment.chars, tests[i].fragment, url->fragment.length * sizeof(WCHAR) ),
183 "%u: got %s\n", i, wine_dbgstr_wn(url->fragment.chars, url->fragment.length) );
185 else ok( !url->fragment.length, "%u: got %u\n", i, url->fragment.length );
188 WsFreeHeap( heap );
191 START_TEST(url)
193 test_WsDecodeUrl();