From 47fc7d5a8431505af8dec8326e5d081219ad7d6a Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 15 Mar 2015 20:16:55 -0700 Subject: [PATCH] Add script runner for saucelabs --- Makefile | 2 +- script/saucelabs | 11 ++++ test/app.js | 138 -------------------------------------------- test/saucelabs.js | 100 +++++++++++++++----------------- test/server.js | 142 +++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 197 insertions(+), 196 deletions(-) create mode 100755 script/saucelabs delete mode 100755 test/app.js diff --git a/Makefile b/Makefile index 5017503..c7692d7 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ test: node_modules/ build lint ./script/test saucelabs: build - node ./test/saucelabs.js + ./script/saucelabs travis: lint test saucelabs diff --git a/script/saucelabs b/script/saucelabs new file mode 100755 index 0000000..9e4ca56 --- /dev/null +++ b/script/saucelabs @@ -0,0 +1,11 @@ +#!/bin/bash +set -e + +port=8080 + +# Spin a test server in the background +node ./test/server.js $port &>/dev/null & +server_pid=$! +trap "kill $server_pid" INT EXIT + +node ./test/saucelabs.js "http://localhost:$port/test/test.html" diff --git a/test/app.js b/test/app.js deleted file mode 100755 index fdcbccf..0000000 --- a/test/app.js +++ /dev/null @@ -1,138 +0,0 @@ -var fs = require('fs') -var url = require('url'); -var querystring = require('querystring'); - -var routes = { - '/request': function(res, req) { - res.writeHead(200, {'Content-Type': 'application/json'}); - var data = '' - req.on('data', function(c) { data += c }) - req.on('end', function() { - res.end(JSON.stringify({ - method: req.method, - url: req.url, - headers: req.headers, - data: data - })); - }) - }, - '/hello': function(res, req) { - res.writeHead(200, { - 'Content-Type': 'text/plain', - 'X-Request-URL': 'http://' + req.headers.host + req.url - }); - res.end('hi'); - }, - '/hello/utf8': function(res) { - res.writeHead(200, { - 'Content-Type': 'text/plain; charset=utf-8' - }); - // "hello" - var buf = new Buffer([104, 101, 108, 108, 111]); - res.end(buf); - }, - '/hello/utf16le': function(res) { - res.writeHead(200, { - 'Content-Type': 'text/plain; charset=utf-16le' - }); - // "hello" - var buf = new Buffer([104, 0, 101, 0, 108, 0, 108, 0, 111, 0]); - res.end(buf); - }, - '/binary': function(res) { - res.writeHead(200, {'Content-Type': 'application/octet-stream'}); - var buf = new Buffer(256); - for (var i = 0; i < 256; i++) { - buf[i] = i; - } - res.end(buf); - }, - '/redirect/301': function(res) { - res.writeHead(301, {'Location': '/hello'}); - res.end(); - }, - '/redirect/302': function(res) { - res.writeHead(302, {'Location': '/hello'}); - res.end(); - }, - '/redirect/303': function(res) { - res.writeHead(303, {'Location': '/hello'}); - res.end(); - }, - '/redirect/307': function(res) { - res.writeHead(307, {'Location': '/hello'}); - res.end(); - }, - '/redirect/308': function(res) { - res.writeHead(308, {'Location': '/hello'}); - res.end(); - }, - '/boom': function(res) { - res.writeHead(500, {'Content-Type': 'text/plain'}); - res.end('boom'); - }, - '/empty': function(res) { - res.writeHead(204); - res.end(); - }, - '/error': function(res) { - res.destroy(); - }, - '/form': function(res) { - res.writeHead(200, {'Content-Type': 'text/plain'}); - res.end('number=1&space=one+two&empty=&encoded=a%2Bb&'); - }, - '/json': function(res) { - res.writeHead(200, {'Content-Type': 'application/json'}); - res.end(JSON.stringify({name: 'Hubot', login: 'hubot'})); - }, - '/json-error': function(res) { - res.writeHead(200, {'Content-Type': 'application/json'}); - res.end('not json {'); - }, - '/cookie': function(res, req) { - var setCookie, cookie - var params = querystring.parse(url.parse(req.url).query); - if (params.name && params.value) { - setCookie = [params.name, params.value].join('='); - } - if (params.name) { - cookie = querystring.parse(req.headers['cookie'], '; ')[params.name]; - } - res.writeHead(200, {'Content-Type': 'text/plain', 'Set-Cookie': setCookie}); - res.end(cookie); - }, - '/headers': function(res) { - res.writeHead(200, { - 'Date': 'Mon, 13 Oct 2014 21:02:27 GMT', - 'Content-Type': 'text/html; charset=utf-8' - }); - res.end(); - } -}; - -var types = { - js: 'application/javascript', - css: 'text/css', - html: 'text/html', - txt: 'text/plain' -}; - -module.exports = function(req, res) { - var pathname = url.parse(req.url).pathname; - var route = routes[pathname]; - if (route) { - route(res, req); - } else { - fs.readFile(__dirname + '/..' + pathname, function(err, data) { - if (err) { - res.writeHead(404, {'Content-Type': types.txt}); - res.end('Not Found'); - } else { - var ext = (pathname.match(/\.([^\/]+)$/) || [])[1] - res.writeHead(200, {'Content-Type': types[ext] || types.txt}); - res.end(data); - } - }); - } -}; diff --git a/test/saucelabs.js b/test/saucelabs.js index 12808e3..cf852f9 100644 --- a/test/saucelabs.js +++ b/test/saucelabs.js @@ -1,7 +1,6 @@ require('es6-promise'); var http = require('http'); var https = require('https'); -var app = require('./app'); function fetchJSON(options, obj) { var data = JSON.stringify(obj); @@ -35,61 +34,54 @@ function wait(ms) { }); } -var server = http.createServer(app); -server.on('listening', function() { - var port = server.address().port; - var url = 'http://localhost:'+port+'/test/test.html'; - - fetchJSON({ - method: 'POST', - hostname: 'saucelabs.com', - path: '/rest/v1/' + process.env.SAUCE_USERNAME + '/js-tests', - headers: {}, - auth: process.env.SAUCE_USERNAME + ':' + process.env.SAUCE_ACCESS_KEY - }, { - 'build': process.env.TRAVIS_BUILD_NUMBER, - 'tags': [process.env.TRAVIS_PULL_REQUEST, process.env.TRAVIS_BRANCH], - 'tunnel-identifier': process.env.TRAVIS_JOB_NUMBER, - 'platforms': [[process.env.SAUCE_PLATFORM, process.env.SAUCE_BROWSER, process.env.SAUCE_VERSION]], - 'url': url, - 'framework': 'qunit' - }).then(function(obj) { - function check() { - return fetchJSON({ - method: 'POST', - hostname: 'saucelabs.com', - path: '/rest/v1/' + process.env.SAUCE_USERNAME + '/js-tests/status', - headers: {}, - auth: process.env.SAUCE_USERNAME + ':' + process.env.SAUCE_ACCESS_KEY - }, obj).then(function(obj) { - if (obj.completed === true) { - return obj; - } else { - return wait(2 * 1000).then(check); - } - }); - } - return Promise.race([check(), timeout(180 * 1000)]); - }).then(function(obj) { - var test = obj['js tests'][0]; +fetchJSON({ + method: 'POST', + hostname: 'saucelabs.com', + path: '/rest/v1/' + process.env.SAUCE_USERNAME + '/js-tests', + headers: {}, + auth: process.env.SAUCE_USERNAME + ':' + process.env.SAUCE_ACCESS_KEY +}, { + 'build': process.env.TRAVIS_BUILD_NUMBER, + 'tags': [process.env.TRAVIS_PULL_REQUEST, process.env.TRAVIS_BRANCH], + 'tunnel-identifier': process.env.TRAVIS_JOB_NUMBER, + 'platforms': [[process.env.SAUCE_PLATFORM, process.env.SAUCE_BROWSER, process.env.SAUCE_VERSION]], + 'url': process.argv[2], + 'framework': 'qunit' +}).then(function(obj) { + function check() { + return fetchJSON({ + method: 'POST', + hostname: 'saucelabs.com', + path: '/rest/v1/' + process.env.SAUCE_USERNAME + '/js-tests/status', + headers: {}, + auth: process.env.SAUCE_USERNAME + ':' + process.env.SAUCE_ACCESS_KEY + }, obj).then(function(obj) { + if (obj.completed === true) { + return obj; + } else { + return wait(2 * 1000).then(check); + } + }); + } + return Promise.race([check(), timeout(180 * 1000)]); +}).then(function(obj) { + var test = obj['js tests'][0]; - console.log(test.url); - console.log(test.platform); - console.log(test.result); + console.log(test.url); + console.log(test.platform); + console.log(test.result); - var passed = test.result && (typeof test.result === 'object') && - test.result.passed === test.result.total; + var passed = test.result && (typeof test.result === 'object') && + test.result.passed === test.result.total; - if (!passed) { - throw 'tests failed'; - } - }).then(function() { - server.close(); - global.process.exit(0); - }, function(error) { - setImmediate(function() { - throw error; - }); + if (!passed) { + throw 'tests failed'; + } +}).then(function() { + server.close(); + global.process.exit(0); +}, function(error) { + setImmediate(function() { + throw error; }); }); -server.listen(8080); diff --git a/test/server.js b/test/server.js index c2493be..a6ca9d7 100755 --- a/test/server.js +++ b/test/server.js @@ -1,7 +1,143 @@ #!/usr/bin/env node +var port = Number(process.argv[2] || 3000) + +var fs = require('fs') var http = require('http'); -var app = require('./app'); +var url = require('url'); +var querystring = require('querystring'); + +var routes = { + '/request': function(res, req) { + res.writeHead(200, {'Content-Type': 'application/json'}); + var data = '' + req.on('data', function(c) { data += c }) + req.on('end', function() { + res.end(JSON.stringify({ + method: req.method, + url: req.url, + headers: req.headers, + data: data + })); + }) + }, + '/hello': function(res, req) { + res.writeHead(200, { + 'Content-Type': 'text/plain', + 'X-Request-URL': 'http://' + req.headers.host + req.url + }); + res.end('hi'); + }, + '/hello/utf8': function(res) { + res.writeHead(200, { + 'Content-Type': 'text/plain; charset=utf-8' + }); + // "hello" + var buf = new Buffer([104, 101, 108, 108, 111]); + res.end(buf); + }, + '/hello/utf16le': function(res) { + res.writeHead(200, { + 'Content-Type': 'text/plain; charset=utf-16le' + }); + // "hello" + var buf = new Buffer([104, 0, 101, 0, 108, 0, 108, 0, 111, 0]); + res.end(buf); + }, + '/binary': function(res) { + res.writeHead(200, {'Content-Type': 'application/octet-stream'}); + var buf = new Buffer(256); + for (var i = 0; i < 256; i++) { + buf[i] = i; + } + res.end(buf); + }, + '/redirect/301': function(res) { + res.writeHead(301, {'Location': '/hello'}); + res.end(); + }, + '/redirect/302': function(res) { + res.writeHead(302, {'Location': '/hello'}); + res.end(); + }, + '/redirect/303': function(res) { + res.writeHead(303, {'Location': '/hello'}); + res.end(); + }, + '/redirect/307': function(res) { + res.writeHead(307, {'Location': '/hello'}); + res.end(); + }, + '/redirect/308': function(res) { + res.writeHead(308, {'Location': '/hello'}); + res.end(); + }, + '/boom': function(res) { + res.writeHead(500, {'Content-Type': 'text/plain'}); + res.end('boom'); + }, + '/empty': function(res) { + res.writeHead(204); + res.end(); + }, + '/error': function(res) { + res.destroy(); + }, + '/form': function(res) { + res.writeHead(200, {'Content-Type': 'text/plain'}); + res.end('number=1&space=one+two&empty=&encoded=a%2Bb&'); + }, + '/json': function(res) { + res.writeHead(200, {'Content-Type': 'application/json'}); + res.end(JSON.stringify({name: 'Hubot', login: 'hubot'})); + }, + '/json-error': function(res) { + res.writeHead(200, {'Content-Type': 'application/json'}); + res.end('not json {'); + }, + '/cookie': function(res, req) { + var setCookie, cookie + var params = querystring.parse(url.parse(req.url).query); + if (params.name && params.value) { + setCookie = [params.name, params.value].join('='); + } + if (params.name) { + cookie = querystring.parse(req.headers['cookie'], '; ')[params.name]; + } + res.writeHead(200, {'Content-Type': 'text/plain', 'Set-Cookie': setCookie}); + res.end(cookie); + }, + '/headers': function(res) { + res.writeHead(200, { + 'Date': 'Mon, 13 Oct 2014 21:02:27 GMT', + 'Content-Type': 'text/html; charset=utf-8' + }); + res.end(); + } +}; + +var types = { + js: 'application/javascript', + css: 'text/css', + html: 'text/html', + txt: 'text/plain' +}; -var port = parseInt(process.argv[2], 10) || 3000; -http.createServer(app).listen(port); +http.createServer(function(req, res) { + var pathname = url.parse(req.url).pathname; + var route = routes[pathname]; + if (route) { + route(res, req); + } else { + fs.readFile(__dirname + '/..' + pathname, function(err, data) { + if (err) { + res.writeHead(404, {'Content-Type': types.txt}); + res.end('Not Found'); + } else { + var ext = (pathname.match(/\.([^\/]+)$/) || [])[1] + res.writeHead(200, {'Content-Type': types[ext] || types.txt}); + res.end(data); + } + }); + } +}).listen(port); -- GitLab