From e8abf9998209f690cdb7e051c56a3699aa1a91ca Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Wed, 4 Nov 2015 14:56:12 -0800 Subject: [PATCH] Add deployment tests. Closes #21. --- .travis.yml | 6 ++ package.json | 1 + test/appengine/test.js | 100 ++++++++++++++++++++++----- test/encrypted/express-demo.json | 7 ++ test/encrypted/express-demo.json.enc | Bin 0 -> 2048 bytes 5 files changed, 98 insertions(+), 16 deletions(-) create mode 100644 test/encrypted/express-demo.json create mode 100644 test/encrypted/express-demo.json.enc diff --git a/.travis.yml b/.travis.yml index dce4356f0c0..330843e6675 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,10 +44,16 @@ before_install: printf '\ny\n\ny\ny\n' | ./google-cloud-sdk/install.sh && cd $TRAVIS_BUILD_DIR; fi +- gcloud components update -q +- gcloud components update preview -q - openssl aes-256-cbc -K $encrypted_95e832a36b06_key -iv $encrypted_95e832a36b06_iv -in nodejs-docs-samples.json.enc -out nodejs-docs-samples.json -d - if [ -a nodejs-docs-samples.json ]; then gcloud auth activate-service-account --key-file nodejs-docs-samples.json; fi +- openssl aes-256-cbc -K $encrypted_4e84c7c7ab67_key -iv $encrypted_4e84c7c7ab67_iv -in test/encrypted/express-demo.json.enc -out test/encrypted/express-demo.json -d +- if [ -a test/encrypted/express-demo.json ]; then + gcloud auth activate-service-account --key-file test/encrypted/express-demo.json; + fi install: #Add app specific setup here diff --git a/package.json b/package.json index ddf938af216..1ff43530246 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "googleapis": "~2.1.3" }, "devDependencies": { + "async": "^1.5.0", "coveralls": "^2.11.4", "istanbul": "^0.4.0", "jshint": "~2.8.0", diff --git a/test/appengine/test.js b/test/appengine/test.js index 74c3030e18d..7b946ff4761 100644 --- a/test/appengine/test.js +++ b/test/appengine/test.js @@ -14,7 +14,9 @@ 'use strict'; var spawn = require('child_process').spawn; +var exec = require('child_process').exec; var request = require('request'); +var async = require('async'); var cwd = process.cwd(); @@ -25,6 +27,7 @@ function getPath(dir) { var sampleTests = [ { dir: 'express', + projectId: 'express-demo', cmd: 'node', arg1: './bin/www', msg: 'Hello World! Express.js on Google App Engine.' @@ -93,6 +96,27 @@ if (process.env.TRAVIS_NODE_VERSION !== 'stable') { }); } +function end(timeoutId, intervalId, proc) { + clearTimeout(timeoutId); + clearInterval(intervalId); + proc.kill('SIGKILL'); +} + +function testRequest(url, sample, cb) { + request(url, function (err, res, body) { + if (err) { + cb(err, false); + } else { + if (body && body.indexOf(sample.msg) !== -1 && + (res.statusCode === 200 || res.statusCode === sample.code)) { + cb(null, true); + } else { + cb(null, false); + } + } + }); +} + describe('appengine/', function () { sampleTests.forEach(function (sample) { it(sample.dir + ': dependencies should install', function (done) { @@ -166,24 +190,68 @@ describe('appengine/', function () { } }); - timeoutId = setTimeout(end, 5000); - intervalId = setInterval(testRequest, 1000); - - function end() { - clearTimeout(timeoutId); - clearInterval(intervalId); - proc.kill('SIGKILL'); - } - - function testRequest() { - request('http://localhost:8080', function (err, res, body) { - if (body && body.indexOf(sample.msg) !== -1 && - (res.statusCode === 200 || res.statusCode === sample.code)) { - success = true; - end(); + timeoutId = setTimeout(function () { + end(timeoutId, intervalId, proc); + }, 5000); + intervalId = setInterval(function () { + testRequest('http://localhost:8080', sample, function (err, _success) { + if (err) { + console.log(err); + } else { + success = _success; } + end(timeoutId, intervalId, proc); }); - } + }, 1000); }); }); + + if (!process.env.TRAVIS) { + return; + } + + it('should deploy all samples', function (done) { + this.timeout(10 * 60 * 1000); // 10 minutes + async.parallel(sampleTests.map(function (sample) { + if (sample.projectId) { + return function (cb) { + var calledDone = false; + var timeoutId; + var intervalId; + var proc = spawn('npm', ['run', 'deploy'], { + cwd: getPath(sample.dir) + }); + + proc.stderr.on('data', function (data) { + console.log(sample.projectId + ' stderr: ' + data); + }); + proc.stdout.on('data', function (data) { + console.log(sample.projectId + ' stdout: ' + data); + }); + proc.on('error', function (err) { + if (!calledDone) { + calledDone = true; + done(err); + } + }); + proc.on('exit', function (code, signal) { + var url = 'http://' + sample.projectId + '.appspot.com'; + return testRequest(url, sample, function (err, result) { + if (err) { + console.log(err); + } + if (!calledDone) { + calledDone = true; + if (!err && !result) { + err = new Error(sample.dir + ': failed verification!'); + } + done(err, result); + } + }); + }); + }; + } + return function (cb) { cb(); }; + }), done); + }); }); diff --git a/test/encrypted/express-demo.json b/test/encrypted/express-demo.json new file mode 100644 index 00000000000..a3233fbfefb --- /dev/null +++ b/test/encrypted/express-demo.json @@ -0,0 +1,7 @@ +{ + "private_key_id": "86afabe11b39d5451f9e324a18295fc1dcdc0b67", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDdkLGvD5y49ESR\nTnPLSGOlV3Cy304Rz81z3JTFqGKsN0POupF/mK+nHxEH9UoKAkuChdUR750qH21P\njvBBEcDI9hUqh9oisYXbOFZpelune+6QQ9v7BJZgeJ5hcVCpUASA4d6V087OgP1o\nLlR4IbHOO9GP7ra7tudQ2xDuDgBz9LgGKern1y+1WBOop6zL0f0NCOlutFirZOa9\n1RRRM4C7cQMHW6bbFb5PtvmEhfeLXjMeXal5lxS2wrucNcJHpi/jVbHGC3+57uFr\nPpi06tjJu/Tr1RPHt6Hd4pwCoetjXaVQTFcbEoPL3dYzj6E32WpEqRCKa6ZMTegD\nSaI0Iq6PAgMBAAECggEAJmtEpDpszpVsnlWgNoui27TB0gJuoyAJXCHPmkaMdZhP\npbUsLZfoPW5hoaOi5wFm3oceXzHRatBwP+9lMaNGbpJdMTbFWGa38z9dnISfB/ex\nckqSBoDRIoFH1VW0yucZINAJrKlBnwU266287+fH0R8GQ5L9FKeujJKv6Nd8tJ5U\nAlCLAv9Fw3EbQpbi8poQdL31dycwuqinzmY9suwih/zsv2U9PZTC2fNJOstiweDe\nd5Zvlabbw0H8ER2gVCnKppFcC6sMde7bCya3hmvihaBfLJJKORL885GNK8dW+nsv\nyV1Rh1a4Q5BUASEJqOHRaFWIhIjjyXblUkNfMgFSoQKBgQDuvx++7+CHbw/ySTd0\nuHcen+I/36Pmq2euH24qvuBl/2uxohUJQfI2aUuTtj0VAFOVPSnHU/YIXJd4gR6s\nt8lpDViQjcesDMsumlPaDrALXfnSPDiOtgSezEwPZBOwPFtnJyGBwgOmomvjriec\nJRBKsyUkQydU+W6l4UhlI1bfUwKBgQDtk7XMu88sIhVWi0XsWbUW3I/FG3CBGLzq\n90soFMLlqEyT45BmkW82eHAxIpzr+eJUhUViGZbslg1ccl4l1NaV/RiN3kQvNH+t\ni2c3GX4XuhaMuSFHFqDDqhYgjG6hea4es0eaZtbTMs2ZGZzCzMhZ0g6r++dobcEZ\nYJ10c6JYVQKBgAa11HyXXWYxFu+mYyqirKZts/w7mu22z5kzRPNqnf//59T8Sz8R\nXW9uEjO6oYjfk3nUWEJD99xQTemTJ3uPRtfvChg2A/CwA13x9H1igEwxff4Mt0I7\nl3GnKFQeafdAGwmRLf3pqBSc6A9kK7TVzdlro5WbVZWr1RJQfKprDdwFAoGAGkoC\nEAmoPyX2XoFC14iFtWXqstD6fg6SuR1sP58sgeVBtAu2auMk/04MfCNsYeBg3yFw\nMA7M2JkyGUy+hkkrBaXgFbLGsMKKblXCsiIsBcwduqyxtgAXAg/MKwXfKBci4VrN\nTZSbqPsyLQLcieHHOck4vmc9kBy1BW3ffoddK5ECgYEAx8zQuR9nx/nwFayxmCC3\ntqQQo5bphwh5BVzOM39QwcLRLqY/j7WNcPcwItBf1E3OZr16hRmklMdWFn2WSqqq\nG58j6gkIzaflsYmT+i/R0uWi8EZ69NUz5lvwbPBsuy+rLXSw0qkB5JqQag9Zjd6O\nukcH/qn8yIcIZOB3yGrcryI\u003d\n-----END PRIVATE KEY-----\n", + "client_email": "331060524961-5tu4fsd2sej6cdc6iv6kuvv5p0chri0i@developer.gserviceaccount.com", + "client_id": "331060524961-5tu4fsd2sej6cdc6iv6kuvv5p0chri0i.apps.googleusercontent.com", + "type": "service_account" +} \ No newline at end of file diff --git a/test/encrypted/express-demo.json.enc b/test/encrypted/express-demo.json.enc new file mode 100644 index 0000000000000000000000000000000000000000..c8a52142e6b05c0754eeb858c40be2d775668f51 GIT binary patch literal 2048 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 literal 0 HcmV?d00001