save point durring huge unorganized refactor
This commit is contained in:
146
scripts/run_browser_integration_suite/index.js
Normal file
146
scripts/run_browser_integration_suite/index.js
Normal file
@ -0,0 +1,146 @@
|
||||
var server = require('./server');
|
||||
var child_process = require('child_process');
|
||||
var _ = require('lodash');
|
||||
var open = require('open');
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var async = require('async');
|
||||
|
||||
var yamlTestSourceFile = path.join(__dirname, '../../test/integration/yaml_suite/index.js');
|
||||
var yamlTestBundleFile = path.join(__dirname, '../../test/browser_integration/yaml_tests.js');
|
||||
var clientEntryFile = path.join(__dirname, '../../src/elasticsearch.js');
|
||||
|
||||
var browsers = _.transform({
|
||||
safari: {
|
||||
darwin: 'Safari'
|
||||
},
|
||||
chrome: {
|
||||
darwin: 'Google Chrome',
|
||||
win32: 'Google Chrome',
|
||||
executable: 'google-chrome'
|
||||
},
|
||||
chromium: {
|
||||
|
||||
executable: 'chromium-browser',
|
||||
},
|
||||
firefox: {
|
||||
darwin: 'Firefox',
|
||||
win32: 'Firefox',
|
||||
executable: 'firefox'
|
||||
},
|
||||
opera: {
|
||||
darwin: 'Opera',
|
||||
win32: 'Opera',
|
||||
executable: 'opera'
|
||||
}
|
||||
}, function (browsers, config, name) {
|
||||
if (config[process.platform]) {
|
||||
browsers[name] = config[process.platform];
|
||||
return;
|
||||
}
|
||||
|
||||
if (process.platform !== 'darwin' && process.platform !== 'win32' && config.executable) {
|
||||
browsers[name] = config.executable;
|
||||
return;
|
||||
}
|
||||
}, {});
|
||||
|
||||
var argv = require('optimist')
|
||||
.default('browser', 'chrome')
|
||||
.default('force_gen', false)
|
||||
.boolean('force_gen')
|
||||
.alias('f', 'force_gen')
|
||||
.default('host', 'localhost')
|
||||
.default('port', 9200)
|
||||
.argv;
|
||||
|
||||
var browserAppName;
|
||||
|
||||
async.series([
|
||||
function (done) {
|
||||
if (browsers.hasOwnProperty(argv.browser)) {
|
||||
browserAppName = browsers[argv.browser];
|
||||
done();
|
||||
} else {
|
||||
done('--browser must be set to one of ' + _.keys(browsers).join(', ') + ' on this platform');
|
||||
}
|
||||
},
|
||||
function (done) {
|
||||
fs.exists('dist', function (yes) {
|
||||
if (!argv.force_gen && yes) {
|
||||
done();
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('generating client with "grunt build"');
|
||||
child_process.spawn('grunt', ['build'], {
|
||||
stdio: 'inherit'
|
||||
}).on('close', function (status) {
|
||||
done(status && 'grunt closed with a status code of ' + status + '. aborting.');
|
||||
});
|
||||
});
|
||||
},
|
||||
function (done) {
|
||||
fs.exists(yamlTestBundleFile, function (yes) {
|
||||
if (!argv.force_gen && yes) {
|
||||
done();
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('generating browser\'s yaml_tests.js bundle');
|
||||
var b = require('browserify')();
|
||||
|
||||
b.add(yamlTestSourceFile);
|
||||
var bundle = b.bundle({
|
||||
external: [
|
||||
'optimist'
|
||||
],
|
||||
ignore: [
|
||||
'test/integration/yaml_suite/reporter',
|
||||
clientEntryFile
|
||||
]
|
||||
});
|
||||
var file = fs.createWriteStream(yamlTestBundleFile, {
|
||||
flags: 'w',
|
||||
encoding: 'utf8',
|
||||
mode: 0666
|
||||
});
|
||||
|
||||
bundle.pipe(file);
|
||||
|
||||
file.once('error', function (err) {
|
||||
done(err);
|
||||
});
|
||||
|
||||
bundle.once('error', function (err) {
|
||||
done(err);
|
||||
});
|
||||
|
||||
bundle.once('end', function () {
|
||||
done();
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
], function (err) {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
} else {
|
||||
server.listen(0, function () {
|
||||
var port = server.address().port;
|
||||
console.log('server listening on port', port);
|
||||
|
||||
open('http://localhost:' + port + '?es_hostname=' + encodeURIComponent(argv.host) +
|
||||
'&es_port=' + encodeURIComponent(argv.port) +
|
||||
'&browser=' + encodeURIComponent(argv.browser), browserAppName);
|
||||
});
|
||||
|
||||
server.on('tests done', function (success) {
|
||||
console.log('test completed', success ? 'successfully' : 'but failed');
|
||||
process.exit(success ? 0 : 1);
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
190
scripts/run_browser_integration_suite/server.js
Normal file
190
scripts/run_browser_integration_suite/server.js
Normal file
@ -0,0 +1,190 @@
|
||||
var http = require('http');
|
||||
var url = require('url');
|
||||
var path = require('path');
|
||||
var fs = require('fs');
|
||||
var _ = require('lodash');
|
||||
var chalk = require('chalk');
|
||||
var makeJUnitXml = require('../make_j_unit_xml');
|
||||
chalk.enabled = true;
|
||||
|
||||
var middleware = [];
|
||||
|
||||
Error.stackTraceLimit = Infinity;
|
||||
|
||||
var chars = 'abcdefghijklmnopqrstuvwxyz';
|
||||
|
||||
var server = http.createServer(function (req, resp) {
|
||||
var parsedUrl = url.parse(req.url, true);
|
||||
req.uri = parsedUrl.pathname;
|
||||
req.query = parsedUrl.query;
|
||||
req.filename = path.join(__dirname, '../../test/browser_integration/', req.uri);
|
||||
|
||||
var end = resp.end;
|
||||
resp.end = function () {
|
||||
console.log(chalk[this.statusCode < 300 ? 'green' : 'red'](this.statusCode), req.uri);
|
||||
end.apply(resp, arguments);
|
||||
};
|
||||
|
||||
var middleIndex = -1;
|
||||
|
||||
function next() {
|
||||
middleIndex++;
|
||||
if (middleIndex < middleware.length) {
|
||||
middleware[middleIndex](req, resp, next);
|
||||
} else {
|
||||
resp.writeHead(500);
|
||||
resp.end('500 Bad Gateway\n');
|
||||
}
|
||||
}
|
||||
next();
|
||||
});
|
||||
|
||||
function rand(length) {
|
||||
var str = '';
|
||||
while (str.length < length) {
|
||||
str += chars.charAt(Math.floor(Math.random() * chars.length));
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
function collectTestResults(req, resp) {
|
||||
var body = '';
|
||||
var browser = req.query.browser;
|
||||
var logFilename = path.join(__dirname, '../../test-output-' + browser + '.xml');
|
||||
|
||||
req.on('data', function (chunk) {
|
||||
body += chunk;
|
||||
});
|
||||
|
||||
req.on('error', function (err) {
|
||||
resp.writeHead(500);
|
||||
resp.end(err.message || 'failed to receive request completely');
|
||||
});
|
||||
|
||||
req.on('end', function () {
|
||||
var testDetails;
|
||||
try {
|
||||
testDetails = JSON.parse(body);
|
||||
} catch (e) {
|
||||
resp.writeHead(500);
|
||||
resp.end('encoding failure');
|
||||
return;
|
||||
}
|
||||
|
||||
resp.writeHead(200);
|
||||
resp.end('good work');
|
||||
|
||||
var xml = makeJUnitXml(browser, testDetails);
|
||||
fs.writeFile(logFilename, xml, function (err) {
|
||||
if (err) {
|
||||
console.log('unable to save test-output to', err.message);
|
||||
console.trace();
|
||||
server.emit('tests done', false);
|
||||
} else {
|
||||
console.log('test output written to', logFilename);
|
||||
server.emit('tests done', !testDetails.stats.failures);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
middleware.push(function (req, resp, next) {
|
||||
// resolve filenames
|
||||
switch (req.uri) {
|
||||
case '/tests-started':
|
||||
resp.end('OK');
|
||||
return;
|
||||
case '/tests-complete':
|
||||
return collectTestResults(req, resp);
|
||||
case '/expect.js':
|
||||
req.filename = path.join(__dirname, '../../node_modules/expect.js/expect.js');
|
||||
break;
|
||||
case '/mocha.js':
|
||||
case '/mocha.css':
|
||||
req.filename = path.join(__dirname, '../../node_modules/mocha', req.uri);
|
||||
break;
|
||||
case '/client.js':
|
||||
req.filename = path.join(__dirname, '../../dist/elasticsearch.js');
|
||||
break;
|
||||
}
|
||||
next();
|
||||
});
|
||||
|
||||
middleware.push(function (req, resp, next) {
|
||||
// catch 404's, add directory's index.html
|
||||
fs.stat(req.filename, function (err, stats) {
|
||||
if (err) {
|
||||
resp.writeHead(404, {'Content-Type': 'text/plain'});
|
||||
resp.write('404 Not Found\n');
|
||||
resp.end();
|
||||
} else {
|
||||
if (stats.isDirectory()) {
|
||||
req.filename = path.join(req.filename, '../../test/browser_integration/index.html');
|
||||
}
|
||||
next();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
middleware.push(function (req, resp) {
|
||||
// static files
|
||||
var reader = fs.createReadStream(req.filename);
|
||||
var data = '';
|
||||
|
||||
reader.on('data', onData);
|
||||
reader.on('error', onError);
|
||||
reader.on('end', onEnd);
|
||||
|
||||
function cleanupListeners() {
|
||||
reader.removeListener('end', onEnd);
|
||||
reader.removeListener('data', onData);
|
||||
reader.removeListener('error', onError);
|
||||
}
|
||||
|
||||
function onData(chunk) {
|
||||
data += chunk;
|
||||
}
|
||||
|
||||
function onError(err) {
|
||||
cleanupListeners();
|
||||
console.error(err);
|
||||
resp.setHeader('Content-Type', 'text/plain');
|
||||
resp.writeHead(500);
|
||||
resp.write(err.message + '\n');
|
||||
resp.end();
|
||||
}
|
||||
|
||||
function onEnd() {
|
||||
cleanupListeners();
|
||||
var contentType = 'text/plain';
|
||||
|
||||
switch (req.filename.split('.').pop()) {
|
||||
case 'js':
|
||||
contentType = 'application/javascript';
|
||||
break;
|
||||
case 'css':
|
||||
contentType = 'text/css';
|
||||
break;
|
||||
case 'html':
|
||||
contentType = 'text/html';
|
||||
break;
|
||||
}
|
||||
|
||||
if (contentType === 'text/html') {
|
||||
resp.end(_.template(data, _.defaults(req.query, {
|
||||
es_hostname: 'localhost',
|
||||
es_port: 9200,
|
||||
browser: 'unknown',
|
||||
ts: 'no'//rand(5)
|
||||
})));
|
||||
} else {
|
||||
resp.end(data);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
module.exports = server;
|
||||
Reference in New Issue
Block a user