appium-instruments
Version:
IOS Instruments + instruments-without-delay launcher used by Appium
439 lines (350 loc) • 27.5 kB
JavaScript
require('source-map-support').install();
;
var _regeneratorRuntime = require('babel-runtime/regenerator')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
var _2 = require('../..');
var _chai = require('chai');
var _chai2 = _interopRequireDefault(_chai);
var _chaiAsPromised = require('chai-as-promised');
var _chaiAsPromised2 = _interopRequireDefault(_chaiAsPromised);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _appiumIosSimulator = require('appium-ios-simulator');
var _appiumSupport = require('appium-support');
var _teen_process = require('teen_process');
var _libUtils = require('../../lib/utils');
var _asyncbox = require('asyncbox');
_chai2['default'].should();
_chai2['default'].use(_chaiAsPromised2['default']);
var LAUNCH_HANDLER_TIMEOUT = 10000;
var TEMP_DIR = _path2['default'].resolve(__dirname, 'tmp');
describe('instruments tests', function () {
this.timeout(90000);
function newInstrument(opts) {
return _regeneratorRuntime.async(function newInstrument$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
_lodash2['default'].extend(opts, {
app: _path2['default'].resolve(__dirname, '..', '..', '..', 'assets', 'TestApp.app'),
bootstrap: _path2['default'].resolve(__dirname, '..', 'assets', 'bootstrap.js'),
simulatorSdkAndDevice: 'iPhone 6 (9.3)'
});
context$2$0.next = 3;
return _regeneratorRuntime.awrap(_2.Instruments.quickInstruments(opts));
case 3:
return context$2$0.abrupt('return', context$2$0.sent);
case 4:
case 'end':
return context$2$0.stop();
}
}, null, this);
}
function test(appendDesc, opts) {
var _this = this;
var checks = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
checks = checks || {};
var instruments = undefined;
it('should launch' + appendDesc, function callee$2$0() {
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
context$3$0.next = 2;
return _regeneratorRuntime.awrap((0, _appiumIosSimulator.killAllSimulators)());
case 2:
context$3$0.next = 4;
return _regeneratorRuntime.awrap(newInstrument(opts));
case 4:
instruments = context$3$0.sent;
if (!checks.afterCreate) {
context$3$0.next = 8;
break;
}
context$3$0.next = 8;
return _regeneratorRuntime.awrap(checks.afterCreate(instruments));
case 8:
setTimeout(function () {
if (instruments.launchResultDeferred) {
instruments.launchResultDeferred.resolve();
}
}, LAUNCH_HANDLER_TIMEOUT);
context$3$0.next = 11;
return _regeneratorRuntime.awrap(instruments.launch());
case 11:
if (!checks.afterLaunch) {
context$3$0.next = 14;
break;
}
context$3$0.next = 14;
return _regeneratorRuntime.awrap(checks.afterLaunch(instruments));
case 14:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
it('should shutdown' + appendDesc, function callee$2$0() {
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
context$3$0.next = 2;
return _regeneratorRuntime.awrap(instruments.shutdown());
case 2:
case 'end':
return context$3$0.stop();
}
}, null, this);
});
}
describe('regular timeout', function () {
test('', { launchTimeout: 60000 });
});
describe('smart timeout', function () {
test('', { launchTimeout: { global: 60000, afterSimLaunch: 10000 } });
});
describe.skip("using different tmp dir", function () {
var _this2 = this;
var altTmpDir = _path2['default'].resolve(TEMP_DIR, 'abcd');
before(function callee$2$0() {
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
context$3$0.prev = 0;
context$3$0.next = 3;
return _regeneratorRuntime.awrap(_appiumSupport.fs.mkdir(TEMP_DIR));
case 3:
context$3$0.next = 7;
break;
case 5:
context$3$0.prev = 5;
context$3$0.t0 = context$3$0['catch'](0);
case 7:
context$3$0.next = 9;
return _regeneratorRuntime.awrap(_appiumSupport.fs.rimraf(altTmpDir));
case 9:
case 'end':
return context$3$0.stop();
}
}, null, this, [[0, 5]]);
});
after(function callee$2$0() {
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
context$3$0.next = 2;
return _regeneratorRuntime.awrap(_appiumSupport.fs.rimraf(TEMP_DIR));
case 2:
case 'end':
return context$3$0.stop();
}
}, null, this);
});
test(" (1)", {
launchTimeout: { global: 60000, afterSimLaunch: 10000 },
tmpDir: altTmpDir
}, {
afterCreate: function afterCreate(instruments) {
instruments.tmpDir.should.equal(altTmpDir);
},
afterLaunch: function afterLaunch() {
return _regeneratorRuntime.async(function afterLaunch$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
context$3$0.next = 2;
return _regeneratorRuntime.awrap(_appiumSupport.fs.exists(altTmpDir));
case 2:
context$3$0.sent.should.be.ok;
context$3$0.next = 5;
return _regeneratorRuntime.awrap(_appiumSupport.fs.exists(_path2['default'].resolve(altTmpDir, 'instrumentscli0.trace')));
case 5:
context$3$0.sent.should.be.ok;
case 6:
case 'end':
return context$3$0.stop();
}
}, null, _this2);
}
});
//test(" (2)", {
//launchTimeout: {global: 60000, afterSimLaunch: 10000},
//tmpDir: altTmpDir
//}, {
//afterCreate: function (instruments) { instruments.tmpDir.should.equal(altTmpDir); },
//afterLaunch: async function () {
//(await fs.exists(altTmpDir)).should.be.ok;
//// tmp dir is deleted at startup so trace file is not incremented
//(await fs.exists(path.resolve(altTmpDir, 'instrumentscli0.trace'))).should.be.ok;
//}
//});
});
describe.skip("using different trace dir", function () {
var _this3 = this;
var altTraceDir = _path2['default'].resolve(TEMP_DIR, 'abcd');
before(function callee$2$0() {
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
context$3$0.prev = 0;
context$3$0.next = 3;
return _regeneratorRuntime.awrap(_appiumSupport.fs.mkdir(TEMP_DIR));
case 3:
context$3$0.next = 7;
break;
case 5:
context$3$0.prev = 5;
context$3$0.t0 = context$3$0['catch'](0);
case 7:
context$3$0.next = 9;
return _regeneratorRuntime.awrap(_appiumSupport.fs.rimraf(altTraceDir));
case 9:
case 'end':
return context$3$0.stop();
}
}, null, this, [[0, 5]]);
});
after(function callee$2$0() {
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
context$3$0.next = 2;
return _regeneratorRuntime.awrap(_appiumSupport.fs.rimraf(TEMP_DIR));
case 2:
case 'end':
return context$3$0.stop();
}
}, null, this);
});
test(" (1)", {
launchTimeout: { global: 60000, afterSimLaunch: 10000 },
traceDir: altTraceDir
}, {
afterCreate: function afterCreate(instruments) {
instruments.tmpDir.should.equal('/tmp/appium-instruments');
},
afterLaunch: function afterLaunch() {
return _regeneratorRuntime.async(function afterLaunch$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
context$3$0.next = 2;
return _regeneratorRuntime.awrap(_appiumSupport.fs.exists(altTraceDir));
case 2:
context$3$0.sent.should.be.ok;
context$3$0.next = 5;
return _regeneratorRuntime.awrap(_appiumSupport.fs.exists(_path2['default'].resolve(altTraceDir, 'instrumentscli0.trace')));
case 5:
context$3$0.sent.should.be.ok;
case 6:
case 'end':
return context$3$0.stop();
}
}, null, _this3);
}
});
test(" (2)", {
launchTimeout: { global: 60000, afterSimLaunch: 10000 },
traceDir: altTraceDir
}, {
afterCreate: function afterCreate(instruments) {
instruments.tmpDir.should.equal('/tmp/appium-instruments');
},
afterLaunch: function afterLaunch() {
return _regeneratorRuntime.async(function afterLaunch$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
context$3$0.next = 2;
return _regeneratorRuntime.awrap(_appiumSupport.fs.exists(altTraceDir));
case 2:
context$3$0.sent.should.be.ok;
context$3$0.next = 5;
return _regeneratorRuntime.awrap(_appiumSupport.fs.exists(_path2['default'].resolve(altTraceDir, 'instrumentscli1.trace')));
case 5:
context$3$0.sent.should.be.ok;
case 6:
case 'end':
return context$3$0.stop();
}
}, null, _this3);
}
});
});
describe("shutdown without startup", function () {
it('should launch', function callee$2$0() {
var instruments;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
context$3$0.next = 2;
return _regeneratorRuntime.awrap((0, _appiumIosSimulator.killAllSimulators)());
case 2:
context$3$0.next = 4;
return _regeneratorRuntime.awrap(newInstrument({ launchTimeout: 60000 }));
case 4:
instruments = context$3$0.sent;
context$3$0.next = 7;
return _regeneratorRuntime.awrap(instruments.shutdown());
case 7:
case 'end':
return context$3$0.stop();
}
}, null, this);
});
});
describe('getting devices', function () {
var _this4 = this;
before(function callee$2$0() {
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
context$3$0.next = 2;
return _regeneratorRuntime.awrap((0, _appiumIosSimulator.killAllSimulators)());
case 2:
case 'end':
return context$3$0.stop();
}
}, null, _this4);
});
it('should get all available devices', function callee$2$0() {
var iosVer, _ref, stdout, devices;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
iosVer = undefined;
context$3$0.prev = 1;
context$3$0.next = 4;
return _regeneratorRuntime.awrap((0, _teen_process.exec)('xcrun', ['--sdk', 'iphonesimulator', '--show-sdk-version']));
case 4:
_ref = context$3$0.sent;
stdout = _ref.stdout;
iosVer = parseFloat(stdout);
context$3$0.next = 11;
break;
case 9:
context$3$0.prev = 9;
context$3$0.t0 = context$3$0['catch'](1);
case 11:
if (_lodash2['default'].isNumber(iosVer) || isNaN(iosVer)) {
console.warn('Could not get iOS sdk version, skipping test'); // eslint-disable-line no-console
this.skip();
}
context$3$0.next = 14;
return _regeneratorRuntime.awrap((0, _asyncbox.retry)(3, _libUtils.getAvailableDevices));
case 14:
devices = context$3$0.sent;
if (iosVer >= 7.1) {
devices.length.should.be.above(0);
devices.join('\n').should.include('iPhone 6 (8.4');
} else {
devices.length.should.equal(0);
}
case 16:
case 'end':
return context$3$0.stop();
}
}, null, this, [[1, 9]]);
});
});
});
// travis can't write to /tmp, so let's create a tmp directory
// travis can't write to /tmp, so let's create a tmp directory
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvZTJlL2Jhc2ljcy1lMmUtc3BlY3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7aUJBRTRCLE9BQU87O29CQUNsQixNQUFNOzs7OzhCQUNJLGtCQUFrQjs7OztvQkFDNUIsTUFBTTs7OztzQkFDVCxRQUFROzs7O2tDQUNZLHNCQUFzQjs7NkJBQ3JDLGdCQUFnQjs7NEJBQ2QsY0FBYzs7d0JBQ0MsaUJBQWlCOzt3QkFDL0IsVUFBVTs7QUFFaEMsa0JBQUssTUFBTSxFQUFFLENBQUM7QUFDZCxrQkFBSyxHQUFHLDZCQUFnQixDQUFDOztBQUV6QixJQUFJLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQUNuQyxJQUFJLFFBQVEsR0FBRyxrQkFBSyxPQUFPLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDOztBQUU5QyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsWUFBWTtBQUN4QyxNQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDOztBQUVwQixXQUFlLGFBQWEsQ0FBRSxJQUFJOzs7O0FBQ2hDLDhCQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUU7QUFDYixlQUFHLEVBQUUsa0JBQUssT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDO0FBQ3ZFLHFCQUFTLEVBQUUsa0JBQUssT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQztBQUNsRSxpQ0FBcUIsRUFBRSxnQkFBZ0I7V0FDeEMsQ0FBQyxDQUFDOzsyQ0FDVSxlQUFZLGdCQUFnQixDQUFDLElBQUksQ0FBQzs7Ozs7Ozs7OztHQUNoRDs7QUFFRCxXQUFTLElBQUksQ0FBRSxVQUFVLEVBQUUsSUFBSSxFQUFlOzs7UUFBYixNQUFNLHlEQUFHLEVBQUU7O0FBQzFDLFVBQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0FBQ3RCLFFBQUksV0FBVyxZQUFBLENBQUM7O0FB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QUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEM7Ozs7Ozs7S0FDRixDQUFDLENBQUM7R0FDSixDQUFDLENBQUM7Q0FDSixDQUFDLENBQUMiLCJmaWxlIjoidGVzdC9lMmUvYmFzaWNzLWUyZS1zcGVjcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptb2NoYVxuXG5pbXBvcnQgeyBJbnN0cnVtZW50cyB9IGZyb20gJy4uLy4uJztcbmltcG9ydCBjaGFpIGZyb20gJ2NoYWknO1xuaW1wb3J0IGNoYWlBc1Byb21pc2VkIGZyb20gJ2NoYWktYXMtcHJvbWlzZWQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsga2lsbEFsbFNpbXVsYXRvcnMgfSBmcm9tICdhcHBpdW0taW9zLXNpbXVsYXRvcic7XG5pbXBvcnQgeyBmcyB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZ2V0QXZhaWxhYmxlRGV2aWNlcyB9IGZyb20gJy4uLy4uL2xpYi91dGlscyc7XG5pbXBvcnQgeyByZXRyeSB9IGZyb20gJ2FzeW5jYm94JztcblxuY2hhaS5zaG91bGQoKTtcbmNoYWkudXNlKGNoYWlBc1Byb21pc2VkKTtcblxudmFyIExBVU5DSF9IQU5ETEVSX1RJTUVPVVQgPSAxMDAwMDtcbnZhciBURU1QX0RJUiA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICd0bXAnKTtcblxuZGVzY3JpYmUoJ2luc3RydW1lbnRzIHRlc3RzJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnRpbWVvdXQoOTAwMDApO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIG5ld0luc3RydW1lbnQgKG9wdHMpIHtcbiAgICBfLmV4dGVuZChvcHRzLCB7XG4gICAgICBhcHA6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICdhc3NldHMnLCAnVGVzdEFwcC5hcHAnKSxcbiAgICAgIGJvb3RzdHJhcDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uJywgJ2Fzc2V0cycsICdib290c3RyYXAuanMnKSxcbiAgICAgIHNpbXVsYXRvclNka0FuZERldmljZTogJ2lQaG9uZSA2ICg5LjMpJ1xuICAgIH0pO1xuICAgIHJldHVybiBhd2FpdCBJbnN0cnVtZW50cy5xdWlja0luc3RydW1lbnRzKG9wdHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGVzdCAoYXBwZW5kRGVzYywgb3B0cywgY2hlY2tzID0ge30pIHtcbiAgICBjaGVja3MgPSBjaGVja3MgfHwge307XG4gICAgbGV0IGluc3RydW1lbnRzO1xuXG4gICAgaXQoYHNob3VsZCBsYXVuY2gke2FwcGVuZERlc2N9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQga2lsbEFsbFNpbXVsYXRvcnMoKTtcbiAgICAgIGluc3RydW1lbnRzID0gYXdhaXQgbmV3SW5zdHJ1bWVudChvcHRzKTtcbiAgICAgIGlmIChjaGVja3MuYWZ0ZXJDcmVhdGUpe1xuICAgICAgICBhd2FpdCBjaGVja3MuYWZ0ZXJDcmVhdGUoaW5zdHJ1bWVudHMpO1xuICAgICAgfVxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpbnN0cnVtZW50cy5sYXVuY2hSZXN1bHREZWZlcnJlZCkge1xuICAgICAgICAgIGluc3RydW1lbnRzLmxhdW5jaFJlc3VsdERlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSwgTEFVTkNIX0hBTkRMRVJfVElNRU9VVCk7XG4gICAgICBhd2FpdCBpbnN0cnVtZW50cy5sYXVuY2goKTtcbiAgICAgIGlmIChjaGVja3MuYWZ0ZXJMYXVuY2gpIHtcbiAgICAgICAgYXdhaXQgY2hlY2tzLmFmdGVyTGF1bmNoKGluc3RydW1lbnRzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KGBzaG91bGQgc2h1dGRvd24ke2FwcGVuZERlc2N9YCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgaW5zdHJ1bWVudHMuc2h1dGRvd24oKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlc2NyaWJlKCdyZWd1bGFyIHRpbWVvdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgdGVzdCgnJywge2xhdW5jaFRpbWVvdXQ6IDYwMDAwfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzbWFydCB0aW1lb3V0JywgZnVuY3Rpb24gKCkge1xuICAgIHRlc3QoJycsIHtsYXVuY2hUaW1lb3V0OiB7Z2xvYmFsOiA2MDAwMCwgYWZ0ZXJTaW1MYXVuY2g6IDEwMDAwfX0pO1xuICB9KTtcblxuICBkZXNjcmliZS5za2lwKFwidXNpbmcgZGlmZmVyZW50IHRtcCBkaXJcIiwgZnVuY3Rpb24gKCkge1xuICAgIGxldCBhbHRUbXBEaXIgPSBwYXRoLnJlc29sdmUoVEVNUF9ESVIsICdhYmNkJyk7XG5cbiAgICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gdHJhdmlzIGNhbid0IHdyaXRlIHRvIC90bXAsIHNvIGxldCdzIGNyZWF0ZSBhIHRtcCBkaXJlY3RvcnlcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKFRFTVBfRElSKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIGF3YWl0IGZzLnJpbXJhZihhbHRUbXBEaXIpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKFRFTVBfRElSKTtcbiAgICB9KTtcblxuICAgIHRlc3QoXCIgKDEpXCIsIHtcbiAgICAgIGxhdW5jaFRpbWVvdXQ6IHtnbG9iYWw6IDYwMDAwLCBhZnRlclNpbUxhdW5jaDogMTAwMDB9LFxuICAgICAgdG1wRGlyOiBhbHRUbXBEaXJcbiAgICB9LCB7XG4gICAgICBhZnRlckNyZWF0ZTogKGluc3RydW1lbnRzKSA9PiB7IGluc3RydW1lbnRzLnRtcERpci5zaG91bGQuZXF1YWwoYWx0VG1wRGlyKTsgfSxcbiAgICAgIGFmdGVyTGF1bmNoOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIChhd2FpdCBmcy5leGlzdHMoYWx0VG1wRGlyKSkuc2hvdWxkLmJlLm9rO1xuICAgICAgICAoYXdhaXQgZnMuZXhpc3RzKHBhdGgucmVzb2x2ZShhbHRUbXBEaXIsICdpbnN0cnVtZW50c2NsaTAudHJhY2UnKSkpLnNob3VsZC5iZS5vaztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vdGVzdChcIiAoMilcIiwge1xuICAgICAgLy9sYXVuY2hUaW1lb3V0OiB7Z2xvYmFsOiA2MDAwMCwgYWZ0ZXJTaW1MYXVuY2g6IDEwMDAwfSxcbiAgICAgIC8vdG1wRGlyOiBhbHRUbXBEaXJcbiAgICAvL30sIHtcbiAgICAgIC8vYWZ0ZXJDcmVhdGU6IGZ1bmN0aW9uIChpbnN0cnVtZW50cykgeyBpbnN0cnVtZW50cy50bXBEaXIuc2hvdWxkLmVxdWFsKGFsdFRtcERpcik7IH0sXG4gICAgICAvL2FmdGVyTGF1bmNoOiBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vKGF3YWl0IGZzLmV4aXN0cyhhbHRUbXBEaXIpKS5zaG91bGQuYmUub2s7XG4gICAgICAgIC8vLy8gdG1wIGRpciBpcyBkZWxldGVkIGF0IHN0YXJ0dXAgc28gdHJhY2UgZmlsZSBpcyBub3QgaW5jcmVtZW50ZWRcbiAgICAgICAgLy8oYXdhaXQgZnMuZXhpc3RzKHBhdGgucmVzb2x2ZShhbHRUbXBEaXIsICdpbnN0cnVtZW50c2NsaTAudHJhY2UnKSkpLnNob3VsZC5iZS5vaztcbiAgICAgIC8vfVxuICAgIC8vfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlLnNraXAoXCJ1c2luZyBkaWZmZXJlbnQgdHJhY2UgZGlyXCIsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgYWx0VHJhY2VEaXIgPSBwYXRoLnJlc29sdmUoVEVNUF9ESVIsICdhYmNkJyk7XG5cbiAgICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gdHJhdmlzIGNhbid0IHdyaXRlIHRvIC90bXAsIHNvIGxldCdzIGNyZWF0ZSBhIHRtcCBkaXJlY3RvcnlcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKFRFTVBfRElSKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIGF3YWl0IGZzLnJpbXJhZihhbHRUcmFjZURpcik7XG4gICAgfSk7XG5cbiAgICBhZnRlcihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYoVEVNUF9ESVIpO1xuICAgIH0pO1xuXG4gICAgdGVzdChcIiAoMSlcIiwge1xuICAgICAgbGF1bmNoVGltZW91dDoge2dsb2JhbDogNjAwMDAsIGFmdGVyU2ltTGF1bmNoOiAxMDAwMH0sXG4gICAgICB0cmFjZURpcjogYWx0VHJhY2VEaXJcbiAgICB9LCB7XG4gICAgICBhZnRlckNyZWF0ZTogKGluc3RydW1lbnRzKSA9PiB7XG4gICAgICAgIGluc3RydW1lbnRzLnRtcERpci5zaG91bGQuZXF1YWwoJy90bXAvYXBwaXVtLWluc3RydW1lbnRzJyk7XG4gICAgICB9LFxuICAgICAgYWZ0ZXJMYXVuY2g6IGFzeW5jICgpID0+IHtcbiAgICAgICAgKGF3YWl0IGZzLmV4aXN0cyhhbHRUcmFjZURpcikpLnNob3VsZC5iZS5vaztcbiAgICAgICAgKGF3YWl0IGZzLmV4aXN0cyhwYXRoLnJlc29sdmUoYWx0VHJhY2VEaXIsICdpbnN0cnVtZW50c2NsaTAudHJhY2UnKSkpXG4gICAgICAgICAgLnNob3VsZC5iZS5vaztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRlc3QoXCIgKDIpXCIsIHtcbiAgICAgIGxhdW5jaFRpbWVvdXQ6IHtnbG9iYWw6IDYwMDAwLCBhZnRlclNpbUxhdW5jaDogMTAwMDB9LFxuICAgICAgdHJhY2VEaXI6IGFsdFRyYWNlRGlyXG4gICAgfSwge1xuICAgICAgYWZ0ZXJDcmVhdGU6IChpbnN0cnVtZW50cykgPT4ge1xuICAgICAgICBpbnN0cnVtZW50cy50bXBEaXIuc2hvdWxkLmVxdWFsKCcvdG1wL2FwcGl1bS1pbnN0cnVtZW50cycpO1xuICAgICAgfSxcbiAgICAgIGFmdGVyTGF1bmNoOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIChhd2FpdCBmcy5leGlzdHMoYWx0VHJhY2VEaXIpKS5zaG91bGQuYmUub2s7XG4gICAgICAgIChhd2FpdCBmcy5leGlzdHMocGF0aC5yZXNvbHZlKGFsdFRyYWNlRGlyLCAnaW5zdHJ1bWVudHNjbGkxLnRyYWNlJykpKVxuICAgICAgICAgIC5zaG91bGQuYmUub2s7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwic2h1dGRvd24gd2l0aG91dCBzdGFydHVwXCIsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGxhdW5jaCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGtpbGxBbGxTaW11bGF0b3JzKCk7XG4gICAgICBsZXQgaW5zdHJ1bWVudHMgPSBhd2FpdCBuZXdJbnN0cnVtZW50KHtsYXVuY2hUaW1lb3V0OiA2MDAwMH0pO1xuICAgICAgYXdhaXQgaW5zdHJ1bWVudHMuc2h1dGRvd24oKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldHRpbmcgZGV2aWNlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBiZWZvcmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQga2lsbEFsbFNpbXVsYXRvcnMoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IGFsbCBhdmFpbGFibGUgZGV2aWNlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBpb3NWZXI7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQge3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y3J1bicsIFsnLS1zZGsnLCAnaXBob25lc2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddKTtcbiAgICAgICAgaW9zVmVyID0gcGFyc2VGbG9hdChzdGRvdXQpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgaWYgKF8uaXNOdW1iZXIoaW9zVmVyKSB8fCBpc05hTihpb3NWZXIpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGdldCBpT1Mgc2RrIHZlcnNpb24sIHNraXBwaW5nIHRlc3QnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIHRoaXMuc2tpcCgpO1xuICAgICAgfVxuICAgICAgbGV0IGRldmljZXMgPSBhd2FpdCByZXRyeSgzLCBnZXRBdmFpbGFibGVEZXZpY2VzKTtcbiAgICAgIGlmIChpb3NWZXIgPj0gNy4xKSB7XG4gICAgICAgIGRldmljZXMubGVuZ3RoLnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICAgICAgZGV2aWNlcy5qb2luKCdcXG4nKS5zaG91bGQuaW5jbHVkZSgnaVBob25lIDYgKDguNCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGV2aWNlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9