summaryrefslogtreecommitdiff
path: root/libadhocutil/unittests/testUriParse.cpp
blob: ff49e40052a5d7398043b43caf916ce64f0b30f5 (plain)
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
#define BOOST_TEST_MODULE UriParse
#include <boost/test/unit_test.hpp>

#include "boost-test-extra.h"
#include "uriParse.h"
#include <iterator>
#include <map>
#include <optional>
#include <string>
#include <typeinfo>
#include <utility>

BOOST_AUTO_TEST_CASE(simple)
{
	AdHoc::Uri u("http://localhost");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK(!u.port);
	BOOST_CHECK(!u.username);
	BOOST_CHECK(!u.password);
	BOOST_CHECK(!u.path);
	BOOST_CHECK(u.query.empty());
	BOOST_CHECK(!u.fragment);
}

BOOST_AUTO_TEST_CASE(lowerScheme)
{
	AdHoc::Uri u("HtTP://localhost");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK(!u.port);
	BOOST_CHECK(!u.username);
	BOOST_CHECK(!u.password);
	BOOST_CHECK(!u.path);
	BOOST_CHECK(u.query.empty());
	BOOST_CHECK(!u.fragment);
}

BOOST_AUTO_TEST_CASE(simpleTrailingSlash)
{
	AdHoc::Uri u("ssh+git://localhost/");
	BOOST_CHECK_EQUAL("ssh+git", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK(!u.port);
	BOOST_CHECK(!u.username);
	BOOST_CHECK(!u.password);
	BOOST_CHECK_IF(p, u.path) {
		BOOST_CHECK_EQUAL("", *u.path);
	}
	BOOST_CHECK(u.query.empty());
	BOOST_CHECK(!u.fragment);
}

BOOST_AUTO_TEST_CASE(simpleWithPort)
{
	AdHoc::Uri u("http://localhost:80");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK_IF(p, u.port) {
		BOOST_CHECK_EQUAL(80, *u.port);
	}
	BOOST_CHECK(!u.username);
	BOOST_CHECK(!u.password);
	BOOST_CHECK(!u.path);
	BOOST_CHECK(u.query.empty());
	BOOST_CHECK(!u.fragment);
}

BOOST_AUTO_TEST_CASE(simpleTrailingSlashWithPort)
{
	AdHoc::Uri u("http://localhost:80/");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK_IF(p, u.port) {
		BOOST_CHECK_EQUAL(80, *u.port);
	}
	BOOST_CHECK(!u.username);
	BOOST_CHECK(!u.password);
	BOOST_CHECK_IF(p, u.path) {
		BOOST_CHECK_EQUAL("", *u.path);
	}
	BOOST_CHECK(u.query.empty());
	BOOST_CHECK(!u.fragment);
}

BOOST_AUTO_TEST_CASE(username)
{
	AdHoc::Uri u("http://user@localhost");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK_IF(p, u.username) {
		BOOST_CHECK_EQUAL("user", *u.username);
	}
	BOOST_CHECK(!u.password);
	BOOST_CHECK(!u.path);
	BOOST_CHECK(u.query.empty());
	BOOST_CHECK(!u.fragment);
}

BOOST_AUTO_TEST_CASE(usernameAndPassword)
{
	AdHoc::Uri u("http://user:pass@localhost");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK_IF(p, u.username) {
		BOOST_CHECK_EQUAL("user", *u.username);
	}
	BOOST_CHECK_IF(p, u.password) {
		BOOST_CHECK_EQUAL("pass", *u.password);
	}
	BOOST_CHECK(!u.path);
	BOOST_CHECK(u.query.empty());
	BOOST_CHECK(!u.fragment);
}

BOOST_AUTO_TEST_CASE(path)
{
	AdHoc::Uri u("http://localhost/path/to/resource");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK(!u.username);
	BOOST_CHECK(!u.password);
	BOOST_CHECK_IF(p, u.path) {
		BOOST_CHECK_EQUAL("path/to/resource", *u.path);
	}
	BOOST_CHECK(u.query.empty());
	BOOST_CHECK(!u.fragment);
}

BOOST_AUTO_TEST_CASE(query0)
{
	AdHoc::Uri u("http://localhost/?");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK_EQUAL(0, u.query.size());
}

BOOST_AUTO_TEST_CASE(query1)
{
	AdHoc::Uri u("http://localhost/?var=val");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK_EQUAL(1, u.query.size());
	BOOST_CHECK_EQUAL("var", u.query.begin()->first);
	BOOST_CHECK_EQUAL("val", u.query.begin()->second);
}

BOOST_AUTO_TEST_CASE(query2)
{
	AdHoc::Uri u("http://localhost/?var=val&name=value");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK_EQUAL(2, u.query.size());
	BOOST_CHECK_EQUAL("name", u.query.begin()->first);
	BOOST_CHECK_EQUAL("value", u.query.begin()->second);
	BOOST_CHECK_EQUAL("var", u.query.rbegin()->first);
	BOOST_CHECK_EQUAL("val", u.query.rbegin()->second);
}

BOOST_AUTO_TEST_CASE(queryMany)
{
	AdHoc::Uri u("http://localhost/?name=val&name=value");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK_EQUAL(2, u.query.size());
	BOOST_CHECK_EQUAL("name", u.query.begin()->first);
	BOOST_CHECK_EQUAL("val", u.query.begin()->second);
	BOOST_CHECK_EQUAL("name", u.query.rbegin()->first);
	BOOST_CHECK_EQUAL("value", u.query.rbegin()->second);
}

BOOST_AUTO_TEST_CASE(queryNoValue1)
{
	AdHoc::Uri u("http://localhost/?n1");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK_EQUAL(1, u.query.size());
	BOOST_CHECK_EQUAL("n1", u.query.begin()->first);
	BOOST_CHECK_EQUAL("", u.query.begin()->second);
}

BOOST_AUTO_TEST_CASE(queryNoValue1eq)
{
	AdHoc::Uri u("http://localhost/?n1=");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK_EQUAL(1, u.query.size());
	BOOST_CHECK_EQUAL("n1", u.query.begin()->first);
	BOOST_CHECK_EQUAL("", u.query.begin()->second);
}

BOOST_AUTO_TEST_CASE(queryNoValue2)
{
	AdHoc::Uri u("http://localhost/?n1=&n2");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK_EQUAL(2, u.query.size());
	BOOST_CHECK_EQUAL("n1", u.query.begin()->first);
	BOOST_CHECK_EQUAL("", u.query.begin()->second);
	BOOST_CHECK_EQUAL("n2", u.query.rbegin()->first);
	BOOST_CHECK_EQUAL("", u.query.rbegin()->second);
}

BOOST_AUTO_TEST_CASE(fragment)
{
	AdHoc::Uri u("http://localhost/path/to/resource#someFrag");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("localhost", u.host);
	BOOST_CHECK(!u.username);
	BOOST_CHECK(!u.password);
	BOOST_CHECK_IF(p, u.path) {
		BOOST_CHECK_EQUAL("path/to/resource", *u.path);
	}
	BOOST_CHECK(u.query.empty());
	BOOST_CHECK_IF(p, u.fragment) {
		BOOST_CHECK_EQUAL("someFrag", *u.fragment);
	}
}

BOOST_AUTO_TEST_CASE(ipv6)
{
	AdHoc::Uri u("http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html");
	BOOST_CHECK_EQUAL("http", u.scheme);
	BOOST_CHECK_EQUAL("[fedc:ba98:7654:3210:fedc:ba98:7654:3210]", u.host);
	BOOST_CHECK_IF(p, u.port) {
		BOOST_CHECK_EQUAL(80, *u.port);
	}
	BOOST_CHECK_IF(p, u.path) {
		BOOST_CHECK_EQUAL("index.html", *u.path);
	}
}

BOOST_AUTO_TEST_CASE(bad)
{
	BOOST_CHECK_THROW(AdHoc::Uri(""), AdHoc::InvalidUri);
	BOOST_CHECK_THROW(AdHoc::Uri("localhost"), AdHoc::InvalidUri);
	BOOST_CHECK_THROW(AdHoc::Uri("t00+p://foo"), AdHoc::InvalidUri);
	BOOST_CHECK_THROW(AdHoc::Uri("tcp:"), AdHoc::InvalidUri);
	BOOST_CHECK_THROW(AdHoc::Uri("http:/"), AdHoc::InvalidUri);
	BOOST_CHECK_THROW(AdHoc::Uri("tcp://"), AdHoc::InvalidUri);
	BOOST_CHECK_THROW(AdHoc::Uri("ftp/local"), AdHoc::InvalidUri);
	BOOST_CHECK_THROW(AdHoc::Uri("tcp://local:"), std::bad_cast);
	BOOST_CHECK_THROW(AdHoc::Uri("tcp://local:foo"), std::bad_cast);
	BOOST_CHECK_THROW(AdHoc::Uri("tcp://user:pass@"), AdHoc::InvalidUri);

	AdHoc::InvalidUri ui("message", "http://localhost");
	BOOST_CHECK_EQUAL("InvalidUri (message) parsing [http://localhost]", ui.what());
}