|
|
|
/*
|
|
|
|
* Brute force test cases for URI encoding and decoding functions.
|
|
|
|
*
|
|
|
|
* There are no test cases for decoding extended UTF-8 codepoints
|
|
|
|
* because such strings must explicitly be rejected (this is
|
|
|
|
* specified quite clearly). If a custom entrypoint with more
|
|
|
|
* control is added, separate testcases for that should be added.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*---
|
|
|
|
{
|
|
|
|
"slow": true
|
|
|
|
}
|
|
|
|
---*/
|
|
|
|
|
|
|
|
// indirect eval -> this is bound to the global object, E5 Section 10.4.2, step 1.a.
|
|
|
|
var g = (function () { var e = eval; return e('this'); } )();
|
|
|
|
|
|
|
|
/* Dump a string as decimal codepoints, ensures that tests produce ASCII only
|
|
|
|
* outputs.
|
|
|
|
*/
|
|
|
|
function dumpCodePoints(x) {
|
|
|
|
var i;
|
|
|
|
var res = [];
|
|
|
|
|
|
|
|
for (i = 0; i < x.length; i++) {
|
|
|
|
res.push(x.charCodeAt(i));
|
|
|
|
}
|
|
|
|
|
|
|
|
return res.join(' ');
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Brute force URI encode/decode conversion for the entire BMP range.
|
|
|
|
*/
|
|
|
|
|
|
|
|
function genString(start, count) {
|
|
|
|
var res = [];
|
|
|
|
var i, cp;
|
|
|
|
|
|
|
|
for (i = 0; i < count; i++) {
|
|
|
|
cp = start + i;
|
|
|
|
res[i] = String.fromCharCode(cp);
|
|
|
|
}
|
|
|
|
|
|
|
|
return res.join('');
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Trivial string checksum used to summarize brute force output lines
|
|
|
|
* (minimizes test case size).
|
|
|
|
*/
|
|
|
|
function checkSumString(x) {
|
|
|
|
var i, n;
|
|
|
|
var res = 0;
|
|
|
|
var mult = [ 1, 3, 5, 7, 11, 13, 17, 19, 23 ];
|
|
|
|
|
|
|
|
n = x.length;
|
|
|
|
for (i = 0; i < n; i++) {
|
|
|
|
res += x.charCodeAt(i) * mult[i % mult.length];
|
|
|
|
res = res >>> 0; // coerce to 32 bits
|
|
|
|
}
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*===
|
|
|
|
encodeURI BMP
|
|
|
|
0 true 3321596
|
|
|
|
1024 true 3710104
|
|
|
|
2048 true 5466624
|
|
|
|
3072 true 5477888
|
|
|
|
4096 true 5370368
|
|
|
|
5120 true 5381632
|
|
|
|
6144 true 5471744
|
|
|
|
7168 true 5483008
|
|
|
|
8192 true 5375488
|
|
|
|
9216 true 5386752
|
|
|
|
10240 true 5476864
|
|
|
|
11264 true 5488128
|
|
|
|
12288 true 5380608
|
|
|
|
13312 true 5391872
|
|
|
|
14336 true 5481984
|
|
|
|
15360 true 5493248
|
|
|
|
16384 true 5385728
|
|
|
|
17408 true 5396992
|
|
|
|
18432 true 5487104
|
|
|
|
19456 true 5498368
|
|
|
|
20480 true 5390848
|
|
|
|
21504 true 5402112
|
|
|
|
22528 true 5492224
|
|
|
|
23552 true 5503488
|
|
|
|
24576 true 5395968
|
|
|
|
25600 true 5407232
|
|
|
|
26624 true 5497344
|
|
|
|
27648 true 5508608
|
|
|
|
28672 true 5401088
|
|
|
|
29696 true 5412352
|
|
|
|
30720 true 5502464
|
|
|
|
31744 true 5513728
|
|
|
|
32768 true 5406208
|
|
|
|
33792 true 5417472
|
|
|
|
34816 true 5507584
|
|
|
|
35840 true 5518848
|
|
|
|
36864 true 5411328
|
|
|
|
37888 true 5422592
|
|
|
|
38912 true 5512704
|
|
|
|
39936 true 5523968
|
|
|
|
40960 true 5452288
|
|
|
|
41984 true 5463552
|
|
|
|
43008 true 5553664
|
|
|
|
44032 true 5564928
|
|
|
|
45056 true 5457408
|
|
|
|
46080 true 5468672
|
|
|
|
47104 true 5558784
|
|
|
|
48128 true 5570048
|
|
|
|
49152 true 5462528
|
|
|
|
50176 true 5473792
|
|
|
|
51200 true 5563904
|
|
|
|
52224 true 5575168
|
|
|
|
53248 true 5467648
|
|
|
|
54272 true 5478912
|
|
|
|
55296 URIError (expected)
|
|
|
|
56320 URIError (expected)
|
|
|
|
57344 true 5472768
|
|
|
|
58368 true 5484032
|
|
|
|
59392 true 5574144
|
|
|
|
60416 true 5585408
|
|
|
|
61440 true 5477888
|
|
|
|
62464 true 5489152
|
|
|
|
63488 true 5579264
|
|
|
|
64512 true 5590528
|
|
|
|
encodeURIComponent BMP
|
|
|
|
0 true 3177834
|
|
|
|
1024 true 3710104
|
|
|
|
2048 true 5466624
|
|
|
|
3072 true 5477888
|
|
|
|
4096 true 5370368
|
|
|
|
5120 true 5381632
|
|
|
|
6144 true 5471744
|
|
|
|
7168 true 5483008
|
|
|
|
8192 true 5375488
|
|
|
|
9216 true 5386752
|
|
|
|
10240 true 5476864
|
|
|
|
11264 true 5488128
|
|
|
|
12288 true 5380608
|
|
|
|
13312 true 5391872
|
|
|
|
14336 true 5481984
|
|
|
|
15360 true 5493248
|
|
|
|
16384 true 5385728
|
|
|
|
17408 true 5396992
|
|
|
|
18432 true 5487104
|
|
|
|
19456 true 5498368
|
|
|
|
20480 true 5390848
|
|
|
|
21504 true 5402112
|
|
|
|
22528 true 5492224
|
|
|
|
23552 true 5503488
|
|
|
|
24576 true 5395968
|
|
|
|
25600 true 5407232
|
|
|
|
26624 true 5497344
|
|
|
|
27648 true 5508608
|
|
|
|
28672 true 5401088
|
|
|
|
29696 true 5412352
|
|
|
|
30720 true 5502464
|
|
|
|
31744 true 5513728
|
|
|
|
32768 true 5406208
|
|
|
|
33792 true 5417472
|
|
|
|
34816 true 5507584
|
|
|
|
35840 true 5518848
|
|
|
|
36864 true 5411328
|
|
|
|
37888 true 5422592
|
|
|
|
38912 true 5512704
|
|
|
|
39936 true 5523968
|
|
|
|
40960 true 5452288
|
|
|
|
41984 true 5463552
|
|
|
|
43008 true 5553664
|
|
|
|
44032 true 5564928
|
|
|
|
45056 true 5457408
|
|
|
|
46080 true 5468672
|
|
|
|
47104 true 5558784
|
|
|
|
48128 true 5570048
|
|
|
|
49152 true 5462528
|
|
|
|
50176 true 5473792
|
|
|
|
51200 true 5563904
|
|
|
|
52224 true 5575168
|
|
|
|
53248 true 5467648
|
|
|
|
54272 true 5478912
|
|
|
|
55296 URIError (expected)
|
|
|
|
56320 URIError (expected)
|
|
|
|
57344 true 5472768
|
|
|
|
58368 true 5484032
|
|
|
|
59392 true 5574144
|
|
|
|
60416 true 5585408
|
|
|
|
61440 true 5477888
|
|
|
|
62464 true 5489152
|
|
|
|
63488 true 5579264
|
|
|
|
64512 true 5590528
|
|
|
|
===*/
|
|
|
|
|
|
|
|
/* Test encodeURI and encodeURIComponent for BMP. Results are string hashed
|
|
|
|
* to minimize output size.
|
|
|
|
*/
|
|
|
|
|
|
|
|
function encodeURIBMPTest(is_uricomponent) {
|
|
|
|
var x1, x2, x3;
|
|
|
|
var got_urierror;
|
|
|
|
|
|
|
|
// step 1024 (= 0x400), ensure that 0xd800...0xdfff aligns nicely
|
|
|
|
for (var i = 0; i < 65536; i += 1024) {
|
|
|
|
got_urierror = false;
|
|
|
|
try {
|
|
|
|
x1 = genString(i, 1024);
|
|
|
|
if (is_uricomponent) {
|
|
|
|
x2 = g.encodeURIComponent(x1);
|
|
|
|
x3 = g.decodeURIComponent(x2);
|
|
|
|
} else {
|
|
|
|
x2 = g.encodeURI(x1);
|
|
|
|
x3 = g.decodeURI(x2);
|
|
|
|
}
|
|
|
|
print(i, (x1 === x3), checkSumString(x2));
|
|
|
|
} catch (e) {
|
|
|
|
if (e.name === 'URIError') {
|
|
|
|
got_urierror = true;
|
|
|
|
} else {
|
|
|
|
throw e;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i >= 0xd800 && i < 0xe000) {
|
|
|
|
// For surrogate pairs encoded 'naively' into UTF-8,
|
|
|
|
// URIError is required.
|
|
|
|
if (got_urierror) {
|
|
|
|
print(i, 'URIError (expected)');
|
|
|
|
} else {
|
|
|
|
print(i, 'URIError (unexpected)');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
print('encodeURI BMP');
|
|
|
|
encodeURIBMPTest(false);
|
|
|
|
print('encodeURIComponent BMP');
|
|
|
|
encodeURIBMPTest(true);
|
|
|
|
} catch (e) {
|
|
|
|
print(e.name, e);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*===
|
|
|
|
encodeURI surrogate pairs
|
|
|
|
459501750
|
|
|
|
465268918
|
|
|
|
465989814
|
|
|
|
459676504
|
|
|
|
460397400
|
|
|
|
466164568
|
|
|
|
466885464
|
|
|
|
460572154
|
|
|
|
461293050
|
|
|
|
467060218
|
|
|
|
467781114
|
|
|
|
461467804
|
|
|
|
462188700
|
|
|
|
467955868
|
|
|
|
468676764
|
|
|
|
462363454
|
|
|
|
encodeURIComponent surrogate pairs
|
|
|
|
459501750
|
|
|
|
465268918
|
|
|
|
465989814
|
|
|
|
459676504
|
|
|
|
460397400
|
|
|
|
466164568
|
|
|
|
466885464
|
|
|
|
460572154
|
|
|
|
461293050
|
|
|
|
467060218
|
|
|
|
467781114
|
|
|
|
461467804
|
|
|
|
462188700
|
|
|
|
467955868
|
|
|
|
468676764
|
|
|
|
462363454
|
|
|
|
===*/
|
|
|
|
|
|
|
|
/* Test surrogate pair encoding. Results are string hashed in large pieces
|
|
|
|
* to minimize test output size.
|
|
|
|
*/
|
|
|
|
|
|
|
|
function encodeURISurrogatePairTest(is_uricomponent) {
|
|
|
|
var x1, x2, x3;
|
|
|
|
var lo, hi;
|
|
|
|
var tmp = [];
|
|
|
|
|
|
|
|
for (var i = 0; i < 0x100000; i++) {
|
|
|
|
hi = 0xd800 + ((i >> 10) & 0x03ff);
|
|
|
|
lo = 0xdc00 + (i & 0x03ff);
|
|
|
|
|
|
|
|
tmp.push(String.fromCharCode(hi, lo));
|
|
|
|
if (tmp.length < 65536) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
x1 = tmp.join('');
|
|
|
|
if (is_uricomponent) {
|
|
|
|
x2 = g.encodeURIComponent(x1);
|
|
|
|
x3 = g.decodeURIComponent(x2);
|
|
|
|
} else {
|
|
|
|
x2 = g.encodeURI(x1);
|
|
|
|
x3 = g.decodeURI(x2);
|
|
|
|
}
|
|
|
|
print(checkSumString(x2));
|
|
|
|
tmp = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tmp.length != 0) {
|
|
|
|
throw new Error('internal error');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
print('encodeURI surrogate pairs');
|
|
|
|
encodeURISurrogatePairTest(false);
|
|
|
|
print('encodeURIComponent surrogate pairs');
|
|
|
|
encodeURISurrogatePairTest(true);
|
|
|
|
} catch (e) {
|
|
|
|
print(e.name, e);
|
|
|
|
}
|
|
|
|
/*===
|
|
|
|
===*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
decodeURI
|
|
|
|
decodeURIComponent
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* FIXME: decoding bruteforce cases? ASCII range decoding cases already
|
|
|
|
* exist, what to test here?
|
|
|
|
*/
|
|
|
|
|