Skip to content

Commit 4b1c2eb

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

File tree

5 files changed

+142
-15
lines changed

5 files changed

+142
-15
lines changed

.travis.yml

Lines changed: 6 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 128 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
var spawn = require('child_process').spawn;
1717
var request = require('request');
18+
var async = require('async');
1819

1920
var cwd = process.cwd();
2021

@@ -25,6 +26,7 @@ function getPath(dir) {
2526
var sampleTests = [
2627
{
2728
dir: 'express',
29+
projectId: 'express-demo',
2830
cmd: 'node',
2931
arg1: './bin/www',
3032
msg: 'Hello World! Express.js on Google App Engine.'
@@ -93,6 +95,36 @@ if (process.env.TRAVIS_NODE_VERSION !== 'stable') {
9395
});
9496
}
9597

98+
function end(timeoutId, intervalId, proc) {
99+
clearTimeout(timeoutId);
100+
clearInterval(intervalId);
101+
proc.kill('SIGKILL');
102+
}
103+
104+
function testRequest(url, sample, cb) {
105+
request(url, function (err, res, body) {
106+
if (err) {
107+
cb(err, false);
108+
} else {
109+
if (body && body.indexOf(sample.msg) !== -1 &&
110+
(res.statusCode === 200 || res.statusCode === sample.code)) {
111+
cb(null, true);
112+
} else {
113+
cb(null, false);
114+
}
115+
}
116+
});
117+
}
118+
119+
function shouldHide(data) {
120+
if (data.indexOf('.../') !== -1 ||
121+
data.indexOf('...-') !== -1 ||
122+
data.indexOf('...\\') !== -1 ||
123+
data.indexOf('...|') !== -1) {
124+
return true;
125+
}
126+
}
127+
96128
describe('appengine/', function () {
97129
sampleTests.forEach(function (sample) {
98130
it(sample.dir + ': dependencies should install', function (done) {
@@ -166,24 +198,105 @@ describe('appengine/', function () {
166198
}
167199
});
168200

169-
timeoutId = setTimeout(end, 5000);
170-
intervalId = setInterval(testRequest, 1000);
201+
timeoutId = setTimeout(function () {
202+
end(timeoutId, intervalId, proc);
203+
}, 5000);
204+
intervalId = setInterval(function () {
205+
testRequest('http://localhost:8080', sample, function (err, _success) {
206+
if (err) {
207+
console.log(err);
208+
} else {
209+
success = _success;
210+
}
211+
end(timeoutId, intervalId, proc);
212+
});
213+
}, 1000);
214+
});
215+
});
171216

172-
function end() {
173-
clearTimeout(timeoutId);
174-
clearInterval(intervalId);
175-
proc.kill('SIGKILL');
176-
}
217+
if (!process.env.TRAVIS) {
218+
return;
219+
}
177220

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();
221+
it('should deploy all samples', function (done) {
222+
this.timeout(10 * 60 * 1000); // 10 minutes
223+
async.parallel(sampleTests.map(function (sample) {
224+
if (sample.projectId) {
225+
return function (cb) {
226+
var calledDone = false;
227+
var proc = spawn('gcloud', [
228+
'preview',
229+
'app',
230+
'deploy',
231+
'app.yaml',
232+
'-q',
233+
'--project',
234+
sample.projectId,
235+
'--promote',
236+
'--version',
237+
'demo'
238+
], {
239+
cwd: getPath(sample.dir)
240+
});
241+
242+
function finish(err) {
243+
if (!calledDone) {
244+
calledDone = true;
245+
cb(err);
246+
}
184247
}
185-
});
248+
249+
proc.stderr.on('data', function (data) {
250+
if (shouldHide(data)) {
251+
return;
252+
}
253+
console.log(sample.projectId + ' stderr: ' + data);
254+
});
255+
proc.stdout.on('data', function (data) {
256+
if (shouldHide(data)) {
257+
return;
258+
}
259+
console.log(sample.projectId + ' stdout: ' + data);
260+
});
261+
proc.on('error', finish);
262+
proc.on('exit', function (code) {
263+
if (code !== 0) {
264+
finish(new Error(sample.dir + ': failed to deploy!'));
265+
} else {
266+
var url = 'http://' + sample.projectId + '.appspot.com';
267+
var demoUrl = 'http://demo.' + sample.projectId + '.appspot.com';
268+
async.waterfall([
269+
function (cb) {
270+
setTimeout(cb, 10000);
271+
},
272+
function (cb) {
273+
// Test "default" module
274+
testRequest(url, sample, cb);
275+
},
276+
function (result, cb) {
277+
if (!result) {
278+
cb(new Error(sample.dir + ': failed verification!'));
279+
} else {
280+
cb();
281+
}
282+
},
283+
function (cb) {
284+
// Test versioned url of "default" module
285+
testRequest(demoUrl, sample, cb);
286+
},
287+
function (result, cb) {
288+
if (!result) {
289+
cb(new Error(sample.dir + ': failed verification!'));
290+
} else {
291+
cb();
292+
}
293+
}
294+
], finish);
295+
}
296+
});
297+
};
186298
}
187-
});
299+
return function (cb) { cb(); };
300+
}), done);
188301
});
189302
});

test/encrypted/express-demo.json

Lines changed: 7 additions & 0 deletions
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+
}
2 KB
Binary file not shown.

0 commit comments

Comments
 (0)