Skip to content

Commit f0812b6

Browse files
cristiancavallistephenplusplus
authored andcommitted
Add errors system-test to system-test run (#2189)
1 parent 833e953 commit f0812b6

4 files changed

Lines changed: 109 additions & 91 deletions

File tree

.github/CONTRIBUTING.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ $ npm test
2323
To run the system tests, first create and configure a project in the Google Developers Console following the [instructions on how to run google-cloud-node][elsewhere]. After that, set the following environment variables:
2424

2525
- **GCLOUD_TESTS_PROJECT_ID**: Developers Console project's ID (e.g. bamboo-shift-455)
26+
- ***GCLOUD_TESTS_PROJECT_NUMBER*** (*optional*): Developers Console project number (e.g. 1046198160504).
2627
- **GCLOUD_TESTS_KEY**: The path to the JSON key file.
27-
- ***GCLOUD_TESTS_API_KEY*** (*optional*): An API key that can be used to test the Translate API.
28+
- ***GCLOUD_TESTS_API_KEY*** (*optional*): An API key.
2829
- ***GCLOUD_TESTS_DNS_DOMAIN*** (*optional*): A domain you own managed by Cloud DNS (expected format: `'gcloud-node.com.'`).
2930

3031
Install the [gcloud command-line tool][gcloudcli] to your machine and use it to create the indexes used in the datastore system tests with indexes found in `system-test/data/index/yaml`:

packages/error-reporting/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"lodash.merge": "^4.6.0",
2525
"lodash.omit": "^4.5.0",
2626
"lodash.omitby": "^4.6.0",
27+
"lodash.pick": "^4.4.0",
2728
"lodash.random": "^3.2.0",
2829
"lodash.without": "^4.4.0",
2930
"mocha": "^3.2.0",

packages/error-reporting/system-test/testAuthClient.js

Lines changed: 103 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -27,45 +27,105 @@ var isString = is.string;
2727
var isEmpty = is.empty;
2828
var forEach = require('lodash.foreach');
2929
var assign = require('lodash.assign');
30+
var pick = require('lodash.pick');
31+
var omitBy = require('lodash.omitby');
3032
const ERR_TOKEN = '_@google_STACKDRIVER_INTEGRATION_TEST_ERROR__';
31-
32-
33-
describe('Behvaiour acceptance testing', function() {
34-
before(function() {
35-
// Before starting the suite make sure we have the proper resources
36-
if (!isString(process.env.GCLOUD_PROJECT)) {
37-
throw new Error(
38-
'The gcloud project id (GCLOUD_PROJECT) was not set in the env');
39-
} else if (!isString(process.env.STUBBED_API_KEY)) {
40-
throw new Error(
41-
'The api key (STUBBED_API_KEY) was not set as an env variable');
42-
} else if (!isString(process.env.STUBBED_PROJECT_NUM)) {
43-
throw new Error(
44-
'The project number (STUBBED_PROJECT_NUM) was not set in the env');
45-
} else if (process.env.NODE_ENV !== 'production') {
46-
throw new Error(
47-
'The NODE_ENV is not set to production as an env variable. Please ' +
48-
'set NODE_ENV to production');
33+
const env = (function(injectedEnv) {
34+
const envKeys = ['GOOGLE_APPLICATION_CREDENTIALS', 'GCLOUD_PROJECT',
35+
'NODE_ENV'];
36+
class InstancedEnv {
37+
constructor() {
38+
assign(this, injectedEnv);
39+
this._originalEnv = this._captureProcessProperties();
4940
}
50-
// In case we are running after unit mocks which were not destroyed properly
51-
nock.cleanAll();
52-
});
41+
_captureProcessProperties() {
42+
return omitBy(pick(process.env, envKeys), value => !isString(value));
43+
}
44+
sterilizeProcess() {
45+
forEach(envKeys, (v, k) => delete process.env[k]);
46+
return this;
47+
}
48+
setProjectId() {
49+
assign(process.env, {
50+
GCLOUD_PROJECT: injectedEnv.projectId
51+
});
52+
return this;
53+
}
54+
setProjectNumber() {
55+
assign(process.env, {
56+
GCLOUD_PROJECT: injectedEnv.projectNumber
57+
});
58+
return this;
59+
}
60+
setKeyFilename() {
61+
assign(process.env, {
62+
GOOGLE_APPLICATION_CREDENTIALS: injectedEnv.keyFilename
63+
});
64+
return this;
65+
}
66+
setProduction() {
67+
assign(process.env, {
68+
NODE_ENV: 'production'
69+
});
70+
return this;
71+
}
72+
restoreProcessToOriginalState() {
73+
assign(process.env, this._originalEnv);
74+
return this;
75+
}
76+
injected() {
77+
return assign({}, injectedEnv);
78+
}
79+
}
80+
return new InstancedEnv();
81+
}(require('../../../system-test/env.js')));
82+
const SHOULD_RUN = (function() {
83+
if (!isString(env.injected().projectId)) {
84+
return new Error('The project id (projectId) was not set in the env');
85+
}
86+
if (!isString(env.injected().apiKey)) {
87+
return new Error('The api key (apiKey) was not set as an env variable');
88+
}
89+
if (!isString(env.injected().projectNumber)) {
90+
return new Error(
91+
'The project number (projectNumber) was not set in the env');
92+
}
93+
if (!isString(env.injected().keyFilename)) {
94+
return new Error(
95+
'The key filename (keyFilename) was not set in the env');
96+
}
97+
return true;
98+
}());
99+
const TEST_RUNNER = (function() {
100+
if (SHOULD_RUN instanceof Error) {
101+
console.log('Skipping error-reporting system tests:');
102+
console.log(' ' + SHOULD_RUN.message);
103+
return describe.skip;
104+
}
105+
return describe;
106+
}());
107+
108+
(TEST_RUNNER)('Errors system tests', function() {
53109
describe('Request/Response lifecycle mocking', function() {
54110
var sampleError = new Error(ERR_TOKEN);
55111
var errorMessage = new ErrorMessage().setMessage(sampleError);
56112
var fakeService, client, logger;
113+
before(() => env.sterilizeProcess());
57114
beforeEach(function() {
115+
env.setProjectId().setKeyFilename().setProduction();
58116
fakeService = nock(
59117
'https://clouderrorreporting.googleapis.com/v1beta1/projects/' +
60-
process.env.GCLOUD_PROJECT
118+
env.projectId
61119
).persist().post('/events:report');
62120
logger = createLogger({logLevel: 5});
63121
client = new RequestHandler(
64122
new Configuration({ignoreEnvironmentCheck: true}, logger), logger);
65123
});
66124
afterEach(function() {
125+
env.sterilizeProcess();
67126
nock.cleanAll();
68127
});
128+
after(() => env.restoreProcessToOriginalState());
69129
describe('Receiving non-retryable errors', function() {
70130
it('Should fail', function(done) {
71131
this.timeout(5000);
@@ -99,7 +159,8 @@ describe('Behvaiour acceptance testing', function() {
99159
describe('Using an API key', function() {
100160
it('Should provide the key as a query string on outgoing requests',
101161
function(done) {
102-
var key = process.env.STUBBED_API_KEY;
162+
env.sterilizeProcess().setProjectId().setProduction();
163+
var key = env.apiKey;
103164
var client = new RequestHandler(new Configuration(
104165
{key: key, ignoreEnvironmentCheck: true},
105166
createLogger({logLevel: 5})));
@@ -125,30 +186,17 @@ describe('Behvaiour acceptance testing', function() {
125186
describe('System-live integration testing', function() {
126187
var sampleError = new Error(ERR_TOKEN);
127188
var errorMessage = new ErrorMessage().setMessage(sampleError.stack);
128-
var oldEnv = {
129-
GCLOUD_PROJECT: process.env.GCLOUD_PROJECT,
130-
STUBBED_PROJECT_NUM: process.env.STUBBED_PROJECT_NUM,
131-
NODE_ENV: process.env.NODE_ENV
132-
};
133-
function sterilizeEnv() {
134-
forEach(oldEnv, function(val, key) {
135-
delete process.env[key];
136-
});
137-
}
138-
function restoreEnv() {
139-
assign(process.env, oldEnv);
140-
}
141189
describe('Client creation', function() {
142190
describe('Using only project id', function() {
143191
describe('As a runtime argument', function() {
144192
var cfg, logger;
145193
before(function() {
146-
sterilizeEnv();
194+
env.sterilizeProcess().setKeyFilename();
147195
logger = createLogger({logLevel: 5});
148-
cfg = new Configuration({projectId: oldEnv.GCLOUD_PROJECT,
196+
cfg = new Configuration({projectId: env.injected().projectId,
149197
ignoreEnvironmentCheck: true}, logger);
150198
});
151-
after(restoreEnv);
199+
after(() => env.sterilizeProcess());
152200
it('Should not throw on initialization', function(done) {
153201
this.timeout(10000);
154202
assert.doesNotThrow(function() {
@@ -166,12 +214,11 @@ describe('Behvaiour acceptance testing', function() {
166214
describe('As an env variable', function() {
167215
var cfg, logger;
168216
before(function() {
169-
sterilizeEnv();
170-
process.env.GCLOUD_PROJECT = oldEnv.GCLOUD_PROJECT;
217+
env.sterilizeProcess().setProjectId().setKeyFilename();
171218
logger = createLogger({logLevel: 5});
172219
cfg = new Configuration({ignoreEnvironmentCheck: true}, logger);
173220
});
174-
after(restoreEnv);
221+
after(() => env.sterilizeProcess());
175222
it('Should not throw on initialization', function(done) {
176223
this.timeout(10000);
177224
assert.doesNotThrow(function() {
@@ -191,14 +238,14 @@ describe('Behvaiour acceptance testing', function() {
191238
describe('As a runtime argument', function() {
192239
var cfg, logger;
193240
before(function() {
194-
sterilizeEnv();
241+
env.sterilizeProcess().setKeyFilename();
195242
logger = createLogger({logLevel: 5});
196243
cfg = new Configuration({
197-
projectId: parseInt(oldEnv.STUBBED_PROJECT_NUM),
244+
projectId: parseInt(env.injected().projectNumber),
198245
ignoreEnvironmentCheck: true
199246
}, logger);
200247
});
201-
after(restoreEnv);
248+
after(() => env.sterilizeProcess());
202249
it('Should not throw on initialization', function(done) {
203250
this.timeout(10000);
204251
assert.doesNotThrow(function() {
@@ -216,12 +263,11 @@ describe('Behvaiour acceptance testing', function() {
216263
describe('As an env variable', function() {
217264
var cfg, logger;
218265
before(function() {
219-
sterilizeEnv();
220-
process.env.GCLOUD_PROJECT = oldEnv.STUBBED_PROJECT_NUM;
266+
env.sterilizeProcess().setKeyFilename().setProjectNumber();
221267
logger = createLogger({logLevel: 5});
222268
cfg = new Configuration({ignoreEnvironmentCheck: true}, logger);
223269
});
224-
after(restoreEnv);
270+
after(() => env.sterilizeProcess());
225271
it('Should not throw on initialization', function(done) {
226272
this.timeout(10000);
227273
assert.doesNotThrow(function() {
@@ -248,14 +294,13 @@ describe('Behvaiour acceptance testing', function() {
248294
].join(' ');
249295
var logger, client;
250296
before(function() {
251-
delete process.env.NODE_ENV;
297+
env.sterilizeProcess().setKeyFilename().setProjectId();
298+
process.env.NODE_ENV = 'null';
252299
logger = createLogger({logLevel: 5});
253300
client = new RequestHandler(new Configuration(undefined, logger),
254301
logger);
255302
});
256-
after(function() {
257-
process.env.NODE_ENV = oldEnv.NODE_ENV;
258-
});
303+
after(() => env.sterilizeProcess());
259304
it('Should callback with an error', function(done) {
260305
client.sendError({}, function(err, response, body) {
261306
assert(err instanceof Error);
@@ -265,49 +310,22 @@ describe('Behvaiour acceptance testing', function() {
265310
});
266311
});
267312
});
268-
// describe('An invalid env configuration', function() {
269-
// var ERROR_STRING = [
270-
// 'Unable to find the project Id for communication with the',
271-
// 'Stackdriver Error Reporting service. This app will be unable to',
272-
// 'send errors to the reporting service unless a valid project Id',
273-
// 'is supplied via runtime configuration or the GCLOUD_PROJECT',
274-
// 'environmental variable.'
275-
// ].join(' ');
276-
// var logger, client;
277-
// before(function() {
278-
// delete process.env.GCLOUD_PROJECT;
279-
// logger = createLogger({logLevel: 5});
280-
// client = new RequestHandler(new Configuration(
281-
// {ignoreEnvironmentCheck: true}, logger), logger);
282-
// });
283-
// after(function() {
284-
// process.env.GCLOUD_PROJECT = oldEnv.GCLOUD_PROJECT;
285-
// });
286-
// it('Should callback with an error', function(done) {
287-
// client.sendError(errorMessage, function(err, response, body) {
288-
// assert(err instanceof Error);
289-
// assert.strictEqual(err.message, ERROR_STRING);
290-
// assert.strictEqual(response, null);
291-
// done();
292-
// });
293-
// });
294-
// });
295313
});
296314
describe('Success behaviour', function() {
297315
var er = new Error(ERR_TOKEN);
298316
var em = new ErrorMessage().setMessage(er.stack);
299317
describe('Given a valid project id', function() {
300318
var logger, client, cfg;
301319
before(function() {
302-
sterilizeEnv();
320+
env.sterilizeProcess();
303321
logger = createLogger({logLevel: 5});
304322
cfg = new Configuration({
305-
projectId: oldEnv.GCLOUD_PROJECT,
323+
projectId: env.injected().projectId,
306324
ignoreEnvironmentCheck: true
307325
}, logger);
308326
client = new RequestHandler(cfg, logger);
309327
});
310-
after(restoreEnv);
328+
after(() => env.sterilizeProcess());
311329
it('Should succeed in its request', function(done) {
312330
client.sendError(em, function(err, response, body) {
313331
assert.strictEqual(err, null);
@@ -321,19 +339,15 @@ describe('Behvaiour acceptance testing', function() {
321339
describe('Given a valid project number', function() {
322340
var logger, client, cfg;
323341
before(function() {
324-
forEach(oldEnv, function(val, key) {
325-
delete process.env[key];
326-
});
342+
env.sterilizeProcess();
327343
logger = createLogger({logLevel: 5});
328344
cfg = new Configuration({
329-
projectId: parseInt(oldEnv.STUBBED_PROJECT_NUM),
345+
projectId: parseInt(env.injected().projectNumber),
330346
ignoreEnvironmentCheck: true
331347
}, logger);
332348
client = new RequestHandler(cfg, logger);
333349
});
334-
after(function() {
335-
assign(process.env, oldEnv);
336-
});
350+
after(() => env.sterilizeProcess());
337351
it('Should succeed in its request', function(done) {
338352
client.sendError(em, function(err, response, body) {
339353
assert.strictEqual(err, null);

system-test/env.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,7 @@
1818

1919
module.exports = {
2020
projectId: process.env.GCLOUD_TESTS_PROJECT_ID,
21-
keyFilename: process.env.GCLOUD_TESTS_KEY
21+
keyFilename: process.env.GCLOUD_TESTS_KEY,
22+
apiKey: process.env.GCLOUD_TESTS_API_KEY,
23+
projectNumber: process.env.GCLOUD_TESTS_PROJECT_NUMBER
2224
};

0 commit comments

Comments
 (0)