appium-doctor
Version:
Test environment for fitness to run Appium
261 lines (205 loc) • 21.4 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 _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==