UNPKG

appium-adb-test

Version:

Android Debug Bridge interface

333 lines (279 loc) 32 kB
'use strict'; 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'; var avdName = 'AVD_NAME'; 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('createSubProcess', function () { it('should return an instance of SubProcess', function () { adb.createSubProcess([]).should.be.an['instanceof'](teen_process.SubProcess); }); }); })); 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); }); it('getRunningAVD should get connected avd', function callee$1$0() { var udid, port, emulator; return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: udid = 'emulator-5554'; port = 5554; emulator = { udid: udid, port: port }; mocks.adb.expects("getConnectedEmulators").once().withExactArgs().returns([emulator]); mocks.adb.expects("setEmulatorPort").once().withExactArgs(port); mocks.adb.expects("sendTelnetCommand").once().withExactArgs("avd name").returns(avdName); mocks.adb.expects("setDeviceId").once().withExactArgs(udid); context$2$0.next = 9; return _regeneratorRuntime.awrap(adb.getRunningAVD(avdName)); case 9: context$2$0.t0 = emulator; context$2$0.sent.should.equal(context$2$0.t0); mocks.adb.verify(); case 12: case 'end': return context$2$0.stop(); } }, null, _this); }); it('getRunningAVD should return null when expected avd is not connected', function callee$1$0() { var udid, port, emulator; return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: udid = 'emulator-5554'; port = 5554; emulator = { udid: udid, port: port }; mocks.adb.expects("getConnectedEmulators").once().withExactArgs().returns([emulator]); mocks.adb.expects("setEmulatorPort").once().withExactArgs(port); mocks.adb.expects("sendTelnetCommand").once().withExactArgs("avd name").returns('OTHER_AVD'); context$2$0.t0 = _chai2['default']; context$2$0.next = 9; return _regeneratorRuntime.awrap(adb.getRunningAVD(avdName)); case 9: context$2$0.t1 = context$2$0.sent; context$2$0.t0.expect.call(context$2$0.t0, context$2$0.t1).to.be['null']; mocks.adb.verify(); case 12: case 'end': return context$2$0.stop(); } }, null, _this); }); it('getRunningAVD should return null when no avd is connected', 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("getConnectedEmulators").once().withExactArgs().returns([]); context$2$0.t0 = _chai2['default']; context$2$0.next = 4; return _regeneratorRuntime.awrap(adb.getRunningAVD(avdName)); case 4: context$2$0.t1 = context$2$0.sent; context$2$0.t0.expect.call(context$2$0.t0, context$2$0.t1).to.be['null']; mocks.adb.verify(); case 7: case 'end': return context$2$0.stop(); } }, null, _this); }); })); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvdW5pdC9zeXNjYWxscy1zcGVjcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O29CQUFpQixNQUFNOzs7OzhCQUNJLGtCQUFrQjs7OztnQkFDN0IsT0FBTzs7Ozs0QkFDTyxjQUFjOztJQUFoQyxZQUFZOztpQ0FDRSxxQkFBcUI7O3dCQUNqQyxVQUFVOzs7O0FBR3hCLGtCQUFLLEdBQUcsNkJBQWdCLENBQUM7QUFDekIsSUFBTSxHQUFHLEdBQUcsbUJBQVMsQ0FBQztBQUN0QixHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7QUFDakMsSUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDOztBQUUzQixRQUFRLENBQUMsY0FBYyxFQUFFLGtDQUFVLEVBQUMsWUFBWSxFQUFaLFlBQVksRUFBQyxFQUFFLFVBQUMsS0FBSyxFQUFLO0FBQzVELElBQUUsQ0FBQyxzREFBc0QsRUFBRTtRQUlyRCxPQUFPOzs7O0FBSFgsZUFBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQy9CLElBQUksRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQ3RELE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBQyxrREFBa0QsRUFBQyxDQUFDLENBQUM7OzJDQUNwRCxHQUFHLENBQUMsbUJBQW1CLEVBQUU7OztBQUF6QyxpQkFBTzs7QUFDWCxpQkFBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxlQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDOzs7Ozs7O0dBQzdCLENBQUMsQ0FBQztBQUNILElBQUUsQ0FBQyw0RUFBNEUsRUFBRTs7OztBQUMvRSxlQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FDL0IsSUFBSSxFQUFFLENBQUMs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QyIsImZpbGUiOiJ0ZXN0L3VuaXQvc3lzY2FsbHMtc3BlY3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhaSBmcm9tICdjaGFpJztcclxuaW1wb3J0IGNoYWlBc1Byb21pc2VkIGZyb20gJ2NoYWktYXMtcHJvbWlzZWQnO1xyXG5pbXBvcnQgQURCIGZyb20gJy4uLy4uJztcclxuaW1wb3J0ICogYXMgdGVlbl9wcm9jZXNzIGZyb20gJ3RlZW5fcHJvY2Vzcyc7XHJcbmltcG9ydCB7IHdpdGhNb2NrcyB9IGZyb20gJ2FwcGl1bS10ZXN0LXN1cHBvcnQnO1xyXG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XHJcblxyXG5cclxuY2hhaS51c2UoY2hhaUFzUHJvbWlzZWQpO1xyXG5jb25zdCBhZGIgPSBuZXcgQURCKCk7XHJcbmFkYi5leGVjdXRhYmxlLnBhdGggPSAnYWRiX3BhdGgnO1xyXG5jb25zdCBhdmROYW1lID0gJ0FWRF9OQU1FJztcclxuXHJcbmRlc2NyaWJlKCdTeXN0ZW0gY2FsbHMnLCB3aXRoTW9ja3Moe3RlZW5fcHJvY2Vzc30sIChtb2NrcykgPT4ge1xyXG4gIGl0KCdnZXRDb25uZWN0ZWREZXZpY2VzIHNob3VsZCBnZXQgYWxsIGNvbm5lY3RlZCBkZXZpY2VzJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgbW9ja3MudGVlbl9wcm9jZXNzLmV4cGVjdHMoXCJleGVjXCIpXHJcbiAgICAgIC5vbmNlKCkud2l0aEV4YWN0QXJncyhhZGIuZXhlY3V0YWJsZS5wYXRoLCBbJ2RldmljZXMnXSlcclxuICAgICAgLnJldHVybnMoe3N0ZG91dDpcIkxpc3Qgb2YgZGV2aWNlcyBhdHRhY2hlZCBcXG4gZW11bGF0b3ItNTU1NFx0ZGV2aWNlXCJ9KTtcclxuICAgIGxldCBkZXZpY2VzID0gYXdhaXQgYWRiLmdldENvbm5lY3RlZERldmljZXMoKTtcclxuICAgIGRldmljZXMuc2hvdWxkLmhhdmUubGVuZ3RoLmFib3ZlKDApO1xyXG4gICAgbW9ja3MudGVlbl9wcm9jZXNzLnZlcmlmeSgpO1xyXG4gIH0pO1xyXG4gIGl0KCdnZXRDb25uZWN0ZWREZXZpY2VzIHNob3VsZCBmYWlsIHdoZW4gYWRiIGRldmljZXMgcmV0dXJucyB1bmV4cGVjdGVkIG91dHB1dCcsIGFzeW5jICgpID0+IHtcclxuICAgIG1vY2tzLnRlZW5fcHJvY2Vzcy5leHBlY3RzKFwiZXhlY1wiKVxyXG4gICAgICAub25jZSgpLndpdGhFeGFjdEFyZ3MoYWRiLmV4ZWN1dGFibGUucGF0aCwgWydkZXZpY2VzJ10pXHJcbiAgICAgIC5yZXR1cm5zKHtzdGRvdXQ6XCJmb29iYXJcIn0pO1xyXG4gICAgYXdhaXQgYWRiLmdldENvbm5lY3RlZERldmljZXMoKS5zaG91bGQuZXZlbnR1YWxseS5iZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RlZFdpdGgoXCJVbmV4cGVjdGVkIG91dHB1dCB3aGlsZSB0cnlpbmcgdG8gZ2V0IGRldmljZXNcIik7XHJcbiAgICBtb2Nrcy50ZWVuX3Byb2Nlc3MudmVyaWZ5KCk7XHJcbiAgfSk7XHJcbiAgaXQoJ2dldERldmljZXNXaXRoUmV0cnkgc2hvdWxkIGZhaWwgd2hlbiB0aGVyZSBhcmUgbm8gY29ubmVjdGVkIGRldmljZXMnLCBhc3luYyAoKSA9PiB7XHJcbiAgICBtb2Nrcy50ZWVuX3Byb2Nlc3MuZXhwZWN0cyhcImV4ZWNcIilcclxuICAgICAgLmF0TGVhc3QoMikud2l0aEV4YWN0QXJncyhhZGIuZXhlY3V0YWJsZS5wYXRoLCBbJ2RldmljZXMnXSlcclxuICAgICAgLnJldHVybnMoe3N0ZG91dDpcIkxpc3Qgb2YgZGV2aWNlcyBhdHRhY2hlZFwifSk7XHJcbiAgICBhd2FpdCBhZGIuZ2V0RGV2aWNlc1dpdGhSZXRyeSgxMDAwKS5zaG91bGQuZXZlbnR1YWxseS5iZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVqZWN0ZWRXaXRoKFwiQ291bGQgbm90IGZpbmQgYSBjb25uZWN0ZWQgQW5kcm9pZCBkZXZpY2UuXCIpO1xyXG4gICAgbW9ja3MudGVlbl9wcm9jZXNzLnZlcmlmeSgpO1xyXG4gIH0pO1xyXG4gIGl0KCdnZXREZXZpY2VzV2l0aFJldHJ5IHNob3VsZCBmYWlsIHdoZW4gYWRiIGRldmljZXMgcmV0dXJucyB1bmV4cGVjdGVkIG91dHB1dCcsIGFzeW5jICgpID0+IHtcclxuICAgIG1vY2tzLnRlZW5fcHJvY2Vzcy5leHBlY3RzKFwiZXhlY1wiKVxyXG4gICAgICAuYXRMZWFzdCgyKS53aXRoRXhhY3RBcmdzKGFkYi5leGVjdXRhYmxlLnBhdGgsIFsnZGV2aWNlcyddKVxyXG4gICAgICAucmV0dXJucyh7c3Rkb3V0OlwiZm9vYmFyXCJ9KTtcclxuICAgIGF3YWl0IGFkYi5nZXREZXZpY2VzV2l0aFJldHJ5KDEwMDApLnNob3VsZC5ldmVudHVhbGx5LmJlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWplY3RlZFdpdGgoXCJDb3VsZCBub3QgZmluZCBhIGNvbm5lY3RlZCBBbmRyb2lkIGRldmljZS5cIik7XHJcbiAgICBtb2Nrcy50ZWVuX3Byb2Nlc3MudmVyaWZ5KCk7XHJcbiAgfSk7XHJcbiAgaXQoJ2dldERldmljZXNXaXRoUmV0cnkgc2hvdWxkIGdldCBhbGwgY29ubmVjdGVkIGRldmljZXMnLCBhc3luYyAoKSA9PiB7XHJcbiAgICBtb2Nrcy50ZWVuX3Byb2Nlc3MuZXhwZWN0cyhcImV4ZWNcIilcclxuICAgICAgLm9uY2UoKS53aXRoRXhhY3RBcmdzKGFkYi5leGVjdXRhYmxlLnBhdGgsIFsnZGV2aWNlcyddKVxyXG4gICAgICAucmV0dXJucyh7c3Rkb3V0OlwiTGlzdCBvZiBkZXZpY2VzIGF0dGFjaGVkIFxcbiBlbXVsYXRvci01NTU0XHRkZXZpY2VcIn0pO1xyXG4gICAgbGV0IGRldmljZXMgPSBhd2FpdCBhZGIuZ2V0RGV2aWNlc1dpdGhSZXRyeSgxMDAwKTtcclxuICAgIGRldmljZXMuc2hvdWxkLmhhdmUubGVuZ3RoLmFib3ZlKDApO1xyXG4gICAgbW9ja3MudGVlbl9wcm9jZXNzLnZlcmlmeSgpO1xyXG4gIH0pO1xyXG4gIGl0KCdnZXREZXZpY2VzV2l0aFJldHJ5IHNob3VsZCBnZXQgYWxsIGNvbm5lY3RlZCBkZXZpY2VzIHNlY29uZCB0aW1lJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgbW9ja3MudGVlbl9wcm9jZXNzLmV4cGVjdHMoXCJleGVjXCIpXHJcbiAgICAgIC5vbkNhbGwoMClcclxuICAgICAgLnJldHVybnMoe3N0ZG91dDpcIkZvb2JhclwifSk7XHJcbiAgICBtb2Nrcy50ZWVuX3Byb2Nlc3MuZXhwZWN0cyhcImV4ZWNcIilcclxuICAgICAgLndpdGhFeGFjdEFyZ3MoYWRiLmV4ZWN1dGFibGUucGF0aCwgWydkZXZpY2VzJ10pXHJcbiAgICAgIC5yZXR1cm5zKHtzdGRvdXQ6XCJMaXN0IG9mIGRldmljZXMgYXR0YWNoZWQgXFxuIGVtdWxhdG9yLTU1NTRcdGRldmljZVwifSk7XHJcbiAgICBsZXQgZGV2aWNlcyA9IGF3YWl0IGFkYi5nZXREZXZpY2VzV2l0aFJldHJ5KDIwMDApO1xyXG4gICAgZGV2aWNlcy5zaG91bGQuaGF2ZS5sZW5ndGguYWJvdmUoMCk7XHJcbiAgICBtb2Nrcy50ZWVuX3Byb2Nlc3MudmVyaWZ5KCk7XHJcbiAgfSk7XHJcbiAgaXQoJ2dldERldmljZXNXaXRoUmV0cnkgc2hvdWxkIGZhaWwgd2hlbiBleGVjIHRocm93cyBhbiBlcnJvcicsIGFzeW5jICgpID0+IHtcclxuICAgIG1vY2tzLnRlZW5fcHJvY2Vzcy5leHBlY3RzKFwiZXhlY1wiKVxyXG4gICAgICAuYXRMZWFzdCgyKVxyXG4gICAgICAudGhyb3dzKFwiRXJyb3IgZm9vYmFyXCIpO1xyXG4gICAgYXdhaXQgYWRiLmdldERldmljZXNXaXRoUmV0cnkoMTAwMCkuc2hvdWxkLmV2ZW50dWFsbHkuYmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdGVkV2l0aChcIkNvdWxkIG5vdCBmaW5kIGEgY29ubmVjdGVkIEFuZHJvaWQgZGV2aWNlLlwiKTtcclxuICAgIG1vY2tzLnRlZW5fcHJvY2Vzcy52ZXJpZnkoKTtcclxuICB9KTtcclxuICBpdCgnc2V0RGV2aWNlSWQgc2hvdWxkIHNldCB0aGUgZGV2aWNlIGlkJywgKCkgPT4ge1xyXG4gICAgYWRiLnNldERldmljZUlkKCdmb29iYXInKTtcclxuICAgIGFkYi5jdXJEZXZpY2VJZC5zaG91bGQuZXF1YWwoJ2Zvb2JhcicpO1xyXG4gICAgYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3Muc2hvdWxkLmluY2x1ZGUoJ2Zvb2JhcicpO1xyXG4gIH0pO1xyXG4gIGl0KCdzZXREZXZpY2Ugc2hvdWxkIHNldCB0aGUgZGV2aWNlIGlkIGFuZCBlbXUgcG9ydCBmcm9tIG9iaicsICgpID0+IHtcclxuICAgIGFkYi5zZXREZXZpY2Uoe3VkaWQ6ICdlbXVsYXRvci0xMjM0J30pO1xyXG4gICAgYWRiLmN1ckRldmljZUlkLnNob3VsZC5lcXVhbCgnZW11bGF0b3ItMTIzNCcpO1xyXG4gICAgYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3Muc2hvdWxkLmluY2x1ZGUoJ2VtdWxhdG9yLTEyMzQnKTtcclxuICAgIGFkYi5lbXVsYXRvclBvcnQuc2hvdWxkLmVxdWFsKDEyMzQpO1xyXG4gIH0pO1xyXG4gIGl0KCdzZXRFbXVsYXRvclBvcnQgc2hvdWxkIGNoYW5nZSBlbXVsYXRvciBwb3J0JywgKCkgPT4ge1xyXG4gICAgYWRiLnNldEVtdWxhdG9yUG9ydCg1NTU0KTtcclxuICAgIGFkYi5lbXVsYXRvclBvcnQuc2hvdWxkLmVxdWFsKDU1NTQpO1xyXG4gIH0pO1xyXG4gIGRlc2NyaWJlKCdjcmVhdGVTdWJQcm9jZXNzJywgKCkgPT4ge1xyXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgU3ViUHJvY2VzcycsICgpID0+IHtcclxuICAgICAgYWRiLmNyZWF0ZVN1YlByb2Nlc3MoW10pLnNob3VsZC5iZS5hbi5pbnN0YW5jZW9mKHRlZW5fcHJvY2Vzcy5TdWJQcm9jZXNzKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59KSk7XHJcblxyXG5kZXNjcmliZSgnU3lzdGVtIGNhbGxzJywgIHdpdGhNb2Nrcyh7YWRiLCBCfSwgKG1vY2tzKSA9PiB7XHJcbiAgaXQoJ2ZpbGVFeGlzdHMgc2hvdWxkIHJldHVybiB0cnVlIGZvciBpZiBscyByZXR1cm5zJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgbW9ja3MuYWRiLmV4cGVjdHMoXCJsc1wiKVxyXG4gICAgICAub25jZSgpLndpdGhFeGFjdEFyZ3MoJ2ZvbycpXHJcbiAgICAgIC5yZXR1cm5zKFsnYmFyJ10pO1xyXG4gICAgYXdhaXQgYWRiLmZpbGVFeGlzdHMoXCJmb29cIikuc2hvdWxkLmV2ZW50dWFsbHkuZXF1YWwodHJ1ZSk7XHJcbiAgICBtb2Nrcy5hZGIudmVyaWZ5KCk7XHJcbiAgfSk7XHJcbiAgaXQoJ2xzIHNob3VsZCByZXR1cm4gbGlzdCcsIGFzeW5jICgpID0+IHtcclxuICAgIG1vY2tzLmFkYi5leHBlY3RzKFwic2hlbGxcIilcclxuICAgICAgLm9uY2UoKS53aXRoRXhhY3RBcmdzKFsnbHMnLCAnZm9vJ10pXHJcbiAgICAgIC5yZXR1cm5zKCdiYXInKTtcclxuICAgIGxldCBsaXN0ID0gYXdhaXQgYWRiLmxzKFwiZm9vXCIpO1xyXG4gICAgbGlzdC5zaG91bGQuZGVlcC5lcXVhbChbJ2JhciddKTtcclxuICAgIG1vY2tzLmFkYi52ZXJpZnkoKTtcclxuICB9KTtcclxuICBpdCgncmVib290IHNob3VsZCBjYWxsIHN0b3AgYW5kIHN0YXJ0IHVzaW5nIHNoZWxsJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgbW9ja3MuYWRiLmV4cGVjdHMoXCJzaGVsbFwiKVxyXG4gICAgICAub25jZSgpLndpdGhFeGFjdEFyZ3MoWydzdG9wJ10pO1xyXG4gICAgbW9ja3MuYWRiLmV4cGVjdHMoXCJzZXREZXZpY2VQcm9wZXJ0eVwiKVxyXG4gICAgICAub25jZSgpLndpdGhFeGFjdEFyZ3MoJ3N5cy5ib290X2NvbXBsZXRlZCcsIDApO1xyXG4gICAgbW9ja3MuYWRiLmV4cGVjdHMoXCJzaGVsbFwiKVxyXG4gICAgICAub25jZSgpLndpdGhFeGFjdEFyZ3MoWydzdGFydCddKTtcclxuICAgIG1vY2tzLmFkYi5leHBlY3RzKFwiZ2V0RGV2aWNlUHJvcGVydHlcIilcclxuICAgICAgLm9uY2UoKS53aXRoRXhhY3RBcmdzKCdzeXMuYm9vdF9jb21wbGV0ZWQnKVxyXG4gICAgICAucmV0dXJucygnMScpO1xyXG4gICAgbW9ja3MuQi5leHBlY3RzKFwiZGVsYXlcIilcclxuICAgICAgLm9uY2UoKS53aXRoRXhhY3RBcmdzKDIwMDApO1xyXG4gICAgYXdhaXQgYWRiLnJlYm9vdCgpLnNob3VsZC5ldmVudHVhbGx5Lm5vdC5iZS5yZWplY3RlZDtcclxuICAgIG1vY2tzLmFkYi52ZXJpZnkoKTtcclxuICAgIG1vY2tzLkIudmVyaWZ5KCk7XHJcbiAgfSk7XHJcbiAgaXQoJ2dldFJ1bm5pbmdBVkQgc2hvdWxkIGdldCBjb25uZWN0ZWQgYXZkJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgbGV0IHVkaWQgPSAnZW11bGF0b3ItNTU1NCc7XHJcbiAgICBsZXQgcG9ydCA9IDU1NTQ7XHJcbiAgICBsZXQgZW11bGF0b3IgPSB7dWRpZCwgcG9ydH07XHJcbiAgICBtb2Nrcy5hZGIuZXhwZWN0cyhcImdldENvbm5lY3RlZEVtdWxhdG9yc1wiKVxyXG4gICAgICAub25jZSgpLndpdGhFeGFjdEFyZ3MoKVxyXG4gICAgICAucmV0dXJucyhbZW11bGF0b3JdKTtcclxuICAgIG1vY2tzLmFkYi5leHBlY3RzKFwic2V0RW11bGF0b3JQb3J0XCIpXHJcbiAgICAgIC5vbmNlKCkud2l0aEV4YWN0QXJncyhwb3J0KTtcclxuICAgIG1vY2tzLmFkYi5leHBlY3RzKFwic2VuZFRlbG5ldENvbW1hbmRcIilcclxuICAgICAgLm9uY2UoKS53aXRoRXhhY3RBcmdzKFwiYXZkIG5hbWVcIilcclxuICAgICAgLnJldHVybnMoYXZkTmFtZSk7XHJcbiAgICBtb2Nrcy5hZGIuZXhwZWN0cyhcInNldERldmljZUlkXCIpXHJcbiAgICAgIC5vbmNlKCkud2l0aEV4YWN0QXJncyh1ZGlkKTtcclxuICAgIChhd2FpdCBhZGIuZ2V0UnVubmluZ0FWRChhdmROYW1lKSkuc2hvdWxkLmVxdWFsKGVtdWxhdG9yKTtcclxuICAgIG1vY2tzLmFkYi52ZXJpZnkoKTtcclxuICB9KTtcclxuICBpdCgnZ2V0UnVubmluZ0FWRCBzaG91bGQgcmV0dXJuIG51bGwgd2hlbiBleHBlY3RlZCBhdmQgaXMgbm90IGNvbm5lY3RlZCcsIGFzeW5jICgpID0+IHtcclxuICAgIGxldCB1ZGlkID0gJ2VtdWxhdG9yLTU1NTQnO1xyXG4gICAgbGV0IHBvcnQgPSA1NTU0O1xyXG4gICAgbGV0IGVtdWxhdG9yID0ge3VkaWQsIHBvcnR9O1xyXG4gICAgbW9ja3MuYWRiLmV4cGVjdHMoXCJnZXRDb25uZWN0ZWRFbXVsYXRvcnNcIilcclxuICAgICAgLm9uY2UoKS53aXRoRXhhY3RBcmdzKClcclxuICAgICAgLnJldHVybnMoW2VtdWxhdG9yXSk7XHJcbiAgICBtb2Nrcy5hZGIuZXhwZWN0cyhcInNldEVtdWxhdG9yUG9ydFwiKVxyXG4gICAgICAub25jZSgpLndpdGhFeGFjdEFyZ3MocG9ydCk7XHJcbiAgICBtb2Nrcy5hZGIuZXhwZWN0cyhcInNlbmRUZWxuZXRDb21tYW5kXCIpXHJcbiAgICAgIC5vbmNlKCkud2l0aEV4YWN0QXJncyhcImF2ZCBuYW1lXCIpXHJcbiAgICAgIC5yZXR1cm5zKCdPVEhFUl9BVkQnKTtcclxuICAgIGNoYWkuZXhwZWN0KGF3YWl0IGFkYi5nZXRSdW5uaW5nQVZEKGF2ZE5hbWUpKS50by5iZS5udWxsO1xyXG4gICAgbW9ja3MuYWRiLnZlcmlmeSgpO1xyXG4gIH0pO1xyXG4gIGl0KCdnZXRSdW5uaW5nQVZEIHNob3VsZCByZXR1cm4gbnVsbCB3aGVuIG5vIGF2ZCBpcyBjb25uZWN0ZWQnLCBhc3luYyAoKSA9PiB7XHJcbiAgICBtb2Nrcy5hZGIuZXhwZWN0cyhcImdldENvbm5lY3RlZEVtdWxhdG9yc1wiKVxyXG4gICAgICAub25jZSgpLndpdGhFeGFjdEFyZ3MoKVxyXG4gICAgICAucmV0dXJucyhbXSk7XHJcbiAgICBjaGFpLmV4cGVjdChhd2FpdCBhZGIuZ2V0UnVubmluZ0FWRChhdmROYW1lKSkudG8uYmUubnVsbDtcclxuICAgIG1vY2tzLmFkYi52ZXJpZnkoKTtcclxuICB9KTtcclxufSkpO1xyXG4iXSwic291cmNlUm9vdCI6Ii4uXFwuLlxcLi4ifQ==