tests.js (15735B)
1 /* eslint-disable node/no-deprecated-api */ 2 3 'use strict' 4 5 var test = require('tape') 6 7 var buffer = require('buffer') 8 9 var index = require('./') 10 var safer = require('./safer') 11 var dangerous = require('./dangerous') 12 13 /* Inheritance tests */ 14 15 test('Default is Safer', function (t) { 16 t.equal(index, safer) 17 t.notEqual(safer, dangerous) 18 t.notEqual(index, dangerous) 19 t.end() 20 }) 21 22 test('Is not a function', function (t) { 23 [index, safer, dangerous].forEach(function (impl) { 24 t.equal(typeof impl, 'object') 25 t.equal(typeof impl.Buffer, 'object') 26 }); 27 [buffer].forEach(function (impl) { 28 t.equal(typeof impl, 'object') 29 t.equal(typeof impl.Buffer, 'function') 30 }) 31 t.end() 32 }) 33 34 test('Constructor throws', function (t) { 35 [index, safer, dangerous].forEach(function (impl) { 36 t.throws(function () { impl.Buffer() }) 37 t.throws(function () { impl.Buffer(0) }) 38 t.throws(function () { impl.Buffer('a') }) 39 t.throws(function () { impl.Buffer('a', 'utf-8') }) 40 t.throws(function () { return new impl.Buffer() }) 41 t.throws(function () { return new impl.Buffer(0) }) 42 t.throws(function () { return new impl.Buffer('a') }) 43 t.throws(function () { return new impl.Buffer('a', 'utf-8') }) 44 }) 45 t.end() 46 }) 47 48 test('Safe methods exist', function (t) { 49 [index, safer, dangerous].forEach(function (impl) { 50 t.equal(typeof impl.Buffer.alloc, 'function', 'alloc') 51 t.equal(typeof impl.Buffer.from, 'function', 'from') 52 }) 53 t.end() 54 }) 55 56 test('Unsafe methods exist only in Dangerous', function (t) { 57 [index, safer].forEach(function (impl) { 58 t.equal(typeof impl.Buffer.allocUnsafe, 'undefined') 59 t.equal(typeof impl.Buffer.allocUnsafeSlow, 'undefined') 60 }); 61 [dangerous].forEach(function (impl) { 62 t.equal(typeof impl.Buffer.allocUnsafe, 'function') 63 t.equal(typeof impl.Buffer.allocUnsafeSlow, 'function') 64 }) 65 t.end() 66 }) 67 68 test('Generic methods/properties are defined and equal', function (t) { 69 ['poolSize', 'isBuffer', 'concat', 'byteLength'].forEach(function (method) { 70 [index, safer, dangerous].forEach(function (impl) { 71 t.equal(impl.Buffer[method], buffer.Buffer[method], method) 72 t.notEqual(typeof impl.Buffer[method], 'undefined', method) 73 }) 74 }) 75 t.end() 76 }) 77 78 test('Built-in buffer static methods/properties are inherited', function (t) { 79 Object.keys(buffer).forEach(function (method) { 80 if (method === 'SlowBuffer' || method === 'Buffer') return; 81 [index, safer, dangerous].forEach(function (impl) { 82 t.equal(impl[method], buffer[method], method) 83 t.notEqual(typeof impl[method], 'undefined', method) 84 }) 85 }) 86 t.end() 87 }) 88 89 test('Built-in Buffer static methods/properties are inherited', function (t) { 90 Object.keys(buffer.Buffer).forEach(function (method) { 91 if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return; 92 [index, safer, dangerous].forEach(function (impl) { 93 t.equal(impl.Buffer[method], buffer.Buffer[method], method) 94 t.notEqual(typeof impl.Buffer[method], 'undefined', method) 95 }) 96 }) 97 t.end() 98 }) 99 100 test('.prototype property of Buffer is inherited', function (t) { 101 [index, safer, dangerous].forEach(function (impl) { 102 t.equal(impl.Buffer.prototype, buffer.Buffer.prototype, 'prototype') 103 t.notEqual(typeof impl.Buffer.prototype, 'undefined', 'prototype') 104 }) 105 t.end() 106 }) 107 108 test('All Safer methods are present in Dangerous', function (t) { 109 Object.keys(safer).forEach(function (method) { 110 if (method === 'Buffer') return; 111 [index, safer, dangerous].forEach(function (impl) { 112 t.equal(impl[method], safer[method], method) 113 if (method !== 'kStringMaxLength') { 114 t.notEqual(typeof impl[method], 'undefined', method) 115 } 116 }) 117 }) 118 Object.keys(safer.Buffer).forEach(function (method) { 119 [index, safer, dangerous].forEach(function (impl) { 120 t.equal(impl.Buffer[method], safer.Buffer[method], method) 121 t.notEqual(typeof impl.Buffer[method], 'undefined', method) 122 }) 123 }) 124 t.end() 125 }) 126 127 test('Safe methods from Dangerous methods are present in Safer', function (t) { 128 Object.keys(dangerous).forEach(function (method) { 129 if (method === 'Buffer') return; 130 [index, safer, dangerous].forEach(function (impl) { 131 t.equal(impl[method], dangerous[method], method) 132 if (method !== 'kStringMaxLength') { 133 t.notEqual(typeof impl[method], 'undefined', method) 134 } 135 }) 136 }) 137 Object.keys(dangerous.Buffer).forEach(function (method) { 138 if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return; 139 [index, safer, dangerous].forEach(function (impl) { 140 t.equal(impl.Buffer[method], dangerous.Buffer[method], method) 141 t.notEqual(typeof impl.Buffer[method], 'undefined', method) 142 }) 143 }) 144 t.end() 145 }) 146 147 /* Behaviour tests */ 148 149 test('Methods return Buffers', function (t) { 150 [index, safer, dangerous].forEach(function (impl) { 151 t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0))) 152 t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 10))) 153 t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 'a'))) 154 t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10))) 155 t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10, 'x'))) 156 t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(9, 'ab'))) 157 t.ok(buffer.Buffer.isBuffer(impl.Buffer.from(''))) 158 t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string'))) 159 t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string', 'utf-8'))) 160 t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'))) 161 t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([0, 42, 3]))) 162 t.ok(buffer.Buffer.isBuffer(impl.Buffer.from(new Uint8Array([0, 42, 3])))) 163 t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([]))) 164 }); 165 ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { 166 t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](0))) 167 t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](10))) 168 }) 169 t.end() 170 }) 171 172 test('Constructor is buffer.Buffer', function (t) { 173 [index, safer, dangerous].forEach(function (impl) { 174 t.equal(impl.Buffer.alloc(0).constructor, buffer.Buffer) 175 t.equal(impl.Buffer.alloc(0, 10).constructor, buffer.Buffer) 176 t.equal(impl.Buffer.alloc(0, 'a').constructor, buffer.Buffer) 177 t.equal(impl.Buffer.alloc(10).constructor, buffer.Buffer) 178 t.equal(impl.Buffer.alloc(10, 'x').constructor, buffer.Buffer) 179 t.equal(impl.Buffer.alloc(9, 'ab').constructor, buffer.Buffer) 180 t.equal(impl.Buffer.from('').constructor, buffer.Buffer) 181 t.equal(impl.Buffer.from('string').constructor, buffer.Buffer) 182 t.equal(impl.Buffer.from('string', 'utf-8').constructor, buffer.Buffer) 183 t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').constructor, buffer.Buffer) 184 t.equal(impl.Buffer.from([0, 42, 3]).constructor, buffer.Buffer) 185 t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).constructor, buffer.Buffer) 186 t.equal(impl.Buffer.from([]).constructor, buffer.Buffer) 187 }); 188 [0, 10, 100].forEach(function (arg) { 189 t.equal(dangerous.Buffer.allocUnsafe(arg).constructor, buffer.Buffer) 190 t.equal(dangerous.Buffer.allocUnsafeSlow(arg).constructor, buffer.SlowBuffer(0).constructor) 191 }) 192 t.end() 193 }) 194 195 test('Invalid calls throw', function (t) { 196 [index, safer, dangerous].forEach(function (impl) { 197 t.throws(function () { impl.Buffer.from(0) }) 198 t.throws(function () { impl.Buffer.from(10) }) 199 t.throws(function () { impl.Buffer.from(10, 'utf-8') }) 200 t.throws(function () { impl.Buffer.from('string', 'invalid encoding') }) 201 t.throws(function () { impl.Buffer.from(-10) }) 202 t.throws(function () { impl.Buffer.from(1e90) }) 203 t.throws(function () { impl.Buffer.from(Infinity) }) 204 t.throws(function () { impl.Buffer.from(-Infinity) }) 205 t.throws(function () { impl.Buffer.from(NaN) }) 206 t.throws(function () { impl.Buffer.from(null) }) 207 t.throws(function () { impl.Buffer.from(undefined) }) 208 t.throws(function () { impl.Buffer.from() }) 209 t.throws(function () { impl.Buffer.from({}) }) 210 t.throws(function () { impl.Buffer.alloc('') }) 211 t.throws(function () { impl.Buffer.alloc('string') }) 212 t.throws(function () { impl.Buffer.alloc('string', 'utf-8') }) 213 t.throws(function () { impl.Buffer.alloc('b25ldHdvdGhyZWU=', 'base64') }) 214 t.throws(function () { impl.Buffer.alloc(-10) }) 215 t.throws(function () { impl.Buffer.alloc(1e90) }) 216 t.throws(function () { impl.Buffer.alloc(2 * (1 << 30)) }) 217 t.throws(function () { impl.Buffer.alloc(Infinity) }) 218 t.throws(function () { impl.Buffer.alloc(-Infinity) }) 219 t.throws(function () { impl.Buffer.alloc(null) }) 220 t.throws(function () { impl.Buffer.alloc(undefined) }) 221 t.throws(function () { impl.Buffer.alloc() }) 222 t.throws(function () { impl.Buffer.alloc([]) }) 223 t.throws(function () { impl.Buffer.alloc([0, 42, 3]) }) 224 t.throws(function () { impl.Buffer.alloc({}) }) 225 }); 226 ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { 227 t.throws(function () { dangerous.Buffer[method]('') }) 228 t.throws(function () { dangerous.Buffer[method]('string') }) 229 t.throws(function () { dangerous.Buffer[method]('string', 'utf-8') }) 230 t.throws(function () { dangerous.Buffer[method](2 * (1 << 30)) }) 231 t.throws(function () { dangerous.Buffer[method](Infinity) }) 232 if (dangerous.Buffer[method] === buffer.Buffer.allocUnsafe) { 233 t.skip('Skipping, older impl of allocUnsafe coerced negative sizes to 0') 234 } else { 235 t.throws(function () { dangerous.Buffer[method](-10) }) 236 t.throws(function () { dangerous.Buffer[method](-1e90) }) 237 t.throws(function () { dangerous.Buffer[method](-Infinity) }) 238 } 239 t.throws(function () { dangerous.Buffer[method](null) }) 240 t.throws(function () { dangerous.Buffer[method](undefined) }) 241 t.throws(function () { dangerous.Buffer[method]() }) 242 t.throws(function () { dangerous.Buffer[method]([]) }) 243 t.throws(function () { dangerous.Buffer[method]([0, 42, 3]) }) 244 t.throws(function () { dangerous.Buffer[method]({}) }) 245 }) 246 t.end() 247 }) 248 249 test('Buffers have appropriate lengths', function (t) { 250 [index, safer, dangerous].forEach(function (impl) { 251 t.equal(impl.Buffer.alloc(0).length, 0) 252 t.equal(impl.Buffer.alloc(10).length, 10) 253 t.equal(impl.Buffer.from('').length, 0) 254 t.equal(impl.Buffer.from('string').length, 6) 255 t.equal(impl.Buffer.from('string', 'utf-8').length, 6) 256 t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').length, 11) 257 t.equal(impl.Buffer.from([0, 42, 3]).length, 3) 258 t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).length, 3) 259 t.equal(impl.Buffer.from([]).length, 0) 260 }); 261 ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { 262 t.equal(dangerous.Buffer[method](0).length, 0) 263 t.equal(dangerous.Buffer[method](10).length, 10) 264 }) 265 t.end() 266 }) 267 268 test('Buffers have appropriate lengths (2)', function (t) { 269 t.equal(index.Buffer.alloc, safer.Buffer.alloc) 270 t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) 271 var ok = true; 272 [ safer.Buffer.alloc, 273 dangerous.Buffer.allocUnsafe, 274 dangerous.Buffer.allocUnsafeSlow 275 ].forEach(function (method) { 276 for (var i = 0; i < 1e2; i++) { 277 var length = Math.round(Math.random() * 1e5) 278 var buf = method(length) 279 if (!buffer.Buffer.isBuffer(buf)) ok = false 280 if (buf.length !== length) ok = false 281 } 282 }) 283 t.ok(ok) 284 t.end() 285 }) 286 287 test('.alloc(size) is zero-filled and has correct length', function (t) { 288 t.equal(index.Buffer.alloc, safer.Buffer.alloc) 289 t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) 290 var ok = true 291 for (var i = 0; i < 1e2; i++) { 292 var length = Math.round(Math.random() * 2e6) 293 var buf = index.Buffer.alloc(length) 294 if (!buffer.Buffer.isBuffer(buf)) ok = false 295 if (buf.length !== length) ok = false 296 var j 297 for (j = 0; j < length; j++) { 298 if (buf[j] !== 0) ok = false 299 } 300 buf.fill(1) 301 for (j = 0; j < length; j++) { 302 if (buf[j] !== 1) ok = false 303 } 304 } 305 t.ok(ok) 306 t.end() 307 }) 308 309 test('.allocUnsafe / .allocUnsafeSlow are fillable and have correct lengths', function (t) { 310 ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { 311 var ok = true 312 for (var i = 0; i < 1e2; i++) { 313 var length = Math.round(Math.random() * 2e6) 314 var buf = dangerous.Buffer[method](length) 315 if (!buffer.Buffer.isBuffer(buf)) ok = false 316 if (buf.length !== length) ok = false 317 buf.fill(0, 0, length) 318 var j 319 for (j = 0; j < length; j++) { 320 if (buf[j] !== 0) ok = false 321 } 322 buf.fill(1, 0, length) 323 for (j = 0; j < length; j++) { 324 if (buf[j] !== 1) ok = false 325 } 326 } 327 t.ok(ok, method) 328 }) 329 t.end() 330 }) 331 332 test('.alloc(size, fill) is `fill`-filled', function (t) { 333 t.equal(index.Buffer.alloc, safer.Buffer.alloc) 334 t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) 335 var ok = true 336 for (var i = 0; i < 1e2; i++) { 337 var length = Math.round(Math.random() * 2e6) 338 var fill = Math.round(Math.random() * 255) 339 var buf = index.Buffer.alloc(length, fill) 340 if (!buffer.Buffer.isBuffer(buf)) ok = false 341 if (buf.length !== length) ok = false 342 for (var j = 0; j < length; j++) { 343 if (buf[j] !== fill) ok = false 344 } 345 } 346 t.ok(ok) 347 t.end() 348 }) 349 350 test('.alloc(size, fill) is `fill`-filled', function (t) { 351 t.equal(index.Buffer.alloc, safer.Buffer.alloc) 352 t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) 353 var ok = true 354 for (var i = 0; i < 1e2; i++) { 355 var length = Math.round(Math.random() * 2e6) 356 var fill = Math.round(Math.random() * 255) 357 var buf = index.Buffer.alloc(length, fill) 358 if (!buffer.Buffer.isBuffer(buf)) ok = false 359 if (buf.length !== length) ok = false 360 for (var j = 0; j < length; j++) { 361 if (buf[j] !== fill) ok = false 362 } 363 } 364 t.ok(ok) 365 t.deepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 97)) 366 t.notDeepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 98)) 367 368 var tmp = new buffer.Buffer(2) 369 tmp.fill('ok') 370 if (tmp[1] === tmp[0]) { 371 // Outdated Node.js 372 t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('ooooo')) 373 } else { 374 t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('okoko')) 375 } 376 t.notDeepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('kokok')) 377 378 t.end() 379 }) 380 381 test('safer.Buffer.from returns results same as Buffer constructor', function (t) { 382 [index, safer, dangerous].forEach(function (impl) { 383 t.deepEqual(impl.Buffer.from(''), new buffer.Buffer('')) 384 t.deepEqual(impl.Buffer.from('string'), new buffer.Buffer('string')) 385 t.deepEqual(impl.Buffer.from('string', 'utf-8'), new buffer.Buffer('string', 'utf-8')) 386 t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), new buffer.Buffer('b25ldHdvdGhyZWU=', 'base64')) 387 t.deepEqual(impl.Buffer.from([0, 42, 3]), new buffer.Buffer([0, 42, 3])) 388 t.deepEqual(impl.Buffer.from(new Uint8Array([0, 42, 3])), new buffer.Buffer(new Uint8Array([0, 42, 3]))) 389 t.deepEqual(impl.Buffer.from([]), new buffer.Buffer([])) 390 }) 391 t.end() 392 }) 393 394 test('safer.Buffer.from returns consistent results', function (t) { 395 [index, safer, dangerous].forEach(function (impl) { 396 t.deepEqual(impl.Buffer.from(''), impl.Buffer.alloc(0)) 397 t.deepEqual(impl.Buffer.from([]), impl.Buffer.alloc(0)) 398 t.deepEqual(impl.Buffer.from(new Uint8Array([])), impl.Buffer.alloc(0)) 399 t.deepEqual(impl.Buffer.from('string', 'utf-8'), impl.Buffer.from('string')) 400 t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from([115, 116, 114, 105, 110, 103])) 401 t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from(impl.Buffer.from('string'))) 402 t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), impl.Buffer.from('onetwothree')) 403 t.notDeepEqual(impl.Buffer.from('b25ldHdvdGhyZWU='), impl.Buffer.from('onetwothree')) 404 }) 405 t.end() 406 })