Skip to content

Commit 7053922

Browse files
committed
test: clean up / refactor buffer tests, remove duplication
Remove duplication of buffer tests, separate out into separate files, update and cleanup code, move to using strictEqual where possible. PR-URL: #8256 Reviewed-By: Michaël Zasso <[email protected]>
1 parent b3e7ac2 commit 7053922

12 files changed

+926
-2443
lines changed

test/parallel/test-buffer-alloc.js

+463-912
Large diffs are not rendered by default.

test/parallel/test-buffer-compare.js

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
'use strict';
2+
3+
require('../common');
4+
const assert = require('assert');
5+
6+
const b = Buffer.alloc(1, 'a');
7+
const c = Buffer.alloc(1, 'c');
8+
const d = Buffer.alloc(2, 'aa');
9+
10+
assert.strictEqual(b.compare(c), -1);
11+
assert.strictEqual(c.compare(d), 1);
12+
assert.strictEqual(d.compare(b), 1);
13+
assert.strictEqual(b.compare(d), -1);
14+
assert.strictEqual(b.compare(b), 0);
15+
16+
assert.strictEqual(Buffer.compare(b, c), -1);
17+
assert.strictEqual(Buffer.compare(c, d), 1);
18+
assert.strictEqual(Buffer.compare(d, b), 1);
19+
assert.strictEqual(Buffer.compare(b, d), -1);
20+
assert.strictEqual(Buffer.compare(c, c), 0);
21+
22+
assert.strictEqual(Buffer.compare(Buffer.alloc(0), Buffer.alloc(0)), 0);
23+
assert.strictEqual(Buffer.compare(Buffer.alloc(0), Buffer.alloc(1)), -1);
24+
assert.strictEqual(Buffer.compare(Buffer.alloc(1), Buffer.alloc(0)), 1);
25+
26+
assert.throws(() => Buffer.compare(Buffer.alloc(1), 'abc'));
27+
28+
assert.throws(() => Buffer.compare('abc', Buffer.alloc(1)));
29+
30+
assert.throws(() => Buffer.alloc(1).compare('abc'));

test/parallel/test-buffer-copy.js

