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
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',
53 static WCHAR url25
[] = {'h','t','t','p',':','/','/','h','o','s','t','?','q','u','e','r','y',
55 static WCHAR url26
[] = {'h','t','t','p',':','/','/','h','o','s','t','#','f','r','a','g',
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'};
65 WS_URL_SCHEME_TYPE scheme
;
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,
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,
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 },
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
);
123 hr
= WsDecodeUrl( &str
, 0, heap
, (WS_URL
**)&url
, NULL
);
124 ok( hr
== WS_E_INVALID_FORMAT
, "got %08x\n", hr
);
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
;
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
);
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
);
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
);
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
);