Skip to content

Commit

Permalink
test: more comprehensive IDNA test cases
Browse files Browse the repository at this point in the history
- 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 <anna@addaleax.net>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
  • Loading branch information
TimothyGu authored and addaleax committed Mar 5, 2017
1 parent 1b6ba9e commit 6a5d961
Show file tree
Hide file tree
Showing 4 changed files with 311 additions and 89 deletions.
217 changes: 217 additions & 0 deletions test/fixtures/url-idna.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
'use strict';

// Credit for list: http://www.i18nguy.com/markup/idna-examples.html
module.exports = {
valid: [
{ ascii: 'xn--mgbaal8b0b9b2b.icom.museum',
unicode: 'افغانستا.icom.museum'
},
{
ascii: 'xn--lgbbat1ad8j.icom.museum',
unicode: 'الجزائر.icom.museum'
},
{
ascii: 'xn--sterreich-z7a.icom.museum',
unicode: 'österreich.icom.museum'
},
{
ascii: 'xn--54b6eqazv8bc7e.icom.museum',
unicode: 'বাংলাদেশ.icom.museum'
},
{
ascii: 'xn--80abmy0agn7e.icom.museum',
unicode: 'беларусь.icom.museum'
},
{
ascii: 'xn--belgi-rsa.icom.museum',
unicode: 'belgië.icom.museum'
},
{
ascii: 'xn--80abgvm6a7d2b.icom.museum',
unicode: 'българия.icom.museum'
},
{
ascii: 'xn--mgbfqim.icom.museum',
unicode: 'تشادر.icom.museum'
},
{
ascii: 'xn--fiqs8s.icom.museum',
unicode: '中国.icom.museum'
},
{
ascii: 'xn--mgbu4chg.icom.museum',
unicode: 'القمر.icom.museum'
},
{
ascii: 'xn--vxakcego.icom.museum',
unicode: 'κυπρος.icom.museum'
},
{
ascii: 'xn--eskrepublika-ebb62d.icom.museum',
unicode: 'českárepublika.icom.museum'
},
{
ascii: 'xn--wgbh1c.icom.museum',
unicode: 'مصر.icom.museum'
},
{
ascii: 'xn--hxakic4aa.icom.museum',
unicode: 'ελλάδα.icom.museum'
},
{
ascii: 'xn--magyarorszg-t7a.icom.museum',
unicode: 'magyarország.icom.museum'
},
{
ascii: 'xn--sland-ysa.icom.museum',
unicode: 'ísland.icom.museum'
},
{
ascii: 'xn--h2brj9c.icom.museum',
unicode: 'भारत.icom.museum'
},
{
ascii: 'xn--mgba3a4fra.icom.museum',
unicode: 'ايران.icom.museum'
},
{
ascii: 'xn--ire-9la.icom.museum',
unicode: 'éire.icom.museum'
},
{
ascii: 'xn--4dbklr2c8d.xn--4dbrk0ce.museum',
unicode: 'איקו״ם.ישראל.museum'
},
{
ascii: 'xn--wgv71a.icom.museum',
unicode: '日本.icom.museum'
},
{
ascii: 'xn--igbhzh7gpa.icom.museum',
unicode: 'الأردن.icom.museum'
},
{
ascii: 'xn--80aaa0a6awh12ed.icom.museum',
unicode: 'қазақстан.icom.museum'
},
{
ascii: 'xn--3e0b707e.icom.museum',
unicode: '한국.icom.museum'
},
{
ascii: 'xn--80afmksoji0fc.icom.museum',
unicode: 'кыргызстан.icom.museum'
},
{
ascii: 'xn--q7ce6a.icom.museum',
unicode: 'ລາວ.icom.museum'
},
{
ascii: 'xn--mgbb7fjb.icom.museum',
unicode: 'لبنان.icom.museum'
},
{
ascii: 'xn--80aaldqjmmi6x.icom.museum',
unicode: 'македонија.icom.museum'
},
{
ascii: 'xn--mgbah1a3hjkrd.icom.museum',
unicode: 'موريتانيا.icom.museum'
},
{
ascii: 'xn--mxico-bsa.icom.museum',
unicode: 'méxico.icom.museum'
},
{
ascii: 'xn--c1aqabffc0aq.icom.museum',
unicode: 'монголулс.icom.museum'
},
{
ascii: 'xn--mgbc0a9azcg.icom.museum',
unicode: 'المغرب.icom.museum'
},
{
ascii: 'xn--l2bey1c2b.icom.museum',
unicode: 'नेपाल.icom.museum'
},
{
ascii: 'xn--mgb9awbf.icom.museum',
unicode: 'عمان.icom.museum'
},
{
ascii: 'xn--wgbl6a.icom.museum',
unicode: 'قطر.icom.museum'
},
{
ascii: 'xn--romnia-yta.icom.museum',
unicode: 'românia.icom.museum'
},
{
ascii: 'xn--h1alffa9f.xn--h1aegh.museum',
unicode: 'россия.иком.museum'
},
{
ascii: 'xn--80aaabm1ab4blmeec9e7n.xn--h1aegh.museum',
unicode: 'србијаицрнагора.иком.museum'
},
{
ascii: 'xn--xkc2al3hye2a.icom.museum',
unicode: 'இலங்கை.icom.museum'
},
{
ascii: 'xn--espaa-rta.icom.museum',
unicode: 'españa.icom.museum'
},
{
ascii: 'xn--o3cw4h.icom.museum',
unicode: 'ไทย.icom.museum'
},
{
ascii: 'xn--pgbs0dh.icom.museum',
unicode: 'تونس.icom.museum'
},
{
ascii: 'xn--trkiye-3ya.icom.museum',
unicode: 'türkiye.icom.museum'
},
{
ascii: 'xn--80aaxgrpt.icom.museum',
unicode: 'украина.icom.museum'
},
{
ascii: 'xn--vitnam-jk8b.icom.museum',
unicode: 'việtnam.icom.museum'
},
// long URL
{
ascii: `${`${'a'.repeat(63)}.`.repeat(3)}com`,
unicode: `${`${'a'.repeat(63)}.`.repeat(3)}com`
}
],
invalid: [
// long label
{
url: `${'a'.repeat(64)}.com`,
mode: 'ascii'
},
// long URL
{
url: `${`${'a'.repeat(63)}.`.repeat(4)}com`,
mode: 'ascii'
},
// invalid character
{
url: '\ufffd.com',
mode: 'ascii'
},
{
url: '\ufffd.com',
mode: 'unicode'
},
// invalid Punycode
{
url: 'xn---abc.com',
mode: 'unicode'
}
]
}
62 changes: 31 additions & 31 deletions test/fixtures/url-tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -3589,17 +3589,17 @@ module.exports =
"base": "http://other.com/",
"failure": true
},
// "U+FFFD",
// {
// "input": "https://\ufffd",
// "base": "about:blank",
// "failure": true
// },
// {
// "input": "https://%EF%BF%BD",
// "base": "about:blank",
// "failure": true
// },
"U+FFFD",
{
"input": "https://\ufffd",
"base": "about:blank",
"failure": true
},
{
"input": "https://%EF%BF%BD",
"base": "about:blank",
"failure": true
},
{
"input": "https://x/\ufffd?\ufffd#\ufffd",
"base": "about:blank",
Expand Down Expand Up @@ -4497,26 +4497,26 @@ module.exports =
"hash": ""
},
"# Hosts and percent-encoding",
// {
// "input": "ftp://example.com%80/",
// "base": "about:blank",
// "failure": true
// },
// {
// "input": "ftp://example.com%A0/",
// "base": "about:blank",
// "failure": true
// },
// {
// "input": "https://example.com%80/",
// "base": "about:blank",
// "failure": true
// },
// {
// "input": "https://example.com%A0/",
// "base": "about:blank",
// "failure": true
// },
{
"input": "ftp://example.com%80/",
"base": "about:blank",
"failure": true
},
{
"input": "ftp://example.com%A0/",
"base": "about:blank",
"failure": true
},
{
"input": "https://example.com%80/",
"base": "about:blank",
"failure": true
},
{
"input": "https://example.com%A0/",
"base": "about:blank",
"failure": true
},
{
"input": "ftp://%e2%98%83",
"base": "about:blank",
Expand Down
85 changes: 27 additions & 58 deletions test/parallel/test-icu-punycode.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,67 +6,36 @@ if (!common.hasIntl) {
return;
}

const icu = getPunycode();
const icu = process.binding('icu');
const assert = require('assert');

function getPunycode() {
try {
return process.binding('icu');
} catch (err) {
return undefined;
const tests = require('../fixtures/url-idna.js');

{
for (const [i, { ascii, unicode }] of tests.valid.entries()) {
assert.strictEqual(ascii, icu.toASCII(unicode), `toASCII(${i + 1})`);
assert.strictEqual(unicode, icu.toUnicode(ascii), `toUnicode(${i + 1})`);
assert.strictEqual(ascii, icu.toASCII(icu.toUnicode(ascii)),
`toASCII(toUnicode(${i + 1}))`);
assert.strictEqual(unicode, icu.toUnicode(icu.toASCII(unicode)),
`toUnicode(toASCII(${i + 1}))`);
}
}

// Credit for list: http://www.i18nguy.com/markup/idna-examples.html
const tests = [
'افغانستا.icom.museum',
'الجزائر.icom.museum',
'österreich.icom.museum',
'বাংলাদেশ.icom.museum',
'беларусь.icom.museum',
'belgië.icom.museum',
'българия.icom.museum',
'تشادر.icom.museum',
'中国.icom.museum',
'القمر.icom.museum',
'κυπρος.icom.museum',
'českárepublika.icom.museum',
'مصر.icom.museum',
'ελλάδα.icom.museum',
'magyarország.icom.museum',
'ísland.icom.museum',
'भारत.icom.museum',
'ايران.icom.museum',
'éire.icom.museum',
'איקו״ם.ישראל.museum',
'日本.icom.museum',
'الأردن.icom.museum',
'қазақстан.icom.museum',
'한국.icom.museum',
'кыргызстан.icom.museum',
'ລາວ.icom.museum',
'لبنان.icom.museum',
'македонија.icom.museum',
'موريتانيا.icom.museum',
'méxico.icom.museum',
'монголулс.icom.museum',
'المغرب.icom.museum',
'नेपाल.icom.museum',
'عمان.icom.museum',
'قطر.icom.museum',
'românia.icom.museum',
'россия.иком.museum',
'србијаицрнагора.иком.museum',
'இலங்கை.icom.museum',
'españa.icom.museum',
'ไทย.icom.museum',
'تونس.icom.museum',
'türkiye.icom.museum',
'украина.icom.museum',
'việtnam.icom.museum'
];
{
const errorRe = {
ascii: /^Error: Cannot convert name to ASCII$/,
unicode: /^Error: Cannot convert name to Unicode$/
};
const convertFunc = {
ascii: icu.toASCII,
unicode: icu.toUnicode
};

// Testing the roundtrip
tests.forEach((i) => {
assert.strictEqual(i, icu.toUnicode(icu.toASCII(i)));
});
for (const [i, { url, mode }] of tests.invalid.entries()) {
assert.throws(() => convertFunc[mode](url), errorRe[mode],
`Invalid case ${i + 1}`);
assert.doesNotThrow(() => convertFunc[mode](url, true),
`Invalid case ${i + 1} in lenient mode`);
}
}
Loading

0 comments on commit 6a5d961

Please sign in to comment.