UNPKG

appium-doctor

Version:

Test environment for fitness to run Appium

261 lines (205 loc) 21.4 kB
require('source-map-support').install(); '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 _appiumSupport = require('appium-support'); var _teen_process = require('teen_process'); var tp = _interopRequireWildcard(_teen_process); var _libNodeDetector = require('../lib/node-detector'); var _libNodeDetector2 = _interopRequireDefault(_libNodeDetector); var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _appiumTestSupport = require('appium-test-support'); _chai2['default'].should(); var expect = _chai2['default'].expect; describe('NodeDetector', (0, _appiumTestSupport.withMocks)({ fs: _appiumSupport.fs, tp: tp }, function (mocks, S) { it('retrieveInCommonPlaces - success', 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.fs.expects('exists').once().returns(_bluebird2['default'].resolve(true)); context$2$0.next = 3; return _regeneratorRuntime.awrap(_libNodeDetector2['default'].retrieveInCommonPlaces()); case 3: context$2$0.sent.should.equal('/usr/local/bin/node'); (0, _appiumTestSupport.verify)(mocks); case 5: case 'end': return context$2$0.stop(); } }, null, _this); }); it('retrieveInCommonPlaces - failure', 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.fs.expects('exists').twice().returns(_bluebird2['default'].resolve(false)); context$2$0.next = 3; return _regeneratorRuntime.awrap(_libNodeDetector2['default'].retrieveInCommonPlaces()); case 3: context$2$0.t0 = context$2$0.sent; expect(context$2$0.t0).to.be.a('null'); (0, _appiumTestSupport.verify)(mocks); case 6: case 'end': return context$2$0.stop(); } }, null, _this); }); // retrieveUsingWhichCommand var testRetrieveWithScript = function testRetrieveWithScript(method) { it(method + ' - success', 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: mocks.tp.expects('exec').once().returns(_bluebird2['default'].resolve({ stdout: '/a/b/c/d\n', stderr: '' })); mocks.fs.expects('exists').once().returns(_bluebird2['default'].resolve(true)); context$3$0.next = 4; return _regeneratorRuntime.awrap(_libNodeDetector2['default'][method]()); case 4: context$3$0.sent.should.equal('/a/b/c/d'); (0, _appiumTestSupport.verify)(mocks); case 6: case 'end': return context$3$0.stop(); } }, null, _this); }); it(method + ' - failure - path not found ', 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: mocks.tp.expects('exec').once().returns(_bluebird2['default'].resolve({ stdout: 'aaa not found\n', stderr: '' })); context$3$0.next = 3; return _regeneratorRuntime.awrap(_libNodeDetector2['default'][method]()); case 3: context$3$0.t0 = context$3$0.sent; expect(context$3$0.t0).to.be.a('null'); (0, _appiumTestSupport.verify)(mocks); case 6: case 'end': return context$3$0.stop(); } }, null, _this); }); it(method + ' - failure - path not exist', 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: mocks.tp.expects('exec').once().returns(_bluebird2['default'].resolve({ stdout: '/a/b/c/d\n', stderr: '' })); mocks.fs.expects('exists').once().returns(_bluebird2['default'].resolve(false)); context$3$0.next = 4; return _regeneratorRuntime.awrap(_libNodeDetector2['default'][method]()); case 4: context$3$0.t0 = context$3$0.sent; expect(context$3$0.t0).to.be.a('null'); case 6: case 'end': return context$3$0.stop(); } }, null, _this); }); }; testRetrieveWithScript('retrieveUsingWhichCommand'); testRetrieveWithScript('retrieveUsingAppleScript'); it('retrieveUsingAppiumConfigFile - success', 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.fs.expects('exists').twice().returns(_bluebird2['default'].resolve(true)); mocks.fs.expects('readFile').once().returns(_bluebird2['default'].resolve('{"node_bin": "/a/b/c/d"}')); context$2$0.next = 4; return _regeneratorRuntime.awrap(_libNodeDetector2['default'].retrieveUsingAppiumConfigFile()); case 4: context$2$0.sent.should.equal('/a/b/c/d'); (0, _appiumTestSupport.verify)(mocks); case 6: case 'end': return context$2$0.stop(); } }, null, _this); }); it('retrieveUsingAppiumConfigFile - failure - not json', 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.fs.expects('exists').once().returns(_bluebird2['default'].resolve(true)); mocks.fs.expects('readFile').once().returns(_bluebird2['default'].resolve('{node_bin: "/a/b/c/d"}')); context$2$0.next = 4; return _regeneratorRuntime.awrap(_libNodeDetector2['default'].retrieveUsingAppiumConfigFile()); case 4: context$2$0.t0 = context$2$0.sent; expect(context$2$0.t0).to.be.a('null'); (0, _appiumTestSupport.verify)(mocks); case 7: case 'end': return context$2$0.stop(); } }, null, _this); }); it('retrieveUsingAppiumConfigFile - failure - path does not exist', 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.fs.expects('exists').once().returns(_bluebird2['default'].resolve(true)); mocks.fs.expects('exists').once().returns(_bluebird2['default'].resolve(false)); mocks.fs.expects('readFile').once().returns(_bluebird2['default'].resolve('{"node_bin": "/a/b/c/d"}')); context$2$0.next = 5; return _regeneratorRuntime.awrap(_libNodeDetector2['default'].retrieveUsingAppiumConfigFile()); case 5: context$2$0.t0 = context$2$0.sent; expect(context$2$0.t0).to.be.a('null'); (0, _appiumTestSupport.verify)(mocks); case 8: case 'end': return context$2$0.stop(); } }, null, _this); }); it('checkForNodeBinary - success', 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.NodeDetector = S.sandbox.mock(_libNodeDetector2['default']); mocks.NodeDetector.expects('retrieveInCommonPlaces').once().returns(null); mocks.NodeDetector.expects('retrieveUsingWhichCommand').once().returns(null); mocks.NodeDetector.expects('retrieveUsingAppleScript').returns('/a/b/c/d'); mocks.NodeDetector.expects('retrieveUsingAppiumConfigFile').never(); context$2$0.next = 7; return _regeneratorRuntime.awrap(_libNodeDetector2['default'].detect()); case 7: context$2$0.sent.should.equal('/a/b/c/d'); (0, _appiumTestSupport.verify)(mocks); case 9: case 'end': return context$2$0.stop(); } }, null, _this); }); it('checkForNodeBinary - failure', 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.NodeDetector = S.sandbox.mock(_libNodeDetector2['default']); mocks.NodeDetector.expects('retrieveInCommonPlaces').once().returns(null); mocks.NodeDetector.expects('retrieveUsingWhichCommand').once().returns(null); mocks.NodeDetector.expects('retrieveUsingAppleScript').once().returns(null); mocks.NodeDetector.expects('retrieveUsingAppiumConfigFile').once().returns(null); context$2$0.next = 7; return _regeneratorRuntime.awrap(_libNodeDetector2['default'].detect()); case 7: context$2$0.t0 = context$2$0.sent; expect(context$2$0.t0).to.be.a('null'); (0, _appiumTestSupport.verify)(mocks); case 10: case 'end': return context$2$0.stop(); } }, null, _this); }); })); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3Qvbm9kZS1kZXRlY3Rvci1zcGVjcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7b0JBRWlCLE1BQU07Ozs7NkJBQ0osZ0JBQWdCOzs0QkFDZixjQUFjOztJQUF0QixFQUFFOzsrQkFDVyxzQkFBc0I7Ozs7d0JBQ2pDLFVBQVU7Ozs7aUNBQ1UscUJBQXFCOztBQUd2RCxrQkFBSyxNQUFNLEVBQUUsQ0FBQztBQUNkLElBQUksTUFBTSxHQUFHLGtCQUFLLE1BQU0sQ0FBQzs7QUFFekIsUUFBUSxDQUFDLGNBQWMsRUFBRSxrQ0FBVSxFQUFDLEVBQUUsbUJBQUEsRUFBRSxFQUFFLEVBQUYsRUFBRSxFQUFDLEVBQUUsVUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFLOztBQUUxRCxJQUFFLENBQUMsa0NBQWtDLEVBQUU7Ozs7QUFDcEMsZUFBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLHNCQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDOzsyQ0FDcEQsNkJBQWEsc0JBQXNCLEVBQUU7OzsyQkFDekMsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQkFBcUI7O0FBQ3JDLHlDQUFPLEtBQUssQ0FBQyxDQUFDOzs7Ozs7O0dBQ2YsQ0FBQyxDQUFDOztBQUVILElBQUUsQ0FBQyxrQ0FBa0MsRUFBRTs7OztBQUNyQyxlQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsc0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7OzJDQUNoRCw2QkFBYSxzQkFBc0IsRUFBRTs7OztBQUFsRCxnQkFBTSxpQkFBOEMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTTs7QUFDbEUseUNBQU8sS0FBSyxDQUFDLENBQUM7Ozs7Ozs7R0FDZixDQUFDLENBQUM7OztBQUdILE1BQUksc0JB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QyxDQUFDLENBQUMsTUFBTTs7QUFDbEQseUNBQU8sS0FBSyxDQUFDLENBQUM7Ozs7Ozs7R0FDZixDQUFDLENBQUM7Q0FFSixDQUFDLENBQUMsQ0FBQyIsImZpbGUiOiJ0ZXN0L25vZGUtZGV0ZWN0b3Itc3BlY3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bW9jaGFcblxuaW1wb3J0IGNoYWkgZnJvbSAnY2hhaSc7XG5pbXBvcnQgeyBmcyB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCAqIGFzIHRwIGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgTm9kZURldGVjdG9yIGZyb20gJy4uL2xpYi9ub2RlLWRldGVjdG9yJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IHdpdGhNb2NrcywgdmVyaWZ5IH0gZnJvbSAnYXBwaXVtLXRlc3Qtc3VwcG9ydCc7XG5cblxuY2hhaS5zaG91bGQoKTtcbmxldCBleHBlY3QgPSBjaGFpLmV4cGVjdDtcblxuZGVzY3JpYmUoJ05vZGVEZXRlY3RvcicsIHdpdGhNb2Nrcyh7ZnMsIHRwfSwgKG1vY2tzLCBTKSA9PiB7XG5cbiBpdCgncmV0cmlldmVJbkNvbW1vblBsYWNlcyAtIHN1Y2Nlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja3MuZnMuZXhwZWN0cygnZXhpc3RzJykub25jZSgpLnJldHVybnMoQi5yZXNvbHZlKHRydWUpKTtcbiAgICAoYXdhaXQgTm9kZURldGVjdG9yLnJldHJpZXZlSW5Db21tb25QbGFjZXMoKSlcbiAgICAgIC5zaG91bGQuZXF1YWwoJy91c3IvbG9jYWwvYmluL25vZGUnKTtcbiAgICB2ZXJpZnkobW9ja3MpO1xuICB9KTtcblxuICBpdCgncmV0cmlldmVJbkNvbW1vblBsYWNlcyAtIGZhaWx1cmUnLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja3MuZnMuZXhwZWN0cygnZXhpc3RzJykudHdpY2UoKS5yZXR1cm5zKEIucmVzb2x2ZShmYWxzZSkpO1xuICAgIGV4cGVjdChhd2FpdCBOb2RlRGV0ZWN0b3IucmV0cmlldmVJbkNvbW1vblBsYWNlcygpKS50by5iZS5hKCdudWxsJyk7XG4gICAgdmVyaWZ5KG1vY2tzKTtcbiAgfSk7XG5cbiAgLy8gcmV0cmlldmVVc2luZ1doaWNoQ29tbWFuZFxuICBsZXQgdGVzdFJldHJpZXZlV2l0aFNjcmlwdCA9IChtZXRob2QpID0+IHtcbiAgICBpdChtZXRob2QgKyAnIC0gc3VjY2VzcycsIGFzeW5jICgpID0+IHtcbiAgICAgIG1vY2tzLnRwLmV4cGVjdHMoJ2V4ZWMnKS5vbmNlKCkucmV0dXJucyhcbiAgICAgICAgQi5yZXNvbHZlKHtzdGRvdXQ6ICcvYS9iL2MvZFxcbicsIHN0ZGVycjogJyd9KSk7XG4gICAgICBtb2Nrcy5mcy5leHBlY3RzKCdleGlzdHMnKS5vbmNlKCkucmV0dXJucyhCLnJlc29sdmUodHJ1ZSkpO1xuICAgICAgKGF3YWl0IE5vZGVEZXRlY3RvclttZXRob2RdKCkpXG4gICAgICAgIC5zaG91bGQuZXF1YWwoJy9hL2IvYy9kJyk7XG4gICAgICB2ZXJpZnkobW9ja3MpO1xuICAgIH0pO1xuXG4gICAgaXQobWV0aG9kICsgJyAtIGZhaWx1cmUgLSBwYXRoIG5vdCBmb3VuZCAnLCBhc3luYyAoKSA9PiB7XG4gICAgICBtb2Nrcy50cC5leHBlY3RzKCdleGVjJykub25jZSgpLnJldHVybnMoXG4gICAgICAgIEIucmVzb2x2ZSh7c3Rkb3V0OiAnYWFhIG5vdCBmb3VuZFxcbicsIHN0ZGVycjogJyd9KSk7XG4gICAgICBleHBlY3QoYXdhaXQgTm9kZURldGVjdG9yW21ldGhvZF0oKSkudG8uYmUuYSgnbnVsbCcpO1xuICAgICAgdmVyaWZ5KG1vY2tzKTtcbiAgICB9KTtcbiAgICBpdChtZXRob2QgKyAnIC0gZmFpbHVyZSAtIHBhdGggbm90IGV4aXN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgbW9ja3MudHAuZXhwZWN0cygnZXhlYycpLm9uY2UoKS5yZXR1cm5zKFxuICAgICAgICBCLnJlc29sdmUoe3N0ZG91dDogJy9hL2IvYy9kXFxuJywgc3RkZXJyOiAnJ30pKTtcbiAgICAgIG1vY2tzLmZzLmV4cGVjdHMoJ2V4aXN0cycpLm9uY2UoKS5yZXR1cm5zKEIucmVzb2x2ZShmYWxzZSkpO1xuICAgICAgZXhwZWN0KGF3YWl0IE5vZGVEZXRlY3RvclttZXRob2RdKCkpLnRvLmJlLmEoJ251bGwnKTtcbiAgICB9KTtcbiAgfTtcblxuICB0ZXN0UmV0cmlldmVXaXRoU2NyaXB0KCdyZXRyaWV2ZVVzaW5nV2hpY2hDb21tYW5kJyk7XG4gIHRlc3RSZXRyaWV2ZVdpdGhTY3JpcHQoJ3JldHJpZXZlVXNpbmdBcHBsZVNjcmlwdCcpO1xuXG4gIGl0KCdyZXRyaWV2ZVVzaW5nQXBwaXVtQ29uZmlnRmlsZSAtIHN1Y2Nlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja3MuZnMuZXhwZWN0cygnZXhpc3RzJykudHdpY2UoKS5yZXR1cm5zKEIucmVzb2x2ZSh0cnVlKSk7XG4gICAgbW9ja3MuZnMuZXhwZWN0cygncmVhZEZpbGUnKS5vbmNlKCkucmV0dXJucyhcbiAgICAgIEIucmVzb2x2ZSgne1wibm9kZV9iaW5cIjogXCIvYS9iL2MvZFwifScpKTtcbiAgICAoYXdhaXQgTm9kZURldGVjdG9yLnJldHJpZXZlVXNpbmdBcHBpdW1Db25maWdGaWxlKCkpXG4gICAgICAuc2hvdWxkLmVxdWFsKCcvYS9iL2MvZCcpO1xuICAgIHZlcmlmeShtb2Nrcyk7XG4gIH0pO1xuXG4gIGl0KCdyZXRyaWV2ZVVzaW5nQXBwaXVtQ29uZmlnRmlsZSAtIGZhaWx1cmUgLSBub3QganNvbicsIGFzeW5jICgpID0+IHtcbiAgICBtb2Nrcy5mcy5leHBlY3RzKCdleGlzdHMnKS5vbmNlKCkucmV0dXJucyhCLnJlc29sdmUodHJ1ZSkpO1xuICAgIG1vY2tzLmZzLmV4cGVjdHMoJ3JlYWRGaWxlJykub25jZSgpLnJldHVybnMoXG4gICAgICBCLnJlc29sdmUoJ3tub2RlX2JpbjogXCIvYS9iL2MvZFwifScpKTtcbiAgICBleHBlY3QoYXdhaXQgTm9kZURldGVjdG9yLnJldHJpZXZlVXNpbmdBcHBpdW1Db25maWdGaWxlKCkpXG4gICAgICAudG8uYmUuYSgnbnVsbCcpO1xuICAgIHZlcmlmeShtb2Nrcyk7XG4gIH0pO1xuXG4gIGl0KCdyZXRyaWV2ZVVzaW5nQXBwaXVtQ29uZmlnRmlsZSAtIGZhaWx1cmUgLSBwYXRoIGRvZXMgbm90IGV4aXN0JywgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tzLmZzLmV4cGVjdHMoJ2V4aXN0cycpLm9uY2UoKS5yZXR1cm5zKEIucmVzb2x2ZSh0cnVlKSk7XG4gICAgbW9ja3MuZnMuZXhwZWN0cygnZXhpc3RzJykub25jZSgpLnJldHVybnMoQi5yZXNvbHZlKGZhbHNlKSk7XG4gICAgbW9ja3MuZnMuZXhwZWN0cygncmVhZEZpbGUnKS5vbmNlKCkucmV0dXJucyhcbiAgICAgIEIucmVzb2x2ZSgne1wibm9kZV9iaW5cIjogXCIvYS9iL2MvZFwifScpKTtcbiAgICBleHBlY3QoYXdhaXQgTm9kZURldGVjdG9yLnJldHJpZXZlVXNpbmdBcHBpdW1Db25maWdGaWxlKCkpXG4gICAgICAudG8uYmUuYSgnbnVsbCcpO1xuICAgIHZlcmlmeShtb2Nrcyk7XG4gIH0pO1xuXG4gIGl0KCdjaGVja0Zvck5vZGVCaW5hcnkgLSBzdWNjZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tzLk5vZGVEZXRlY3RvciA9IFMuc2FuZGJveC5tb2NrKE5vZGVEZXRlY3Rvcik7XG4gICAgbW9ja3MuTm9kZURldGVjdG9yLmV4cGVjdHMoJ3JldHJpZXZlSW5Db21tb25QbGFjZXMnKS5vbmNlKCkucmV0dXJucyhudWxsKTtcbiAgICBtb2Nrcy5Ob2RlRGV0ZWN0b3IuZXhwZWN0cygncmV0cmlldmVVc2luZ1doaWNoQ29tbWFuZCcpLm9uY2UoKS5yZXR1cm5zKG51bGwpO1xuICAgIG1vY2tzLk5vZGVEZXRlY3Rvci5leHBlY3RzKCdyZXRyaWV2ZVVzaW5nQXBwbGVTY3JpcHQnKS5yZXR1cm5zKCcvYS9iL2MvZCcpO1xuICAgIG1vY2tzLk5vZGVEZXRlY3Rvci5leHBlY3RzKCdyZXRyaWV2ZVVzaW5nQXBwaXVtQ29uZmlnRmlsZScpLm5ldmVyKCk7XG4gICAgKGF3YWl0IE5vZGVEZXRlY3Rvci5kZXRlY3QoKSkuc2hvdWxkLmVxdWFsKCcvYS9iL2MvZCcpO1xuICAgIHZlcmlmeShtb2Nrcyk7XG4gIH0pO1xuXG4gIGl0KCdjaGVja0Zvck5vZGVCaW5hcnkgLSBmYWlsdXJlJywgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tzLk5vZGVEZXRlY3RvciA9IFMuc2FuZGJveC5tb2NrKE5vZGVEZXRlY3Rvcik7XG4gICAgbW9ja3MuTm9kZURldGVjdG9yLmV4cGVjdHMoJ3JldHJpZXZlSW5Db21tb25QbGFjZXMnKS5vbmNlKCkucmV0dXJucyhudWxsKTtcbiAgICBtb2Nrcy5Ob2RlRGV0ZWN0b3IuZXhwZWN0cygncmV0cmlldmVVc2luZ1doaWNoQ29tbWFuZCcpLm9uY2UoKS5yZXR1cm5zKG51bGwpO1xuICAgIG1vY2tzLk5vZGVEZXRlY3Rvci5leHBlY3RzKCdyZXRyaWV2ZVVzaW5nQXBwbGVTY3JpcHQnKS5vbmNlKCkucmV0dXJucyhudWxsKTtcbiAgICBtb2Nrcy5Ob2RlRGV0ZWN0b3IuZXhwZWN0cygncmV0cmlldmVVc2luZ0FwcGl1bUNvbmZpZ0ZpbGUnKS5vbmNlKCkucmV0dXJucyhudWxsKTtcbiAgICBleHBlY3QoYXdhaXQgTm9kZURldGVjdG9yLmRldGVjdCgpKS50by5iZS5hKCdudWxsJyk7XG4gICAgdmVyaWZ5KG1vY2tzKTtcbiAgfSk7XG5cbn0pKTtcbiJdfQ==