You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
277 lines
9.6 KiB
277 lines
9.6 KiB
var test = require('tape') |
|
var fs = require('fs') |
|
var home = require('os-homedir') |
|
var cp = require('child_process') |
|
var EventEmitter = require('events').EventEmitter |
|
var util = require('../util') |
|
var error = require('../error') |
|
|
|
var spawn = util.spawn |
|
|
|
test('prebuildCache() for different environments', function (t) { |
|
var APPDATA = process.env.APPDATA = 'somepathhere' |
|
t.equal(util.prebuildCache(), APPDATA + '/npm-cache/_prebuilds', 'APPDATA set') |
|
delete process.env.APPDATA |
|
t.equal(util.prebuildCache(), home() + '/.npm/_prebuilds', 'APPDATA not set') |
|
t.end() |
|
}) |
|
|
|
test('cachedPrebuild() converts url to valid characters', function (t) { |
|
var url = 'https://github.com/level/leveldown/releases/download/v1.4.0/leveldown-v1.4.0-node-v14-linux-x64.tar.gz' |
|
var tail = 'https-github.com-level-leveldown-releases-download-v1.4.0-leveldown-v1.4.0-node-v14-linux-x64.tar.gz' |
|
var cached = util.cachedPrebuild(url) |
|
t.ok(cached.indexOf(tail)) |
|
t.end() |
|
}) |
|
|
|
test('tempFile() ends with pid and random number', function (t) { |
|
var url = 'https://github.com/level/leveldown/releases/download/v1.4.0/leveldown-v1.4.0-node-v14-linux-x64.tar.gz' |
|
var cached = util.cachedPrebuild(url) |
|
var tempFile = util.tempFile(cached) |
|
var regexp = /(\S+)\.(\d+)-([a-f0-9]+)\.tmp$/gi |
|
var match = regexp.exec(tempFile) |
|
t.ok(match, 'matches') |
|
t.equal(match[1], cached, 'starts with cached file name') |
|
fs.exists(tempFile, function (exists) { |
|
t.equal(exists, false, 'file should not exist yet') |
|
t.end() |
|
}) |
|
}) |
|
|
|
test('urlTemplate() returns different templates based on pkg and rc', function (t) { |
|
var o1 = {download: 'd0000d'} |
|
var t1 = util.urlTemplate(o1) |
|
t.equal(t1, 'd0000d', 'template based on --download <string>') |
|
var o2 = { |
|
pkg: {binary: {host: 'http://foo.com'}} |
|
} |
|
var t2 = util.urlTemplate(o2) |
|
t.equal(t2, 'http://foo.com/{name}-v{version}-node-v{abi}-{platform}{libc}-{arch}.tar.gz', 'template based on pkg.binary properties') |
|
var o3 = { |
|
pkg: {binary: {host: 'http://foo.com'}}, |
|
download: true |
|
} |
|
var t3 = util.urlTemplate(o3) |
|
t.equal(t3, t2, 'pkg: {} takes precedence over --download') |
|
var o4 = { |
|
pkg: {binary: {host: 'http://foo.com'}}, |
|
download: 'd0000d' |
|
} |
|
var t4 = util.urlTemplate(o4) |
|
t.equal(t4, t1, '--download <string> always goes first') |
|
var o5 = { |
|
pkg: {binary: {host: 'http://foo.com', remote_path: 'w00t'}} |
|
} |
|
var t5 = util.urlTemplate(o5) |
|
t.equal(t5, 'http://foo.com/w00t/{name}-v{version}-node-v{abi}-{platform}{libc}-{arch}.tar.gz', 'pkg.binary.remote_path is added after host, default format') |
|
var o6 = { |
|
pkg: { |
|
binary: { |
|
host: 'http://foo.com', |
|
remote_path: 'w00t', |
|
package_name: '{name}-{major}.{minor}-node-v{abi}-{platform}-{arch}.tar.gz' |
|
} |
|
} |
|
} |
|
var t6 = util.urlTemplate(o6) |
|
t.equal(t6, 'http://foo.com/w00t/{name}-{major}.{minor}-node-v{abi}-{platform}-{arch}.tar.gz', 'pkg.binary.package_name is added after host and remote_path, custom format') |
|
var o7 = {pkg: require('../package.json'), download: true} |
|
var t7 = util.urlTemplate(o7) |
|
t.equal(t7, 'https://github.com/mafintosh/prebuild/releases/download/v{version}/{name}-v{version}-node-v{abi}-{platform}{libc}-{arch}.tar.gz', '--download with no arguments, no pkg.binary, default format') |
|
t.end() |
|
}) |
|
|
|
test('urlTemplate() with pkg.binary cleans up leading ./ or / and trailing /', function (t) { |
|
var expected = 'http://foo.com/w00t/{name}-{major}.{minor}-node-v{abi}-{platform}-{arch}.tar.gz' |
|
var o = { |
|
pkg: { |
|
binary: { |
|
host: 'http://foo.com/', |
|
remote_path: '/w00t', |
|
package_name: '/{name}-{major}.{minor}-node-v{abi}-{platform}-{arch}.tar.gz' |
|
} |
|
} |
|
} |
|
t.equal(util.urlTemplate(o), expected) |
|
o.pkg.binary = { |
|
host: 'http://foo.com/', |
|
remote_path: './w00t/', |
|
package_name: './{name}-{major}.{minor}-node-v{abi}-{platform}-{arch}.tar.gz' |
|
} |
|
t.equal(util.urlTemplate(o), expected) |
|
o.pkg.binary = { |
|
host: 'http://foo.com/', |
|
remote_path: 'w00t/', |
|
package_name: '{name}-{major}.{minor}-node-v{abi}-{platform}-{arch}.tar.gz/' |
|
} |
|
t.equal(util.urlTemplate(o), expected) |
|
o.pkg.binary = { |
|
host: 'http://foo.com', |
|
remote_path: './w00t', |
|
package_name: '/{name}-{major}.{minor}-node-v{abi}-{platform}-{arch}.tar.gz/' |
|
} |
|
t.equal(util.urlTemplate(o), expected) |
|
t.end() |
|
}) |
|
|
|
test('getDownloadUrl() expands template to correct values', function (t) { |
|
var abi = process.versions.modules |
|
var o1 = { |
|
pkg: { |
|
name: 'a-native-module', |
|
version: 'x.y.z-alpha5', |
|
binary: { |
|
host: 'https://foo.com', |
|
module_name: 'a-native-module-bindings', |
|
package_name: '{name}-{package_name}-{version}-{major}-{minor}-{patch}-{prerelease}-{abi}-{node_abi}-{platform}-{arch}-{configuration}-{module_name}' |
|
} |
|
}, |
|
platform: 'coolplatform', |
|
arch: 'futureplatform' |
|
} |
|
var url1 = util.getDownloadUrl(o1) |
|
t.equal(url1, 'https://foo.com/a-native-module-a-native-module-x.y.z-alpha5-x-y-z-alpha5-alpha5-' + abi + '-' + abi + '-coolplatform-futureplatform-Release-a-native-module-bindings', 'weird url but testing everything is propagated, with prerelease and Release') |
|
var o2 = { |
|
pkg: { |
|
name: 'a-native-module', |
|
version: 'x.y.z+beta77', |
|
binary: { |
|
host: 'https://foo.com', |
|
module_name: 'a-native-module-bindings', |
|
package_name: '{name}-{package_name}-{version}-{major}-{minor}-{patch}-{build}-{abi}-{node_abi}-{platform}-{arch}-{configuration}-{module_name}' |
|
} |
|
}, |
|
platform: 'coolplatform', |
|
arch: 'futureplatform', |
|
debug: true |
|
} |
|
var url2 = util.getDownloadUrl(o2) |
|
t.equal(url2, 'https://foo.com/a-native-module-a-native-module-x.y.z+beta77-x-y-z+beta77-beta77-' + abi + '-' + abi + '-coolplatform-futureplatform-Debug-a-native-module-bindings', 'weird url but testing everything is propagated, with build and Debug') |
|
var o3 = { |
|
pkg: { |
|
name: '@scope/a-native-module', |
|
version: 'x.y.z+beta77', |
|
binary: { |
|
host: 'https://foo.com', |
|
module_name: 'a-native-module-bindings', |
|
package_name: '{name}-{package_name}-{version}-{major}-{minor}-{patch}-{build}-{abi}-{node_abi}-{platform}-{arch}-{configuration}-{module_name}' |
|
} |
|
}, |
|
platform: 'coolplatform', |
|
arch: 'futureplatform', |
|
debug: true |
|
} |
|
var url3 = util.getDownloadUrl(o3) |
|
t.equal(url3, url2, 'scope does not matter for download url') |
|
t.end() |
|
}) |
|
|
|
test('getTarPath based on package.json and rc config', function (t) { |
|
var opts = { |
|
pkg: { |
|
name: 'foo', |
|
version: 'X.Y.Z' |
|
}, |
|
platform: 'fakeos', |
|
arch: 'x64' |
|
} |
|
var tarPath = util.getTarPath(opts, 314) |
|
t.equal(tarPath, 'prebuilds/foo-vX.Y.Z-node-v314-fakeos-x64.tar.gz', 'correct tar path') |
|
t.end() |
|
}) |
|
|
|
test('readGypFile reads file based on correct version', function (t) { |
|
var v = 'X.Y.Z' |
|
var file = 'node_version.h' |
|
var _readFile = fs.readFile |
|
fs.readFile = function (fpath, encoding, cb) { |
|
t.equal(fpath, home() + '/.node-gyp/' + v + '/src/' + file, 'corect file name') |
|
cb() |
|
} |
|
util.readGypFile({version: v, file: file}, function (err, data) { |
|
t.error(err, 'readGypFile should succeed') |
|
fs.readFile = _readFile |
|
t.end() |
|
}) |
|
}) |
|
|
|
test('readGypFile errors if fs.readFile errors', function (t) { |
|
var v = 'X.Y.Z' |
|
var file = 'src/node_version.h' |
|
var _readFile = fs.readFile |
|
var error = new Error('sorry dude, no such file') |
|
fs.readFile = function (fpath, encoding, cb) { |
|
process.nextTick(cb.bind(null, error)) |
|
} |
|
util.readGypFile({version: v, file: file}, function (err, data) { |
|
fs.readFile = _readFile |
|
t.same(err, error, 'expected error') |
|
t.end() |
|
}) |
|
}) |
|
|
|
// skipping these 3 tests as it is using execspawn now |
|
|
|
test.skip('spawn(): no args default to empty array', function (t) { |
|
cp.spawn = function (cmd, args, opts) { |
|
t.equal(cmd, 'foo', 'correct command') |
|
t.same(args, [], 'default args') |
|
t.same(opts, {stdio: 'inherit'}, 'inherit stdio') |
|
return { |
|
on: function (id, cb) { |
|
t.equal(id, 'exit', 'listener on exit event') |
|
t.end() |
|
} |
|
} |
|
} |
|
spawn('foo') |
|
}) |
|
|
|
test.skip('spawn(): callback fires with no error on exit code 0', function (t) { |
|
cp.spawn = function (cmd, args, opts) { |
|
t.same(args, ['arg1', 'arg2'], 'correct args') |
|
return new EventEmitter() |
|
} |
|
spawn('foo', ['arg1', 'arg2'], function (err) { |
|
t.error(err, 'no error') |
|
t.end() |
|
}).emit('exit', 0) |
|
}) |
|
|
|
test.skip('spawn(): callback fires with error on non 0 exit code', function (t) { |
|
cp.spawn = function () { return new EventEmitter() } |
|
spawn('foo', ['arg1'], function (err) { |
|
t.same(err, error.spawnFailed('foo', ['arg1'], 314)) |
|
t.end() |
|
}).emit('exit', 314) |
|
}) |
|
|
|
test('releaseFolder(): depends on package.json and --debug', function (t) { |
|
var folder = util.releaseFolder |
|
t.equal(folder({pkg: {}}), 'build/Release', 'Release is default') |
|
t.equal(folder({ |
|
debug: false, |
|
pkg: {} |
|
}), 'build/Release', 'Release is default') |
|
t.equal(folder({ |
|
debug: true, |
|
pkg: {} |
|
}), 'build/Debug', 'Debug folder when --debug') |
|
t.equal(folder({ |
|
debug: true, |
|
pkg: { binary: { module_path: 'foo/bar' } } |
|
}), 'foo/bar', 'using binary property from package.json') |
|
t.end() |
|
}) |
|
|
|
test('nodeGypPath(): accepts any arguments', function (t) { |
|
var nodeGypPath = util.nodeGypPath |
|
t.equal(nodeGypPath('.node-gyp', '0.10.40', 'include/node'), |
|
home() + '/.node-gyp/0.10.40/include/node') |
|
t.equal(nodeGypPath('.node-gyp', '4.1.0', 'include/node', 'node.h'), |
|
home() + '/.node-gyp/4.1.0/include/node/node.h') |
|
t.equal(nodeGypPath('.node-gyp', '/iojs-1.0.4/', '/include/node/', '/node.h'), |
|
home() + '/.node-gyp/iojs-1.0.4/include/node/node.h', |
|
'trailing slashes should not matter') |
|
t.end() |
|
})
|
|
|