File: uri-test.cpp

package info (click to toggle)
libzeep 7.3.2-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,372 kB
  • sloc: cpp: 17,430; javascript: 180; makefile: 12; sh: 11
file content (267 lines) | stat: -rw-r--r-- 10,287 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
//          Copyright Maarten L. Hekkelman 2026
// Distributed under the Boost Software License, Version 1.0.
//    (See accompanying file LICENSE_1_0.txt or copy at
//          http://www.boost.org/LICENSE_1_0.txt)

#include <catch2/catch_test_macros.hpp>

#include <zeep/uri.hpp>

#include <cctype>
#include <string>
#include <vector>

TEST_CASE("cc_1")
{
	for (int ch = 0; ch <= 255; ++ch)
	{
		// std::cout << ch << ' ' << char(ch) << '\n';
		CHECK((std::isalpha(ch) != 0) == zeep::uri::is_scheme_start(ch));
		CHECK((std::isxdigit(ch) != 0) == zeep::uri::is_xdigit(ch));
	}
}

TEST_CASE("uri_1")
{
	zeep::is_valid_uri("http://a/");

	zeep::is_valid_uri("http://a:80/");

	zeep::is_valid_uri("http://a.b/");
	zeep::is_valid_uri("http://a/b");

	zeep::is_valid_uri("http://user@a/b");
	zeep::is_valid_uri("http://user:pass@a/b");
	zeep::is_valid_uri("http://user:pass@a:80/b");

	zeep::is_valid_uri("http://a?q");
	zeep::is_valid_uri("http://a#f");

	zeep::is_valid_uri("http://a/b?q");
	zeep::is_valid_uri("http://a/b#f");

	zeep::is_valid_uri("http://a/b/c?q");
	zeep::is_valid_uri("http://a/b/c#f");

	zeep::is_valid_uri("http://a/b/c.d?q");
	zeep::is_valid_uri("http://a/b/c.d#f");

	zeep::is_valid_uri("http://user@localhost/segment/index.html#frag");
	zeep::is_valid_uri("http://user@[::1]/segment/index.html#frag");
	zeep::is_valid_uri("http://user:pass@[::1]/segment/index.html#frag");

	zeep::is_valid_uri("http://user@localhost/segment/index.html?query");
	zeep::is_valid_uri("http://user@[::1]/segment/index.html?query");
	zeep::is_valid_uri("http://user:pass@[::1]/segment/index.html?query");

	zeep::is_valid_uri("http://user@localhost/segment/index.html?query#frag");
	zeep::is_valid_uri("http://user@[::1]/segment/index.html?query#frag");
	zeep::is_valid_uri("http://user:pass@[::1]/segment/index.html?query#frag");
}

TEST_CASE("uri_2")
{
	zeep::uri url("http://user:pass@[::1]/segment/index.html?query#frag");

	CHECK(url.get_scheme() == "http");
	CHECK(url.get_host() == "[::1]");
	CHECK(url.get_path().string() == "/segment/index.html");
	CHECK(url.get_query(false) == "query");
	CHECK(url.get_fragment(false) == "frag");
}

TEST_CASE("uri_3")
{
	zeep::uri url("http://www.example.com/~maarten");

	CHECK(url.get_path().string() == "/~maarten");
}

TEST_CASE("uri_4")
{
	zeep::uri url("http://www.example.com/%7Emaarten");

	CHECK(url.get_path().string() == "/~maarten");
}

TEST_CASE("uri_5")
{
	// This is a bit dubious... but it is valid according to RFC3986

	zeep::uri uri("http://a/b%0D%0ASet-Cookie:%20false");

	CHECK(uri.get_segments().front() == "b\r\nSet-Cookie: false");
}

TEST_CASE("uri_6a")
{
	zeep::uri uri("file:/a/b");
	CHECK(uri.is_absolute());
	CHECK(uri.get_path().string() == "/a/b");
}

TEST_CASE("uri_6b")
{
	zeep::uri uri("file://a/b");
	CHECK(uri.is_absolute());
	CHECK(uri.get_host() == "a");
	CHECK(uri.get_path().string() == "/b");
}

TEST_CASE("uri_6c")
{
	CHECK_THROWS_AS(zeep::uri("file://a"), zeep::uri_parse_error);
	CHECK_THROWS_AS(zeep::uri("file://a?b"), zeep::uri_parse_error);
	CHECK_THROWS_AS(zeep::uri("file://a#c"), zeep::uri_parse_error);
}

