Coverage Report

Created: 2018-09-25 14:53

/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
}