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