Skip to content

Commit 6a5d961

Browse files
TimothyGuaddaleax
authored andcommitted
test: more comprehensive IDNA test cases
- Split the tests out to a separate file - Add invalid cases - Add tests for url.domainTo*() - Re-enable previously broken WPT URL parsing tests PR-URL: #11549 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Joyee Cheung <[email protected]>
1 parent 1b6ba9e commit 6a5d961

File tree

4 files changed

+311
-89
lines changed

4 files changed

+311
-89
lines changed

test/fixtures/url-idna.js

+217
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
'use strict';
2+
3+
// Credit for list: http://www.i18nguy.com/markup/idna-examples.html
4+
module.exports = {
5+
valid: [
6+
{ ascii: 'xn--mgbaal8b0b9b2b.icom.museum',
7+
unicode: 'افغانستا.icom.museum'
8+
},
9+
{
10+
ascii: 'xn--lgbbat1ad8j.icom.museum',
11+
unicode: 'الجزائر.icom.museum'
12+
},
13+
{
14+
ascii: 'xn--sterreich-z7a.icom.museum',
15+
unicode: 'österreich.icom.museum'
16+
},
17+
{
18+
ascii: 'xn--54b6eqazv8bc7e.icom.museum',
19+
unicode: 'বাংলাদেশ.icom.museum'
20+
},
21+
{
22+
ascii: 'xn--80abmy0agn7e.icom.museum',
23+
unicode: 'беларусь.icom.museum'
24+
},
25+
{
26+
ascii: 'xn--belgi-rsa.icom.museum',
27+
unicode: 'belgië.icom.museum'
28+
},
29+
{
30+
ascii: 'xn--80abgvm6a7d2b.icom.museum',
31+
unicode: 'българия.icom.museum'
32+
},
33+
{
34+
ascii: 'xn--mgbfqim.icom.museum',
35+
unicode: 'تشادر.icom.museum'
36+
},
37+
{
38+
ascii: 'xn--fiqs8s.icom.museum',
39+
unicode: '中国.icom.museum'
40+
},
41+
{
42+
ascii: 'xn--mgbu4chg.icom.museum',
43+
unicode: 'القمر.icom.museum'
44+
},
45+
{
46+
ascii: 'xn--vxakcego.icom.museum',
47+
unicode: 'κυπρος.icom.museum'
48+
},
49+
{
50+
ascii: 'xn--eskrepublika-ebb62d.icom.museum',
51+
unicode: 'českárepublika.icom.museum'
52+
},
53+
{
54+
ascii: 'xn--wgbh1c.icom.museum',
55+
unicode: 'مصر.icom.museum'
56+
},
57+
{
58+
ascii: 'xn--hxakic4aa.icom.museum',
59+
unicode: 'ελλάδα.icom.museum'
60+
},
61+
{
62+
ascii: 'xn--magyarorszg-t7a.icom.museum',
63+
unicode: 'magyarország.icom.museum'
64+
},
65+
{
66+
ascii: 'xn--sland-ysa.icom.museum',
67+
unicode: 'ísland.icom.museum'
68+
},
69+
{
70+
ascii: 'xn--h2brj9c.icom.museum',
71+
unicode: 'भारत.icom.museum'
72+
},
73+
{
74+
ascii: 'xn--mgba3a4fra.icom.museum',
75+
unicode: 'ايران.icom.museum'
76+
},
77+
{
78+
ascii: 'xn--ire-9la.icom.museum',
79+
unicode: 'éire.icom.museum'
80+
},
81+
{
82+
ascii: 'xn--4dbklr2c8d.xn--4dbrk0ce.museum',
83+
unicode: 'איקו״ם.ישראל.museum'
84+
},
85+
{
86+
ascii: 'xn--wgv71a.icom.museum',
87+
unicode: '日本.icom.museum'
88+
},
89+
{
90+
ascii: 'xn--igbhzh7gpa.icom.museum',
91+
unicode: 'الأردن.icom.museum'
92+
},
93+
{
94+
ascii: 'xn--80aaa0a6awh12ed.icom.museum',
95+
unicode: 'қазақстан.icom.museum'
96+
},
97+
{
98+
ascii: 'xn--3e0b707e.icom.museum',
99+
unicode: '한국.icom.museum'
100+
},
101+
{
102+
ascii: 'xn--80afmksoji0fc.icom.museum',
103+
unicode: 'кыргызстан.icom.museum'
104+
},
105+
{
106+
ascii: 'xn--q7ce6a.icom.museum',
107+
unicode: 'ລາວ.icom.museum'
108+
},
109+
{
110+
ascii: 'xn--mgbb7fjb.icom.museum',
111+
unicode: 'لبنان.icom.museum'
112+
},
113+
{
114+
ascii: 'xn--80aaldqjmmi6x.icom.museum',
115+
unicode: 'македонија.icom.museum'
116+
},
117+
{
118+
ascii: 'xn--mgbah1a3hjkrd.icom.museum',
119+
unicode: 'موريتانيا.icom.museum'
120+
},
121+
{
122+
ascii: 'xn--mxico-bsa.icom.museum',
123+
unicode: 'méxico.icom.museum'
124+
},
125+
{
126+
ascii: 'xn--c1aqabffc0aq.icom.museum',
127+
unicode: 'монголулс.icom.museum'
128+
},
129+
{
130+
ascii: 'xn--mgbc0a9azcg.icom.museum',
131+
unicode: 'المغرب.icom.museum'
132+
},
133+
{
134+
ascii: 'xn--l2bey1c2b.icom.museum',
135+
unicode: 'नेपाल.icom.museum'
136+
},
137+
{
138+
ascii: 'xn--mgb9awbf.icom.museum',
139+
unicode: 'عمان.icom.museum'
140+
},
141+
{
142+
ascii: 'xn--wgbl6a.icom.museum',
143+
unicode: 'قطر.icom.museum'
144+
},
145+
{
146+
ascii: 'xn--romnia-yta.icom.museum',
147+
unicode: 'românia.icom.museum'
148+
},
149+
{
150+
ascii: 'xn--h1alffa9f.xn--h1aegh.museum',
151+
unicode: 'россия.иком.museum'
152+
},
153+
{
154+
ascii: 'xn--80aaabm1ab4blmeec9e7n.xn--h1aegh.museum',
155+
unicode: 'србијаицрнагора.иком.museum'
156+
},
157+
{
158+
ascii: 'xn--xkc2al3hye2a.icom.museum',
159+
unicode: 'இலங்கை.icom.museum'
160+
},
161+
{
162+
ascii: 'xn--espaa-rta.icom.museum',
163+
unicode: 'españa.icom.museum'
164+
},
165+
{
166+
ascii: 'xn--o3cw4h.icom.museum',
167+
unicode: 'ไทย.icom.museum'
168+
},
169+
{
170+
ascii: 'xn--pgbs0dh.icom.museum',
171+
unicode: 'تونس.icom.museum'
172+
},
173+
{
174+
ascii: 'xn--trkiye-3ya.icom.museum',
175+
unicode: 'türkiye.icom.museum'
176+
},
177+
{
178+
ascii: 'xn--80aaxgrpt.icom.museum',
179+
unicode: 'украина.icom.museum'
180+
},
181+
{
182+
ascii: 'xn--vitnam-jk8b.icom.museum',
183+
unicode: 'việtnam.icom.museum'
184+
},
185+
// long URL
186+
{
187+
ascii: `${`${'a'.repeat(63)}.`.repeat(3)}com`,
188+
unicode: `${`${'a'.repeat(63)}.`.repeat(3)}com`
189+
}
190+
],
191+
invalid: [
192+
// long label
193+
{
194+
url: `${'a'.repeat(64)}.com`,
195+
mode: 'ascii'
196+
},
197+
// long URL
198+
{
199+
url: `${`${'a'.repeat(63)}.`.repeat(4)}com`,
200+
mode: 'ascii'
201+
},
202+
// invalid character
203+
{
204+
url: '\ufffd.com',
205+
mode: 'ascii'
206+
},
207+
{
208+
url: '\ufffd.com',
209+
mode: 'unicode'
210+
},
211+
// invalid Punycode
212+
{
213+
url: 'xn---abc.com',
214+
mode: 'unicode'
215+
}
216+
]
217+
}

