Skip to content

Commit e8abf99

Browse files
committed
Add deployment tests. Closes #21.
1 parent 5469269 commit e8abf99

File tree

5 files changed

+98
-16
lines changed

5 files changed

+98
-16
lines changed

.travis.yml

+6
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,16 @@ before_install:
4444
printf '\ny\n\ny\ny\n' | ./google-cloud-sdk/install.sh &&
4545
cd $TRAVIS_BUILD_DIR;
4646
fi
47+
- gcloud components update -q
48+
- gcloud components update preview -q
4749
- openssl aes-256-cbc -K $encrypted_95e832a36b06_key -iv $encrypted_95e832a36b06_iv -in nodejs-docs-samples.json.enc -out nodejs-docs-samples.json -d
4850
- if [ -a nodejs-docs-samples.json ]; then
4951
gcloud auth activate-service-account --key-file nodejs-docs-samples.json;
5052
fi
53+
- 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
54+
- if [ -a test/encrypted/express-demo.json ]; then
55+
gcloud auth activate-service-account --key-file test/encrypted/express-demo.json;
56+
fi
5157

5258
install:
5359
#Add app specific setup here

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"googleapis": "~2.1.3"
2727
},
2828
"devDependencies": {
29+
"async": "^1.5.0",
2930
"coveralls": "^2.11.4",
3031
"istanbul": "^0.4.0",
3132
"jshint": "~2.8.0",

test/appengine/test.js

+84-16
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
'use strict';
1515

1616
var spawn = require('child_process').spawn;
17+
var exec = require('child_process').exec;
1718
var request = require('request');
19+
var async = require('async');
1820

1921
var cwd = process.cwd();
2022

@@ -25,6 +27,7 @@ function getPath(dir) {
2527
var sampleTests = [
2628
{
2729
dir: 'express',
30+
projectId: 'express-demo',
2831
cmd: 'node',
2932
arg1: './bin/www',
3033
msg: 'Hello World! Express.js on Google App Engine.'
@@ -93,6 +96,27 @@ if (process.env.TRAVIS_NODE_VERSION !== 'stable') {
9396
});
9497
}
9598

99+
function end(timeoutId, intervalId, proc) {
100+
clearTimeout(timeoutId);
101+
clearInterval(intervalId);
102+
proc.kill('SIGKILL');
103+
}
104+
105+
function testRequest(url, sample, cb) {
106+
request(url, function (err, res, body) {
107+
if (err) {
108+
cb(err, false);
109+
} else {
110+
if (body && body.indexOf(sample.msg) !== -1 &&
111+
(res.statusCode === 200 || res.statusCode === sample.code)) {
112+
cb(null, true);
113+
} else {
114+
cb(null, false);
115+
}
116+
}
117+
});
118+
}
119+
96120
describe('appengine/', function () {
97121
sampleTests.forEach(function (sample) {
98122
it(sample.dir + ': dependencies should install', function (done) {
@@ -166,24 +190,68 @@ describe('appengine/', function () {
166190
}
167191
});
168192

169-
timeoutId = setTimeout(end, 5000);
170-
intervalId = setInterval(testRequest, 1000);
171-
172-
function end() {
173-
clearTimeout(timeoutId);
174-
clearInterval(intervalId);
175-
proc.kill('SIGKILL');
176-
}
177-
178-
function testRequest() {
179-
request('http://localhost:8080', function (err, res, body) {
180-
if (body && body.indexOf(sample.msg) !== -1 &&
181-
(res.statusCode === 200 || res.statusCode === sample.code)) {
182-
success = true;
183-
end();
193+
timeoutId = setTimeout(function () {
194+
end(timeoutId, intervalId, proc);
195+
}, 5000);
196+
intervalId = setInterval(function () {
197+
testRequest('http://localhost:8080', sample, function (err, _success) {
198+
if (err) {
199+
console.log(err);
200+
} else {
201+
success = _success;
184202
}
203+
end(timeoutId, intervalId, proc);
185204
});
186-
}
205+
}, 1000);
187206
});
188207
});
208+
209+
if (!process.env.TRAVIS) {
210+
return;
211+
}
212+
213+
it('should deploy all samples', function (done) {
214+
this.timeout(10 * 60 * 1000); // 10 minutes
215+
async.parallel(sampleTests.map(function (sample) {
216+
if (sample.projectId) {
217+
return function (cb) {
218+
var calledDone = false;
219+
var timeoutId;
220+
var intervalId;
221+
var proc = spawn('npm', ['run', 'deploy'], {
222+
cwd: getPath(sample.dir)
223+
});
224+
225+
proc.stderr.on('data', function (data) {
226+
console.log(sample.projectId + ' stderr: ' + data);
227+
});
228+
proc.stdout.on('data', function (data) {
229+
console.log(sample.projectId + ' stdout: ' + data);
230+
});
231+
proc.on('error', function (err) {
232+
if (!calledDone) {
233+
calledDone = true;
234+
done(err);
235+
}
236+
});
237+
proc.on('exit', function (code, signal) {
238+
var url = 'http://' + sample.projectId + '.appspot.com';
239+
return testRequest(url, sample, function (err, result) {
240+
if (err) {
241+
console.log(err);
242+
}
243+
if (!calledDone) {
244+
calledDone = true;
245+
if (!err && !result) {
246+
err = new Error(sample.dir + ': failed verification!');
247+
}
248+
done(err, result);
249+
}
250+
});
251+
});
252+
};
253+
}
254+
return function (cb) { cb(); };
255+
}), done);
256+
});
189257
});

test/encrypted/express-demo.json

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"private_key_id": "86afabe11b39d5451f9e324a18295fc1dcdc0b67",
3+
"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",
4+
"client_email": "331060524961-5tu4fsd2sej6cdc6iv6kuvv5p0chri0i@developer.gserviceaccount.com",
5+
"client_id": "331060524961-5tu4fsd2sej6cdc6iv6kuvv5p0chri0i.apps.googleusercontent.com",
6+
"type": "service_account"
7+
}

test/encrypted/express-demo.json.enc

2 KB
Binary file not shown.

0 commit comments

Comments
 (0)