Blame view

node_modules/buffer/bin/download-node-tests.js 3.17 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  #!/usr/bin/env node
  
  var concat = require('concat-stream')
  var cp = require('child_process')
  var fs = require('fs')
  var hyperquest = require('hyperquest')
  var path = require('path')
  var split = require('split')
  var through = require('through2')
  
  var url = 'https://api.github.com/repos/nodejs/node/contents'
  var dirs = [
    '/test/parallel',
    '/test/pummel'
  ]
  
  cp.execSync('rm -rf node/*.js', { cwd: path.join(__dirname, '../test') })
  
  var httpOpts = {
    headers: {
      'User-Agent': null
      // auth if github rate-limits you...
      // 'Authorization': 'Basic ' + Buffer('username:password').toString('base64'),
    }
  }
  
  dirs.forEach(function (dir) {
    var req = hyperquest(url + dir, httpOpts)
    req.pipe(concat(function (data) {
      if (req.response.statusCode !== 200) {
        throw new Error(url + dir + ': ' + data.toString())
      }
      downloadBufferTests(dir, JSON.parse(data))
    }))
  })
  
  function downloadBufferTests (dir, files) {
    files.forEach(function (file) {
      if (!/test-buffer.*/.test(file.name)) return
  
      if (file.name === 'test-buffer-fakes.js') {
        // These teses only apply to node, where they're calling into C++ and need to
        // ensure the prototype can't be faked, or else there will be a segfault.
        return
      }
  
      console.log(file.download_url)
  
      var out = path.join(__dirname, '../test/node', file.name)
      hyperquest(file.download_url, httpOpts)
        .pipe(split())
        .pipe(testfixer(file.name))
        .pipe(fs.createWriteStream(out))
        .on('finish', function () {
          console.log('wrote ' + file.name)
        })
    })
  }
  
  function testfixer (filename) {
    var firstline = true
  
    return through(function (line, enc, cb) {
      line = line.toString()
  
      if (firstline) {
        // require buffer explicitly
        var preamble = 'var Buffer = require(\'../../\').Buffer;\n'
        if (/use strict/.test(line)) line += '\n' + preamble
        else line + preamble + '\n' + line
        firstline = false
      }
  
      // use `var` instead of `const`/`let`
      line = line.replace(/(const|let) /g, 'var ')
  
      // make `var common = require('common')` work
      line = line.replace(/(var common = require.*)/g, 'var common = { skip: function () {} };')
  
      // make `require('../common')` work
      line = line.replace(/require\('\.\.\/common'\);/g, '')
  
      // require browser buffer
      line = line.replace(/(.*)require\('buffer'\)(.*)/g, '$1require(\'../../\')$2')
  
      // comment out console logs
      line = line.replace(/(.*console\..*)/g, '// $1')
  
      // we can't reliably test typed array max-sizes in the browser
      if (filename === 'test-buffer-big.js') {
        line = line.replace(/(.*new Int8Array.*RangeError.*)/, '// $1')
        line = line.replace(/(.*new ArrayBuffer.*RangeError.*)/, '// $1')
        line = line.replace(/(.*new Float64Array.*RangeError.*)/, '// $1')
      }
  
      // https://github.com/nodejs/node/blob/v0.12/test/parallel/test-buffer.js#L1138
      // unfortunately we can't run this because crypto-browserify doesn't work in old
      // versions of ie
      if (filename === 'test-buffer.js') {
        line = line.replace(/^(\s*)(var crypto = require.*)/, '$1// $2')
        line = line.replace(/(crypto.createHash.*\))/, '1 /*$1*/')
      }
  
      cb(null, line + '\n')
    })
  }