UNPKG

abacus-account-stub

Version:
197 lines (164 loc) 22 kB
'use strict' // Stub for an account management service. ; var _ = require('underscore'); var request = require('abacus-request'); var batch = require('abacus-batch'); var cluster = require('abacus-cluster'); var oauth = require('abacus-oauth'); var schemas = require('abacus-usage-schemas'); var extend = _.extend; var map = _.map; var brequest = batch(request); // Mock the cluster module require.cache[require.resolve('abacus-cluster')].exports = extend(function (app) { return app; }, cluster); // Mock the oauth module with a spy var oauthspy = spy(function (req, res, next) { return next(); }); var oauthmock = extend({}, oauth, { validator: function validator() { return oauthspy; } }); require.cache[require.resolve('abacus-oauth')].exports = oauthmock; var accountManagement = require('..'); describe('abacus-account-stub', function () { it('returns information about an account', function (done) { process.env.SECURED = 'false'; oauthspy.reset(); // Create an account management stub application var app = accountManagement(); // Listen on an ephemeral port var server = app.listen(0); // Get an account, expecting our stub test account var account = { account_id: '5678', organizations: ['a3d7fe4d-3cb1-4cc3-a831-ffe98e20cf27', 'b3d7fe4d-3cb1-4cc3-a831-ffe98e20cf28', 'c3d7fe4d-3cb1-4cc3-a831-ffe98e20cf29'], pricing_country: 'USA' }; request.get('http://localhost::p/v1/accounts/:account_id', { p: server.address().port, account_id: '5678' }, function (err, val) { expect(err).to.equal(undefined); expect(val.statusCode).to.equal(200); expect(val.body).to.deep.equal(account); // Check oauth validator spy expect(oauthspy.callCount).to.equal(0); done(); }); }); it('returns information about the account containing an org', function (done) { process.env.SECURED = 'false'; oauthspy.reset(); // Create an account management stub application var app = accountManagement(); // Listen on an ephemeral port var server = app.listen(0); // Get the account containing an org, expecting our stub test account var account = { account_id: '1234', organizations: ['a3d7fe4d-3cb1-4cc3-a831-ffe98e20cf27'], pricing_country: 'USA' }; request.get('http://localhost::p/v1/orgs/:org_id/account', { p: server.address().port, org_id: 'a3d7fe4d-3cb1-4cc3-a831-ffe98e20cf27' }, function (err, val) { expect(err).to.equal(undefined); expect(val.statusCode).to.equal(200); expect(val.body).to.deep.equal(account); // Check oauth validator spy expect(oauthspy.callCount).to.equal(0); done(); }); }); it('returns a resource price config', function (done) { process.env.SECURED = 'false'; oauthspy.reset(); // Create a test account management stub app var app = accountManagement(); // Listen on an ephemeral port var server = app.listen(0); request.get('http://localhost::p/v1/pricing/resources' + '/:resource_id/config/:time', { p: server.address().port, resource_id: 'object-storage', time: 1420070400000 }, function (err, val) { expect(err).to.equal(undefined); expect(val.statusCode).to.equal(200); expect(val.body).to.deep.equal(require('../resources/object-storage')); // Check oauth validator spy expect(oauthspy.callCount).to.equal(0); done(); }); }); it('Run a secured account management stub', function (done) { process.env.SECURED = 'true'; oauthspy.reset(); // Create an account management stub application var app = accountManagement(); // Listen on an ephemeral port var server = app.listen(0); var cbs = 0; var done1 = function done1() { if (++cbs === 3) { // Check oauth validator spy expect(oauthspy.callCount).to.equal(4); done(); } }; // Get an account, expecting our stub test account var account = { account_id: '5678', organizations: ['a3d7fe4d-3cb1-4cc3-a831-ffe98e20cf27', 'b3d7fe4d-3cb1-4cc3-a831-ffe98e20cf28', 'c3d7fe4d-3cb1-4cc3-a831-ffe98e20cf29'], pricing_country: 'USA' }; brequest.get('http://localhost::p/v1/accounts/:account_id', { p: server.address().port, account_id: '5678' }, function (err, val) { expect(err).to.equal(undefined); expect(val.statusCode).to.equal(200); expect(val.body).to.deep.equal(account); done1(); }); // Get the account containing an org, expecting our stub test account brequest.get('http://localhost::p/v1/orgs/:org_id/account', { p: server.address().port, org_id: 'a3d7fe4d-3cb1-4cc3-a831-ffe98e20cf27' }, function (err, val) { expect(err).to.equal(undefined); expect(val.statusCode).to.equal(200); expect(val.body).to.deep.equal({ account_id: '1234', organizations: ['a3d7fe4d-3cb1-4cc3-a831-ffe98e20cf27'], pricing_country: 'USA' }); done1(); }); // Get Pricing config for a resource brequest.get('http://localhost::p/v1/pricing/resources' + '/:resource_id/config/:time', { p: server.address().port, resource_id: 'object-storage', time: 1420070400000 }, function (err, val) { expect(err).to.equal(undefined); expect(val.statusCode).to.equal(200); expect(val.body).to.deep.equal(require('../resources/object-storage')); done1(); }); }); it('validates sample price configurations', function () { map(['object-storage', 'linux-container'], function (name) { console.log(' validating', name, ' pricing'); var conf = require('../resources/' + name); expect(schemas.priceConfig.validate(conf)).to.deep.equal(conf); console.log(' validated', name, ' pricing'); }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3Rlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFBWSxDQUFDO0FBSWIsSUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2hDLElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzFDLElBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN0QyxJQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUMxQyxJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDdEMsSUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7O0FBRWhELElBQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDeEIsSUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQzs7QUFFbEIsSUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQzs7O0FBQUMsQUFHaEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQ3RELE1BQU0sQ0FBQyxVQUFDLEdBQUc7U0FBSyxHQUFHO0NBQUEsRUFBRSxPQUFPLENBQUM7OztBQUFDLEFBR2hDLElBQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxVQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSTtTQUFLLElBQUksRUFBRTtDQUFBLENBQUMsQ0FBQztBQUNqRCxJQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRTtBQUNsQyxXQUFTLEVBQUU7V0FBTSxRQUFRO0dBQUE7Q0FDMUIsQ0FBQyxDQUFDO0FBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsT0FBTyxH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Q0FBdUMsRUFBRSxZQUFNO0FBQ2hELE9BQUcsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDLEVBQUUsVUFBQyxJQUFJLEVBQUs7QUFDbkQsYUFBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDaEQsVUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUM3QyxZQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvRCxhQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztLQUNwRCxDQUFDLENBQUM7R0FDSixDQUFDLENBQUM7Q0FDSixDQUFDLENBQUMiLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gU3R1YiBmb3IgYW4gYWNjb3VudCBtYW5hZ2VtZW50IHNlcnZpY2UuXG5cbmNvbnN0IF8gPSByZXF1aXJlKCd1bmRlcnNjb3JlJyk7XG5jb25zdCByZXF1ZXN0ID0gcmVxdWlyZSgnYWJhY3VzLXJlcXVlc3QnKTtcbmNvbnN0IGJhdGNoID0gcmVxdWlyZSgnYWJhY3VzLWJhdGNoJyk7XG5jb25zdCBjbHVzdGVyID0gcmVxdWlyZSgnYWJhY3VzLWNsdXN0ZXInKTtcbmNvbnN0IG9hdXRoID0gcmVxdWlyZSgnYWJhY3VzLW9hdXRoJyk7XG5jb25zdCBzY2hlbWFzID0gcmVxdWlyZSgnYWJhY3VzLXVzYWdlLXNjaGVtYXMnKTtcblxuY29uc3QgZXh0ZW5kID0gXy5leHRlbmQ7XG5jb25zdCBtYXAgPSBfLm1hcDtcblxuY29uc3QgYnJlcXVlc3QgPSBiYXRjaChyZXF1ZXN0KTtcblxuLy8gTW9jayB0aGUgY2x1c3RlciBtb2R1bGVcbnJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKCdhYmFjdXMtY2x1c3RlcicpXS5leHBvcnRzID1cbiAgZXh0ZW5kKChhcHApID0+IGFwcCwgY2x1c3Rlcik7XG5cbi8vIE1vY2sgdGhlIG9hdXRoIG1vZHVsZSB3aXRoIGEgc3B5XG5jb25zdCBvYXV0aHNweSA9IHNweSgocmVxLCByZXMsIG5leHQpID0+IG5leHQoKSk7XG5jb25zdCBvYXV0aG1vY2sgPSBleHRlbmQoe30sIG9hdXRoLCB7XG4gIHZhbGlkYXRvcjogKCkgPT4gb2F1dGhzcHlcbn0pO1xucmVxdWlyZS5jYWNoZVtyZXF1aXJlLnJlc29sdmUoJ2FiYWN1cy1vYXV0aCcpXS5leHBvcnRzID0gb2F1dGhtb2NrO1xuXG5jb25zdCBhY2NvdW50TWFuYWdlbWVudCA9IHJlcXVpcmUoJy4uJyk7XG5cbmRlc2NyaWJlKCdhYmFjdXMtYWNjb3VudC1zdHViJywgKCkgPT4ge1xuICBpdCgncmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhbiBhY2NvdW50JywgKGRvbmUpID0+IHtcbiAgICBwcm9jZXNzLmVudi5TRUNVUkVEID0gJ2ZhbHNlJztcbiAgICBvYXV0aHNweS5yZXNldCgpO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGFjY291bnQgbWFuYWdlbWVudCBzdHViIGFwcGxpY2F0aW9uXG4gICAgY29uc3QgYXBwID0gYWNjb3VudE1hbmFnZW1lbnQoKTtcblxuICAgIC8vIExpc3RlbiBvbiBhbiBlcGhlbWVyYWwgcG9ydFxuICAgIGNvbnN0IHNlcnZlciA9IGFwcC5saXN0ZW4oMCk7XG5cbiAgICAvLyBHZXQgYW4gYWNjb3VudCwgZXhwZWN0aW5nIG91ciBzdHViIHRlc3QgYWNjb3VudFxuICAgIGNvbnN0IGFjY291bnQgPSB7XG4gICAgICBhY2NvdW50X2lkOiAnNTY3OCcsXG4gICAgICBvcmdhbml6YXRpb25zOiBbXG4gICAgICAgICdhM2Q3ZmU0ZC0zY2IxLTRjYzMtYTgzMS1mZmU5OGUyMGNmMjcnLFxuICAgICAgICAnYjNkN2ZlNGQtM2NiMS00Y2MzLWE4MzEtZmZlOThlMjBjZjI4JyxcbiAgICAgICAgJ2MzZDdmZTRkLTNjYjEtNGNjMy1hODMxLWZmZTk4ZTIwY2YyOSddLFxuICAgICAgcHJpY2luZ19jb3VudHJ5OiAnVVNBJ1xuICAgIH07XG4gICAgcmVxdWVzdC5nZXQoJ2h0dHA6Ly9sb2NhbGhvc3Q6OnAvdjEvYWNjb3VudHMvOmFjY291bnRfaWQnLCB7XG4gICAgICBwOiBzZXJ2ZXIuYWRkcmVzcygpLnBvcnQsXG4gICAgICBhY2NvdW50X2lkOiAnNTY3OCdcbiAgICB9LCAoZXJyLCB2YWwpID0+IHtcbiAgICAgIGV4cGVjdChlcnIpLnRvLmVxdWFsKHVuZGVmaW5lZCk7XG4gICAgICBleHBlY3QodmFsLnN0YXR1c0NvZGUpLnRvLmVxdWFsKDIwMCk7XG4gICAgICBleHBlY3QodmFsLmJvZHkpLnRvLmRlZXAuZXF1YWwoYWNjb3VudCk7XG5cbiAgICAgIC8vIENoZWNrIG9hdXRoIHZhbGlkYXRvciBzcHlcbiAgICAgIGV4cGVjdChvYXV0aHNweS5jYWxsQ291bnQpLnRvLmVxdWFsKDApO1xuXG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdyZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50IGNvbnRhaW5pbmcgYW4gb3JnJywgKGRvbmUpID0+IHtcbiAgICBwcm9jZXNzLmVudi5TRUNVUkVEID0gJ2ZhbHNlJztcbiAgICBvYXV0aHNweS5yZXNldCgpO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGFjY291bnQgbWFuYWdlbWVudCBzdHViIGFwcGxpY2F0aW9uXG4gICAgY29uc3QgYXBwID0gYWNjb3VudE1hbmFnZW1lbnQoKTtcblxuICAgIC8vIExpc3RlbiBvbiBhbiBlcGhlbWVyYWwgcG9ydFxuICAgIGNvbnN0IHNlcnZlciA9IGFwcC5saXN0ZW4oMCk7XG5cbiAgICAvLyBHZXQgdGhlIGFjY291bnQgY29udGFpbmluZyBhbiBvcmcsIGV4cGVjdGluZyBvdXIgc3R1YiB0ZXN0IGFjY291bnRcbiAgICBjb25zdCBhY2NvdW50ID0ge1xuICAgICAgYWNjb3VudF9pZDogJzEyMzQnLFxuICAgICAgb3JnYW5pemF0aW9uczogWydhM2Q3ZmU0ZC0zY2IxLTRjYzMtYTgzMS1mZmU5OGUyMGNmMjcnXSxcbiAgICAgIHByaWNpbmdfY291bnRyeTogJ1VTQSdcbiAgICB9O1xuICAgIHJlcXVlc3QuZ2V0KCdodHRwOi8vbG9jYWxob3N0OjpwL3YxL29yZ3MvOm9yZ19pZC9hY2NvdW50Jywge1xuICAgICAgcDogc2VydmVyLmFkZHJlc3MoKS5wb3J0LFxuICAgICAgb3JnX2lkOiAnYTNkN2ZlNGQtM2NiMS00Y2MzLWE4MzEtZmZlOThlMjBjZjI3J1xuICAgIH0sIChlcnIsIHZhbCkgPT4ge1xuICAgICAgZXhwZWN0KGVycikudG8uZXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIGV4cGVjdCh2YWwuc3RhdHVzQ29kZSkudG8uZXF1YWwoMjAwKTtcbiAgICAgIGV4cGVjdCh2YWwuYm9keSkudG8uZGVlcC5lcXVhbChhY2NvdW50KTtcblxuICAgICAgLy8gQ2hlY2sgb2F1dGggdmFsaWRhdG9yIHNweVxuICAgICAgZXhwZWN0KG9hdXRoc3B5LmNhbGxDb3VudCkudG8uZXF1YWwoMCk7XG5cbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgYSByZXNvdXJjZSBwcmljZSBjb25maWcnLCAoZG9uZSkgPT4ge1xuICAgIHByb2Nlc3MuZW52LlNFQ1VSRUQgPSAnZmFsc2UnO1xuICAgIG9hdXRoc3B5LnJlc2V0KCk7XG5cbiAgICAvLyBDcmVhdGUgYSB0ZXN0IGFjY291bnQgbWFuYWdlbWVudCBzdHViIGFwcFxuICAgIGNvbnN0IGFwcCA9IGFjY291bnRNYW5hZ2VtZW50KCk7XG5cbiAgICAvLyBMaXN0ZW4gb24gYW4gZXBoZW1lcmFsIHBvcnRcbiAgICBjb25zdCBzZXJ2ZXIgPSBhcHAubGlzdGVuKDApO1xuXG4gICAgcmVxdWVzdC5nZXQoXG4gICAgICAnaHR0cDovL2xvY2FsaG9zdDo6cC92MS9wcmljaW5nL3Jlc291cmNlcycgK1xuICAgICAgJy86cmVzb3VyY2VfaWQvY29uZmlnLzp0aW1lJywge1xuICAgICAgICBwOiBzZXJ2ZXIuYWRkcmVzcygpLnBvcnQsXG4gICAgICAgIHJlc291cmNlX2lkOiAnb2JqZWN0LXN0b3JhZ2UnLFxuICAgICAgICB0aW1lOiAxNDIwMDcwNDAwMDAwXG4gICAgICB9LCAoZXJyLCB2YWwpID0+IHtcbiAgICAgICAgZXhwZWN0KGVycikudG8uZXF1YWwodW5kZWZpbmVkKTtcbiAgICAgICAgZXhwZWN0KHZhbC5zdGF0dXNDb2RlKS50by5lcXVhbCgyMDApO1xuICAgICAgICBleHBlY3QodmFsLmJvZHkpLnRvLmRlZXAuZXF1YWwoXG4gICAgICAgICAgcmVxdWlyZSgnLi4vcmVzb3VyY2VzL29iamVjdC1zdG9yYWdlJykpO1xuXG4gICAgICAgIC8vIENoZWNrIG9hdXRoIHZhbGlkYXRvciBzcHlcbiAgICAgICAgZXhwZWN0KG9hdXRoc3B5LmNhbGxDb3VudCkudG8uZXF1YWwoMCk7XG5cbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdSdW4gYSBzZWN1cmVkIGFjY291bnQgbWFuYWdlbWVudCBzdHViJywgKGRvbmUpID0+IHtcbiAgICBwcm9jZXNzLmVudi5TRUNVUkVEID0gJ3RydWUnO1xuICAgIG9hdXRoc3B5LnJlc2V0KCk7XG5cbiAgICAvLyBDcmVhdGUgYW4gYWNjb3VudCBtYW5hZ2VtZW50IHN0dWIgYXBwbGljYXRpb25cbiAgICBjb25zdCBhcHAgPSBhY2NvdW50TWFuYWdlbWVudCgpO1xuXG4gICAgLy8gTGlzdGVuIG9uIGFuIGVwaGVtZXJhbCBwb3J0XG4gICAgY29uc3Qgc2VydmVyID0gYXBwLmxpc3RlbigwKTtcblxuICAgIGxldCBjYnMgPSAwO1xuICAgIGNvbnN0IGRvbmUxID0gKCkgPT4ge1xuICAgICAgaWYoKytjYnMgPT09IDMpIHtcbiAgICAgICAgLy8gQ2hlY2sgb2F1dGggdmFsaWRhdG9yIHNweVxuICAgICAgICBleHBlY3Qob2F1dGhzcHkuY2FsbENvdW50KS50by5lcXVhbCg0KTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldCBhbiBhY2NvdW50LCBleHBlY3Rpbmcgb3VyIHN0dWIgdGVzdCBhY2NvdW50XG4gICAgY29uc3QgYWNjb3VudCA9IHtcbiAgICAgIGFjY291bnRfaWQ6ICc1Njc4JyxcbiAgICAgIG9yZ2FuaXphdGlvbnM6IFtcbiAgICAgICAgJ2EzZDdmZTRkLTNjYjEtNGNjMy1hODMxLWZmZTk4ZTIwY2YyNycsXG4gICAgICAgICdiM2Q3ZmU0ZC0zY2IxLTRjYzMtYTgzMS1mZmU5OGUyMGNmMjgnLFxuICAgICAgICAnYzNkN2ZlNGQtM2NiMS00Y2MzLWE4MzEtZmZlOThlMjBjZjI5J10sXG4gICAgICBwcmljaW5nX2NvdW50cnk6ICdVU0EnXG4gICAgfTtcbiAgICBicmVxdWVzdC5nZXQoJ2h0dHA6Ly9sb2NhbGhvc3Q6OnAvdjEvYWNjb3VudHMvOmFjY291bnRfaWQnLCB7XG4gICAgICBwOiBzZXJ2ZXIuYWRkcmVzcygpLnBvcnQsXG4gICAgICBhY2NvdW50X2lkOiAnNTY3OCdcbiAgICB9LCAoZXJyLCB2YWwpID0+IHtcbiAgICAgIGV4cGVjdChlcnIpLnRvLmVxdWFsKHVuZGVmaW5lZCk7XG4gICAgICBleHBlY3QodmFsLnN0YXR1c0NvZGUpLnRvLmVxdWFsKDIwMCk7XG4gICAgICBleHBlY3QodmFsLmJvZHkpLnRvLmRlZXAuZXF1YWwoYWNjb3VudCk7XG4gICAgICBkb25lMSgpO1xuICAgIH0pO1xuXG4gICAgLy8gR2V0IHRoZSBhY2NvdW50IGNvbnRhaW5pbmcgYW4gb3JnLCBleHBlY3Rpbmcgb3VyIHN0dWIgdGVzdCBhY2NvdW50XG4gICAgYnJlcXVlc3QuZ2V0KCdodHRwOi8vbG9jYWxob3N0OjpwL3YxL29yZ3MvOm9yZ19pZC9hY2NvdW50Jywge1xuICAgICAgcDogc2VydmVyLmFkZHJlc3MoKS5wb3J0LFxuICAgICAgb3JnX2lkOiAnYTNkN2ZlNGQtM2NiMS00Y2MzLWE4MzEtZmZlOThlMjBjZjI3J1xuICAgIH0sIChlcnIsIHZhbCkgPT4ge1xuICAgICAgZXhwZWN0KGVycikudG8uZXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIGV4cGVjdCh2YWwuc3RhdHVzQ29kZSkudG8uZXF1YWwoMjAwKTtcbiAgICAgIGV4cGVjdCh2YWwuYm9keSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICAgIGFjY291bnRfaWQ6ICcxMjM0JyxcbiAgICAgICAgb3JnYW5pemF0aW9uczogWydhM2Q3ZmU0ZC0zY2IxLTRjYzMtYTgzMS1mZmU5OGUyMGNmMjcnXSxcbiAgICAgICAgcHJpY2luZ19jb3VudHJ5OiAnVVNBJ1xuICAgICAgfSk7XG4gICAgICBkb25lMSgpO1xuICAgIH0pO1xuXG4gICAgLy8gR2V0IFByaWNpbmcgY29uZmlnIGZvciBhIHJlc291cmNlXG4gICAgYnJlcXVlc3QuZ2V0KFxuICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6OnAvdjEvcHJpY2luZy9yZXNvdXJjZXMnICtcbiAgICAgICcvOnJlc291cmNlX2lkL2NvbmZpZy86dGltZScsIHtcbiAgICAgICAgcDogc2VydmVyLmFkZHJlc3MoKS5wb3J0LFxuICAgICAgICByZXNvdXJjZV9pZDogJ29iamVjdC1zdG9yYWdlJyxcbiAgICAgICAgdGltZTogMTQyMDA3MDQwMDAwMFxuICAgICAgfSwgKGVyciwgdmFsKSA9PiB7XG4gICAgICAgIGV4cGVjdChlcnIpLnRvLmVxdWFsKHVuZGVmaW5lZCk7XG4gICAgICAgIGV4cGVjdCh2YWwuc3RhdHVzQ29kZSkudG8uZXF1YWwoMjAwKTtcbiAgICAgICAgZXhwZWN0KHZhbC5ib2R5KS50by5kZWVwLmVxdWFsKFxuICAgICAgICAgIHJlcXVpcmUoJy4uL3Jlc291cmNlcy9vYmplY3Qtc3RvcmFnZScpKTtcbiAgICAgICAgZG9uZTEoKTtcbiAgICAgIH0pO1xuICB9KTtcblxuICBpdCgndmFsaWRhdGVzIHNhbXBsZSBwcmljZSBjb25maWd1cmF0aW9ucycsICgpID0+IHtcbiAgICBtYXAoWydvYmplY3Qtc3RvcmFnZScsICdsaW51eC1jb250YWluZXInXSwgKG5hbWUpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCcgICAgdmFsaWRhdGluZycsIG5hbWUsICcgcHJpY2luZycpO1xuICAgICAgY29uc3QgY29uZiA9IHJlcXVpcmUoJy4uL3Jlc291cmNlcy8nICsgbmFtZSk7XG4gICAgICBleHBlY3Qoc2NoZW1hcy5wcmljZUNvbmZpZy52YWxpZGF0ZShjb25mKSkudG8uZGVlcC5lcXVhbChjb25mKTtcbiAgICAgIGNvbnNvbGUubG9nKCcgICAgICAgIHZhbGlkYXRlZCcsIG5hbWUsICcgcHJpY2luZycpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19