This repository has been archived on 2020-01-20. You can view files and clone it, but cannot push or open issues or pull requests.
node-spearhead/test/integration/helpers.js

157 lines
4.7 KiB
JavaScript
Raw Normal View History

2015-09-01 10:31:00 +03:00
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
/*
* Copyright (c) 2015, Joyent, Inc.
*/
/*
* Test helpers for the integration tests
*/
var error = console.error;
var assert = require('assert-plus');
var f = require('util').format;
2015-09-01 10:31:00 +03:00
var path = require('path');
var common = require('../../lib/common');
var mod_config = require('../../lib/config');
var testcommon = require('../lib/testcommon');
2015-09-01 10:31:00 +03:00
var CONFIG;
var configPath = process.env.TRITON_TEST_CONFIG
? path.resolve(process.cwd(), process.env.TRITON_TEST_CONFIG)
: path.resolve(__dirname, '..', 'config.json');
try {
CONFIG = require(configPath);
assert.object(CONFIG, configPath);
if (CONFIG.profile && CONFIG.profileName) {
throw new Error(
'cannot specify both "profile" and "profileName" in ' +
configPath);
} else if (CONFIG.profile) {
assert.string(CONFIG.profile.url, 'CONFIG.profile.url');
assert.string(CONFIG.profile.account, 'CONFIG.profile.account');
assert.string(CONFIG.profile.keyId, 'CONFIG.profile.keyId');
assert.optionalBool(CONFIG.profile.insecure,
'CONFIG.profile.insecure');
} else if (CONFIG.profileName) {
CONFIG.profile = mod_config.loadProfile({
configDir: path.join(process.env.HOME, '.triton'),
name: CONFIG.profileName
});
} else {
throw new Error('one of "profile" or "profileName" must be defined ' +
'in ' + configPath);
}
assert.optionalBool(CONFIG.destructiveAllowed,
'test/config.json#destructiveAllowed');
} catch (e) {
error('* * *');
error('node-triton integration tests require a config file. By default');
error('it looks for "test/config.json". Or you can set the');
error('TRITON_TEST_CONFIG envvar. E.g.:');
error('');
error(' TRITON_TEST_CONFIG=test/coal.json make test');
error('');
error('See "test/config.json.sample" for a starting point for a config.');
error('');
error('Warning: This test suite will create machines, images, etc. ');
error('using this CloudAPI and account. While it will do its best');
error('to clean up all resources, running the test suite against');
error('a public cloud could *cost* you money. :)');
error('* * *');
throw e;
2015-09-01 10:31:00 +03:00
}
if (CONFIG.profile.insecure === undefined)
CONFIG.profile.insecure = false;
if (CONFIG.destructiveAllowed === undefined)
CONFIG.destructiveAllowed = false;
2015-09-01 10:31:00 +03:00
var TRITON = [process.execPath, path.resolve(__dirname, '../../bin/triton')];
2015-09-01 10:31:00 +03:00
var UA = 'node-triton-test';
var LOG = require('../lib/log');
/*
* Call the `triton` CLI with the given args.
*/
function triton(args, cb) {
var command = [].concat(TRITON).concat(args);
if (typeof (args) === 'string')
command = command.join(' ');
2015-09-01 10:31:00 +03:00
testcommon.execPlus({
command: command,
2015-09-01 10:31:00 +03:00
execOpts: {
maxBuffer: Infinity,
env: {
PATH: process.env.PATH,
HOME: process.env.HOME,
SSH_AUTH_SOCK: process.env.SSH_AUTH_SOCK,
2015-09-25 20:10:39 +03:00
TRITON_PROFILE: 'env',
TRITON_URL: CONFIG.profile.url,
TRITON_ACCOUNT: CONFIG.profile.account,
TRITON_KEY_ID: CONFIG.profile.keyId,
TRITON_TLS_INSECURE: CONFIG.profile.insecure
2015-09-01 10:31:00 +03:00
}
},
log: LOG
}, cb);
}
/*
* triton wrapper that:
* - tests no error is present
* - tests stdout is not empty
* - tests stderr is empty
*
* In the event that any of the above is false, this function will NOT
* fire the callback, which will result in the early terminate of these
* tests as `t.end()` will never be called.
*
* @param {Tape} t - tape test object
* @param {Object|Array} opts - options object
* @param {Function} cb - callback called like "cb(stdout)"
*/
function safeTriton(t, opts, cb) {
if (Array.isArray(opts)) {
opts = {args: opts};
}
t.comment(f('running: triton %s', opts.args.join(' ')));
triton(opts.args, function (err, stdout, stderr) {
t.error(err, 'no error running child process');
t.equal(stderr, '', 'no stderr produced');
t.notEqual(stdout, '', 'stdout produced');
if (opts.json) {
try {
stdout = JSON.parse(stdout);
} catch (e) {
t.fail('failed to parse JSON');
return;
}
}
if (!err && stdout && !stderr)
cb(stdout);
});
}
2015-09-01 10:31:00 +03:00
// --- exports
module.exports = {
CONFIG: CONFIG,
triton: triton,
safeTriton: safeTriton,
2015-09-01 10:31:00 +03:00
ifErr: testcommon.ifErr
};