+120
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
'use strict';
2+
3+
require('../common');
4+
const assert = require('assert');
5+
6+
var b = Buffer.allocUnsafe(1024);
7+
var c = Buffer.allocUnsafe(512);
8+
var cntr = 0;
9+
10+
{
11+
// copy 512 bytes, from 0 to 512.
12+
b.fill(++cntr);
13+
c.fill(++cntr);
14+
const copied = b.copy(c, 0, 0, 512);
15+
assert.strictEqual(512, copied);
16+
for (let i = 0; i < c.length; i++) {
17+
assert.strictEqual(b[i], c[i]);
18+
}
19+
}
20+
21+
{
22+
// copy c into b, without specifying sourceEnd
23+
b.fill(++cntr);
24+
c.fill(++cntr);
25+
const copied = c.copy(b, 0, 0);
26+
assert.strictEqual(c.length, copied);
27+
for (let i = 0; i < c.length; i++) {
28+
assert.strictEqual(c[i], b[i]);
29+
}
30+
}
31+
32+
{
33+
// copy c into b, without specifying sourceStart
34+
b.fill(++cntr);
35+
c.fill(++cntr);
36+
const copied = c.copy(b, 0);
37+
assert.strictEqual(c.length, copied);
38+
for (let i = 0; i < c.length; i++) {
39+
assert.strictEqual(c[i], b[i]);
40+
}
41+
}
42+
43+
{
44+
// copy longer buffer b to shorter c without targetStart
45+
b.fill(++cntr);
46+
c.fill(++cntr);
47+
const copied = b.copy(c);
48+
assert.strictEqual(c.length, copied);
49+
for (let i = 0; i < c.length; i++) {
50+
assert.strictEqual(b[i], c[i]);
51+
}
52+
}
53+
54+
{
55+
// copy starting near end of b to c
56+
b.fill(++cntr);
57+
c.fill(++cntr);
58+
const copied = b.copy(c, 0, b.length - Math.floor(c.length / 2));
59+
assert.strictEqual(Math.floor(c.length / 2), copied);
60+
for (let i = 0; i < Math.floor(c.length / 2); i++) {
61+
assert.strictEqual(b[b.length - Math.floor(c.length / 2) + i], c[i]);
62+
}
63+
for (let i = Math.floor(c.length / 2) + 1; i < c.length; i++) {
64+
assert.strictEqual(c[c.length - 1], c[i]);
65+
}
66+
}
67+
68+
{
69+
// try to copy 513 bytes, and check we don't overrun c
70+
b.fill(++cntr);
71+
c.fill(++cntr);
72+
const copied = b.copy(c, 0, 0, 513);
73+
assert.strictEqual(c.length, copied);
74+
for (let i = 0; i < c.length; i++) {
75+
assert.strictEqual(b[i], c[i]);
76+
}
77+
}
78+
79+
{
80+
// copy 768 bytes from b into b
81+
b.fill(++cntr);
82+
b.fill(++cntr, 256);
83+
const copied = b.copy(b, 0, 256, 1024);
84+
assert.strictEqual(768, copied);
85+
for (let i = 0; i < b.length; i++) {
86+
assert.strictEqual(cntr, b[i]);
87+
}
88+
}
89+
90+
// copy string longer than buffer length (failure will segfault)
91+
var bb = Buffer.allocUnsafe(10);
92+
bb.fill('hello crazy world');
93+
94+
95+
// try to copy from before the beginning of b
96+
assert.doesNotThrow(() => { b.copy(c, 0, 100, 10); });
97+
98+
// copy throws at negative sourceStart
99+
assert.throws(function() {
100+
Buffer.allocUnsafe(5).copy(Buffer.allocUnsafe(5), 0, -1);
101+
}, RangeError);
102+
103+
{
104+
// check sourceEnd resets to targetEnd if former is greater than the latter
105+
b.fill(++cntr);
106+
c.fill(++cntr);
107+
b.copy(c, 0, 0, 1025);
108+
for (let i = 0; i < c.length; i++) {
109+
assert.strictEqual(b[i], c[i]);
110+
}
111+
}
112+
113+
// throw with negative sourceEnd
114+
assert.throws(() => b.copy(c, 0, 0, -1), RangeError);
115+
116+
// when sourceStart is greater than sourceEnd, zero copied
117+
assert.strictEqual(b.copy(c, 0, 100, 10), 0);
118+
119+
// when targetStart > targetLength, zero copied
120+
assert.strictEqual(b.copy(c, 512, 0, 10), 0);

test/parallel/test-buffer-equals.js

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
'use strict';
2+
3+
require('../common');
4+
const assert = require('assert');
5+
6+
const b = Buffer.from('abcdf');
7+
const c = Buffer.from('abcdf');
8+
const d = Buffer.from('abcde');
9+
const e = Buffer.from('abcdef');
10+
11+
assert.ok(b.equals(c));
12+
assert.ok(!c.equals(d));
13+
assert.ok(!d.equals(e));
14+
assert.ok(d.equals(d));
15+
16+
assert.throws(() => Buffer.alloc(1).equals('abc'));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
'use strict';
2+
3+
require('../common');
4+
const assert = require('assert');
5+
const SlowBuffer = require('buffer').SlowBuffer;
6+
7+
// Test failed or zero-sized Buffer allocations not affecting typed arrays.
8+
// This test exists because of a regression that occurred. Because Buffer
9+
// instances are allocated with the same underlying allocator as TypedArrays,
10+
// but Buffer's can optional be non-zero filled, there was a regression that
11+
// occurred when a Buffer allocated failed, the internal flag specifying
12+
// whether or not to zero-fill was not being reset, causing TypedArrays to
13+
// allocate incorrectly.
14+
const zeroArray = new Uint32Array(10).fill(0);
15+
const sizes = [1e10, 0, 0.1, -1, 'a', undefined, null, NaN];
16+
const allocators = [
17+
Buffer,
18+
SlowBuffer,
19+
Buffer.alloc,
20+
Buffer.allocUnsafe,
21+
Buffer.allocUnsafeSlow
22+
];
23+
for (const allocator of allocators) {
24+
for (const size of sizes) {
25+
try {
26+
// These allocations are known to fail. If they do,
27+
// Uint32Array should still produce a zeroed out result.
28+
allocator(size);
29+
} catch (e) {
30+
assert.deepStrictEqual(new Uint32Array(10), zeroArray);
31+
}
32+
}
33+
}

