appium-webdriveragent-driver
Version:
Appium driver for WebDriverAgent
430 lines (344 loc) • 27 kB
JavaScript
;
var _regeneratorRuntime = require('babel-runtime/regenerator')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
var _this = this;
var _ = require('../..');
var _libSimulatorManagementJs = require('../../lib/simulatorManagement.js');
var _chai = require('chai');
var _chai2 = _interopRequireDefault(_chai);
var _chaiAsPromised = require('chai-as-promised');
var _chaiAsPromised2 = _interopRequireDefault(_chaiAsPromised);
var _iosTestApp = require('ios-test-app');
var _wd = require('wd');
var _wd2 = _interopRequireDefault(_wd);
var _appiumIosSimulator = require('appium-ios-simulator');
var _nodeSimctl = require('node-simctl');
_chai2['default'].should();
_chai2['default'].use(_chaiAsPromised2['default']);
var HOST = "localhost",
PORT = 4994,
APP = _iosTestApp.absolute.iphonesimulator,
BUNDLE_ID = 'io.appium.TestApp',
PLATFORM_VERSION = '9.1';
var DEFAULT_CAPS = {
platformName: 'iOS',
platformVersion: PLATFORM_VERSION,
app: APP,
bundleId: BUNDLE_ID,
deviceName: "iPhone 6",
automationName: "WebDriverAgent"
};
var getNumSims = function getNumSims() {
return _regeneratorRuntime.async(function getNumSims$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
context$1$0.next = 2;
return _regeneratorRuntime.awrap((0, _nodeSimctl.getDevices)());
case 2:
context$1$0.t0 = PLATFORM_VERSION;
return context$1$0.abrupt('return', context$1$0.sent[context$1$0.t0].length);
case 4:
case 'end':
return context$1$0.stop();
}
}, null, _this);
};
describe('WebDriverAgentDriver', function () {
var server = undefined;
var driver = _wd2['default'].promiseChainRemote(HOST, PORT);
before(function callee$1$0() {
return _regeneratorRuntime.async(function callee$1$0$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
context$2$0.next = 2;
return _regeneratorRuntime.awrap((0, _.startServer)(PORT, HOST));
case 2:
server = context$2$0.sent;
case 3:
case 'end':
return context$2$0.stop();
}
}, null, _this);
});
after(function () {
// TODO I don't think this is actually shutting the server down, figure
// that out
server.close();
});
it('should start and stop a session', function callee$1$0() {
var els;
return _regeneratorRuntime.async(function callee$1$0$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
this.timeout(120 * 1000);
context$2$0.next = 3;
return _regeneratorRuntime.awrap(driver.init(DEFAULT_CAPS));
case 3:
context$2$0.next = 5;
return _regeneratorRuntime.awrap(driver.elementsByClassName("UIAButton"));
case 5:
els = context$2$0.sent;
els.length.should.equal(7);
context$2$0.next = 9;
return _regeneratorRuntime.awrap(driver.quit());
case 9:
case 'end':
return context$2$0.stop();
}
}, null, this);
});
describe('reset', function () {
it('default: creates sim and deletes it afterwards', function callee$2$0() {
var caps, simsBefore, simsDuring, simsAfter;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
this.timeout(120 * 1000);
caps = {
platformName: 'iOS',
platformVersion: PLATFORM_VERSION,
app: APP,
bundleId: BUNDLE_ID,
deviceName: "iPhone 6",
automationName: "WebDriverAgent"
};
context$3$0.next = 4;
return _regeneratorRuntime.awrap((0, _appiumIosSimulator.killAllSimulators)());
case 4:
context$3$0.next = 6;
return _regeneratorRuntime.awrap(getNumSims());
case 6:
simsBefore = context$3$0.sent;
context$3$0.next = 9;
return _regeneratorRuntime.awrap(driver.init(caps));
case 9:
context$3$0.next = 11;
return _regeneratorRuntime.awrap(getNumSims());
case 11:
simsDuring = context$3$0.sent;
context$3$0.next = 14;
return _regeneratorRuntime.awrap(driver.quit());
case 14:
context$3$0.next = 16;
return _regeneratorRuntime.awrap(getNumSims());
case 16:
simsAfter = context$3$0.sent;
simsDuring.should.equal(simsBefore + 1);
simsAfter.should.equal(simsBefore);
case 19:
case 'end':
return context$3$0.stop();
}
}, null, this);
});
it('with udid: uses sim and shuts it down afterwards', function callee$2$0() {
var udid, caps, simsBefore, simsDuring, simsAfter;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
this.timeout(120 * 1000);
// before
context$3$0.next = 3;
return _regeneratorRuntime.awrap((0, _nodeSimctl.createDevice)('webDriverAgentTest', 'iPhone 6', PLATFORM_VERSION));
case 3:
udid = context$3$0.sent;
caps = {
platformName: 'iOS',
platformVersion: PLATFORM_VERSION,
app: APP,
bundleId: BUNDLE_ID,
deviceName: "iPhone 6",
automationName: "WebDriverAgent",
udid: udid
};
context$3$0.next = 7;
return _regeneratorRuntime.awrap(getNumSims());
case 7:
simsBefore = context$3$0.sent;
context$3$0.next = 10;
return _regeneratorRuntime.awrap(driver.init(caps));
case 10:
context$3$0.next = 12;
return _regeneratorRuntime.awrap(getNumSims());
case 12:
simsDuring = context$3$0.sent;
context$3$0.next = 15;
return _regeneratorRuntime.awrap(driver.quit());
case 15:
context$3$0.next = 17;
return _regeneratorRuntime.awrap(getNumSims());
case 17:
simsAfter = context$3$0.sent;
context$3$0.next = 20;
return _regeneratorRuntime.awrap((0, _libSimulatorManagementJs.simBooted)(udid));
case 20:
context$3$0.sent.should.be['false'];
simsDuring.should.equal(simsBefore);
simsAfter.should.equal(simsBefore);
// cleanup
context$3$0.next = 25;
return _regeneratorRuntime.awrap((0, _nodeSimctl.deleteDevice)(udid));
case 25:
case 'end':
return context$3$0.stop();
}
}, null, this);
});
it('with udid booted: uses sim and leaves it afterwards', function callee$2$0() {
var udid, sim, caps, simsBefore, simsDuring, simsAfter;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
this.timeout(120 * 1000);
// before
context$3$0.next = 3;
return _regeneratorRuntime.awrap((0, _nodeSimctl.createDevice)('webDriverAgentTest', 'iPhone 6', PLATFORM_VERSION));
case 3:
udid = context$3$0.sent;
context$3$0.next = 6;
return _regeneratorRuntime.awrap((0, _appiumIosSimulator.getSimulator)(udid));
case 6:
sim = context$3$0.sent;
context$3$0.next = 9;
return _regeneratorRuntime.awrap(sim.run());
case 9:
caps = {
platformName: 'iOS',
platformVersion: PLATFORM_VERSION,
app: APP,
bundleId: BUNDLE_ID,
deviceName: "iPhone 6",
automationName: "WebDriverAgent",
udid: udid
};
context$3$0.next = 12;
return _regeneratorRuntime.awrap((0, _libSimulatorManagementJs.simBooted)(udid));
case 12:
context$3$0.sent.should.be['true'];
context$3$0.next = 15;
return _regeneratorRuntime.awrap(getNumSims());
case 15:
simsBefore = context$3$0.sent;
context$3$0.next = 18;
return _regeneratorRuntime.awrap(driver.init(caps));
case 18:
context$3$0.next = 20;
return _regeneratorRuntime.awrap(getNumSims());
case 20:
simsDuring = context$3$0.sent;
context$3$0.next = 23;
return _regeneratorRuntime.awrap(driver.quit());
case 23:
context$3$0.next = 25;
return _regeneratorRuntime.awrap(getNumSims());
case 25:
simsAfter = context$3$0.sent;
context$3$0.next = 28;
return _regeneratorRuntime.awrap((0, _libSimulatorManagementJs.simBooted)(udid));
case 28:
context$3$0.sent.should.be['true'];
simsDuring.should.equal(simsBefore);
simsAfter.should.equal(simsBefore);
// cleanup
context$3$0.next = 33;
return _regeneratorRuntime.awrap(sim.shutdown());
case 33:
context$3$0.next = 35;
return _regeneratorRuntime.awrap((0, _nodeSimctl.deleteDevice)(udid));
case 35:
case 'end':
return context$3$0.stop();
}
}, null, this);
});
it('with invalid udid: throws an error', function callee$2$0() {
var caps;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
this.timeout(120 * 1000);
// test
caps = {
platformName: 'iOS',
platformVersion: PLATFORM_VERSION,
app: APP,
bundleId: BUNDLE_ID,
deviceName: "iPhone 6",
automationName: "WebDriverAgent",
udid: 'some-random-udid'
};
context$3$0.next = 4;
return _regeneratorRuntime.awrap(driver.init(caps).should.be.rejectedWith('environment you requested was unavailable'));
case 4:
case 'end':
return context$3$0.stop();
}
}, null, this);
});
it('with noReset set to true: leaves sim booted', function callee$2$0() {
var udid, sim, caps, simsBefore, simsDuring, simsAfter;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
this.timeout(120 * 1000);
// before
context$3$0.next = 3;
return _regeneratorRuntime.awrap((0, _nodeSimctl.createDevice)('webDriverAgentTest', 'iPhone 6', PLATFORM_VERSION));
case 3:
udid = context$3$0.sent;
context$3$0.next = 6;
return _regeneratorRuntime.awrap((0, _appiumIosSimulator.getSimulator)(udid));
case 6:
sim = context$3$0.sent;
caps = {
platformName: 'iOS',
platformVersion: PLATFORM_VERSION,
app: APP,
bundleId: BUNDLE_ID,
deviceName: "iPhone 6",
automationName: "WebDriverAgent",
udid: udid,
noReset: true
};
context$3$0.next = 10;
return _regeneratorRuntime.awrap(getNumSims());
case 10:
simsBefore = context$3$0.sent;
context$3$0.next = 13;
return _regeneratorRuntime.awrap(driver.init(caps));
case 13:
context$3$0.next = 15;
return _regeneratorRuntime.awrap(getNumSims());
case 15:
simsDuring = context$3$0.sent;
context$3$0.next = 18;
return _regeneratorRuntime.awrap(driver.quit());
case 18:
context$3$0.next = 20;
return _regeneratorRuntime.awrap(getNumSims());
case 20:
simsAfter = context$3$0.sent;
context$3$0.next = 23;
return _regeneratorRuntime.awrap((0, _libSimulatorManagementJs.simBooted)(udid));
case 23:
context$3$0.sent.should.be['true'];
simsDuring.should.equal(simsBefore);
simsAfter.should.equal(simsBefore);
// cleanup
context$3$0.next = 28;
return _regeneratorRuntime.awrap(sim.shutdown());
case 28:
context$3$0.next = 30;
return _regeneratorRuntime.awrap((0, _nodeSimctl.deleteDevice)(udid));
case 30:
case 'end':
return context$3$0.stop();
}
}, null, this);
});
});
});
// test
// test
// test
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvZnVuY3Rpb25hbC9kcml2ZXItZTJlLXNwZWNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O2dCQUE0QixPQUFPOzt3Q0FDVCxrQ0FBa0M7O29CQUMzQyxNQUFNOzs7OzhCQUNJLGtCQUFrQjs7OzswQkFDcEIsY0FBYzs7a0JBQ3hCLElBQUk7Ozs7a0NBQzZCLHNCQUFzQjs7MEJBQ2YsYUFBYTs7QUFFcEUsa0JBQUssTUFBTSxFQUFFLENBQUM7QUFDZCxrQkFBSyxHQUFHLDZCQUFnQixDQUFDOztBQUV6QixJQUFNLElBQUksR0FBRyxXQUFXO0lBQ2xCLElBQUksR0FBRyxJQUFJO0lBQ1gsR0FBRyxHQUFHLHFCQUFTLGVBQWU7SUFDOUIsU0FBUyxHQUFHLG1CQUFtQjtJQUMvQixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7O0FBRS9CLElBQU0sWUFBWSxHQUFHO0FBQ25CLGNBQVksRUFBRSxLQUFLO0FBQ25CLGlCQUFlLEVBQUUsZ0JBQWdCO0FBQ2pDLEtBQUcsRUFBRSxHQUFHO0FBQ1IsVUFBUSxFQUFFLFNBQVM7QUFDbkIsWUFBVSxFQUFFLFVBQVU7QUFDdEIsZ0JBQWMsRUFBRSxnQkFBZ0I7Q0FDakMsQ0FBQzs7QUFFRixJQUFJLFVBQVUsR0FBRyxTQUFiLFVBQVU7Ozs7O3lDQUNFLDZCQUFZOzs7eUJBQUUsZ0JBQWdCOzZFQUFFLE1BQU07Ozs7Ozs7Q0FDckQsQ0FBQzs7QUFFRixRQUFRLENBQUMsc0JBQXNCLEVBQUUsWUFBTTtBQUNyQyxNQUFJLE1BQU0sWUFBQSxDQUFDO0FBQ1gsTUFBSSxNQUFNLEdBQUcsZ0JBQUcsa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQy9DLFFBQU0sQ0FBQzs7Ozs7MkNBQ1UsbUJBQVksSUFBSSxFQUFFLElBQUksQ0FBQzs7O0FBQXRDLGdCQUFNOzs7Ozs7O0dBQ1AsQ0FBQyxDQUFDOztBQUVILE9BQUssQ0FBQyxZQUFNOzs7QUFHVixVQUFNLENBQUMsS0FBSyxFQUFFLENB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LENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNwQyxxQkFBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7Ozs7NkNBRzdCLEdBQUcsQ0FBQyxRQUFRLEVBQUU7Ozs7NkNBQ2QsOEJBQWEsSUFBSSxDQUFDOzs7Ozs7O0tBQ3pCLENBQUMsQ0FBQztHQUVKLENBQUMsQ0FBQztDQUVKLENBQUMsQ0FBQyIsImZpbGUiOiJ0ZXN0L2Z1bmN0aW9uYWwvZHJpdmVyLWUyZS1zcGVjcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgc2ltQm9vdGVkIH0gZnJvbSAnLi4vLi4vbGliL3NpbXVsYXRvck1hbmFnZW1lbnQuanMnO1xuaW1wb3J0IGNoYWkgZnJvbSAnY2hhaSc7XG5pbXBvcnQgY2hhaUFzUHJvbWlzZWQgZnJvbSAnY2hhaS1hcy1wcm9taXNlZCc7XG5pbXBvcnQgeyBhYnNvbHV0ZSB9IGZyb20gJ2lvcy10ZXN0LWFwcCc7XG5pbXBvcnQgd2QgZnJvbSAnd2QnO1xuaW1wb3J0IHsga2lsbEFsbFNpbXVsYXRvcnMsIGdldFNpbXVsYXRvciB9IGZyb20gJ2FwcGl1bS1pb3Mtc2ltdWxhdG9yJztcbmltcG9ydCB7IGdldERldmljZXMsIGNyZWF0ZURldmljZSwgZGVsZXRlRGV2aWNlIH0gZnJvbSAnbm9kZS1zaW1jdGwnO1xuXG5jaGFpLnNob3VsZCgpO1xuY2hhaS51c2UoY2hhaUFzUHJvbWlzZWQpO1xuXG5jb25zdCBIT1NUID0gXCJsb2NhbGhvc3RcIixcbiAgICAgIFBPUlQgPSA0OTk0LFxuICAgICAgQVBQID0gYWJzb2x1dGUuaXBob25lc2ltdWxhdG9yLFxuICAgICAgQlVORExFX0lEID0gJ2lvLmFwcGl1bS5UZXN0QXBwJyxcbiAgICAgIFBMQVRGT1JNX1ZFUlNJT04gPSAnOS4xJztcblxuY29uc3QgREVGQVVMVF9DQVBTID0ge1xuICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICBwbGF0Zm9ybVZlcnNpb246IFBMQVRGT1JNX1ZFUlNJT04sXG4gIGFwcDogQVBQLFxuICBidW5kbGVJZDogQlVORExFX0lELFxuICBkZXZpY2VOYW1lOiBcImlQaG9uZSA2XCIsXG4gIGF1dG9tYXRpb25OYW1lOiBcIldlYkRyaXZlckFnZW50XCIsXG59O1xuXG5sZXQgZ2V0TnVtU2ltcyA9IGFzeW5jICgpID0+IHtcbiAgcmV0dXJuIChhd2FpdCBnZXREZXZpY2VzKCkpW1BMQVRGT1JNX1ZFUlNJT05dLmxlbmd0aDtcbn07XG5cbmRlc2NyaWJlKCdXZWJEcml2ZXJBZ2VudERyaXZlcicsICgpID0+IHtcbiAgbGV0IHNlcnZlcjtcbiAgbGV0IGRyaXZlciA9IHdkLnByb21pc2VDaGFpblJlbW90ZShIT1NULCBQT1JUKTtcbiAgYmVmb3JlKGFzeW5jICgpID0+IHtcbiAgICBzZXJ2ZXIgPSBhd2FpdCBzdGFydFNlcnZlcihQT1JULCBIT1NUKTtcbiAgfSk7XG5cbiAgYWZ0ZXIoKCkgPT4ge1xuICAgIC8vIFRPRE8gSSBkb24ndCB0aGluayB0aGlzIGlzIGFjdHVhbGx5IHNodXR0aW5nIHRoZSBzZXJ2ZXIgZG93biwgZmlndXJlXG4gICAgLy8gdGhhdCBvdXRcbiAgICBzZXJ2ZXIuY2xvc2UoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzdGFydCBhbmQgc3RvcCBhIHNlc3Npb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy50aW1lb3V0KDEyMCAqIDEwMDApO1xuICAgIGF3YWl0IGRyaXZlci5pbml0KERFRkFVTFRfQ0FQUyk7XG4gICAgbGV0IGVscyA9IGF3YWl0IGRyaXZlci5lbGVtZW50c0J5Q2xhc3NOYW1lKFwiVUlBQnV0dG9uXCIpO1xuICAgIGVscy5sZW5ndGguc2hvdWxkLmVxdWFsKDcpO1xuICAgIGF3YWl0IGRyaXZlci5xdWl0KCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXNldCcsICgpID0+IHtcbiAgICBpdCgnZGVmYXVsdDogY3JlYXRlcyBzaW0gYW5kIGRlbGV0ZXMgaXQgYWZ0ZXJ3YXJkcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMudGltZW91dCgxMjAgKiAxMDAwKTtcbiAgICAgIGxldCBjYXBzID0ge1xuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICBwbGF0Zm9ybVZlcnNpb246IFBMQVRGT1JNX1ZFUlNJT04sXG4gICAgICAgIGFwcDogQVBQLFxuICAgICAgICBidW5kbGVJZDogQlVORExFX0lELFxuICAgICAgICBkZXZpY2VOYW1lOiBcImlQaG9uZSA2XCIsXG4gICAgICAgIGF1dG9tYXRpb25OYW1lOiBcIldlYkRyaXZlckFnZW50XCIsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBraWxsQWxsU2ltdWxhdG9ycygpO1xuICAgICAgbGV0IHNpbXNCZWZvcmUgPSBhd2FpdCBnZXROdW1TaW1zKCk7XG4gICAgICBhd2FpdCBkcml2ZXIuaW5pdChjYXBzKTtcbiAgICAgIGxldCBzaW1zRHVyaW5nID0gYXdhaXQgZ2V0TnVtU2ltcygpO1xuICAgICAgYXdhaXQgZHJpdmVyLnF1aXQoKTtcbiAgICAgIGxldCBzaW1zQWZ0ZXIgPSBhd2FpdCBnZXROdW1TaW1zKCk7XG5cbiAgICAgIHNpbXNEdXJpbmcuc2hvdWxkLmVxdWFsKHNpbXNCZWZvcmUgKyAxKTtcbiAgICAgIHNpbXNBZnRlci5zaG91bGQuZXF1YWwoc2ltc0JlZm9yZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnd2l0aCB1ZGlkOiB1c2VzIHNpbSBhbmQgc2h1dHMgaXQgZG93biBhZnRlcndhcmRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy50aW1lb3V0KDEyMCAqIDEwMDApO1xuXG4gICAgICAvLyBiZWZvcmVcbiAgICAgIGxldCB1ZGlkID0gYXdhaXQgY3JlYXRlRGV2aWNlKCd3ZWJEcml2ZXJBZ2VudFRlc3QnLCAnaVBob25lIDYnLCBQTEFURk9STV9WRVJTSU9OKTtcblxuICAgICAgLy8gdGVzdFxuICAgICAgbGV0IGNhcHMgPSB7XG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgIHBsYXRmb3JtVmVyc2lvbjogUExBVEZPUk1fVkVSU0lPTixcbiAgICAgICAgYXBwOiBBUFAsXG4gICAgICAgIGJ1bmRsZUlkOiBCVU5ETEVfSUQsXG4gICAgICAgIGRldmljZU5hbWU6IFwiaVBob25lIDZcIixcbiAgICAgICAgYXV0b21hdGlvbk5hbWU6IFwiV2ViRHJpdmVyQWdlbnRcIixcbiAgICAgICAgdWRpZDogdWRpZFxuICAgICAgfTtcblxuICAgICAgbGV0IHNpbXNCZWZvcmUgPSBhd2FpdCBnZXROdW1TaW1zKCk7XG4gICAgICBhd2FpdCBkcml2ZXIuaW5pdChjYXBzKTtcbiAgICAgIGxldCBzaW1zRHVyaW5nID0gYXdhaXQgZ2V0TnVtU2ltcygpO1xuICAgICAgYXdhaXQgZHJpdmVyLnF1aXQoKTtcbiAgICAgIGxldCBzaW1zQWZ0ZXIgPSBhd2FpdCBnZXROdW1TaW1zKCk7XG4gICAgICAoYXdhaXQgc2ltQm9vdGVkKHVkaWQpKS5zaG91bGQuYmUuZmFsc2U7XG5cbiAgICAgIHNpbXNEdXJpbmcuc2hvdWxkLmVxdWFsKHNpbXNCZWZvcmUpO1xuICAgICAgc2ltc0FmdGVyLnNob3VsZC5lcXVhbChzaW1zQmVmb3JlKTtcblxuICAgICAgLy8gY2xlYW51cFxuICAgICAgYXdhaXQgZGVsZXRlRGV2aWNlKHVkaWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3dpdGggdWRpZCBib290ZWQ6IHVzZXMgc2ltIGFuZCBsZWF2ZXMgaXQgYWZ0ZXJ3YXJkcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMudGltZW91dCgxMjAgKiAxMDAwKTtcblxuICAgICAgLy8gYmVmb3JlXG4gICAgICBsZXQgdWRpZCA9IGF3YWl0IGNyZWF0ZURldmljZSgnd2ViRHJpdmVyQWdlbnRUZXN0JywgJ2lQaG9uZSA2JywgUExBVEZPUk1fVkVSU0lPTik7XG4gICAgICBsZXQgc2ltID0gYXdhaXQgZ2V0U2ltdWxhdG9yKHVkaWQpO1xuICAgICAgYXdhaXQgc2ltLnJ1bigpO1xuXG4gICAgICAvLyB0ZXN0XG4gICAgICBsZXQgY2FwcyA9IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgICAgICAgcGxhdGZvcm1WZXJzaW9uOiBQTEFURk9STV9WRVJTSU9OLFxuICAgICAgICBhcHA6IEFQUCxcbiAgICAgICAgYnVuZGxlSWQ6IEJVTkRMRV9JRCxcbiAgICAgICAgZGV2aWNlTmFtZTogXCJpUGhvbmUgNlwiLFxuICAgICAgICBhdXRvbWF0aW9uTmFtZTogXCJXZWJEcml2ZXJBZ2VudFwiLFxuICAgICAgICB1ZGlkOiB1ZGlkXG4gICAgICB9O1xuXG4gICAgICAoYXdhaXQgc2ltQm9vdGVkKHVkaWQpKS5zaG91bGQuYmUudHJ1ZTtcbiAgICAgIGxldCBzaW1zQmVmb3JlID0gYXdhaXQgZ2V0TnVtU2ltcygpO1xuICAgICAgYXdhaXQgZHJpdmVyLmluaXQoY2Fwcyk7XG4gICAgICBsZXQgc2ltc0R1cmluZyA9IGF3YWl0IGdldE51bVNpbXMoKTtcbiAgICAgIGF3YWl0IGRyaXZlci5xdWl0KCk7XG4gICAgICBsZXQgc2ltc0FmdGVyID0gYXdhaXQgZ2V0TnVtU2ltcygpO1xuICAgICAgKGF3YWl0IHNpbUJvb3RlZCh1ZGlkKSkuc2hvdWxkLmJlLnRydWU7XG5cbiAgICAgIHNpbXNEdXJpbmcuc2hvdWxkLmVxdWFsKHNpbXNCZWZvcmUpO1xuICAgICAgc2ltc0FmdGVyLnNob3VsZC5lcXVhbChzaW1zQmVmb3JlKTtcblxuICAgICAgLy8gY2xlYW51cFxuICAgICAgYXdhaXQgc2ltLnNodXRkb3duKCk7XG4gICAgICBhd2FpdCBkZWxldGVEZXZpY2UodWRpZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnd2l0aCBpbnZhbGlkIHVkaWQ6IHRocm93cyBhbiBlcnJvcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMudGltZW91dCgxMjAgKiAxMDAwKTtcblxuICAgICAgLy8gdGVzdFxuICAgICAgbGV0IGNhcHMgPSB7XG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgIHBsYXRmb3JtVmVyc2lvbjogUExBVEZPUk1fVkVSU0lPTixcbiAgICAgICAgYXBwOiBBUFAsXG4gICAgICAgIGJ1bmRsZUlkOiBCVU5ETEVfSUQsXG4gICAgICAgIGRldmljZU5hbWU6IFwiaVBob25lIDZcIixcbiAgICAgICAgYXV0b21hdGlvbk5hbWU6IFwiV2ViRHJpdmVyQWdlbnRcIixcbiAgICAgICAgdWRpZDogJ3NvbWUtcmFuZG9tLXVkaWQnXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBkcml2ZXIuaW5pdChjYXBzKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdlbnZpcm9ubWVudCB5b3UgcmVxdWVzdGVkIHdhcyB1bmF2YWlsYWJsZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3dpdGggbm9SZXNldCBzZXQgdG8gdHJ1ZTogbGVhdmVzIHNpbSBib290ZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnRpbWVvdXQoMTIwICogMTAwMCk7XG5cbiAgICAgIC8vIGJlZm9yZVxuICAgICAgbGV0IHVkaWQgPSBhd2FpdCBjcmVhdGVEZXZpY2UoJ3dlYkRyaXZlckFnZW50VGVzdCcsICdpUGhvbmUgNicsIFBMQVRGT1JNX1ZFUlNJT04pO1xuICAgICAgbGV0IHNpbSA9IGF3YWl0IGdldFNpbXVsYXRvcih1ZGlkKTtcblxuICAgICAgLy8gdGVzdFxuICAgICAgbGV0IGNhcHMgPSB7XG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgIHBsYXRmb3JtVmVyc2lvbjogUExBVEZPUk1fVkVSU0lPTixcbiAgICAgICAgYXBwOiBBUFAsXG4gICAgICAgIGJ1bmRsZUlkOiBCVU5ETEVfSUQsXG4gICAgICAgIGRldmljZU5hbWU6IFwiaVBob25lIDZcIixcbiAgICAgICAgYXV0b21hdGlvbk5hbWU6IFwiV2ViRHJpdmVyQWdlbnRcIixcbiAgICAgICAgdWRpZDogdWRpZCxcbiAgICAgICAgbm9SZXNldDogdHJ1ZVxuICAgICAgfTtcblxuICAgICAgbGV0IHNpbXNCZWZvcmUgPSBhd2FpdCBnZXROdW1TaW1zKCk7XG4gICAgICBhd2FpdCBkcml2ZXIuaW5pdChjYXBzKTtcbiAgICAgIGxldCBzaW1zRHVyaW5nID0gYXdhaXQgZ2V0TnVtU2ltcygpO1xuICAgICAgYXdhaXQgZHJpdmVyLnF1aXQoKTtcbiAgICAgIGxldCBzaW1zQWZ0ZXIgPSBhd2FpdCBnZXROdW1TaW1zKCk7XG4gICAgICAoYXdhaXQgc2ltQm9vdGVkKHVkaWQpKS5zaG91bGQuYmUudHJ1ZTtcblxuICAgICAgc2ltc0R1cmluZy5zaG91bGQuZXF1YWwoc2ltc0JlZm9yZSk7XG4gICAgICBzaW1zQWZ0ZXIuc2hvdWxkLmVxdWFsKHNpbXNCZWZvcmUpO1xuXG4gICAgICAvLyBjbGVhbnVwXG4gICAgICBhd2FpdCBzaW0uc2h1dGRvd24oKTtcbiAgICAgIGF3YWl0IGRlbGV0ZURldmljZSh1ZGlkKTtcbiAgICB9KTtcblxuICB9KTtcblxufSk7XG4iXX0=