appium-adb
Version:
249 lines (207 loc) • 23.6 kB
JavaScript
;
var _regeneratorRuntime = require('babel-runtime/regenerator')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
var _interopRequireWildcard = require('babel-runtime/helpers/interop-require-wildcard')['default'];
var _this = this;
var _chai = require('chai');
var _chai2 = _interopRequireDefault(_chai);
var _chaiAsPromised = require('chai-as-promised');
var _chaiAsPromised2 = _interopRequireDefault(_chaiAsPromised);
var _ = require('../..');
var _2 = _interopRequireDefault(_);
var _teen_process = require('teen_process');
var teen_process = _interopRequireWildcard(_teen_process);
var _appiumTestSupport = require('appium-test-support');
var _bluebird = require('bluebird');
var _bluebird2 = _interopRequireDefault(_bluebird);
_chai2['default'].use(_chaiAsPromised2['default']);
var adb = new _2['default']();
adb.executable.path = 'adb_path';
describe('System calls', (0, _appiumTestSupport.withMocks)({ teen_process: teen_process }, function (mocks) {
it('getConnectedDevices should get all connected devices', function callee$1$0() {
var devices;
return _regeneratorRuntime.async(function callee$1$0$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
mocks.teen_process.expects("exec").once().withExactArgs(adb.executable.path, ['devices']).returns({ stdout: "List of devices attached \n emulator-5554 device" });
context$2$0.next = 3;
return _regeneratorRuntime.awrap(adb.getConnectedDevices());
case 3:
devices = context$2$0.sent;
devices.should.have.length.above(0);
mocks.teen_process.verify();
case 6:
case 'end':
return context$2$0.stop();
}
}, null, _this);
});
it('getConnectedDevices should fail when adb devices returns unexpected output', 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:
mocks.teen_process.expects("exec").once().withExactArgs(adb.executable.path, ['devices']).returns({ stdout: "foobar" });
context$2$0.next = 3;
return _regeneratorRuntime.awrap(adb.getConnectedDevices().should.eventually.be.rejectedWith("Unexpected output while trying to get devices"));
case 3:
mocks.teen_process.verify();
case 4:
case 'end':
return context$2$0.stop();
}
}, null, _this);
});
it('getDevicesWithRetry should fail when there are no connected devices', 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:
mocks.teen_process.expects("exec").atLeast(2).withExactArgs(adb.executable.path, ['devices']).returns({ stdout: "List of devices attached" });
context$2$0.next = 3;
return _regeneratorRuntime.awrap(adb.getDevicesWithRetry(1000).should.eventually.be.rejectedWith("Could not find a connected Android device."));
case 3:
mocks.teen_process.verify();
case 4:
case 'end':
return context$2$0.stop();
}
}, null, _this);
});
it('getDevicesWithRetry should fail when adb devices returns unexpected output', 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:
mocks.teen_process.expects("exec").atLeast(2).withExactArgs(adb.executable.path, ['devices']).returns({ stdout: "foobar" });
context$2$0.next = 3;
return _regeneratorRuntime.awrap(adb.getDevicesWithRetry(1000).should.eventually.be.rejectedWith("Could not find a connected Android device."));
case 3:
mocks.teen_process.verify();
case 4:
case 'end':
return context$2$0.stop();
}
}, null, _this);
});
it('getDevicesWithRetry should get all connected devices', function callee$1$0() {
var devices;
return _regeneratorRuntime.async(function callee$1$0$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
mocks.teen_process.expects("exec").once().withExactArgs(adb.executable.path, ['devices']).returns({ stdout: "List of devices attached \n emulator-5554 device" });
context$2$0.next = 3;
return _regeneratorRuntime.awrap(adb.getDevicesWithRetry(1000));
case 3:
devices = context$2$0.sent;
devices.should.have.length.above(0);
mocks.teen_process.verify();
case 6:
case 'end':
return context$2$0.stop();
}
}, null, _this);
});
it('getDevicesWithRetry should get all connected devices second time', function callee$1$0() {
var devices;
return _regeneratorRuntime.async(function callee$1$0$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
mocks.teen_process.expects("exec").onCall(0).returns({ stdout: "Foobar" });
mocks.teen_process.expects("exec").withExactArgs(adb.executable.path, ['devices']).returns({ stdout: "List of devices attached \n emulator-5554 device" });
context$2$0.next = 4;
return _regeneratorRuntime.awrap(adb.getDevicesWithRetry(2000));
case 4:
devices = context$2$0.sent;
devices.should.have.length.above(0);
mocks.teen_process.verify();
case 7:
case 'end':
return context$2$0.stop();
}
}, null, _this);
});
it('getDevicesWithRetry should fail when exec throws an error', 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:
mocks.teen_process.expects("exec").atLeast(2).throws("Error foobar");
context$2$0.next = 3;
return _regeneratorRuntime.awrap(adb.getDevicesWithRetry(1000).should.eventually.be.rejectedWith("Could not find a connected Android device."));
case 3:
mocks.teen_process.verify();
case 4:
case 'end':
return context$2$0.stop();
}
}, null, _this);
});
it('setDeviceId should set the device id', function () {
adb.setDeviceId('foobar');
adb.curDeviceId.should.equal('foobar');
adb.executable.defaultArgs.should.include('foobar');
});
it('setDevice should set the device id and emu port from obj', function () {
adb.setDevice({ udid: 'emulator-1234' });
adb.curDeviceId.should.equal('emulator-1234');
adb.executable.defaultArgs.should.include('emulator-1234');
adb.emulatorPort.should.equal(1234);
});
it('setEmulatorPort should change emulator port', function () {
adb.setEmulatorPort(5554);
adb.emulatorPort.should.equal(5554);
});
}));
describe('System calls', (0, _appiumTestSupport.withMocks)({ adb: adb, B: _bluebird2['default'] }, function (mocks) {
it('fileExists should return true for if ls returns', 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:
mocks.adb.expects("ls").once().withExactArgs('foo').returns(['bar']);
context$2$0.next = 3;
return _regeneratorRuntime.awrap(adb.fileExists("foo").should.eventually.equal(true));
case 3:
mocks.adb.verify();
case 4:
case 'end':
return context$2$0.stop();
}
}, null, _this);
});
it('ls should return list', function callee$1$0() {
var list;
return _regeneratorRuntime.async(function callee$1$0$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
mocks.adb.expects("shell").once().withExactArgs(['ls', 'foo']).returns('bar');
context$2$0.next = 3;
return _regeneratorRuntime.awrap(adb.ls("foo"));
case 3:
list = context$2$0.sent;
list.should.deep.equal(['bar']);
mocks.adb.verify();
case 6:
case 'end':
return context$2$0.stop();
}
}, null, _this);
});
it('reboot should call stop and start using shell', 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:
mocks.adb.expects("shell").once().withExactArgs(['stop']);
mocks.adb.expects("setDeviceProperty").once().withExactArgs('sys.boot_completed', 0);
mocks.adb.expects("shell").once().withExactArgs(['start']);
mocks.adb.expects("getDeviceProperty").once().withExactArgs('sys.boot_completed').returns('1');
mocks.B.expects("delay").once().withExactArgs(2000);
context$2$0.next = 7;
return _regeneratorRuntime.awrap(adb.reboot().should.eventually.not.be.rejected);
case 7:
mocks.adb.verify();
mocks.B.verify();
case 9:
case 'end':
return context$2$0.stop();
}
}, null, _this);
});
}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvdW5pdC9zeXNjYWxscy1zcGVjcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O29CQUFpQixNQUFNOzs7OzhCQUNJLGtCQUFrQjs7OztnQkFDN0IsT0FBTzs7Ozs0QkFDTyxjQUFjOztJQUFoQyxZQUFZOztpQ0FDRSxxQkFBcUI7O3dCQUNqQyxVQUFVOzs7O0FBR3hCLGtCQUFLLEdBQUcsNkJBQWdCLENBQUM7QUFDekIsSUFBTSxHQUFHLEdBQUcsbUJBQVMsQ0FBQztBQUN0QixHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7O0FBRWpDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsa0NBQVUsRUFBQyxZQUFZLEVBQVosWUFBWSxFQUFDLEVBQUUsVUFBQyxLQUFLLEVBQUs7QUFDNUQsSUFBRSxDQUFDLHNEQUFzRCxFQUFFO1FBSXJELE9BQU87Ozs7QUFIWCxlQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FDL0IsSUFBSSxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FDdEQsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFDLGtEQUFrRCxFQUFDLENBQUMsQ0FBQzs7MkNBQ3BELEdBQUcsQ0FBQyxtQkFBbUIsRUFBRTs7O0FBQXpDLGlCQUFPOztBQUNYLGlCQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLGVBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7Ozs7Ozs7R0FDN0IsQ0FBQyxDQUFDO0FBQ0gsSUFBRSxDQUFDLDRFQUE0RSxFQUFFOzs7O0FBQy9FLGVBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUMvQixJQUFJLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJ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QUMsQ0FBQztBQUNoQyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDOzs7Ozs7O0dBQ3BCLENBQUMsQ0FBQztBQUNILElBQUUsQ0FBQywrQ0FBK0MsRUFBRTs7OztBQUNsRCxlQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FDdkIsSUFBSSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNsQyxlQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUNuQyxJQUFJLEVBQUUsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDakQsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQ3ZCLElBQUksRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDbkMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FDbkMsSUFBSSxFQUFFLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQixlQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FDckIsSUFBSSxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDOzsyQ0FDeEIsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFROzs7QUFDcEQsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNuQixlQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDOzs7Ozs7O0dBQ2xCLENBQUMsQ0FBQztDQUNKLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6InRlc3QvdW5pdC9zeXNjYWxscy1zcGVjcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFpIGZyb20gJ2NoYWknO1xuaW1wb3J0IGNoYWlBc1Byb21pc2VkIGZyb20gJ2NoYWktYXMtcHJvbWlzZWQnO1xuaW1wb3J0IEFEQiBmcm9tICcuLi8uLic7XG5pbXBvcnQgKiBhcyB0ZWVuX3Byb2Nlc3MgZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IHdpdGhNb2NrcyB9IGZyb20gJ2FwcGl1bS10ZXN0LXN1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5cbmNoYWkudXNlKGNoYWlBc1Byb21pc2VkKTtcbmNvbnN0IGFkYiA9IG5ldyBBREIoKTtcbmFkYi5leGVjdXRhYmxlLnBhdGggPSAnYWRiX3BhdGgnO1xuXG5kZXNjcmliZSgnU3lzdGVtIGNhbGxzJywgd2l0aE1vY2tzKHt0ZWVuX3Byb2Nlc3N9LCAobW9ja3MpID0+IHtcbiAgaXQoJ2dldENvbm5lY3RlZERldmljZXMgc2hvdWxkIGdldCBhbGwgY29ubmVjdGVkIGRldmljZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja3MudGVlbl9wcm9jZXNzLmV4cGVjdHMoXCJleGVjXCIpXG4gICAgICAub25jZSgpLndpdGhFeGFjdEFyZ3MoYWRiLmV4ZWN1dGFibGUucGF0aCwgWydkZXZpY2VzJ10pXG4gICAgICAucmV0dXJucyh7c3Rkb3V0OlwiTGlzdCBvZiBkZXZpY2VzIGF0dGFjaGVkIFxcbiBlbXVsYXRvci01NTU0XHRkZXZpY2VcIn0pO1xuICAgIGxldCBkZXZpY2VzID0gYXdhaXQgYWRiLmdldENvbm5lY3RlZERldmljZXMoKTtcbiAgICBkZXZpY2VzLnNob3VsZC5oYXZlLmxlbmd0aC5hYm92ZSgwKTtcbiAgICBtb2Nrcy50ZWVuX3Byb2Nlc3MudmVyaWZ5KCk7XG4gIH0pO1xuICBpdCgnZ2V0Q29ubmVjdGVkRGV2aWNlcyBzaG91bGQgZmFpbCB3aGVuIGFkYiBkZXZpY2VzIHJldHVybnMgdW5leHBlY3RlZCBvdXRwdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja3MudGVlbl9wcm9jZXNzLmV4cGVjdHMoXCJleGVjXCIpXG4gICAgICAub25jZSgpLndpdGhFeGFjdEFyZ3MoYWRiLmV4ZWN1dGFibGUucGF0aCwgWydkZXZpY2VzJ10pXG4gICAgICAucmV0dXJucyh7c3Rkb3V0OlwiZm9vYmFyXCJ9KTtcbiAgICBhd2FpdCBhZGIuZ2V0Q29ubmVjdGVkRGV2aWNlcygpLnNob3VsZC5ldmVudHVhbGx5LmJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RlZFdpdGgoXCJVbmV4cGVjdGVkIG91dHB1dCB3aGlsZSB0cnlpbmcgdG8gZ2V0IGRldmljZXNcIik7XG4gICAgbW9ja3MudGVlbl9wcm9jZXNzLnZlcmlmeSgpO1xuICB9KTtcbiAgaXQoJ2dldERldmljZXNXaXRoUmV0cnkgc2hvdWxkIGZhaWwgd2hlbiB0aGVyZSBhcmUgbm8gY29ubmVjdGVkIGRldmljZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja3MudGVlbl9wcm9jZXNzLmV4cGVjdHMoXCJleGVjXCIpXG4gICAgICAuYXRMZWFzdCgyKS53aXRoRXhhY3RBcmdzKGFkYi5leGVjdXRhYmxlLnBhdGgsIFsnZGV2aWNlcyddKVxuICAgICAgLnJldHVybnMoe3N0ZG91dDpcIkxpc3Qgb2YgZGV2aWNlcyBhdHRhY2hlZFwifSk7XG4gICAgYXdhaXQgYWRiLmdldERldmljZXNXaXRoUmV0cnkoMTAwMCkuc2hvdWxkLmV2ZW50dWFsbHkuYmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RlZFdpdGgoXCJDb3VsZCBub3QgZmluZCBhIGNvbm5lY3RlZCBBbmRyb2lkIGRldmljZS5cIik7XG4gICAgbW9ja3MudGVlbl9wcm9jZXNzLnZlcmlmeSgpO1xuICB9KTtcbiAgaXQoJ2dldERldmljZXNXaXRoUmV0cnkgc2hvdWxkIGZhaWwgd2hlbiBhZGIgZGV2aWNlcyByZXR1cm5zIHVuZXhwZWN0ZWQgb3V0cHV0JywgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tzLnRlZW5fcHJvY2Vzcy5leHBlY3RzKFwiZXhlY1wiKVxuICAgICAgLmF0TGVhc3QoMikud2l0aEV4YWN0QXJncyhhZGIuZXhlY3V0YWJsZS5wYXRoLCBbJ2RldmljZXMnXSlcbiAgICAgIC5yZXR1cm5zKHtzdGRvdXQ6XCJmb29iYXJcIn0pO1xuICAgIGF3YWl0IGFkYi5nZXREZXZpY2VzV2l0aFJldHJ5KDEwMDApLnNob3VsZC5ldmVudHVhbGx5LmJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVqZWN0ZWRXaXRoKFwiQ291bGQgbm90IGZpbmQgYSBjb25uZWN0ZWQgQW5kcm9pZCBkZXZpY2UuXCIpO1xuICAgIG1vY2tzLnRlZW5fcHJvY2Vzcy52ZXJpZnkoKTtcbiAgfSk7XG4gIGl0KCdnZXREZXZpY2VzV2l0aFJldHJ5IHNob3VsZCBnZXQgYWxsIGNvbm5lY3RlZCBkZXZpY2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tzLnRlZW5fcHJvY2Vzcy5leHBlY3RzKFwiZXhlY1wiKVxuICAgICAgLm9uY2UoKS53aXRoRXhhY3RBcmdzKGFkYi5leGVjdXRhYmxlLnBhdGgsIFsnZGV2aWNlcyddKVxuICAgICAgLnJldHVybnMoe3N0ZG91dDpcIkxpc3Qgb2YgZGV2aWNlcyBhdHRhY2hlZCBcXG4gZW11bGF0b3ItNTU1NFx0ZGV2aWNlXCJ9KTtcbiAgICBsZXQgZGV2aWNlcyA9IGF3YWl0IGFkYi5nZXREZXZpY2VzV2l0aFJldHJ5KDEwMDApO1xuICAgIGRldmljZXMuc2hvdWxkLmhhdmUubGVuZ3RoLmFib3ZlKDApO1xuICAgIG1vY2tzLnRlZW5fcHJvY2Vzcy52ZXJpZnkoKTtcbiAgfSk7XG4gIGl0KCdnZXREZXZpY2VzV2l0aFJldHJ5IHNob3VsZCBnZXQgYWxsIGNvbm5lY3RlZCBkZXZpY2VzIHNlY29uZCB0aW1lJywgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tzLnRlZW5fcHJvY2Vzcy5leHBlY3RzKFwiZXhlY1wiKVxuICAgICAgLm9uQ2FsbCgwKVxuICAgICAgLnJldHVybnMoe3N0ZG91dDpcIkZvb2JhclwifSk7XG4gICAgbW9ja3MudGVlbl9wcm9jZXNzLmV4cGVjdHMoXCJleGVjXCIpXG4gICAgICAud2l0aEV4YWN0QXJncyhhZGIuZXhlY3V0YWJsZS5wYXRoLCBbJ2RldmljZXMnXSlcbiAgICAgIC5yZXR1cm5zKHtzdGRvdXQ6XCJMaXN0IG9mIGRldmljZXMgYXR0YWNoZWQgXFxuIGVtdWxhdG9yLTU1NTRcdGRldmljZVwifSk7XG4gICAgbGV0IGRldmljZXMgPSBhd2FpdCBhZGIuZ2V0RGV2aWNlc1dpdGhSZXRyeSgyMDAwKTtcbiAgICBkZXZpY2VzLnNob3VsZC5oYXZlLmxlbmd0aC5hYm92ZSgwKTtcbiAgICBtb2Nrcy50ZWVuX3Byb2Nlc3MudmVyaWZ5KCk7XG4gIH0pO1xuICBpdCgnZ2V0RGV2aWNlc1dpdGhSZXRyeSBzaG91bGQgZmFpbCB3aGVuIGV4ZWMgdGhyb3dzIGFuIGVycm9yJywgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tzLnRlZW5fcHJvY2Vzcy5leHBlY3RzKFwiZXhlY1wiKVxuICAgICAgLmF0TGVhc3QoMilcbiAgICAgIC50aHJvd3MoXCJFcnJvciBmb29iYXJcIik7XG4gICAgYXdhaXQgYWRiLmdldERldmljZXNXaXRoUmV0cnkoMTAwMCkuc2hvdWxkLmV2ZW50dWFsbHkuYmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RlZFdpdGgoXCJDb3VsZCBub3QgZmluZCBhIGNvbm5lY3RlZCBBbmRyb2lkIGRldmljZS5cIik7XG4gICAgbW9ja3MudGVlbl9wcm9jZXNzLnZlcmlmeSgpO1xuICB9KTtcbiAgaXQoJ3NldERldmljZUlkIHNob3VsZCBzZXQgdGhlIGRldmljZSBpZCcsICgpID0+IHtcbiAgICBhZGIuc2V0RGV2aWNlSWQoJ2Zvb2JhcicpO1xuICAgIGFkYi5jdXJEZXZpY2VJZC5zaG91bGQuZXF1YWwoJ2Zvb2JhcicpO1xuICAgIGFkYi5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLnNob3VsZC5pbmNsdWRlKCdmb29iYXInKTtcbiAgfSk7XG4gIGl0KCdzZXREZXZpY2Ugc2hvdWxkIHNldCB0aGUgZGV2aWNlIGlkIGFuZCBlbXUgcG9ydCBmcm9tIG9iaicsICgpID0+IHtcbiAgICBhZGIuc2V0RGV2aWNlKHt1ZGlkOiAnZW11bGF0b3ItMTIzNCd9KTtcbiAgICBhZGIuY3VyRGV2aWNlSWQuc2hvdWxkLmVxdWFsKCdlbXVsYXRvci0xMjM0Jyk7XG4gICAgYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3Muc2hvdWxkLmluY2x1ZGUoJ2VtdWxhdG9yLTEyMzQnKTtcbiAgICBhZGIuZW11bGF0b3JQb3J0LnNob3VsZC5lcXVhbCgxMjM0KTtcbiAgfSk7XG4gIGl0KCdzZXRFbXVsYXRvclBvcnQgc2hvdWxkIGNoYW5nZSBlbXVsYXRvciBwb3J0JywgKCkgPT4ge1xuICAgIGFkYi5zZXRFbXVsYXRvclBvcnQoNTU1NCk7XG4gICAgYWRiLmVtdWxhdG9yUG9ydC5zaG91bGQuZXF1YWwoNTU1NCk7XG4gIH0pO1xufSkpO1xuXG5kZXNjcmliZSgnU3lzdGVtIGNhbGxzJywgIHdpdGhNb2Nrcyh7YWRiLCBCfSwgKG1vY2tzKSA9PiB7XG4gIGl0KCdmaWxlRXhpc3RzIHNob3VsZCByZXR1cm4gdHJ1ZSBmb3IgaWYgbHMgcmV0dXJucycsIGFzeW5jICgpID0+IHtcbiAgICBtb2Nrcy5hZGIuZXhwZWN0cyhcImxzXCIpXG4gICAgICAub25jZSgpLndpdGhFeGFjdEFyZ3MoJ2ZvbycpXG4gICAgICAucmV0dXJucyhbJ2JhciddKTtcbiAgICBhd2FpdCBhZGIuZmlsZUV4aXN0cyhcImZvb1wiKS5zaG91bGQuZXZlbnR1YWxseS5lcXVhbCh0cnVlKTtcbiAgICBtb2Nrcy5hZGIudmVyaWZ5KCk7XG4gIH0pO1xuICBpdCgnbHMgc2hvdWxkIHJldHVybiBsaXN0JywgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tzLmFkYi5leHBlY3RzKFwic2hlbGxcIilcbiAgICAgIC5vbmNlKCkud2l0aEV4YWN0QXJncyhbJ2xzJywgJ2ZvbyddKVxuICAgICAgLnJldHVybnMoJ2JhcicpO1xuICAgIGxldCBsaXN0ID0gYXdhaXQgYWRiLmxzKFwiZm9vXCIpO1xuICAgIGxpc3Quc2hvdWxkLmRlZXAuZXF1YWwoWydiYXInXSk7XG4gICAgbW9ja3MuYWRiLnZlcmlmeSgpO1xuICB9KTtcbiAgaXQoJ3JlYm9vdCBzaG91bGQgY2FsbCBzdG9wIGFuZCBzdGFydCB1c2luZyBzaGVsbCcsIGFzeW5jICgpID0+IHtcbiAgICBtb2Nrcy5hZGIuZXhwZWN0cyhcInNoZWxsXCIpXG4gICAgICAub25jZSgpLndpdGhFeGFjdEFyZ3MoWydzdG9wJ10pO1xuICAgIG1vY2tzLmFkYi5leHBlY3RzKFwic2V0RGV2aWNlUHJvcGVydHlcIilcbiAgICAgIC5vbmNlKCkud2l0aEV4YWN0QXJncygnc3lzLmJvb3RfY29tcGxldGVkJywgMCk7XG4gICAgbW9ja3MuYWRiLmV4cGVjdHMoXCJzaGVsbFwiKVxuICAgICAgLm9uY2UoKS53aXRoRXhhY3RBcmdzKFsnc3RhcnQnXSk7XG4gICAgbW9ja3MuYWRiLmV4cGVjdHMoXCJnZXREZXZpY2VQcm9wZXJ0eVwiKVxuICAgICAgLm9uY2UoKS53aXRoRXhhY3RBcmdzKCdzeXMuYm9vdF9jb21wbGV0ZWQnKVxuICAgICAgLnJldHVybnMoJzEnKTtcbiAgICBtb2Nrcy5CLmV4cGVjdHMoXCJkZWxheVwiKVxuICAgICAgLm9uY2UoKS53aXRoRXhhY3RBcmdzKDIwMDApO1xuICAgIGF3YWl0IGFkYi5yZWJvb3QoKS5zaG91bGQuZXZlbnR1YWxseS5ub3QuYmUucmVqZWN0ZWQ7XG4gICAgbW9ja3MuYWRiLnZlcmlmeSgpO1xuICAgIG1vY2tzLkIudmVyaWZ5KCk7XG4gIH0pO1xufSkpO1xuIl19