/src/mozilla-central/netwerk/test/gtest/TestStandardURL.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | #include "gtest/gtest.h" |
2 | | #include "gtest/MozGTestBench.h" // For MOZ_GTEST_BENCH |
3 | | |
4 | | #include "nsCOMPtr.h" |
5 | | #include "nsNetCID.h" |
6 | | #include "nsIURL.h" |
7 | | #include "nsIStandardURL.h" |
8 | | #include "nsString.h" |
9 | | #include "nsPrintfCString.h" |
10 | | #include "nsComponentManagerUtils.h" |
11 | | #include "nsIURIMutator.h" |
12 | | #include "mozilla/ipc/URIUtils.h" |
13 | | #include "mozilla/Unused.h" |
14 | | |
15 | | // In nsStandardURL.cpp |
16 | | extern nsresult Test_NormalizeIPv4(const nsACString& host, nsCString& result); |
17 | | |
18 | | |
19 | 0 | TEST(TestStandardURL, Simple) { |
20 | 0 | nsCOMPtr<nsIURI> url; |
21 | 0 | ASSERT_EQ(NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID) |
22 | 0 | .SetSpec(NS_LITERAL_CSTRING("http://example.com")) |
23 | 0 | .Finalize(url), |
24 | 0 | NS_OK); |
25 | 0 | ASSERT_TRUE(url); |
26 | 0 |
|
27 | 0 | ASSERT_EQ(NS_MutateURI(url).SetSpec(NS_LITERAL_CSTRING("http://example.com")).Finalize(url), NS_OK); |
28 | 0 |
|
29 | 0 | nsAutoCString out; |
30 | 0 |
|
31 | 0 | ASSERT_EQ(url->GetSpec(out), NS_OK); |
32 | 0 | ASSERT_TRUE(out == NS_LITERAL_CSTRING("http://example.com/")); |
33 | 0 |
|
34 | 0 | ASSERT_EQ(url->Resolve(NS_LITERAL_CSTRING("foo.html?q=45"), out), NS_OK); |
35 | 0 | ASSERT_TRUE(out == NS_LITERAL_CSTRING("http://example.com/foo.html?q=45")); |
36 | 0 |
|
37 | 0 | ASSERT_EQ(NS_MutateURI(url).SetScheme(NS_LITERAL_CSTRING("foo")).Finalize(url), NS_OK); |
38 | 0 |
|
39 | 0 | ASSERT_EQ(url->GetScheme(out), NS_OK); |
40 | 0 | ASSERT_TRUE(out == NS_LITERAL_CSTRING("foo")); |
41 | 0 |
|
42 | 0 | ASSERT_EQ(url->GetHost(out), NS_OK); |
43 | 0 | ASSERT_TRUE(out == NS_LITERAL_CSTRING("example.com")); |
44 | 0 | ASSERT_EQ(NS_MutateURI(url).SetHost(NS_LITERAL_CSTRING("www.yahoo.com")).Finalize(url), NS_OK); |
45 | 0 | ASSERT_EQ(url->GetHost(out), NS_OK); |
46 | 0 | ASSERT_TRUE(out == NS_LITERAL_CSTRING("www.yahoo.com")); |
47 | 0 |
|
48 | 0 | ASSERT_EQ(NS_MutateURI(url).SetPathQueryRef(NS_LITERAL_CSTRING("/some-path/one-the-net/about.html?with-a-query#for-you")).Finalize(url), NS_OK); |
49 | 0 | ASSERT_EQ(url->GetPathQueryRef(out), NS_OK); |
50 | 0 | ASSERT_TRUE(out == NS_LITERAL_CSTRING("/some-path/one-the-net/about.html?with-a-query#for-you")); |
51 | 0 |
|
52 | 0 | ASSERT_EQ(NS_MutateURI(url).SetQuery(NS_LITERAL_CSTRING("a=b&d=c&what-ever-you-want-to-be-called=45")).Finalize(url), NS_OK); |
53 | 0 | ASSERT_EQ(url->GetQuery(out), NS_OK); |
54 | 0 | ASSERT_TRUE(out == NS_LITERAL_CSTRING("a=b&d=c&what-ever-you-want-to-be-called=45")); |
55 | 0 |
|
56 | 0 | ASSERT_EQ(NS_MutateURI(url).SetRef(NS_LITERAL_CSTRING("#some-book-mark")).Finalize(url), NS_OK); |
57 | 0 | ASSERT_EQ(url->GetRef(out), NS_OK); |
58 | 0 | ASSERT_TRUE(out == NS_LITERAL_CSTRING("some-book-mark")); |
59 | 0 | } |
60 | | |
61 | | TEST(TestStandardURL, NormalizeGood) |
62 | 0 | { |
63 | 0 | nsCString result; |
64 | 0 | const char* manual[] = {"0.0.0.0", "0.0.0.0", |
65 | 0 | "0", "0.0.0.0", |
66 | 0 | "000", "0.0.0.0", |
67 | 0 | "0x00", "0.0.0.0", |
68 | 0 | "10.20.100.200", "10.20.100.200", |
69 | 0 | "255.255.255.255", "255.255.255.255", |
70 | 0 | "0XFF.0xFF.0xff.0xFf", "255.255.255.255", |
71 | 0 | "0x000ff.0X00FF.0x0ff.0xff", "255.255.255.255", |
72 | 0 | "0x000fA.0X00FB.0x0fC.0xfD", "250.251.252.253", |
73 | 0 | "0x000fE.0X00FF.0x0fC.0xfD", "254.255.252.253", |
74 | 0 | "0x000fa.0x00fb.0x0fc.0xfd", "250.251.252.253", |
75 | 0 | "0x000fe.0x00ff.0x0fc.0xfd", "254.255.252.253", |
76 | 0 | "0377.0377.0377.0377", "255.255.255.255", |
77 | 0 | "0000377.000377.00377.0377", "255.255.255.255", |
78 | 0 | "65535", "0.0.255.255", |
79 | 0 | "0xfFFf", "0.0.255.255", |
80 | 0 | "0x00000ffff", "0.0.255.255", |
81 | 0 | "0177777", "0.0.255.255", |
82 | 0 | "000177777", "0.0.255.255", |
83 | 0 | "0.13.65535", "0.13.255.255", |
84 | 0 | "0.22.0xffff", "0.22.255.255", |
85 | 0 | "0.123.0177777", "0.123.255.255", |
86 | 0 | "65536", "0.1.0.0", |
87 | 0 | "0200000", "0.1.0.0", |
88 | 0 | "0x10000", "0.1.0.0"}; |
89 | 0 | for (uint32_t i = 0; i < sizeof(manual)/sizeof(manual[0]); i += 2) { |
90 | 0 | nsCString encHost(manual[i + 0]); |
91 | 0 | ASSERT_EQ(NS_OK, Test_NormalizeIPv4(encHost, result)); |
92 | 0 | ASSERT_TRUE(result.Equals(manual[i + 1])); |
93 | 0 | } |
94 | 0 |
|
95 | 0 | // Make sure we're getting the numbers correctly interpreted: |
96 | 0 | for (int i = 0; i < 256; i++) { |
97 | 0 | nsCString encHost = nsPrintfCString("0x%x", i); |
98 | 0 | ASSERT_EQ(NS_OK, Test_NormalizeIPv4(encHost, result)); |
99 | 0 | ASSERT_TRUE(result.Equals(nsPrintfCString("0.0.0.%d", i))); |
100 | 0 |
|
101 | 0 | encHost = nsPrintfCString("0%o", i); |
102 | 0 | ASSERT_EQ(NS_OK, Test_NormalizeIPv4(encHost, result)); |
103 | 0 | ASSERT_TRUE(result.Equals(nsPrintfCString("0.0.0.%d", i))); |
104 | 0 | } |
105 | 0 |
|
106 | 0 | // Some random numbers in the range, mixing hex, decimal, octal |
107 | 0 | for (int i = 0; i < 8; i++) { |
108 | 0 | int val[4] = {i * 11 + 13, i * 18 + 22, i * 4 + 28, i * 15 + 2}; |
109 | 0 |
|
110 | 0 | nsCString encHost = nsPrintfCString("%d.%d.%d.%d", val[0], val[1], val[2], val[3]); |
111 | 0 | ASSERT_EQ(NS_OK, Test_NormalizeIPv4(encHost, result)); |
112 | 0 | ASSERT_TRUE(result.Equals(encHost)); |
113 | 0 |
|
114 | 0 | nsCString encHostM = nsPrintfCString("0x%x.0x%x.0x%x.0x%x", val[0], val[1], val[2], val[3]); |
115 | 0 | ASSERT_EQ(NS_OK, Test_NormalizeIPv4(encHostM, result)); |
116 | 0 | ASSERT_TRUE(result.Equals(encHost)); |
117 | 0 |
|
118 | 0 | encHostM = nsPrintfCString("0%o.0%o.0%o.0%o", val[0], val[1], val[2], val[3]); |
119 | 0 | ASSERT_EQ(NS_OK, Test_NormalizeIPv4(encHostM, result)); |
120 | 0 | ASSERT_TRUE(result.Equals(encHost)); |
121 | 0 |
|
122 | 0 | encHostM = nsPrintfCString("0x%x.%d.0%o.%d", val[0], val[1], val[2], val[3]); |
123 | 0 | ASSERT_EQ(NS_OK, Test_NormalizeIPv4(encHostM, result)); |
124 | 0 | ASSERT_TRUE(result.Equals(encHost)); |
125 | 0 |
|
126 | 0 | encHostM = nsPrintfCString("%d.0%o.0%o.0x%x", val[0], val[1], val[2], val[3]); |
127 | 0 | ASSERT_EQ(NS_OK, Test_NormalizeIPv4(encHostM, result)); |
128 | 0 | ASSERT_TRUE(result.Equals(encHost)); |
129 | 0 |
|
130 | 0 | encHostM = nsPrintfCString("0%o.0%o.0x%x.0x%x", val[0], val[1], val[2], val[3]); |
131 | 0 | ASSERT_EQ(NS_OK, Test_NormalizeIPv4(encHostM, result)); |
132 | 0 | ASSERT_TRUE(result.Equals(encHost)); |
133 | 0 | } |
134 | 0 | } |
135 | | |
136 | | TEST(TestStandardURL, NormalizeBad) |
137 | 0 | { |
138 | 0 | nsAutoCString result; |
139 | 0 | const char* manual[] = { "x22.232.12.32", "122..12.32", "122.12.32.12.32", "122.12.32..", |
140 | 0 | "122.12.xx.22", "122.12.0xx.22", "0xx.12.01.22", "0x.12.01.22", |
141 | 0 | "12.12.02x.22", "1q.12.2.22", "122.01f.02.22", "12a.01.02.22", |
142 | 0 | "12.01.02.20x1", "10x2.01.02.20", "0xx.01.02.20", "10.x.02.20", |
143 | 0 | "10.00x2.02.20", "10.13.02x2.20", "10.x13.02.20", "10.0x134def.02.20", |
144 | 0 | "\0.2.2.2", "256.2.2.2", "2.256.2.2", "2.2.256.2", |
145 | 0 | "2.2.2.256", "2.2.-2.3", "+2.2.2.3", "13.0x2x2.2.3", |
146 | 0 | "0x2x2.13.2.3"}; |
147 | 0 |
|
148 | 0 | for (uint32_t i = 0; i < sizeof(manual)/sizeof(manual[0]); i ++) { |
149 | 0 | nsCString encHost(manual[i]); |
150 | 0 | ASSERT_EQ(NS_ERROR_FAILURE, Test_NormalizeIPv4(encHost, result)); |
151 | 0 | } |
152 | 0 | } |
153 | | |
154 | | TEST(TestStandardURL, From_test_standardurldotjs) |
155 | 0 | { |
156 | 0 | // These are test (success and failure) cases from test_standardurl.js |
157 | 0 | nsAutoCString result; |
158 | 0 |
|
159 | 0 | const char* localIPv4s[] = {"127.0.0.1", "127.0.1", "127.1", "2130706433", |
160 | 0 | "0177.00.00.01", "0177.00.01", "0177.01", |
161 | 0 | "00000000000000000000000000177.0000000.0000000.0001", |
162 | 0 | "000000177.0000001", "017700000001", |
163 | 0 | "0x7f.0x00.0x00.0x01", "0x7f.0x01", |
164 | 0 | "0x7f000001", "0x007f.0x0000.0x0000.0x0001", |
165 | 0 | "000177.0.00000.0x0001", "127.0.0.1.", |
166 | 0 |
|
167 | 0 | "0X7F.0X00.0X00.0X01", "0X7F.0X01", |
168 | 0 | "0X7F000001", "0X007F.0X0000.0X0000.0X0001", |
169 | 0 | "000177.0.00000.0X0001"}; |
170 | 0 | for (uint32_t i = 0; i < sizeof(localIPv4s)/sizeof(localIPv4s[0]); i ++) { |
171 | 0 | nsCString encHost(localIPv4s[i]); |
172 | 0 | ASSERT_EQ(NS_OK, Test_NormalizeIPv4(encHost, result)); |
173 | 0 | ASSERT_TRUE(result.EqualsLiteral("127.0.0.1")); |
174 | 0 | } |
175 | 0 |
|
176 | 0 | const char* nonIPv4s[] = {"0xfffffffff", "0x100000000", "4294967296", "1.2.0x10000", |
177 | 0 | "1.0x1000000", "256.0.0.1", "1.256.1", "-1.0.0.0", |
178 | 0 | "1.2.3.4.5", "010000000000000000", "2+3", "0.0.0.-1", |
179 | 0 | "1.2.3.4..", "1..2", ".1.2.3.4"}; |
180 | 0 | for (uint32_t i = 0; i < sizeof(nonIPv4s)/sizeof(nonIPv4s[0]); i ++) { |
181 | 0 | nsCString encHost(nonIPv4s[i]); |
182 | 0 | ASSERT_EQ(NS_ERROR_FAILURE, Test_NormalizeIPv4(encHost, result)); |
183 | 0 | } |
184 | 0 | } |
185 | | |
186 | | #define COUNT 10000 |
187 | | |
188 | | MOZ_GTEST_BENCH(TestStandardURL, DISABLED_Perf, [] { |
189 | | nsCOMPtr<nsIURI> url; |
190 | | ASSERT_EQ(NS_OK, |
191 | | NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID) |
192 | | .SetSpec(NS_LITERAL_CSTRING("http://example.com")) |
193 | | .Finalize(url)); |
194 | | |
195 | | nsAutoCString out; |
196 | | for (int i = COUNT; i; --i) { |
197 | | ASSERT_EQ(NS_MutateURI(url).SetSpec(NS_LITERAL_CSTRING("http://example.com")).Finalize(url), NS_OK); |
198 | | ASSERT_EQ(url->GetSpec(out), NS_OK); |
199 | | url->Resolve(NS_LITERAL_CSTRING("foo.html?q=45"), out); |
200 | | mozilla::Unused << NS_MutateURI(url).SetScheme(NS_LITERAL_CSTRING("foo")).Finalize(url); |
201 | | url->GetScheme(out); |
202 | | mozilla::Unused << NS_MutateURI(url).SetHost(NS_LITERAL_CSTRING("www.yahoo.com")).Finalize(url); |
203 | | url->GetHost(out); |
204 | | mozilla::Unused << NS_MutateURI(url).SetPathQueryRef(NS_LITERAL_CSTRING("/some-path/one-the-net/about.html?with-a-query#for-you")).Finalize(url); |
205 | | url->GetPathQueryRef(out); |
206 | | mozilla::Unused << NS_MutateURI(url).SetQuery(NS_LITERAL_CSTRING("a=b&d=c&what-ever-you-want-to-be-called=45")).Finalize(url); |
207 | | url->GetQuery(out); |
208 | | mozilla::Unused << NS_MutateURI(url).SetRef(NS_LITERAL_CSTRING("#some-book-mark")).Finalize(url); |
209 | | url->GetRef(out); |
210 | | } |
211 | | }); |
212 | | |
213 | | // Note the five calls in the loop, so divide by 100k |
214 | | MOZ_GTEST_BENCH(TestStandardURL, DISABLED_NormalizePerf, [] { |
215 | | nsAutoCString result; |
216 | | for (int i = 0; i < 20000; i++) { |
217 | | nsAutoCString encHost("123.232.12.32"); |
218 | | ASSERT_EQ(NS_OK, Test_NormalizeIPv4(encHost, result)); |
219 | | nsAutoCString encHost2("83.62.12.92"); |
220 | | ASSERT_EQ(NS_OK, Test_NormalizeIPv4(encHost2, result)); |
221 | | nsAutoCString encHost3("8.7.6.5"); |
222 | | ASSERT_EQ(NS_OK, Test_NormalizeIPv4(encHost3, result)); |
223 | | nsAutoCString encHost4("111.159.123.220"); |
224 | | ASSERT_EQ(NS_OK, Test_NormalizeIPv4(encHost4, result)); |
225 | | nsAutoCString encHost5("1.160.204.200"); |
226 | | ASSERT_EQ(NS_OK, Test_NormalizeIPv4(encHost5, result)); |
227 | | } |
228 | | }); |
229 | | |
230 | | // Bug 1394785 - ignore unstable test on OSX |
231 | | #ifndef XP_MACOSX |
232 | | // Note the five calls in the loop, so divide by 100k |
233 | | MOZ_GTEST_BENCH(TestStandardURL, DISABLED_NormalizePerfFails, [] { |
234 | | nsAutoCString result; |
235 | | for (int i = 0; i < 20000; i++) { |
236 | | nsAutoCString encHost("123.292.12.32"); |
237 | | ASSERT_EQ(NS_ERROR_FAILURE, Test_NormalizeIPv4(encHost, result)); |
238 | | nsAutoCString encHost2("83.62.12.0x13292"); |
239 | | ASSERT_EQ(NS_ERROR_FAILURE, Test_NormalizeIPv4(encHost2, result)); |
240 | | nsAutoCString encHost3("8.7.6.0xhello"); |
241 | | ASSERT_EQ(NS_ERROR_FAILURE, Test_NormalizeIPv4(encHost3, result)); |
242 | | nsAutoCString encHost4("111.159.notonmywatch.220"); |
243 | | ASSERT_EQ(NS_ERROR_FAILURE, Test_NormalizeIPv4(encHost4, result)); |
244 | | nsAutoCString encHost5("1.160.204.20f"); |
245 | | ASSERT_EQ(NS_ERROR_FAILURE, Test_NormalizeIPv4(encHost5, result)); |
246 | | } |
247 | | }); |
248 | | #endif |
249 | | |
250 | | TEST(TestStandardURL, Mutator) |
251 | 0 | { |
252 | 0 | nsAutoCString out; |
253 | 0 | nsCOMPtr<nsIURI> uri; |
254 | 0 | nsresult rv = NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID) |
255 | 0 | .SetSpec(NS_LITERAL_CSTRING("http://example.com")) |
256 | 0 | .Finalize(uri); |
257 | 0 | ASSERT_EQ(rv, NS_OK); |
258 | 0 |
|
259 | 0 | ASSERT_EQ(uri->GetSpec(out), NS_OK); |
260 | 0 | ASSERT_TRUE(out == NS_LITERAL_CSTRING("http://example.com/")); |
261 | 0 |
|
262 | 0 | rv = NS_MutateURI(uri) |
263 | 0 | .SetScheme(NS_LITERAL_CSTRING("ftp")) |
264 | 0 | .SetHost(NS_LITERAL_CSTRING("mozilla.org")) |
265 | 0 | .SetPathQueryRef(NS_LITERAL_CSTRING("/path?query#ref")) |
266 | 0 | .Finalize(uri); |
267 | 0 | ASSERT_EQ(rv, NS_OK); |
268 | 0 | ASSERT_EQ(uri->GetSpec(out), NS_OK); |
269 | 0 | ASSERT_TRUE(out == NS_LITERAL_CSTRING("ftp://mozilla.org/path?query#ref")); |
270 | 0 |
|
271 | 0 | nsCOMPtr<nsIURL> url; |
272 | 0 | rv = NS_MutateURI(uri) |
273 | 0 | .SetScheme(NS_LITERAL_CSTRING("https")) |
274 | 0 | .Finalize(url); |
275 | 0 | ASSERT_EQ(rv, NS_OK); |
276 | 0 | ASSERT_EQ(url->GetSpec(out), NS_OK); |
277 | 0 | ASSERT_TRUE(out == NS_LITERAL_CSTRING("https://mozilla.org/path?query#ref")); |
278 | 0 | } |
279 | | |
280 | | TEST(TestStandardURL, Deserialize_Bug1392739) |
281 | 0 | { |
282 | 0 | mozilla::ipc::StandardURLParams standard_params; |
283 | 0 | standard_params.urlType() = nsIStandardURL::URLTYPE_STANDARD; |
284 | 0 | standard_params.spec() = NS_LITERAL_CSTRING(""); |
285 | 0 | standard_params.host() = mozilla::ipc::StandardURLSegment(4294967295, 1); |
286 | 0 |
|
287 | 0 | mozilla::ipc::URIParams params(standard_params); |
288 | 0 |
|
289 | 0 | nsCOMPtr<nsIURIMutator> mutator = do_CreateInstance(NS_STANDARDURLMUTATOR_CID); |
290 | 0 | ASSERT_EQ(mutator->Deserialize(params), NS_ERROR_FAILURE); |
291 | 0 | } |