Skip to content

Commit

Permalink
Add errors system-test to system-test run (googleapis#2189)
Browse files Browse the repository at this point in the history
  • Loading branch information
cristiancavalli authored and stephenplusplus committed Apr 13, 2017
1 parent 833e953 commit f0812b6
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 91 deletions.
3 changes: 2 additions & 1 deletion .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,9 @@ $ npm test
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:

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

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`:
Expand Down
1 change: 1 addition & 0 deletions packages/error-reporting/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
"lodash.merge": "^4.6.0",
"lodash.omit": "^4.5.0",
"lodash.omitby": "^4.6.0",
"lodash.pick": "^4.4.0",
"lodash.random": "^3.2.0",
"lodash.without": "^4.4.0",
"mocha": "^3.2.0",
Expand Down
192 changes: 103 additions & 89 deletions packages/error-reporting/system-test/testAuthClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,45 +27,105 @@ var isString = is.string;
var isEmpty = is.empty;
var forEach = require('lodash.foreach');
var assign = require('lodash.assign');
var pick = require('lodash.pick');
var omitBy = require('lodash.omitby');
const ERR_TOKEN = '_@google_STACKDRIVER_INTEGRATION_TEST_ERROR__';


describe('Behvaiour acceptance testing', function() {
before(function() {
// Before starting the suite make sure we have the proper resources
if (!isString(process.env.GCLOUD_PROJECT)) {
throw new Error(
'The gcloud project id (GCLOUD_PROJECT) was not set in the env');
} else if (!isString(process.env.STUBBED_API_KEY)) {
throw new Error(
'The api key (STUBBED_API_KEY) was not set as an env variable');
} else if (!isString(process.env.STUBBED_PROJECT_NUM)) {
throw new Error(
'The project number (STUBBED_PROJECT_NUM) was not set in the env');
} else if (process.env.NODE_ENV !== 'production') {
throw new Error(
'The NODE_ENV is not set to production as an env variable. Please ' +
'set NODE_ENV to production');
const env = (function(injectedEnv) {
const envKeys = ['GOOGLE_APPLICATION_CREDENTIALS', 'GCLOUD_PROJECT',
'NODE_ENV'];
class InstancedEnv {
constructor() {
assign(this, injectedEnv);
this._originalEnv = this._captureProcessProperties();
}
// In case we are running after unit mocks which were not destroyed properly
nock.cleanAll();
});
_captureProcessProperties() {
return omitBy(pick(process.env, envKeys), value => !isString(value));
}
sterilizeProcess() {
forEach(envKeys, (v, k) => delete process.env[k]);
return this;
}
setProjectId() {
assign(process.env, {
GCLOUD_PROJECT: injectedEnv.projectId
});
return this;
}
setProjectNumber() {
assign(process.env, {
GCLOUD_PROJECT: injectedEnv.projectNumber
});
return this;
}
setKeyFilename() {
assign(process.env, {
GOOGLE_APPLICATION_CREDENTIALS: injectedEnv.keyFilename
});
return this;
}
setProduction() {
assign(process.env, {
NODE_ENV: 'production'
});
return this;
}
restoreProcessToOriginalState() {
assign(process.env, this._originalEnv);
return this;
}
injected() {
return assign({}, injectedEnv);
}
}
return new InstancedEnv();
}(require('../../../system-test/env.js')));
const SHOULD_RUN = (function() {
if (!isString(env.injected().projectId)) {
return new Error('The project id (projectId) was not set in the env');
}
if (!isString(env.injected().apiKey)) {
return new Error('The api key (apiKey) was not set as an env variable');
}
if (!isString(env.injected().projectNumber)) {
return new Error(
'The project number (projectNumber) was not set in the env');
}
if (!isString(env.injected().keyFilename)) {
return new Error(
'The key filename (keyFilename) was not set in the env');
}
return true;
}());
const TEST_RUNNER = (function() {
if (SHOULD_RUN instanceof Error) {
console.log('Skipping error-reporting system tests:');
console.log(' ' + SHOULD_RUN.message);
return describe.skip;
}
return describe;
}());

(TEST_RUNNER)('Errors system tests', function() {
describe('Request/Response lifecycle mocking', function() {
var sampleError = new Error(ERR_TOKEN);
var errorMessage = new ErrorMessage().setMessage(sampleError);
var fakeService, client, logger;
before(() => env.sterilizeProcess());
beforeEach(function() {
env.setProjectId().setKeyFilename().setProduction();
fakeService = nock(
'https://clouderrorreporting.googleapis.com/v1beta1/projects/' +
process.env.GCLOUD_PROJECT
env.projectId
).persist().post('/events:report');
logger = createLogger({logLevel: 5});
client = new RequestHandler(
new Configuration({ignoreEnvironmentCheck: true}, logger), logger);
});
afterEach(function() {
env.sterilizeProcess();
nock.cleanAll();
});
after(() => env.restoreProcessToOriginalState());
describe('Receiving non-retryable errors', function() {
it('Should fail', function(done) {
this.timeout(5000);
Expand Down Expand Up @@ -99,7 +159,8 @@ describe('Behvaiour acceptance testing', function() {
describe('Using an API key', function() {
it('Should provide the key as a query string on outgoing requests',
function(done) {
var key = process.env.STUBBED_API_KEY;
env.sterilizeProcess().setProjectId().setProduction();
var key = env.apiKey;
var client = new RequestHandler(new Configuration(
{key: key, ignoreEnvironmentCheck: true},
createLogger({logLevel: 5})));
Expand All @@ -125,30 +186,17 @@ describe('Behvaiour acceptance testing', function() {
describe('System-live integration testing', function() {
var sampleError = new Error(ERR_TOKEN);
var errorMessage = new ErrorMessage().setMessage(sampleError.stack);
var oldEnv = {
GCLOUD_PROJECT: process.env.GCLOUD_PROJECT,
STUBBED_PROJECT_NUM: process.env.STUBBED_PROJECT_NUM,
NODE_ENV: process.env.NODE_ENV
};
function sterilizeEnv() {
forEach(oldEnv, function(val, key) {
delete process.env[key];
});
}
function restoreEnv() {
assign(process.env, oldEnv);
}
describe('Client creation', function() {
describe('Using only project id', function() {
describe('As a runtime argument', function() {
var cfg, logger;
before(function() {
sterilizeEnv();
env.sterilizeProcess().setKeyFilename();
logger = createLogger({logLevel: 5});
cfg = new Configuration({projectId: oldEnv.GCLOUD_PROJECT,
cfg = new Configuration({projectId: env.injected().projectId,
ignoreEnvironmentCheck: true}, logger);
});
after(restoreEnv);
after(() => env.sterilizeProcess());
it('Should not throw on initialization', function(done) {
this.timeout(10000);
assert.doesNotThrow(function() {
Expand All @@ -166,12 +214,11 @@ describe('Behvaiour acceptance testing', function() {
describe('As an env variable', function() {
var cfg, logger;
before(function() {
sterilizeEnv();
process.env.GCLOUD_PROJECT = oldEnv.GCLOUD_PROJECT;
env.sterilizeProcess().setProjectId().setKeyFilename();
logger = createLogger({logLevel: 5});
cfg = new Configuration({ignoreEnvironmentCheck: true}, logger);
});
after(restoreEnv);
after(() => env.sterilizeProcess());
it('Should not throw on initialization', function(done) {
this.timeout(10000);
assert.doesNotThrow(function() {
Expand All @@ -191,14 +238,14 @@ describe('Behvaiour acceptance testing', function() {
describe('As a runtime argument', function() {
var cfg, logger;
before(function() {
sterilizeEnv();
env.sterilizeProcess().setKeyFilename();
logger = createLogger({logLevel: 5});
cfg = new Configuration({
projectId: parseInt(oldEnv.STUBBED_PROJECT_NUM),
projectId: parseInt(env.injected().projectNumber),
ignoreEnvironmentCheck: true
}, logger);
});
after(restoreEnv);
after(() => env.sterilizeProcess());
it('Should not throw on initialization', function(done) {
this.timeout(10000);
assert.doesNotThrow(function() {
Expand All @@ -216,12 +263,11 @@ describe('Behvaiour acceptance testing', function() {
describe('As an env variable', function() {
var cfg, logger;
before(function() {
sterilizeEnv();
process.env.GCLOUD_PROJECT = oldEnv.STUBBED_PROJECT_NUM;
env.sterilizeProcess().setKeyFilename().setProjectNumber();
logger = createLogger({logLevel: 5});
cfg = new Configuration({ignoreEnvironmentCheck: true}, logger);
});
after(restoreEnv);
after(() => env.sterilizeProcess());
it('Should not throw on initialization', function(done) {
this.timeout(10000);
assert.doesNotThrow(function() {
Expand All @@ -248,14 +294,13 @@ describe('Behvaiour acceptance testing', function() {
].join(' ');
var logger, client;
before(function() {
delete process.env.NODE_ENV;
env.sterilizeProcess().setKeyFilename().setProjectId();
process.env.NODE_ENV = 'null';
logger = createLogger({logLevel: 5});
client = new RequestHandler(new Configuration(undefined, logger),
logger);
});
after(function() {
process.env.NODE_ENV = oldEnv.NODE_ENV;
});
after(() => env.sterilizeProcess());
it('Should callback with an error', function(done) {
client.sendError({}, function(err, response, body) {
assert(err instanceof Error);
Expand All @@ -265,49 +310,22 @@ describe('Behvaiour acceptance testing', function() {
});
});
});
// describe('An invalid env configuration', function() {
// var ERROR_STRING = [
// 'Unable to find the project Id for communication with the',
// 'Stackdriver Error Reporting service. This app will be unable to',
// 'send errors to the reporting service unless a valid project Id',
// 'is supplied via runtime configuration or the GCLOUD_PROJECT',
// 'environmental variable.'
// ].join(' ');
// var logger, client;
// before(function() {
// delete process.env.GCLOUD_PROJECT;
// logger = createLogger({logLevel: 5});
// client = new RequestHandler(new Configuration(
// {ignoreEnvironmentCheck: true}, logger), logger);
// });
// after(function() {
// process.env.GCLOUD_PROJECT = oldEnv.GCLOUD_PROJECT;
// });
// it('Should callback with an error', function(done) {
// client.sendError(errorMessage, function(err, response, body) {
// assert(err instanceof Error);
// assert.strictEqual(err.message, ERROR_STRING);
// assert.strictEqual(response, null);
// done();
// });
// });
// });
});
describe('Success behaviour', function() {
var er = new Error(ERR_TOKEN);
var em = new ErrorMessage().setMessage(er.stack);
describe('Given a valid project id', function() {
var logger, client, cfg;
before(function() {
sterilizeEnv();
env.sterilizeProcess();
logger = createLogger({logLevel: 5});
cfg = new Configuration({
projectId: oldEnv.GCLOUD_PROJECT,
projectId: env.injected().projectId,
ignoreEnvironmentCheck: true
}, logger);
client = new RequestHandler(cfg, logger);
});
after(restoreEnv);
after(() => env.sterilizeProcess());
it('Should succeed in its request', function(done) {
client.sendError(em, function(err, response, body) {
assert.strictEqual(err, null);
Expand All @@ -321,19 +339,15 @@ describe('Behvaiour acceptance testing', function() {
describe('Given a valid project number', function() {
var logger, client, cfg;
before(function() {
forEach(oldEnv, function(val, key) {
delete process.env[key];
});
env.sterilizeProcess();
logger = createLogger({logLevel: 5});
cfg = new Configuration({
projectId: parseInt(oldEnv.STUBBED_PROJECT_NUM),
projectId: parseInt(env.injected().projectNumber),
ignoreEnvironmentCheck: true
}, logger);
client = new RequestHandler(cfg, logger);
});
after(function() {
assign(process.env, oldEnv);
});
after(() => env.sterilizeProcess());
it('Should succeed in its request', function(done) {
client.sendError(em, function(err, response, body) {
assert.strictEqual(err, null);
Expand Down
4 changes: 3 additions & 1 deletion system-test/env.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,7 @@

module.exports = {
projectId: process.env.GCLOUD_TESTS_PROJECT_ID,
keyFilename: process.env.GCLOUD_TESTS_KEY
keyFilename: process.env.GCLOUD_TESTS_KEY,
apiKey: process.env.GCLOUD_TESTS_API_KEY,
projectNumber: process.env.GCLOUD_TESTS_PROJECT_NUMBER
};

0 comments on commit f0812b6

Please sign in to comment.