TEST_CASE("normalize_1")
{
	zeep::uri base("http://a/b/c/d;p?q");

	CHECK(zeep::uri("g:h", base).string() == "g:h");
	CHECK(zeep::uri("g", base).string() == "http://a/b/c/g");
	CHECK(zeep::uri("./g", base).string() == "http://a/b/c/g");
	CHECK(zeep::uri("g/", base).string() == "http://a/b/c/g/");
	CHECK(zeep::uri("/g", base).string() == "http://a/g");
	CHECK(zeep::uri("//g", base).string() == "http://g");
	CHECK(zeep::uri("?y", base).string() == "http://a/b/c/d;p?y");
	CHECK(zeep::uri("g?y", base).string() == "http://a/b/c/g?y");
	CHECK(zeep::uri("#s", base).string() == "http://a/b/c/d;p?q#s");
	CHECK(zeep::uri("g#s", base).string() == "http://a/b/c/g#s");
	CHECK(zeep::uri("g?y#s", base).string() == "http://a/b/c/g?y#s");
	CHECK(zeep::uri(";x", base).string() == "http://a/b/c/;x");
	CHECK(zeep::uri("g;x", base).string() == "http://a/b/c/g;x");
	CHECK(zeep::uri("g;x?y#s", base).string() == "http://a/b/c/g;x?y#s");
	CHECK(zeep::uri("", base).string() == "http://a/b/c/d;p?q");
	CHECK(zeep::uri(".", base).string() == "http://a/b/c/");
	CHECK(zeep::uri("./", base).string() == "http://a/b/c/");
	CHECK(zeep::uri("..", base).string() == "http://a/b/");
	CHECK(zeep::uri("../", base).string() == "http://a/b/");
	CHECK(zeep::uri("../g", base).string() == "http://a/b/g");
	CHECK(zeep::uri("../..", base).string() == "http://a/");
	CHECK(zeep::uri("../../", base).string() == "http://a/");
	CHECK(zeep::uri("../../g", base).string() == "http://a/g");
}

TEST_CASE("normalize_2")
{
	zeep::uri base("http://a/b/c/d;p?q");

	CHECK(zeep::uri("../../../g", base).string() == "http://a/g");
	CHECK(zeep::uri("../../../../g", base).string() == "http://a/g");
	CHECK(zeep::uri("/./g", base).string() == "http://a/g");
	CHECK(zeep::uri("/../g", base).string() == "http://a/g");
	CHECK(zeep::uri("g.", base).string() == "http://a/b/c/g.");
	CHECK(zeep::uri(".g", base).string() == "http://a/b/c/.g");
	CHECK(zeep::uri("g..", base).string() == "http://a/b/c/g..");
	CHECK(zeep::uri("..g", base).string() == "http://a/b/c/..g");
	CHECK(zeep::uri("./../g", base).string() == "http://a/b/g");
	CHECK(zeep::uri("./g/.", base).string() == "http://a/b/c/g/");
	CHECK(zeep::uri("g/./h", base).string() == "http://a/b/c/g/h");
	CHECK(zeep::uri("g/../h", base).string() == "http://a/b/c/h");
	CHECK(zeep::uri("g;x=1/./y", base).string() == "http://a/b/c/g;x=1/y");
	CHECK(zeep::uri("g;x=1/../y", base).string() == "http://a/b/c/y");
	CHECK(zeep::uri("g?y/./x", base).string() == "http://a/b/c/g?y/./x");
	CHECK(zeep::uri("g?y/../x", base).string() == "http://a/b/c/g?y/../x");
	CHECK(zeep::uri("g#s/./x", base).string() == "http://a/b/c/g#s/./x");
	CHECK(zeep::uri("g#s/../x", base).string() == "http://a/b/c/g#s/../x");
	//    ; for strict parsers
	CHECK(zeep::uri("http:g", base).string() == "http:g");
	//   /  "http://a/b/c/g" ; for backward compatibility
}

TEST_CASE("path_1")
{
	zeep::uri t("http://a/b");

	t.set_path("c");
	CHECK(t.get_path().string() == "c");
	t.set_path("/c");
	CHECK(t.get_path().string() == "/c");
	t.set_path("/c/");
	CHECK(t.get_path().string() == "/c/");
	t.set_path("c/d");
	CHECK(t.get_path().string() == "c/d");
	t.set_path("/c/d");
	CHECK(t.get_path().string() == "/c/d");
	t.set_path("/c/d/");
	CHECK(t.get_path().string() == "/c/d/");
}

TEST_CASE("path_2")
{
	zeep::uri t("http://a/b");
	zeep::uri u;

	u = t / zeep::uri("c");
	CHECK(u.string() == "http://a/b/c");
	u = t / zeep::uri("/c");
	CHECK(u.string() == "http://a/b/c");
	u = t / zeep::uri("/c/");
	CHECK(u.string() == "http://a/b/c/");
	u = t / zeep::uri("c/d");
	CHECK(u.string() == "http://a/b/c/d");
	u = t / zeep::uri("/c/d");
	CHECK(u.string() == "http://a/b/c/d");
	u = t / zeep::uri("/c/d/");
	CHECK(u.string() == "http://a/b/c/d/");
}

