1*ec63e07aSXin Li // Copyright 2022 Google LLC
2*ec63e07aSXin Li //
3*ec63e07aSXin Li // Licensed under the Apache License, Version 2.0 (the "License");
4*ec63e07aSXin Li // you may not use this file except in compliance with the License.
5*ec63e07aSXin Li // You may obtain a copy of the License at
6*ec63e07aSXin Li //
7*ec63e07aSXin Li // https://www.apache.org/licenses/LICENSE-2.0
8*ec63e07aSXin Li //
9*ec63e07aSXin Li // Unless required by applicable law or agreed to in writing, software
10*ec63e07aSXin Li // distributed under the License is distributed on an "AS IS" BASIS,
11*ec63e07aSXin Li // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*ec63e07aSXin Li // See the License for the specific language governing permissions and
13*ec63e07aSXin Li // limitations under the License.
14*ec63e07aSXin Li
15*ec63e07aSXin Li #include <fstream>
16*ec63e07aSXin Li
17*ec63e07aSXin Li #include "contrib/uriparser/sandboxed.h"
18*ec63e07aSXin Li #include "contrib/uriparser/utils/utils_uriparser.h"
19*ec63e07aSXin Li #include "sandboxed_api/util/path.h"
20*ec63e07aSXin Li #include "sandboxed_api/util/status_matchers.h"
21*ec63e07aSXin Li #include "sandboxed_api/util/temp_file.h"
22*ec63e07aSXin Li
23*ec63e07aSXin Li namespace {
24*ec63e07aSXin Li
25*ec63e07aSXin Li using ::sapi::IsOk;
26*ec63e07aSXin Li
27*ec63e07aSXin Li const struct TestVariant {
28*ec63e07aSXin Li std::string test;
29*ec63e07aSXin Li std::string uri;
30*ec63e07aSXin Li std::string uriescaped;
31*ec63e07aSXin Li std::string scheme;
32*ec63e07aSXin Li std::string userinfo;
33*ec63e07aSXin Li std::string hosttext;
34*ec63e07aSXin Li std::string hostip;
35*ec63e07aSXin Li std::string porttext;
36*ec63e07aSXin Li std::string query;
37*ec63e07aSXin Li std::string fragment;
38*ec63e07aSXin Li std::string normalized;
39*ec63e07aSXin Li std::string add_base_example;
40*ec63e07aSXin Li std::string remove_base_example;
41*ec63e07aSXin Li std::vector<std::string> path_elements;
42*ec63e07aSXin Li std::map<std::string, std::string> query_elements;
43*ec63e07aSXin Li } TestData[] = {
44*ec63e07aSXin Li {
45*ec63e07aSXin Li .test = "http://www.example.com/",
46*ec63e07aSXin Li .uri = "http://www.example.com/",
47*ec63e07aSXin Li .uriescaped = "http%3A%2F%2Fwww.example.com%2F",
48*ec63e07aSXin Li .scheme = "http",
49*ec63e07aSXin Li .userinfo = "",
50*ec63e07aSXin Li .hosttext = "www.example.com",
51*ec63e07aSXin Li .hostip = "",
52*ec63e07aSXin Li .porttext = "",
53*ec63e07aSXin Li .query = "",
54*ec63e07aSXin Li .fragment = "",
55*ec63e07aSXin Li .normalized = "http://www.example.com/",
56*ec63e07aSXin Li .add_base_example = "http://www.example.com/",
57*ec63e07aSXin Li .remove_base_example = "./",
58*ec63e07aSXin Li },
59*ec63e07aSXin Li {
60*ec63e07aSXin Li .test = "https://github.com/google/sandboxed-api/",
61*ec63e07aSXin Li .uri = "https://github.com/google/sandboxed-api/",
62*ec63e07aSXin Li .uriescaped = "https%3A%2F%2Fgithub.com%2Fgoogle%2Fsandboxed-api%2F",
63*ec63e07aSXin Li .scheme = "https",
64*ec63e07aSXin Li .userinfo = "",
65*ec63e07aSXin Li .hosttext = "github.com",
66*ec63e07aSXin Li .hostip = "",
67*ec63e07aSXin Li .porttext = "",
68*ec63e07aSXin Li .query = "",
69*ec63e07aSXin Li .fragment = "",
70*ec63e07aSXin Li .normalized = "https://github.com/google/sandboxed-api/",
71*ec63e07aSXin Li .add_base_example = "https://github.com/google/sandboxed-api/",
72*ec63e07aSXin Li .remove_base_example = "https://github.com/google/sandboxed-api/",
73*ec63e07aSXin Li .path_elements = {"google", "sandboxed-api"},
74*ec63e07aSXin Li },
75*ec63e07aSXin Li {
76*ec63e07aSXin Li .test = "mailto:[email protected]",
77*ec63e07aSXin Li .uri = "mailto:[email protected]",
78*ec63e07aSXin Li .uriescaped = "mailto%3Atest%40example.com",
79*ec63e07aSXin Li .scheme = "mailto",
80*ec63e07aSXin Li .userinfo = "",
81*ec63e07aSXin Li .hosttext = "",
82*ec63e07aSXin Li .hostip = "",
83*ec63e07aSXin Li .porttext = "",
84*ec63e07aSXin Li .query = "",
85*ec63e07aSXin Li .fragment = "",
86*ec63e07aSXin Li .normalized = "mailto:[email protected]",
87*ec63e07aSXin Li .add_base_example = "mailto:[email protected]",
88*ec63e07aSXin Li .remove_base_example = "mailto:[email protected]",
89*ec63e07aSXin Li .path_elements = {"[email protected]"},
90*ec63e07aSXin Li },
91*ec63e07aSXin Li {
92*ec63e07aSXin Li .test = "file:///bin/bash",
93*ec63e07aSXin Li .uri = "file:///bin/bash",
94*ec63e07aSXin Li .uriescaped = "file%3A%2F%2F%2Fbin%2Fbash",
95*ec63e07aSXin Li .scheme = "file",
96*ec63e07aSXin Li .userinfo = "",
97*ec63e07aSXin Li .hosttext = "",
98*ec63e07aSXin Li .hostip = "",
99*ec63e07aSXin Li .porttext = "",
100*ec63e07aSXin Li .query = "",
101*ec63e07aSXin Li .fragment = "",
102*ec63e07aSXin Li .normalized = "file:///bin/bash",
103*ec63e07aSXin Li .add_base_example = "file:///bin/bash",
104*ec63e07aSXin Li .remove_base_example = "file:///bin/bash",
105*ec63e07aSXin Li .path_elements =
106*ec63e07aSXin Li {
107*ec63e07aSXin Li "bin",
108*ec63e07aSXin Li "bash",
109*ec63e07aSXin Li },
110*ec63e07aSXin Li },
111*ec63e07aSXin Li {
112*ec63e07aSXin Li .test = "http://www.example.com/name%20with%20spaces/",
113*ec63e07aSXin Li .uri = "http://www.example.com/name%20with%20spaces/",
114*ec63e07aSXin Li .uriescaped =
115*ec63e07aSXin Li "http%3A%2F%2Fwww.example.com%2Fname%2520with%2520spaces%2F",
116*ec63e07aSXin Li .scheme = "http",
117*ec63e07aSXin Li .userinfo = "",
118*ec63e07aSXin Li .hosttext = "www.example.com",
119*ec63e07aSXin Li .hostip = "",
120*ec63e07aSXin Li .porttext = "",
121*ec63e07aSXin Li .query = "",
122*ec63e07aSXin Li .fragment = "",
123*ec63e07aSXin Li .normalized = "http://www.example.com/name%20with%20spaces/",
124*ec63e07aSXin Li .add_base_example = "http://www.example.com/name%20with%20spaces/",
125*ec63e07aSXin Li .remove_base_example = "name%20with%20spaces/",
126*ec63e07aSXin Li .path_elements =
127*ec63e07aSXin Li {
128*ec63e07aSXin Li "name%20with%20spaces",
129*ec63e07aSXin Li },
130*ec63e07aSXin Li },
131*ec63e07aSXin Li {
132*ec63e07aSXin Li .test = "http://abcdefg@localhost/",
133*ec63e07aSXin Li .uri = "http://abcdefg@localhost/",
134*ec63e07aSXin Li .uriescaped = "http%3A%2F%2Fabcdefg%40localhost%2F",
135*ec63e07aSXin Li .scheme = "http",
136*ec63e07aSXin Li .userinfo = "abcdefg",
137*ec63e07aSXin Li .hosttext = "localhost",
138*ec63e07aSXin Li .hostip = "",
139*ec63e07aSXin Li .porttext = "",
140*ec63e07aSXin Li .query = "",
141*ec63e07aSXin Li .fragment = "",
142*ec63e07aSXin Li .normalized = "http://abcdefg@localhost/",
143*ec63e07aSXin Li .add_base_example = "http://abcdefg@localhost/",
144*ec63e07aSXin Li .remove_base_example = "//abcdefg@localhost/",
145*ec63e07aSXin Li },
146*ec63e07aSXin Li {
147*ec63e07aSXin Li .test = "https://localhost:123/",
148*ec63e07aSXin Li .uri = "https://localhost:123/",
149*ec63e07aSXin Li .uriescaped = "https%3A%2F%2Flocalhost%3A123%2F",
150*ec63e07aSXin Li .scheme = "https",
151*ec63e07aSXin Li .userinfo = "",
152*ec63e07aSXin Li .hosttext = "localhost",
153*ec63e07aSXin Li .hostip = "",
154*ec63e07aSXin Li .porttext = "123",
155*ec63e07aSXin Li .query = "",
156*ec63e07aSXin Li .fragment = "",
157*ec63e07aSXin Li .normalized = "https://localhost:123/",
158*ec63e07aSXin Li .add_base_example = "https://localhost:123/",
159*ec63e07aSXin Li .remove_base_example = "https://localhost:123/",
160*ec63e07aSXin Li },
161*ec63e07aSXin Li {
162*ec63e07aSXin Li .test = "http://[::1]/",
163*ec63e07aSXin Li .uri = "http://[0000:0000:0000:0000:0000:0000:0000:0001]/",
164*ec63e07aSXin Li .uriescaped = "http%3A%2F%2F%5B0000%3A0000%3A0000%3A0000%3A0000%3A0000%"
165*ec63e07aSXin Li "3A0000%3A0001%5D%2F",
166*ec63e07aSXin Li .scheme = "http",
167*ec63e07aSXin Li .userinfo = "",
168*ec63e07aSXin Li .hosttext = "::1",
169*ec63e07aSXin Li .hostip = "::1",
170*ec63e07aSXin Li .porttext = "",
171*ec63e07aSXin Li .query = "",
172*ec63e07aSXin Li .fragment = "",
173*ec63e07aSXin Li .normalized = "http://[0000:0000:0000:0000:0000:0000:0000:0001]/",
174*ec63e07aSXin Li .add_base_example = "http://[0000:0000:0000:0000:0000:0000:0000:0001]/",
175*ec63e07aSXin Li .remove_base_example = "//[0000:0000:0000:0000:0000:0000:0000:0001]/",
176*ec63e07aSXin Li },
177*ec63e07aSXin Li {
178*ec63e07aSXin Li .test = "http://a/b/c/d;p?q",
179*ec63e07aSXin Li .uri = "http://a/b/c/d;p?q",
180*ec63e07aSXin Li .uriescaped = "http%3A%2F%2Fa%2Fb%2Fc%2Fd%3Bp%3Fq",
181*ec63e07aSXin Li .scheme = "http",
182*ec63e07aSXin Li .userinfo = "",
183*ec63e07aSXin Li .hosttext = "a",
184*ec63e07aSXin Li .hostip = "",
185*ec63e07aSXin Li .porttext = "",
186*ec63e07aSXin Li .query = "q",
187*ec63e07aSXin Li .fragment = "",
188*ec63e07aSXin Li .normalized = "http://a/b/c/d;p?q",
189*ec63e07aSXin Li .add_base_example = "http://a/b/c/d;p?q",
190*ec63e07aSXin Li .remove_base_example = "//a/b/c/d;p?q",
191*ec63e07aSXin Li .path_elements = {"b", "c", "d;p"},
192*ec63e07aSXin Li .query_elements = {{"q", ""}},
193*ec63e07aSXin Li },
194*ec63e07aSXin Li {.test = "http://a/b/c/../d;p?q",
195*ec63e07aSXin Li .uri = "http://a/b/c/../d;p?q",
196*ec63e07aSXin Li .uriescaped = "http%3A%2F%2Fa%2Fb%2Fc%2F..%2Fd%3Bp%3Fq",
197*ec63e07aSXin Li .scheme = "http",
198*ec63e07aSXin Li .userinfo = "",
199*ec63e07aSXin Li .hosttext = "a",
200*ec63e07aSXin Li .hostip = "",
201*ec63e07aSXin Li .porttext = "",
202*ec63e07aSXin Li .query = "q",
203*ec63e07aSXin Li .fragment = "",
204*ec63e07aSXin Li .normalized = "http://a/b/d;p?q",
205*ec63e07aSXin Li .add_base_example = "http://a/b/d;p?q",
206*ec63e07aSXin Li .remove_base_example = "//a/b/c/../d;p?q",
207*ec63e07aSXin Li .path_elements = {"b", "c", "..", "d;p"},
208*ec63e07aSXin Li .query_elements = {{"q", ""}}},
209*ec63e07aSXin Li {
210*ec63e07aSXin Li .test = "http://example.com/abc/def/",
211*ec63e07aSXin Li .uri = "http://example.com/abc/def/",
212*ec63e07aSXin Li .uriescaped = "http%3A%2F%2Fexample.com%2Fabc%2Fdef%2F",
213*ec63e07aSXin Li .scheme = "http",
214*ec63e07aSXin Li .userinfo = "",
215*ec63e07aSXin Li .hosttext = "example.com",
216*ec63e07aSXin Li .hostip = "",
217*ec63e07aSXin Li .porttext = "",
218*ec63e07aSXin Li .query = "",
219*ec63e07aSXin Li .fragment = "",
220*ec63e07aSXin Li .normalized = "http://example.com/abc/def/",
221*ec63e07aSXin Li .add_base_example = "http://example.com/abc/def/",
222*ec63e07aSXin Li .remove_base_example = "//example.com/abc/def/",
223*ec63e07aSXin Li .path_elements =
224*ec63e07aSXin Li {
225*ec63e07aSXin Li "abc",
226*ec63e07aSXin Li "def",
227*ec63e07aSXin Li },
228*ec63e07aSXin Li },
229*ec63e07aSXin Li {.test = "http://example.com/?abc",
230*ec63e07aSXin Li .uri = "http://example.com/?abc",
231*ec63e07aSXin Li .uriescaped = "http%3A%2F%2Fexample.com%2F%3Fabc",
232*ec63e07aSXin Li .scheme = "http",
233*ec63e07aSXin Li .userinfo = "",
234*ec63e07aSXin Li .hosttext = "example.com",
235*ec63e07aSXin Li .hostip = "",
236*ec63e07aSXin Li .porttext = "",
237*ec63e07aSXin Li .query = "abc",
238*ec63e07aSXin Li .fragment = "",
239*ec63e07aSXin Li .normalized = "http://example.com/?abc",
240*ec63e07aSXin Li .add_base_example = "http://example.com/?abc",
241*ec63e07aSXin Li .remove_base_example = "//example.com/?abc",
242*ec63e07aSXin Li .query_elements = {{"abc", ""}}},
243*ec63e07aSXin Li {
244*ec63e07aSXin Li .test = "http://[vA.123456]/",
245*ec63e07aSXin Li .uri = "http://[vA.123456]/",
246*ec63e07aSXin Li .uriescaped = "http%3A%2F%2F%5BvA.123456%5D%2F",
247*ec63e07aSXin Li .scheme = "http",
248*ec63e07aSXin Li .userinfo = "",
249*ec63e07aSXin Li .hosttext = "vA.123456",
250*ec63e07aSXin Li .hostip = "",
251*ec63e07aSXin Li .porttext = "",
252*ec63e07aSXin Li .query = "",
253*ec63e07aSXin Li .fragment = "",
254*ec63e07aSXin Li .normalized = "http://[va.123456]/",
255*ec63e07aSXin Li .add_base_example = "http://[vA.123456]/",
256*ec63e07aSXin Li .remove_base_example = "//[vA.123456]/",
257*ec63e07aSXin Li },
258*ec63e07aSXin Li {
259*ec63e07aSXin Li .test = "http://8.8.8.8/",
260*ec63e07aSXin Li .uri = "http://8.8.8.8/",
261*ec63e07aSXin Li .uriescaped = "http%3A%2F%2F8.8.8.8%2F",
262*ec63e07aSXin Li .scheme = "http",
263*ec63e07aSXin Li .userinfo = "",
264*ec63e07aSXin Li .hosttext = "8.8.8.8",
265*ec63e07aSXin Li .hostip = "8.8.8.8",
266*ec63e07aSXin Li .porttext = "",
267*ec63e07aSXin Li .query = "",
268*ec63e07aSXin Li .fragment = "",
269*ec63e07aSXin Li .normalized = "http://8.8.8.8/",
270*ec63e07aSXin Li .add_base_example = "http://8.8.8.8/",
271*ec63e07aSXin Li .remove_base_example = "//8.8.8.8/",
272*ec63e07aSXin Li },
273*ec63e07aSXin Li {.test = "http://www.example.com/?abc",
274*ec63e07aSXin Li .uri = "http://www.example.com/?abc",
275*ec63e07aSXin Li .uriescaped = "http%3A%2F%2Fwww.example.com%2F%3Fabc",
276*ec63e07aSXin Li .scheme = "http",
277*ec63e07aSXin Li .userinfo = "",
278*ec63e07aSXin Li .hosttext = "www.example.com",
279*ec63e07aSXin Li .hostip = "",
280*ec63e07aSXin Li .porttext = "",
281*ec63e07aSXin Li .query = "abc",
282*ec63e07aSXin Li .fragment = "",
283*ec63e07aSXin Li .normalized = "http://www.example.com/?abc",
284*ec63e07aSXin Li .add_base_example = "http://www.example.com/?abc",
285*ec63e07aSXin Li .remove_base_example = "./?abc",
286*ec63e07aSXin Li .query_elements = {{"abc", ""}}},
287*ec63e07aSXin Li {.test = "https://google.com?q=asd&x=y&zxc=asd",
288*ec63e07aSXin Li .uri = "https://google.com?q=asd&x=y&zxc=asd",
289*ec63e07aSXin Li .uriescaped = "https%3A%2F%2Fgoogle.com%3Fq%3Dasd%26x%3Dy%26zxc%3Dasd",
290*ec63e07aSXin Li .scheme = "https",
291*ec63e07aSXin Li .userinfo = "",
292*ec63e07aSXin Li .hosttext = "google.com",
293*ec63e07aSXin Li .hostip = "",
294*ec63e07aSXin Li .porttext = "",
295*ec63e07aSXin Li .query = "q=asd&x=y&zxc=asd",
296*ec63e07aSXin Li .fragment = "",
297*ec63e07aSXin Li .normalized = "https://google.com?q=asd&x=y&zxc=asd",
298*ec63e07aSXin Li .add_base_example = "https://google.com?q=asd&x=y&zxc=asd",
299*ec63e07aSXin Li .remove_base_example = "https://google.com?q=asd&x=y&zxc=asd",
300*ec63e07aSXin Li .query_elements = {{"q", "asd"}, {"x", "y"}, {"zxc", "asd"}}},
301*ec63e07aSXin Li {.test = "https://google.com?q=asd#newplace",
302*ec63e07aSXin Li .uri = "https://google.com?q=asd#newplace",
303*ec63e07aSXin Li .uriescaped = "https%3A%2F%2Fgoogle.com%3Fq%3Dasd%23newplace",
304*ec63e07aSXin Li .scheme = "https",
305*ec63e07aSXin Li .userinfo = "",
306*ec63e07aSXin Li .hosttext = "google.com",
307*ec63e07aSXin Li .hostip = "",
308*ec63e07aSXin Li .porttext = "",
309*ec63e07aSXin Li .query = "q=asd",
310*ec63e07aSXin Li .fragment = "newplace",
311*ec63e07aSXin Li .normalized = "https://google.com?q=asd#newplace",
312*ec63e07aSXin Li .add_base_example = "https://google.com?q=asd#newplace",
313*ec63e07aSXin Li .remove_base_example = "https://google.com?q=asd#newplace",
314*ec63e07aSXin Li .query_elements = {{"q", "asd"}}},
315*ec63e07aSXin Li };
316*ec63e07aSXin Li
317*ec63e07aSXin Li class UriParserBase : public testing::Test {
318*ec63e07aSXin Li protected:
319*ec63e07aSXin Li void SetUp() override;
320*ec63e07aSXin Li std::unique_ptr<UriparserSapiSandbox> sandbox_;
321*ec63e07aSXin Li };
322*ec63e07aSXin Li
323*ec63e07aSXin Li class UriParserTestData : public UriParserBase,
324*ec63e07aSXin Li public testing::WithParamInterface<TestVariant> {};
325*ec63e07aSXin Li
SetUp()326*ec63e07aSXin Li void UriParserBase::SetUp() {
327*ec63e07aSXin Li sandbox_ = std::make_unique<UriparserSapiSandbox>();
328*ec63e07aSXin Li ASSERT_THAT(sandbox_->Init(), IsOk());
329*ec63e07aSXin Li }
330*ec63e07aSXin Li
TEST_P(UriParserTestData,TestUri)331*ec63e07aSXin Li TEST_P(UriParserTestData, TestUri) {
332*ec63e07aSXin Li const TestVariant& tv = GetParam();
333*ec63e07aSXin Li
334*ec63e07aSXin Li UriParser uri(sandbox_.get(), tv.test);
335*ec63e07aSXin Li ASSERT_THAT(uri.GetStatus(), IsOk());
336*ec63e07aSXin Li
337*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string ret, uri.GetUri());
338*ec63e07aSXin Li ASSERT_EQ(ret, tv.uri);
339*ec63e07aSXin Li }
340*ec63e07aSXin Li
TEST_P(UriParserTestData,TestUriEscaped)341*ec63e07aSXin Li TEST_P(UriParserTestData, TestUriEscaped) {
342*ec63e07aSXin Li const TestVariant& tv = GetParam();
343*ec63e07aSXin Li
344*ec63e07aSXin Li UriParser uri(sandbox_.get(), tv.test);
345*ec63e07aSXin Li ASSERT_THAT(uri.GetStatus(), IsOk());
346*ec63e07aSXin Li
347*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string ret, uri.GetUriEscaped(true, true));
348*ec63e07aSXin Li ASSERT_EQ(ret, tv.uriescaped);
349*ec63e07aSXin Li }
350*ec63e07aSXin Li
TEST_P(UriParserTestData,TestScheme)351*ec63e07aSXin Li TEST_P(UriParserTestData, TestScheme) {
352*ec63e07aSXin Li const TestVariant& tv = GetParam();
353*ec63e07aSXin Li
354*ec63e07aSXin Li UriParser uri(sandbox_.get(), tv.test);
355*ec63e07aSXin Li ASSERT_THAT(uri.GetStatus(), IsOk());
356*ec63e07aSXin Li
357*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string ret, uri.GetScheme());
358*ec63e07aSXin Li ASSERT_EQ(ret, tv.scheme);
359*ec63e07aSXin Li }
360*ec63e07aSXin Li
TEST_P(UriParserTestData,TestUserInfo)361*ec63e07aSXin Li TEST_P(UriParserTestData, TestUserInfo) {
362*ec63e07aSXin Li const TestVariant& tv = GetParam();
363*ec63e07aSXin Li
364*ec63e07aSXin Li UriParser uri(sandbox_.get(), tv.test);
365*ec63e07aSXin Li ASSERT_THAT(uri.GetStatus(), IsOk());
366*ec63e07aSXin Li
367*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string ret, uri.GetUserInfo());
368*ec63e07aSXin Li ASSERT_EQ(ret, tv.userinfo);
369*ec63e07aSXin Li }
370*ec63e07aSXin Li
TEST_P(UriParserTestData,TestHostText)371*ec63e07aSXin Li TEST_P(UriParserTestData, TestHostText) {
372*ec63e07aSXin Li const TestVariant& tv = GetParam();
373*ec63e07aSXin Li
374*ec63e07aSXin Li UriParser uri(sandbox_.get(), tv.test);
375*ec63e07aSXin Li ASSERT_THAT(uri.GetStatus(), IsOk());
376*ec63e07aSXin Li
377*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string ret, uri.GetHostText());
378*ec63e07aSXin Li ASSERT_EQ(ret, tv.hosttext);
379*ec63e07aSXin Li }
380*ec63e07aSXin Li
TEST_P(UriParserTestData,TestHostIP)381*ec63e07aSXin Li TEST_P(UriParserTestData, TestHostIP) {
382*ec63e07aSXin Li const TestVariant& tv = GetParam();
383*ec63e07aSXin Li
384*ec63e07aSXin Li UriParser uri(sandbox_.get(), tv.test);
385*ec63e07aSXin Li ASSERT_THAT(uri.GetStatus(), IsOk());
386*ec63e07aSXin Li
387*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string ret, uri.GetHostIP());
388*ec63e07aSXin Li ASSERT_EQ(ret, tv.hostip);
389*ec63e07aSXin Li }
390*ec63e07aSXin Li
TEST_P(UriParserTestData,TestPortText)391*ec63e07aSXin Li TEST_P(UriParserTestData, TestPortText) {
392*ec63e07aSXin Li const TestVariant& tv = GetParam();
393*ec63e07aSXin Li
394*ec63e07aSXin Li UriParser uri(sandbox_.get(), tv.test);
395*ec63e07aSXin Li ASSERT_THAT(uri.GetStatus(), IsOk());
396*ec63e07aSXin Li
397*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string ret, uri.GetPortText());
398*ec63e07aSXin Li ASSERT_EQ(ret, tv.porttext);
399*ec63e07aSXin Li }
400*ec63e07aSXin Li
TEST_P(UriParserTestData,TestQuery)401*ec63e07aSXin Li TEST_P(UriParserTestData, TestQuery) {
402*ec63e07aSXin Li const TestVariant& tv = GetParam();
403*ec63e07aSXin Li
404*ec63e07aSXin Li UriParser uri(sandbox_.get(), tv.test);
405*ec63e07aSXin Li ASSERT_THAT(uri.GetStatus(), IsOk());
406*ec63e07aSXin Li
407*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string ret, uri.GetQuery());
408*ec63e07aSXin Li ASSERT_EQ(ret, tv.query);
409*ec63e07aSXin Li }
410*ec63e07aSXin Li
TEST_P(UriParserTestData,TestFragment)411*ec63e07aSXin Li TEST_P(UriParserTestData, TestFragment) {
412*ec63e07aSXin Li const TestVariant& tv = GetParam();
413*ec63e07aSXin Li
414*ec63e07aSXin Li UriParser uri(sandbox_.get(), tv.test);
415*ec63e07aSXin Li ASSERT_THAT(uri.GetStatus(), IsOk());
416*ec63e07aSXin Li
417*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string ret, uri.GetFragment());
418*ec63e07aSXin Li ASSERT_EQ(ret, tv.fragment);
419*ec63e07aSXin Li }
420*ec63e07aSXin Li
TEST_P(UriParserTestData,TestNormalize)421*ec63e07aSXin Li TEST_P(UriParserTestData, TestNormalize) {
422*ec63e07aSXin Li const TestVariant& tv = GetParam();
423*ec63e07aSXin Li
424*ec63e07aSXin Li UriParser uri(sandbox_.get(), tv.test);
425*ec63e07aSXin Li ASSERT_THAT(uri.GetStatus(), IsOk());
426*ec63e07aSXin Li
427*ec63e07aSXin Li ASSERT_THAT(uri.NormalizeSyntax(), IsOk());
428*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string ret, uri.GetUri());
429*ec63e07aSXin Li ASSERT_EQ(ret, tv.normalized);
430*ec63e07aSXin Li }
431*ec63e07aSXin Li
TEST_P(UriParserTestData,TestMultiple)432*ec63e07aSXin Li TEST_P(UriParserTestData, TestMultiple) {
433*ec63e07aSXin Li const TestVariant& tv = GetParam();
434*ec63e07aSXin Li
435*ec63e07aSXin Li UriParser uri(sandbox_.get(), tv.test);
436*ec63e07aSXin Li ASSERT_THAT(uri.GetStatus(), IsOk());
437*ec63e07aSXin Li
438*ec63e07aSXin Li std::string ret;
439*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(ret, uri.GetQuery());
440*ec63e07aSXin Li ASSERT_EQ(ret, tv.query);
441*ec63e07aSXin Li
442*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(ret, uri.GetHostIP());
443*ec63e07aSXin Li ASSERT_EQ(ret, tv.hostip);
444*ec63e07aSXin Li
445*ec63e07aSXin Li ASSERT_THAT(uri.NormalizeSyntax(), IsOk());
446*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(ret, uri.GetUri());
447*ec63e07aSXin Li ASSERT_EQ(ret, tv.normalized);
448*ec63e07aSXin Li }
449*ec63e07aSXin Li
TEST_P(UriParserTestData,TestAddBaseExample)450*ec63e07aSXin Li TEST_P(UriParserTestData, TestAddBaseExample) {
451*ec63e07aSXin Li const TestVariant& tv = GetParam();
452*ec63e07aSXin Li
453*ec63e07aSXin Li UriParser uri(sandbox_.get(), tv.test);
454*ec63e07aSXin Li ASSERT_THAT(uri.GetStatus(), IsOk());
455*ec63e07aSXin Li
456*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::string ret,
457*ec63e07aSXin Li uri.GetUriWithBase("http://www.example.com"));
458*ec63e07aSXin Li ASSERT_EQ(ret, tv.add_base_example);
459*ec63e07aSXin Li }
460*ec63e07aSXin Li
TEST_P(UriParserTestData,TestRemoveBaseExample)461*ec63e07aSXin Li TEST_P(UriParserTestData, TestRemoveBaseExample) {
462*ec63e07aSXin Li const TestVariant& tv = GetParam();
463*ec63e07aSXin Li
464*ec63e07aSXin Li UriParser uri(sandbox_.get(), tv.test);
465*ec63e07aSXin Li ASSERT_THAT(uri.GetStatus(), IsOk());
466*ec63e07aSXin Li
467*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(
468*ec63e07aSXin Li std::string ret, uri.GetUriWithoutBase("http://www.example.com", false));
469*ec63e07aSXin Li ASSERT_EQ(ret, tv.remove_base_example);
470*ec63e07aSXin Li }
471*ec63e07aSXin Li
TEST_P(UriParserTestData,TestPath)472*ec63e07aSXin Li TEST_P(UriParserTestData, TestPath) {
473*ec63e07aSXin Li const TestVariant& tv = GetParam();
474*ec63e07aSXin Li
475*ec63e07aSXin Li UriParser uri(sandbox_.get(), tv.test);
476*ec63e07aSXin Li ASSERT_THAT(uri.GetStatus(), IsOk());
477*ec63e07aSXin Li
478*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(std::vector<std::string> ret, uri.GetPath());
479*ec63e07aSXin Li ASSERT_EQ(ret.size(), tv.path_elements.size());
480*ec63e07aSXin Li for (int i = 0; i < ret.size(); ++i) {
481*ec63e07aSXin Li ASSERT_EQ(ret[i], tv.path_elements[i]);
482*ec63e07aSXin Li }
483*ec63e07aSXin Li }
484*ec63e07aSXin Li
TEST_P(UriParserTestData,TestQueryElements)485*ec63e07aSXin Li TEST_P(UriParserTestData, TestQueryElements) {
486*ec63e07aSXin Li const TestVariant& tv = GetParam();
487*ec63e07aSXin Li
488*ec63e07aSXin Li UriParser uri(sandbox_.get(), tv.test);
489*ec63e07aSXin Li ASSERT_THAT(uri.GetStatus(), IsOk());
490*ec63e07aSXin Li
491*ec63e07aSXin Li SAPI_ASSERT_OK_AND_ASSIGN(auto ret, uri.GetQueryElements());
492*ec63e07aSXin Li ASSERT_EQ(ret.size(), tv.query_elements.size());
493*ec63e07aSXin Li for (auto orig : tv.query_elements) {
494*ec63e07aSXin Li ASSERT_NE(ret.find(orig.first), ret.end());
495*ec63e07aSXin Li ASSERT_EQ(ret[orig.first], orig.second);
496*ec63e07aSXin Li }
497*ec63e07aSXin Li }
498*ec63e07aSXin Li
499*ec63e07aSXin Li INSTANTIATE_TEST_SUITE_P(UriParserBase, UriParserTestData,
500*ec63e07aSXin Li testing::ValuesIn(TestData));
501*ec63e07aSXin Li
502*ec63e07aSXin Li } // namespace
503