Skip to content

Commit 26ed5b8

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

File tree

5 files changed

+143
-16
lines changed

5 files changed

+143
-16
lines changed

.gitignore

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
**/node_modules/**
22
npm-debug.log
3-
coverage/
3+
coverage/
4+
5+
test/encrypted/express-demo.json

.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

+133-15
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 && (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,110 @@ 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+
}, 10000);
204+
205+
// Give the server time to start up
206+
setTimeout(function () {
207+
intervalId = setInterval(function () {
208+
var url = 'http://localhost:8080';
209+
testRequest(url, sample, function (err, _success) {
210+
if (err) {
211+
console.log(err);
212+
} else {
213+
success = _success;
214+
}
215+
end(timeoutId, intervalId, proc);
216+
});
217+
}, 1000);
218+
}, 2000);
219+
});
220+
});
221+
222+
if (!process.env.TRAVIS) {
223+
return;
224+
}
171225

172-
function end() {
173-
clearTimeout(timeoutId);
174-
clearInterval(intervalId);
175-
proc.kill('SIGKILL');
176-
}
226+
it('should deploy all samples', function (done) {
227+
this.timeout(10 * 60 * 1000); // 10 minutes
228+
async.parallel(sampleTests.map(function (sample) {
229+
if (sample.projectId) {
230+
return function (cb) {
231+
var calledDone = false;
232+
var proc = spawn('gcloud', [
233+
'preview',
234+
'app',
235+
'deploy',
236+
'app.yaml',
237+
'-q',
238+
'--project',
239+
sample.projectId,
240+
'--promote',
241+
'--version',
242+
'demo'
243+
], {
244+
cwd: getPath(sample.dir)
245+
});
177246

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();
247+
function finish(err) {
248+
if (!calledDone) {
249+
calledDone = true;
250+
cb(err);
251+
}
184252
}
185-
});
253+
254+
proc.stderr.on('data', function (data) {
255+
if (shouldHide(data)) {
256+
return;
257+
}
258+
console.log(sample.projectId + ' stderr: ' + data);
259+
});
260+
proc.stdout.on('data', function (data) {
261+
if (shouldHide(data)) {
262+
return;
263+
}
264+
console.log(sample.projectId + ' stdout: ' + data);
265+
});
266+
proc.on('error', finish);
267+
proc.on('exit', function (code) {
268+
if (code !== 0) {
269+
finish(new Error(sample.dir + ': failed to deploy!'));
270+
} else {
271+
var url = 'http://' + sample.projectId + '.appspot.com';
272+
var demoUrl = 'http://demo.' + sample.projectId + '.appspot.com';
273+
async.waterfall([
274+
function (cb) {
275+
setTimeout(cb, 10000);
276+
},
277+
function (cb) {
278+
// Test "default" module
279+
testRequest(url, sample, cb);
280+
},
281+
function (result, cb) {
282+
if (!result) {
283+
cb(new Error(sample.dir + ': failed verification!'));
284+
} else {
285+
cb();
286+
}
287+
},
288+
function (cb) {
289+
// Test versioned url of "default" module
290+
testRequest(demoUrl, sample, cb);
291+
},
292+
function (result, cb) {
293+
if (!result) {
294+
cb(new Error(sample.dir + ': failed verification!'));
295+
} else {
296+
cb();
297+
}
298+
}
299+
], finish);
300+
}
301+
});
302+
};
186303
}
187-
});
304+
return function (cb) { cb(); };
305+
}), done);
188306
});
189307
});

test/encrypted/express-demo.json.enc

2 KB
Binary file not shown.

0 commit comments

Comments
 (0)