TEST_CASE("relative_1")
{
	zeep::uri base("http://a/b/c/d;p?q");
	zeep::uri u;

	CHECK(zeep::uri("g:h").relative(base).string() == "g:h");
	CHECK(zeep::uri("http://a/b/c/g").relative(base).string() == "g");
	CHECK(zeep::uri("http://a/b/c/g/").relative(base).string() == "g/");
	CHECK(zeep::uri("http://a/g").relative(base).string() == "/g");
	CHECK(zeep::uri("http://g").relative(base).string() == "//g");
	CHECK(zeep::uri("http://a/b/c/d;p?y").relative(base).string() == "?y");
	CHECK(zeep::uri("http://a/b/c/g?y").relative(base).string() == "g?y");
	CHECK(zeep::uri("http://a/b/c/d;p?q#s").relative(base).string() == "#s");
	CHECK(zeep::uri("http://a/b/c/g#s").relative(base).string() == "g#s");
	CHECK(zeep::uri("http://a/b/c/g?y#s").relative(base).string() == "g?y#s");
	CHECK(zeep::uri("http://a/b/c/;x").relative(base).string() == ";x");
	CHECK(zeep::uri("http://a/b/c/g;x").relative(base).string() == "g;x");
	CHECK(zeep::uri("http://a/b/c/g;x?y#s").relative(base).string() == "g;x?y#s");
	CHECK(zeep::uri("http://a/b/c/d;p?q").relative(base).string() == "");
	CHECK(zeep::uri("http://a/b/c/").relative(base).string() == ".");
	CHECK(zeep::uri("http://a/b/").relative(base).string() == "..");
	CHECK(zeep::uri("http://a/b/g").relative(base).string() == "../g");
}

TEST_CASE("relative_2")
{
	zeep::uri base("http://a/b/c/d;p?q");
	zeep::uri u;

	CHECK(zeep::uri(zeep::uri("g:h").relative(base).string(), base).string() == "g:h");
	CHECK(zeep::uri(zeep::uri("http://a/b/c/g").relative(base).string(), base).string() == "http://a/b/c/g");
	CHECK(zeep::uri(zeep::uri("http://a/b/c/g/").relative(base).string(), base).string() == "http://a/b/c/g/");
	CHECK(zeep::uri(zeep::uri("http://a/g").relative(base).string(), base).string() == "http://a/g");
	CHECK(zeep::uri(zeep::uri("http://g").relative(base).string(), base).string() == "http://g");
	CHECK(zeep::uri(zeep::uri("http://a/b/c/d;p?y").relative(base).string(), base).string() == "http://a/b/c/d;p?y");
	CHECK(zeep::uri(zeep::uri("http://a/b/c/g?y").relative(base).string(), base).string() == "http://a/b/c/g?y");
	CHECK(zeep::uri(zeep::uri("http://a/b/c/d;p?q#s").relative(base).string(), base).string() == "http://a/b/c/d;p?q#s");
	CHECK(zeep::uri(zeep::uri("http://a/b/c/g#s").relative(base).string(), base).string() == "http://a/b/c/g#s");
	CHECK(zeep::uri(zeep::uri("http://a/b/c/g?y#s").relative(base).string(), base).string() == "http://a/b/c/g?y#s");
	CHECK(zeep::uri(zeep::uri("http://a/b/c/;x").relative(base).string(), base).string() == "http://a/b/c/;x");
	CHECK(zeep::uri(zeep::uri("http://a/b/c/g;x").relative(base).string(), base).string() == "http://a/b/c/g;x");
	CHECK(zeep::uri(zeep::uri("http://a/b/c/g;x?y#s").relative(base).string(), base).string() == "http://a/b/c/g;x?y#s");
	CHECK(zeep::uri(zeep::uri("http://a/b/c/d;p?q").relative(base).string(), base).string() == "http://a/b/c/d;p?q");
	CHECK(zeep::uri(zeep::uri("http://a/b/c/").relative(base).string(), base).string() == "http://a/b/c/");
	CHECK(zeep::uri(zeep::uri("http://a/b/").relative(base).string(), base).string() == "http://a/b/");
	CHECK(zeep::uri(zeep::uri("http://a/b/g").relative(base).string(), base).string() == "http://a/b/g");
}

TEST_CASE("encoding_1")
{
	// http://a/höken/Ðuh?¤
	zeep::uri u("http://a/h%C3%B6ken/%C3%90uh?%C2%A4");

	CHECK(zeep::decode_url(u.get_path().string()) == "/höken/Ðuh");
	CHECK(zeep::decode_url(u.get_query(false)) == "¤");
	CHECK(u.get_query(true) == "¤");
}