test/parallel/test-buffer-fill.js

+47
Original file line numberDiff line numberDiff line change
@@ -267,3 +267,50 @@ function testBufs(string, offset, length, encoding) {
267267
assert.deepStrictEqual(buf1.fill.apply(buf1, arguments),
268268
writeToFill.apply(null, arguments));
269269
}
270+
271+
// Make sure these throw.
272+
assert.throws(() => Buffer.allocUnsafe(8).fill('a', -1));
273+
assert.throws(() => Buffer.allocUnsafe(8).fill('a', 0, 9));
274+
275+
// Make sure this doesn't hang indefinitely.
276+
Buffer.allocUnsafe(8).fill('');
277+
Buffer.alloc(8, '');
278+
279+
{
280+
const buf = Buffer.alloc(64, 10);
281+
for (let i = 0; i < buf.length; i++)
282+
assert.strictEqual(buf[i], 10);
283+
284+
buf.fill(11, 0, buf.length >> 1);
285+
for (let i = 0; i < buf.length >> 1; i++)
286+
assert.strictEqual(buf[i], 11);
287+
for (let i = (buf.length >> 1) + 1; i < buf.length; i++)
288+
assert.strictEqual(buf[i], 10);
289+
290+
buf.fill('h');
291+
for (let i = 0; i < buf.length; i++)
292+
assert.strictEqual('h'.charCodeAt(0), buf[i]);
293+
294+
buf.fill(0);
295+
for (let i = 0; i < buf.length; i++)
296+
assert.strictEqual(0, buf[i]);
297+
298+
buf.fill(null);
299+
for (let i = 0; i < buf.length; i++)
300+
assert.strictEqual(0, buf[i]);
301+
302+
buf.fill(1, 16, 32);
303+
for (let i = 0; i < 16; i++)
304+
assert.strictEqual(0, buf[i]);
305+
for (let i = 16; i < 32; i++)
306+
assert.strictEqual(1, buf[i]);
307+
for (let i = 32; i < buf.length; i++)
308+
assert.strictEqual(0, buf[i]);
309+
}
310+
311+
{
312+
const buf = Buffer.alloc(10, 'abc');
313+
assert.strictEqual(buf.toString(), 'abcabcabca');
314+
buf.fill('է');
315+
assert.strictEqual(buf.toString(), 'էէէէէ');
316+
}
+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
'use strict';
2+
3+
require('../common');
4+
const assert = require('assert');
5+
6+
[ 'hex',
7+
'utf8',
8+
'utf-8',
9+
'ascii',
10+
'latin1',
11+
'binary',
12+
'base64',
13+
'ucs2',
14+
'ucs-2',
15+
'utf16le',
16+
'utf-16le' ].forEach((enc) => {
17+
assert.strictEqual(Buffer.isEncoding(enc), true);
18+
});
19+
20+
[ 'utf9',
21+
'utf-7',
22+
'Unicode-FTW',
23+
'new gnu gun',
24+
false,
25+
NaN,
26+
{},
27+
Infinity,
28+
[],
29+
1,
30+
0,
31+
-1 ].forEach((enc) => {
32+
assert.strictEqual(Buffer.isEncoding(enc), false);
33+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
'use strict';
2+
3+
require('../common');
4+
const assert = require('assert');
5+
6+
const msg = /"size" argument must not be negative/;
7+
8+
// Test that negative Buffer length inputs throw errors.
9+
10+
assert.throws(() => Buffer(-Buffer.poolSize), msg);
11+
assert.throws(() => Buffer(-100), msg);
12+
assert.throws(() => Buffer(-1), msg);
13+
14+
assert.throws(() => Buffer.alloc(-Buffer.poolSize), msg);
15+
assert.throws(() => Buffer.alloc(-100), msg);
16+
assert.throws(() => Buffer.alloc(-1), msg);
17+
18+
assert.throws(() => Buffer.allocUnsafe(-Buffer.poolSize), msg);
19+
assert.throws(() => Buffer.allocUnsafe(-100), msg);
20+
assert.throws(() => Buffer.allocUnsafe(-1), msg);
21+
22+
assert.throws(() => Buffer.allocUnsafeSlow(-Buffer.poolSize), msg);
23+
assert.throws(() => Buffer.allocUnsafeSlow(-100), msg);
24+
assert.throws(() => Buffer.allocUnsafeSlow(-1), msg);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
'use strict';
2+
3+
require('../common');
4+
const assert = require('assert');
5+
const SlowBuffer = require('buffer').SlowBuffer;
6+
7+
// Regression test for https://github.com/nodejs/node/issues/649.
8+
const len = 1422561062959;
9+
assert.throws(() => Buffer(len).toString('utf8'));
10+
assert.throws(() => SlowBuffer(len).toString('utf8'));
11+
assert.throws(() => Buffer.alloc(len).toString('utf8'));
12+
assert.throws(() => Buffer.allocUnsafe(len).toString('utf8'));
13+
assert.throws(() => Buffer.allocUnsafeSlow(len).toString('utf8'));

test/parallel/test-buffer-slice.js

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
'use strict';
2+
3+
require('../common');
4+
const assert = require('assert');
5+
6+
assert.strictEqual(0, Buffer.from('hello').slice(0, 0).length);
7+
assert.strictEqual(0, Buffer('hello').slice(0, 0).length);
8+
9+
const buf = Buffer.from('0123456789');
10+
assert.equal(buf.slice(-10, 10), '0123456789');
11+
assert.equal(buf.slice(-20, 10), '0123456789');
12+
assert.equal(buf.slice(-20, -10), '');
13+
assert.equal(buf.slice(), '0123456789');
14+
assert.equal(buf.slice(0), '0123456789');
15+
assert.equal(buf.slice(0, 0), '');
16+
assert.equal(buf.slice(undefined), '0123456789');
17+
assert.equal(buf.slice('foobar'), '0123456789');
18+
assert.equal(buf.slice(undefined, undefined), '0123456789');
19+
20+
assert.equal(buf.slice(2), '23456789');
21+
assert.equal(buf.slice(5), '56789');
22+
assert.equal(buf.slice(10), '');
23+
assert.equal(buf.slice(5, 8), '567');
24+
assert.equal(buf.slice(8, -1), '8');
25+
assert.equal(buf.slice(-10), '0123456789');
26+
assert.equal(buf.slice(0, -9), '0');
27+
assert.equal(buf.slice(0, -10), '');
28+
assert.equal(buf.slice(0, -1), '012345678');
29+
assert.equal(buf.slice(2, -2), '234567');
30+
assert.equal(buf.slice(0, 65536), '0123456789');
31+
assert.equal(buf.slice(65536, 0), '');
32+
assert.equal(buf.slice(-5, -8), '');
33+
assert.equal(buf.slice(-5, -3), '56');
34+
assert.equal(buf.slice(-10, 10), '0123456789');
35+
for (let i = 0, s = buf.toString(); i < buf.length; ++i) {
36+
assert.equal(buf.slice(i), s.slice(i));
37+
assert.equal(buf.slice(0, i), s.slice(0, i));
38+
assert.equal(buf.slice(-i), s.slice(-i));
39+
assert.equal(buf.slice(0, -i), s.slice(0, -i));
40+
}
41+
42+
const utf16Buf = Buffer.from('0123456789', 'utf16le');
43+
assert.deepStrictEqual(utf16Buf.slice(0, 6), Buffer.from('012', 'utf16le'));
44+
45+
assert.equal(buf.slice('0', '1'), '0');
46+
assert.equal(buf.slice('-5', '10'), '56789');
47+
assert.equal(buf.slice('-10', '10'), '0123456789');
48+
assert.equal(buf.slice('-10', '-5'), '01234');
49+
assert.equal(buf.slice('-10', '-0'), '');
50+
assert.equal(buf.slice('111'), '');
51+
assert.equal(buf.slice('0', '-111'), '');
52+
53+
// try to slice a zero length Buffer
54+
// see https://github.com/joyent/node/issues/5881
55+
Buffer.alloc(0).slice(0, 1);
56+
57+
{
58+
// Single argument slice
59+
assert.strictEqual('bcde', Buffer.from('abcde').slice(1).toString());
60+
}
61+
62+
// slice(0,0).length === 0
63+
assert.strictEqual(0, Buffer.from('hello').slice(0, 0).length);

0 commit comments

Comments
 (0)