test/fixtures/url-tests.js

+31-31
Original file line numberDiff line numberDiff line change
@@ -3589,17 +3589,17 @@ module.exports =
35893589
"base": "http://other.com/",
35903590
"failure": true
35913591
},
3592-
// "U+FFFD",
3593-
// {
3594-
// "input": "https://\ufffd",
3595-
// "base": "about:blank",
3596-
// "failure": true
3597-
// },
3598-
// {
3599-
// "input": "https://%EF%BF%BD",
3600-
// "base": "about:blank",
3601-
// "failure": true
3602-
// },
3592+
"U+FFFD",
3593+
{
3594+
"input": "https://\ufffd",
3595+
"base": "about:blank",
3596+
"failure": true
3597+
},
3598+
{
3599+
"input": "https://%EF%BF%BD",
3600+
"base": "about:blank",
3601+
"failure": true
3602+
},
36033603
{
36043604
"input": "https://x/\ufffd?\ufffd#\ufffd",
36053605
"base": "about:blank",
@@ -4497,26 +4497,26 @@ module.exports =
44974497
"hash": ""
44984498
},
44994499
"# Hosts and percent-encoding",
4500-
// {
4501-
// "input": "ftp://example.com%80/",
4502-
// "base": "about:blank",
4503-
// "failure": true
4504-
// },
4505-
// {
4506-
// "input": "ftp://example.com%A0/",
4507-
// "base": "about:blank",
4508-
// "failure": true
4509-
// },
4510-
// {
4511-
// "input": "https://example.com%80/",
4512-
// "base": "about:blank",
4513-
// "failure": true
4514-
// },
4515-
// {
4516-
// "input": "https://example.com%A0/",
4517-
// "base": "about:blank",
4518-
// "failure": true
4519-
// },
4500+
{
4501+
"input": "ftp://example.com%80/",
4502+
"base": "about:blank",
4503+
"failure": true
4504+
},
4505+
{
4506+
"input": "ftp://example.com%A0/",
4507+
"base": "about:blank",
4508+
"failure": true
4509+
},
4510+
{
4511+
"input": "https://example.com%80/",
4512+
"base": "about:blank",
4513+
"failure": true
4514+
},
4515+
{
4516+
"input": "https://example.com%A0/",
4517+
"base": "about:blank",
4518+
"failure": true
4519+
},
45204520
{
45214521
"input": "ftp://%e2%98%83",
45224522
"base": "about:blank",

test/parallel/test-icu-punycode.js

+27-58
Original file line numberDiff line numberDiff line change
@@ -6,67 +6,36 @@ if (!common.hasIntl) {
66
return;
77
}
88

9-
const icu = getPunycode();
9+
const icu = process.binding('icu');
1010
const assert = require('assert');
1111

12-
function getPunycode() {
13-
try {
14-
return process.binding('icu');
15-
} catch (err) {
16-
return undefined;
12+
const tests = require('../fixtures/url-idna.js');
13+
14+
{
15+
for (const [i, { ascii, unicode }] of tests.valid.entries()) {
16+
assert.strictEqual(ascii, icu.toASCII(unicode), `toASCII(${i + 1})`);
17+
assert.strictEqual(unicode, icu.toUnicode(ascii), `toUnicode(${i + 1})`);
18+
assert.strictEqual(ascii, icu.toASCII(icu.toUnicode(ascii)),
19+
`toASCII(toUnicode(${i + 1}))`);
20+
assert.strictEqual(unicode, icu.toUnicode(icu.toASCII(unicode)),
21+
`toUnicode(toASCII(${i + 1}))`);
1722
}
1823
}
1924

20-
// Credit for list: http://www.i18nguy.com/markup/idna-examples.html
21-
const tests = [
22-
'افغانستا.icom.museum',
23-
'الجزائر.icom.museum',
24-
'österreich.icom.museum',
25-
'বাংলাদেশ.icom.museum',
26-
'беларусь.icom.museum',
27-
'belgië.icom.museum',
28-
'българия.icom.museum',
29-
'تشادر.icom.museum',
30-
'中国.icom.museum',
31-
'القمر.icom.museum',
32-
'κυπρος.icom.museum',
33-
'českárepublika.icom.museum',
34-
'مصر.icom.museum',
35-
'ελλάδα.icom.museum',
36-
'magyarország.icom.museum',
37-
'ísland.icom.museum',
38-
'भारत.icom.museum',
39-
'ايران.icom.museum',
40-
'éire.icom.museum',
41-
'איקו״ם.ישראל.museum',
42-
'日本.icom.museum',
43-
'الأردن.icom.museum',
44-
'қазақстан.icom.museum',
45-
'한국.icom.museum',
46-
'кыргызстан.icom.museum',
47-
'ລາວ.icom.museum',
48-
'لبنان.icom.museum',
49-
'македонија.icom.museum',
50-
'موريتانيا.icom.museum',
51-
'méxico.icom.museum',
52-
'монголулс.icom.museum',
53-
'المغرب.icom.museum',
54-
'नेपाल.icom.museum',
55-
'عمان.icom.museum',
56-
'قطر.icom.museum',
57-
'românia.icom.museum',
58-
'россия.иком.museum',
59-
'србијаицрнагора.иком.museum',
60-
'இலங்கை.icom.museum',
61-
'españa.icom.museum',
62-
'ไทย.icom.museum',
63-
'تونس.icom.museum',
64-
'türkiye.icom.museum',
65-
'украина.icom.museum',
66-
'việtnam.icom.museum'
67-
];
25+
{
26+
const errorRe = {
27+
ascii: /^Error: Cannot convert name to ASCII$/,
28+
unicode: /^Error: Cannot convert name to Unicode$/
29+
};
30+
const convertFunc = {
31+
ascii: icu.toASCII,
32+
unicode: icu.toUnicode
33+
};
6834

69-
// Testing the roundtrip
70-
tests.forEach((i) => {
71-
assert.strictEqual(i, icu.toUnicode(icu.toASCII(i)));
72-
});
35+
for (const [i, { url, mode }] of tests.invalid.entries()) {
36+
assert.throws(() => convertFunc[mode](url), errorRe[mode],
37+
`Invalid case ${i + 1}`);
38+
assert.doesNotThrow(() => convertFunc[mode](url, true),
39+
`Invalid case ${i + 1} in lenient mode`);
40+
}
41+
}

0 commit comments

Comments
 (0)