Projekt

Obecné

Profil

Stáhnout (15.4 KB) Statistiky
| Větev: | Revize:
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
})
(7-7/7)