• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict'
2
3const { describe, it, after } = require('mocha')
4const assert = require('assert')
5const path = require('path')
6const os = require('os')
7const util = require('util')
8const { test: { download, install } } = require('../lib/install')
9const rimraf = require('rimraf')
10const gyp = require('../lib/node-gyp')
11const log = require('npmlog')
12const semver = require('semver')
13const stream = require('stream')
14const streamPipeline = util.promisify(stream.pipeline)
15
16log.level = 'error' // we expect a warning
17
18describe('install', function () {
19  it('EACCES retry once', async () => {
20    const fs = {
21      promises: {
22        stat (_) {
23          const err = new Error()
24          err.code = 'EACCES'
25          assert.ok(true)
26          throw err
27        }
28      }
29    }
30
31    const Gyp = {
32      devDir: __dirname,
33      opts: {
34        ensure: true
35      },
36      commands: {
37        install (argv, cb) {
38          install(fs, Gyp, argv).then(cb, cb)
39        },
40        remove (_, cb) {
41          cb()
42        }
43      }
44    }
45
46    try {
47      await install(fs, Gyp, [])
48    } catch (err) {
49      assert.ok(true)
50      if (/"pre" versions of node cannot be installed/.test(err.message)) {
51        assert.ok(true)
52      }
53    }
54  })
55
56  // only run these tests if we are running a version of Node with predictable version path behavior
57  const skipParallelInstallTests = process.env.FAST_TEST ||
58    process.release.name !== 'node' ||
59    semver.prerelease(process.version) !== null ||
60    semver.satisfies(process.version, '<10')
61
62  async function parallelInstallsTest (test, fs, devDir, prog) {
63    if (skipParallelInstallTests) {
64      return test.skip('Skipping parallel installs test due to test environment configuration')
65    }
66
67    after(async () => {
68      await util.promisify(rimraf)(devDir)
69    })
70
71    const expectedDir = path.join(devDir, process.version.replace(/^v/, ''))
72    await util.promisify(rimraf)(expectedDir)
73
74    await Promise.all([
75      install(fs, prog, []),
76      install(fs, prog, []),
77      install(fs, prog, []),
78      install(fs, prog, []),
79      install(fs, prog, []),
80      install(fs, prog, []),
81      install(fs, prog, []),
82      install(fs, prog, []),
83      install(fs, prog, []),
84      install(fs, prog, [])
85    ])
86  }
87
88  it('parallel installs (ensure=true)', async function () {
89    this.timeout(600000)
90
91    const fs = require('graceful-fs')
92    const devDir = await util.promisify(fs.mkdtemp)(path.join(os.tmpdir(), 'node-gyp-test-'))
93
94    const prog = gyp()
95    prog.parseArgv([])
96    prog.devDir = devDir
97    prog.opts.ensure = true
98    log.level = 'warn'
99
100    await parallelInstallsTest(this, fs, devDir, prog)
101  })
102
103  it('parallel installs (ensure=false)', async function () {
104    this.timeout(600000)
105
106    const fs = require('graceful-fs')
107    const devDir = await util.promisify(fs.mkdtemp)(path.join(os.tmpdir(), 'node-gyp-test-'))
108
109    const prog = gyp()
110    prog.parseArgv([])
111    prog.devDir = devDir
112    prog.opts.ensure = false
113    log.level = 'warn'
114
115    await parallelInstallsTest(this, fs, devDir, prog)
116  })
117
118  it('parallel installs (tarball)', async function () {
119    this.timeout(600000)
120
121    const fs = require('graceful-fs')
122    const devDir = await util.promisify(fs.mkdtemp)(path.join(os.tmpdir(), 'node-gyp-test-'))
123
124    const prog = gyp()
125    prog.parseArgv([])
126    prog.devDir = devDir
127    prog.opts.tarball = path.join(devDir, 'node-headers.tar.gz')
128    log.level = 'warn'
129
130    await streamPipeline(
131      (await download(prog, `https://nodejs.org/dist/${process.version}/node-${process.version}.tar.gz`)).body,
132      fs.createWriteStream(prog.opts.tarball)
133    )
134
135    await parallelInstallsTest(this, fs, devDir, prog)
136  })
137})
138