appium-espresso-driver 2.0.1 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/build/lib/driver.js +123 -35
- package/build/lib/server-builder.js +3 -2
- package/espresso-server/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk +0 -0
- package/espresso-server/app/build/outputs/apk/androidTest/debug/output-metadata.json +5 -3
- package/espresso-server/app/build.gradle.kts +18 -18
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/KReflectionUtilsTest.kt +4 -4
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileClickTest.kt +2 -2
- package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileSwipeTest.kt +3 -3
- package/espresso-server/build.gradle.kts +2 -1
- package/espresso-server/gradle/wrapper/gradle-wrapper.properties +1 -1
- package/lib/driver.js +132 -37
- package/lib/server-builder.js +2 -1
- package/npm-shrinkwrap.json +431 -586
- package/package.json +3 -3
|
@@ -171,7 +171,8 @@ class ServerBuilder {
|
|
|
171
171
|
|
|
172
172
|
const gradlebuild = new _teen_process.SubProcess(cmd, args, {
|
|
173
173
|
cwd: this.serverPath,
|
|
174
|
-
stdio: ['ignore', 'pipe', 'pipe']
|
|
174
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
175
|
+
windowsVerbatimArguments: true
|
|
175
176
|
});
|
|
176
177
|
let buildLastLines = [];
|
|
177
178
|
const logMsg = `Output from Gradle ${this.showGradleLog ? 'will' : 'will not'} be logged`;
|
|
@@ -211,4 +212,4 @@ var _default = ServerBuilder;
|
|
|
211
212
|
exports.default = _default;require('source-map-support').install();
|
|
212
213
|
|
|
213
214
|
|
|
214
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zZXJ2ZXItYnVpbGRlci5qcyJdLCJuYW1lcyI6WyJHUkFETEVfVkVSU0lPTl9LRVkiLCJHUkFETEVfVVJMX1BSRUZJWCIsIkdSQURMRV9VUkxfVEVNUExBVEUiLCJHUkFETEVfTUFYX0VSUk9SX0xPR19MSU5FUyIsIkRFUEVOREVOQ1lfUFJPUF9OQU1FUyIsIlZFUlNJT05fS0VZUyIsImdyYWRsZUxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImJ1aWxkU2VydmVyU2lnbmluZ0NvbmZpZyIsImFyZ3MiLCJ6aXBBbGlnbiIsImtleXN0b3JlRmlsZSIsImtleXN0b3JlUGFzc3dvcmQiLCJrZXlBbGlhcyIsImtleVBhc3N3b3JkIiwiU2VydmVyQnVpbGRlciIsImNvbnN0cnVjdG9yIiwic2VydmVyUGF0aCIsInNob3dHcmFkbGVMb2ciLCJidWlsZENvbmZpZ3VyYXRpb24iLCJ2ZXJzaW9uQ29uZmlndXJhdGlvbiIsInRvb2xzVmVyc2lvbnMiLCJzZXJ2ZXJWZXJzaW9ucyIsIl8iLCJyZWR1Y2UiLCJhY2MiLCJ2YWx1ZSIsImtleSIsImluY2x1ZGVzIiwibG9nIiwid2FybiIsInRlc3RBcHBQYWNrYWdlIiwic2lnbmluZ0NvbmZpZyIsInByb3BOYW1lIiwiYnVpbGQiLCJzZXRHcmFkbGVXcmFwcGVyVmVyc2lvbiIsImluc2VydEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMiLCJydW5CdWlsZFByb2Nlc3MiLCJnZXRDb21tYW5kIiwiY21kIiwic3lzdGVtIiwiaXNXaW5kb3dzIiwiYnVpbGRQcm9wZXJ0eSIsImZpbHRlciIsIm1hcCIsInNlcnZlclZlcnNpb24iLCJncmFkbGVQcm9wZXJ0eSIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJCb29sZWFuIiwicHVzaCIsImtleXMiLCJ1cHBlckZpcnN0IiwiayIsInYiLCJ2ZXJzaW9uIiwicHJvcGVydGllc1BhdGgiLCJwYXRoIiwicmVzb2x2ZSIsIm9yaWdpbmFsUHJvcGVydGllcyIsImZzIiwicmVhZEZpbGUiLCJuZXdQcm9wZXJ0aWVzIiwidXBkYXRlR3JhZGxlRGlzdFVybCIsIndyaXRlRmlsZSIsInByb3BlcnRpZXNDb250ZW50IiwicmVwbGFjZSIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsImhhc0FkZGl0aW9uYWxEZXBzIiwiaXNBcnJheSIsIkVycm9yIiwiaXNFbXB0eSIsImxpbmUiLCJ0cmltIiwiZGVwIiwidGVzdCIsImJ1aWxkUGF0aCIsImNvbmZpZ3VyYXRpb24iLCJwcmVmaXgiLCJkZXBzIiwiaW5mbyIsImRlYnVnIiwiam9pbiIsImdyYWRsZWJ1aWxkIiwiU3ViUHJvY2VzcyIsImN3ZCIsInN0ZGlvIiwiYnVpbGRMYXN0TGluZXMiLCJsb2dNc2ciLCJvbiIsInN0YXJ0c1dpdGgiLCJFT0wiLCJsZW5ndGgiLCJzdGFydCIsImVyciIsIm1zZyIsIm1lc3NhZ2UiLCJlcnJvckFuZFRocm93Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsa0JBQWtCLEdBQUcsUUFBM0I7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxrQkFBMUI7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxvRUFBNUI7O0FBQ0EsTUFBTUMsMEJBQTBCLEdBQUcsRUFBbkM7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxDQUFDLDJCQUFELEVBQThCLG1DQUE5QixDQUE5QjtBQUVBLE1BQU1DLFlBQVksR0FBRyxDQUNuQkwsa0JBRG1CLEVBRW5CLHFCQUZtQixFQUduQixZQUhtQixFQUluQixZQUptQixFQUtuQixRQUxtQixFQU1uQixXQU5tQixFQU9uQixRQVBtQixFQVFuQixxQkFSbUIsRUFTbkIscUJBVG1CLEVBVW5CLFdBVm1CLENBQXJCOzs7QUFhQSxNQUFNTSxTQUFTLEdBQUdDLGdCQUFPQyxTQUFQLENBQWlCLFFBQWpCLENBQWxCOztBQUVBLFNBQVNDLHdCQUFULENBQW1DQyxJQUFuQyxFQUF5QztBQUN2QyxTQUFPO0FBQ0xDLElB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cyc7XG5pbXBvcnQgeyBmcywgbG9nZ2VyLCBzeXN0ZW0gfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyB1cGRhdGVEZXBlbmRlbmN5TGluZXMgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgR1JBRExFX1ZFUlNJT05fS0VZID0gJ2dyYWRsZSc7XG5jb25zdCBHUkFETEVfVVJMX1BSRUZJWCA9ICdkaXN0cmlidXRpb25Vcmw9JztcbmNvbnN0IEdSQURMRV9VUkxfVEVNUExBVEUgPSAnaHR0cHNcXFxcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS1WRVJTSU9OLWFsbC56aXAnO1xuY29uc3QgR1JBRExFX01BWF9FUlJPUl9MT0dfTElORVMgPSAxNTtcbmNvbnN0IERFUEVOREVOQ1lfUFJPUF9OQU1FUyA9IFsnYWRkaXRpb25hbEFwcERlcGVuZGVuY2llcycsICdhZGRpdGlvbmFsQW5kcm9pZFRlc3REZXBlbmRlbmNpZXMnXTtcblxuY29uc3QgVkVSU0lPTl9LRVlTID0gW1xuICBHUkFETEVfVkVSU0lPTl9LRVksXG4gICdhbmRyb2lkR3JhZGxlUGx1Z2luJyxcbiAgJ2NvbXBpbGVTZGsnLFxuICAnYnVpbGRUb29scycsXG4gICdtaW5TZGsnLFxuICAndGFyZ2V0U2RrJyxcbiAgJ2tvdGxpbicsXG4gICdzb3VyY2VDb21wYXRpYmlsaXR5JyxcbiAgJ3RhcmdldENvbXBhdGliaWxpdHknLFxuICAnanZtVGFyZ2V0Jyxcbl07XG5cbmNvbnN0IGdyYWRsZUxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0dyYWRsZScpO1xuXG5mdW5jdGlvbiBidWlsZFNlcnZlclNpZ25pbmdDb25maWcgKGFyZ3MpIHtcbiAgcmV0dXJuIHtcbiAgICB6aXBBbGlnbjogdHJ1ZSxcbiAgICBrZXlzdG9yZUZpbGU6IGFyZ3Mua2V5c3RvcmVGaWxlLFxuICAgIGtleXN0b3JlUGFzc3dvcmQ6IGFyZ3Mua2V5c3RvcmVQYXNzd29yZCxcbiAgICBrZXlBbGlhczogYXJncy5rZXlBbGlhcyxcbiAgICBrZXlQYXNzd29yZDogYXJncy5rZXlQYXNzd29yZFxuICB9O1xufVxuXG5jbGFzcyBTZXJ2ZXJCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IgKGFyZ3MgPSB7fSkge1xuICAgIHRoaXMuc2VydmVyUGF0aCA9IGFyZ3Muc2VydmVyUGF0aDtcbiAgICB0aGlzLnNob3dHcmFkbGVMb2cgPSBhcmdzLnNob3dHcmFkbGVMb2c7XG5cbiAgICBjb25zdCBidWlsZENvbmZpZ3VyYXRpb24gPSBhcmdzLmJ1aWxkQ29uZmlndXJhdGlvbiB8fCB7fTtcblxuICAgIGNvbnN0IHZlcnNpb25Db25maWd1cmF0aW9uID0gYnVpbGRDb25maWd1cmF0aW9uLnRvb2xzVmVyc2lvbnMgfHwge307XG4gICAgdGhpcy5zZXJ2ZXJWZXJzaW9ucyA9IF8ucmVkdWNlKHZlcnNpb25Db25maWd1cmF0aW9uLCAoYWNjLCB2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBpZiAoVkVSU0lPTl9LRVlTLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy53YXJuKGBHb3QgdW5leHBlY3RlZCAnJHtrZXl9JyBpbiB0b29sc1ZlcnNpb24gYmxvY2sgb2YgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuXG4gICAgdGhpcy50ZXN0QXBwUGFja2FnZSA9IGFyZ3MudGVzdEFwcFBhY2thZ2U7XG4gICAgdGhpcy5zaWduaW5nQ29uZmlnID0gYXJncy5zaWduaW5nQ29uZmlnO1xuXG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBERVBFTkRFTkNZX1BST1BfTkFNRVMpIHtcbiAgICAgIHRoaXNbcHJvcE5hbWVdID0gYnVpbGRDb25maWd1cmF0aW9uW3Byb3BOYW1lXSB8fCBbXTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBidWlsZCAoKSB7XG4gICAgaWYgKHRoaXMuc2VydmVyVmVyc2lvbnNbR1JBRExFX1ZFUlNJT05fS0VZXSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRHcmFkbGVXcmFwcGVyVmVyc2lvbih0aGlzLnNlcnZlclZlcnNpb25zW0dSQURMRV9WRVJTSU9OX0tFWV0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuaW5zZXJ0QWRkaXRpb25hbERlcGVuZGVuY2llcygpO1xuXG4gICAgYXdhaXQgdGhpcy5ydW5CdWlsZFByb2Nlc3MoKTtcbiAgfVxuXG4gIGdldENvbW1hbmQgKCkge1xuICAgIGNvbnN0IGNtZCA9IHN5c3RlbS5pc1dpbmRvd3MoKSA/ICdncmFkbGV3LmJhdCcgOiAnLi9ncmFkbGV3JztcbiAgICBjb25zdCBidWlsZFByb3BlcnR5ID0gKGtleSwgdmFsdWUpID0+IHZhbHVlID8gYC1QJHtrZXl9PSR7dmFsdWV9YCA6IG51bGw7XG4gICAgbGV0IGFyZ3MgPSBWRVJTSU9OX0tFWVNcbiAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBHUkFETEVfVkVSU0lPTl9LRVkpXG4gICAgICAubWFwKChrZXkpID0+IHtcbiAgICAgICAgY29uc3Qgc2VydmVyVmVyc2lvbiA9IHRoaXMuc2VydmVyVmVyc2lvbnNba2V5XTtcbiAgICAgICAgY29uc3QgZ3JhZGxlUHJvcGVydHkgPSBgYXBwaXVtJHtrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHtrZXkuc2xpY2UoMSl9YDtcbiAgICAgICAgcmV0dXJuIGJ1aWxkUHJvcGVydHkoZ3JhZGxlUHJvcGVydHksIHNlcnZlclZlcnNpb24pO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICBpZiAodGhpcy5zaWduaW5nQ29uZmlnKSB7XG4gICAgICBhcmdzLnB1c2goLi4uKFxuICAgICAgICBfLmtleXModGhpcy5zaWduaW5nQ29uZmlnKVxuICAgICAgICAubWFwKChrZXkpID0+IFtgYXBwaXVtJHtfLnVwcGVyRmlyc3Qoa2V5KX1gLCB0aGlzLnNpZ25pbmdDb25maWdba2V5XV0pXG4gICAgICAgIC5tYXAoKFtrLCB2XSkgPT4gYnVpbGRQcm9wZXJ0eShrLCB2KSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGVzdEFwcFBhY2thZ2UpIHtcbiAgICAgIGFyZ3MucHVzaChidWlsZFByb3BlcnR5KCdhcHBpdW1UYXJnZXRQYWNrYWdlJywgdGhpcy50ZXN0QXBwUGFja2FnZSkpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ2FwcDphc3NlbWJsZUFuZHJvaWRUZXN0Jyk7XG5cbiAgICByZXR1cm4ge2NtZCwgYXJnc307XG4gIH1cblxuICBhc3luYyBzZXRHcmFkbGVXcmFwcGVyVmVyc2lvbiAodmVyc2lvbikge1xuICAgIGNvbnN0IHByb3BlcnRpZXNQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuc2VydmVyUGF0aCwgJ2dyYWRsZScsICd3cmFwcGVyJywgJ2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMnKTtcbiAgICBjb25zdCBvcmlnaW5hbFByb3BlcnRpZXMgPSBhd2FpdCBmcy5yZWFkRmlsZShwcm9wZXJ0aWVzUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBuZXdQcm9wZXJ0aWVzID0gdGhpcy51cGRhdGVHcmFkbGVEaXN0VXJsKG9yaWdpbmFsUHJvcGVydGllcywgdmVyc2lvbik7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHByb3BlcnRpZXNQYXRoLCBuZXdQcm9wZXJ0aWVzLCAndXRmOCcpO1xuICB9XG5cbiAgdXBkYXRlR3JhZGxlRGlzdFVybCAocHJvcGVydGllc0NvbnRlbnQsIHZlcnNpb24pIHtcbiAgICByZXR1cm4gcHJvcGVydGllc0NvbnRlbnQucmVwbGFjZShcbiAgICAgIG5ldyBSZWdFeHAoYF4oJHtfLmVzY2FwZVJlZ0V4cChHUkFETEVfVVJMX1BSRUZJWCl9KS4rJGAsICdnbScpLFxuICAgICAgYCQxJHtHUkFETEVfVVJMX1RFTVBMQVRFLnJlcGxhY2UoJ1ZFUlNJT04nLCB2ZXJzaW9uKX1gXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMgKCkge1xuICAgIGxldCBoYXNBZGRpdGlvbmFsRGVwcyA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgREVQRU5ERU5DWV9QUk9QX05BTUVTKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheSh0aGlzW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtwcm9wTmFtZX0nIG11c3QgYmUgYW4gYXJyYXlgKTtcbiAgICAgIH1cbiAgICAgIGlmIChfLmlzRW1wdHkodGhpc1twcm9wTmFtZV0uZmlsdGVyKChsaW5lKSA9PiBfLnRyaW0obGluZSkpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBkZXAgb2YgdGhpc1twcm9wTmFtZV0pIHtcbiAgICAgICAgaWYgKC9bXFxzJ1xcXFwkXS8udGVzdChkZXApKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaW5nbGUgcXVvdGVzLCBkb2xsYXIgY2hhcmFjdGVycyBhbmQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzJyArXG4gICAgICAgICAgICBgIGFyZSBkaXNhbGxvd2VkIGluIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzOiAke2RlcH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaGFzQWRkaXRpb25hbERlcHMgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWhhc0FkZGl0aW9uYWxEZXBzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuc2VydmVyUGF0aCwgJ2FwcCcsICdidWlsZC5ncmFkbGUua3RzJyk7XG4gICAgbGV0IGNvbmZpZ3VyYXRpb24gPSBhd2FpdCBmcy5yZWFkRmlsZShidWlsZFBhdGgsICd1dGY4Jyk7XG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBERVBFTkRFTkNZX1BST1BfTkFNRVMpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IHByb3BOYW1lID09PSBERVBFTkRFTkNZX1BST1BfTkFNRVNbMF1cbiAgICAgICAgPyAnaW1wbGVtZW50YXRpb24nXG4gICAgICAgIDogJ2FuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24nO1xuICAgICAgY29uc3QgZGVwcyA9IHRoaXNbcHJvcE5hbWVdXG4gICAgICAgIC5maWx0ZXIoKGxpbmUpID0+IF8udHJpbShsaW5lKSlcbiAgICAgICAgLm1hcCgobGluZSkgPT4gYCR7cHJlZml4fShcIiR7bGluZX1cIilgKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoZGVwcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxvZy5pbmZvKGBBZGRpbmcgdGhlIGZvbGxvd2luZyAke3Byb3BOYW1lfSB0byBidWlsZC5ncmFkbGUua3RzOiAke2RlcHN9YCk7XG4gICAgICBjb25maWd1cmF0aW9uID0gdXBkYXRlRGVwZW5kZW5jeUxpbmVzKGNvbmZpZ3VyYXRpb24sIHByb3BOYW1lLCBkZXBzKTtcbiAgICB9XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGJ1aWxkUGF0aCwgY29uZmlndXJhdGlvbiwgJ3V0ZjgnKTtcbiAgfVxuXG4gIGFzeW5jIHJ1bkJ1aWxkUHJvY2VzcyAoKSB7XG4gICAgY29uc3Qge2NtZCwgYXJnc30gPSB0aGlzLmdldENvbW1hbmQoKTtcbiAgICBsb2cuZGVidWcoYEJlZ2lubmluZyBidWlsZCB3aXRoIGNvbW1hbmQgJyR7Y21kfSAke2FyZ3Muam9pbignICcpfScgYCArXG4gICAgICBgaW4gZGlyZWN0b3J5ICcke3RoaXMuc2VydmVyUGF0aH0nYCk7XG4gICAgY29uc3QgZ3JhZGxlYnVpbGQgPSBuZXcgU3ViUHJvY2VzcyhjbWQsIGFyZ3MsIHtcbiAgICAgIGN3ZDogdGhpcy5zZXJ2ZXJQYXRoLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIGxldCBidWlsZExhc3RMaW5lcyA9IFtdO1xuXG4gICAgY29uc3QgbG9nTXNnID0gYE91dHB1dCBmcm9tIEdyYWRsZSAke3RoaXMuc2hvd0dyYWRsZUxvZyA/ICd3aWxsJyA6ICd3aWxsIG5vdCd9IGJlIGxvZ2dlZGA7XG4gICAgbG9nLmRlYnVnKGAke2xvZ01zZ30uIFRvIGNoYW5nZSB0aGlzLCB1c2UgJ3Nob3dHcmFkbGVMb2cnIGRlc2lyZWQgY2FwYWJpbGl0eWApO1xuICAgIGdyYWRsZWJ1aWxkLm9uKCdzdHJlYW0tbGluZScsIChsaW5lKSA9PiB7XG4gICAgICBpZiAodGhpcy5zaG93R3JhZGxlTG9nKSB7XG4gICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJ1tTVERFUlJdJykpIHtcbiAgICAgICAgICBncmFkbGVMb2cud2FybihsaW5lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncmFkbGVMb2cuaW5mbyhsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnVpbGRMYXN0TGluZXMucHVzaChgJHtFT0x9JHtsaW5lfWApO1xuICAgICAgaWYgKGJ1aWxkTGFzdExpbmVzLmxlbmd0aCA+IEdSQURMRV9NQVhfRVJST1JfTE9HX0xJTkVTKSB7XG4gICAgICAgIGJ1aWxkTGFzdExpbmVzID0gYnVpbGRMYXN0TGluZXMuc2xpY2UoLUdSQURMRV9NQVhfRVJST1JfTE9HX0xJTkVTKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBncmFkbGVidWlsZC5zdGFydCgpO1xuICAgICAgYXdhaXQgZ3JhZGxlYnVpbGQuam9pbigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbGV0IG1zZyA9IGBVbmFibGUgdG8gYnVpbGQgRXNwcmVzc28gc2VydmVyIC0gJHtlcnIubWVzc2FnZX1cXG5gICtcbiAgICAgICAgYEdyYWRsZSBlcnJvciBtZXNzYWdlOiR7RU9MfSR7YnVpbGRMYXN0TGluZXN9YDtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KG1zZyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFNlcnZlckJ1aWxkZXIsIFZFUlNJT05fS0VZUywgR1JBRExFX1VSTF9URU1QTEFURSwgYnVpbGRTZXJ2ZXJTaWduaW5nQ29uZmlnIH07XG5leHBvcnQgZGVmYXVsdCBTZXJ2ZXJCdWlsZGVyO1xuIl0sImZpbGUiOiJsaWIvc2VydmVyLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
215
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zZXJ2ZXItYnVpbGRlci5qcyJdLCJuYW1lcyI6WyJHUkFETEVfVkVSU0lPTl9LRVkiLCJHUkFETEVfVVJMX1BSRUZJWCIsIkdSQURMRV9VUkxfVEVNUExBVEUiLCJHUkFETEVfTUFYX0VSUk9SX0xPR19MSU5FUyIsIkRFUEVOREVOQ1lfUFJPUF9OQU1FUyIsIlZFUlNJT05fS0VZUyIsImdyYWRsZUxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImJ1aWxkU2VydmVyU2lnbmluZ0NvbmZpZyIsImFyZ3MiLCJ6aXBBbGlnbiIsImtleXN0b3JlRmlsZSIsImtleXN0b3JlUGFzc3dvcmQiLCJrZXlBbGlhcyIsImtleVBhc3N3b3JkIiwiU2VydmVyQnVpbGRlciIsImNvbnN0cnVjdG9yIiwic2VydmVyUGF0aCIsInNob3dHcmFkbGVMb2ciLCJidWlsZENvbmZpZ3VyYXRpb24iLCJ2ZXJzaW9uQ29uZmlndXJhdGlvbiIsInRvb2xzVmVyc2lvbnMiLCJzZXJ2ZXJWZXJzaW9ucyIsIl8iLCJyZWR1Y2UiLCJhY2MiLCJ2YWx1ZSIsImtleSIsImluY2x1ZGVzIiwibG9nIiwid2FybiIsInRlc3RBcHBQYWNrYWdlIiwic2lnbmluZ0NvbmZpZyIsInByb3BOYW1lIiwiYnVpbGQiLCJzZXRHcmFkbGVXcmFwcGVyVmVyc2lvbiIsImluc2VydEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMiLCJydW5CdWlsZFByb2Nlc3MiLCJnZXRDb21tYW5kIiwiY21kIiwic3lzdGVtIiwiaXNXaW5kb3dzIiwiYnVpbGRQcm9wZXJ0eSIsImZpbHRlciIsIm1hcCIsInNlcnZlclZlcnNpb24iLCJncmFkbGVQcm9wZXJ0eSIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJCb29sZWFuIiwicHVzaCIsImtleXMiLCJ1cHBlckZpcnN0IiwiayIsInYiLCJ2ZXJzaW9uIiwicHJvcGVydGllc1BhdGgiLCJwYXRoIiwicmVzb2x2ZSIsIm9yaWdpbmFsUHJvcGVydGllcyIsImZzIiwicmVhZEZpbGUiLCJuZXdQcm9wZXJ0aWVzIiwidXBkYXRlR3JhZGxlRGlzdFVybCIsIndyaXRlRmlsZSIsInByb3BlcnRpZXNDb250ZW50IiwicmVwbGFjZSIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsImhhc0FkZGl0aW9uYWxEZXBzIiwiaXNBcnJheSIsIkVycm9yIiwiaXNFbXB0eSIsImxpbmUiLCJ0cmltIiwiZGVwIiwidGVzdCIsImJ1aWxkUGF0aCIsImNvbmZpZ3VyYXRpb24iLCJwcmVmaXgiLCJkZXBzIiwiaW5mbyIsImRlYnVnIiwiam9pbiIsImdyYWRsZWJ1aWxkIiwiU3ViUHJvY2VzcyIsImN3ZCIsInN0ZGlvIiwid2luZG93c1ZlcmJhdGltQXJndW1lbnRzIiwiYnVpbGRMYXN0TGluZXMiLCJsb2dNc2ciLCJvbiIsInN0YXJ0c1dpdGgiLCJFT0wiLCJsZW5ndGgiLCJzdGFydCIsImVyciIsIm1zZyIsIm1lc3NhZ2UiLCJlcnJvckFuZFRocm93Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsa0JBQWtCLEdBQUcsUUFBM0I7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxrQkFBMUI7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxvRUFBNUI7O0FBQ0EsTUFBTUMsMEJBQTBCLEdBQUcsRUFBbkM7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxDQUFDLDJCQUFELEVBQThCLG1DQUE5QixDQUE5QjtBQUVBLE1BQU1DLFlBQVksR0FBRyxDQUNuQkwsa0JBRG1CLEVBRW5CLHFCQUZtQixFQUduQixZQUhtQixFQUluQixZQUptQixFQUtuQixRQUxtQixFQU1uQixXQU5tQixFQU9uQixRQVBtQixFQVFuQixxQkFSbUIsRUFTbkIscUJBVG1CLEVBVW5CLFdBVm1CLENBQXJCOzs7QUFhQSxNQUFNTSxTQUFTLEdBQUdDLGdCQUFPQyxTQUFQLENBQWlCLFFBQWpCLENBQWxCOztBQUVBLFNBQVNDLHdCQUFULENBQW1DQyxJQUFu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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBmcywgbG9nZ2VyLCBzeXN0ZW0gfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyB1cGRhdGVEZXBlbmRlbmN5TGluZXMgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgR1JBRExFX1ZFUlNJT05fS0VZID0gJ2dyYWRsZSc7XG5jb25zdCBHUkFETEVfVVJMX1BSRUZJWCA9ICdkaXN0cmlidXRpb25Vcmw9JztcbmNvbnN0IEdSQURMRV9VUkxfVEVNUExBVEUgPSAnaHR0cHNcXFxcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS1WRVJTSU9OLWFsbC56aXAnO1xuY29uc3QgR1JBRExFX01BWF9FUlJPUl9MT0dfTElORVMgPSAxNTtcbmNvbnN0IERFUEVOREVOQ1lfUFJPUF9OQU1FUyA9IFsnYWRkaXRpb25hbEFwcERlcGVuZGVuY2llcycsICdhZGRpdGlvbmFsQW5kcm9pZFRlc3REZXBlbmRlbmNpZXMnXTtcblxuY29uc3QgVkVSU0lPTl9LRVlTID0gW1xuICBHUkFETEVfVkVSU0lPTl9LRVksXG4gICdhbmRyb2lkR3JhZGxlUGx1Z2luJyxcbiAgJ2NvbXBpbGVTZGsnLFxuICAnYnVpbGRUb29scycsXG4gICdtaW5TZGsnLFxuICAndGFyZ2V0U2RrJyxcbiAgJ2tvdGxpbicsXG4gICdzb3VyY2VDb21wYXRpYmlsaXR5JyxcbiAgJ3RhcmdldENvbXBhdGliaWxpdHknLFxuICAnanZtVGFyZ2V0J1xuXTtcblxuY29uc3QgZ3JhZGxlTG9nID0gbG9nZ2VyLmdldExvZ2dlcignR3JhZGxlJyk7XG5cbmZ1bmN0aW9uIGJ1aWxkU2VydmVyU2lnbmluZ0NvbmZpZyAoYXJncykge1xuICByZXR1cm4ge1xuICAgIHppcEFsaWduOiB0cnVlLFxuICAgIGtleXN0b3JlRmlsZTogYXJncy5rZXlzdG9yZUZpbGUsXG4gICAga2V5c3RvcmVQYXNzd29yZDogYXJncy5rZXlzdG9yZVBhc3N3b3JkLFxuICAgIGtleUFsaWFzOiBhcmdzLmtleUFsaWFzLFxuICAgIGtleVBhc3N3b3JkOiBhcmdzLmtleVBhc3N3b3JkXG4gIH07XG59XG5cbmNsYXNzIFNlcnZlckJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvciAoYXJncyA9IHt9KSB7XG4gICAgdGhpcy5zZXJ2ZXJQYXRoID0gYXJncy5zZXJ2ZXJQYXRoO1xuICAgIHRoaXMuc2hvd0dyYWRsZUxvZyA9IGFyZ3Muc2hvd0dyYWRsZUxvZztcblxuICAgIGNvbnN0IGJ1aWxkQ29uZmlndXJhdGlvbiA9IGFyZ3MuYnVpbGRDb25maWd1cmF0aW9uIHx8IHt9O1xuXG4gICAgY29uc3QgdmVyc2lvbkNvbmZpZ3VyYXRpb24gPSBidWlsZENvbmZpZ3VyYXRpb24udG9vbHNWZXJzaW9ucyB8fCB7fTtcbiAgICB0aGlzLnNlcnZlclZlcnNpb25zID0gXy5yZWR1Y2UodmVyc2lvbkNvbmZpZ3VyYXRpb24sIChhY2MsIHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGlmIChWRVJTSU9OX0tFWVMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLndhcm4oYEdvdCB1bmV4cGVjdGVkICcke2tleX0nIGluIHRvb2xzVmVyc2lvbiBibG9jayBvZiB0aGUgYnVpbGQgY29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICB0aGlzLnRlc3RBcHBQYWNrYWdlID0gYXJncy50ZXN0QXBwUGFja2FnZTtcbiAgICB0aGlzLnNpZ25pbmdDb25maWcgPSBhcmdzLnNpZ25pbmdDb25maWc7XG5cbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIERFUEVOREVOQ1lfUFJPUF9OQU1FUykge1xuICAgICAgdGhpc1twcm9wTmFtZV0gPSBidWlsZENvbmZpZ3VyYXRpb25bcHJvcE5hbWVdIHx8IFtdO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGJ1aWxkICgpIHtcbiAgICBpZiAodGhpcy5zZXJ2ZXJWZXJzaW9uc1tHUkFETEVfVkVSU0lPTl9LRVldKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldEdyYWRsZVdyYXBwZXJWZXJzaW9uKHRoaXMuc2VydmVyVmVyc2lvbnNbR1JBRExFX1ZFUlNJT05fS0VZXSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pbnNlcnRBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKCk7XG5cbiAgICBhd2FpdCB0aGlzLnJ1bkJ1aWxkUHJvY2VzcygpO1xuICB9XG5cbiAgZ2V0Q29tbWFuZCAoKSB7XG4gICAgY29uc3QgY21kID0gc3lzdGVtLmlzV2luZG93cygpID8gJ2dyYWRsZXcuYmF0JyA6ICcuL2dyYWRsZXcnO1xuICAgIGNvbnN0IGJ1aWxkUHJvcGVydHkgPSAoa2V5LCB2YWx1ZSkgPT4gdmFsdWUgPyBgLVAke2tleX09JHt2YWx1ZX1gIDogbnVsbDtcbiAgICBsZXQgYXJncyA9IFZFUlNJT05fS0VZU1xuICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09IEdSQURMRV9WRVJTSU9OX0tFWSlcbiAgICAgIC5tYXAoKGtleSkgPT4ge1xuICAgICAgICBjb25zdCBzZXJ2ZXJWZXJzaW9uID0gdGhpcy5zZXJ2ZXJWZXJzaW9uc1trZXldO1xuICAgICAgICBjb25zdCBncmFkbGVQcm9wZXJ0eSA9IGBhcHBpdW0ke2tleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke2tleS5zbGljZSgxKX1gO1xuICAgICAgICByZXR1cm4gYnVpbGRQcm9wZXJ0eShncmFkbGVQcm9wZXJ0eSwgc2VydmVyVmVyc2lvbik7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcblxuICAgIGlmICh0aGlzLnNpZ25pbmdDb25maWcpIHtcbiAgICAgIGFyZ3MucHVzaCguLi4oXG4gICAgICAgIF8ua2V5cyh0aGlzLnNpZ25pbmdDb25maWcpXG4gICAgICAgIC5tYXAoKGtleSkgPT4gW2BhcHBpdW0ke18udXBwZXJGaXJzdChrZXkpfWAsIHRoaXMuc2lnbmluZ0NvbmZpZ1trZXldXSlcbiAgICAgICAgLm1hcCgoW2ssIHZdKSA9PiBidWlsZFByb3BlcnR5KGssIHYpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICApKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXN0QXBwUGFja2FnZSkge1xuICAgICAgYXJncy5wdXNoKGJ1aWxkUHJvcGVydHkoJ2FwcGl1bVRhcmdldFBhY2thZ2UnLCB0aGlzLnRlc3RBcHBQYWNrYWdlKSk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnYXBwOmFzc2VtYmxlQW5kcm9pZFRlc3QnKTtcblxuICAgIHJldHVybiB7Y21kLCBhcmdzfTtcbiAgfVxuXG4gIGFzeW5jIHNldEdyYWRsZVdyYXBwZXJWZXJzaW9uICh2ZXJzaW9uKSB7XG4gICAgY29uc3QgcHJvcGVydGllc1BhdGggPSBwYXRoLnJlc29sdmUodGhpcy5zZXJ2ZXJQYXRoLCAnZ3JhZGxlJywgJ3dyYXBwZXInLCAnZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcycpO1xuICAgIGNvbnN0IG9yaWdpbmFsUHJvcGVydGllcyA9IGF3YWl0IGZzLnJlYWRGaWxlKHByb3BlcnRpZXNQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG5ld1Byb3BlcnRpZXMgPSB0aGlzLnVwZGF0ZUdyYWRsZURpc3RVcmwob3JpZ2luYWxQcm9wZXJ0aWVzLCB2ZXJzaW9uKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocHJvcGVydGllc1BhdGgsIG5ld1Byb3BlcnRpZXMsICd1dGY4Jyk7XG4gIH1cblxuICB1cGRhdGVHcmFkbGVEaXN0VXJsIChwcm9wZXJ0aWVzQ29udGVudCwgdmVyc2lvbikge1xuICAgIHJldHVybiBwcm9wZXJ0aWVzQ29udGVudC5yZXBsYWNlKFxuICAgICAgbmV3IFJlZ0V4cChgXigke18uZXNjYXBlUmVnRXhwKEdSQURMRV9VUkxfUFJFRklYKX0pLiskYCwgJ2dtJyksXG4gICAgICBgJDEke0dSQURMRV9VUkxfVEVNUExBVEUucmVwbGFjZSgnVkVSU0lPTicsIHZlcnNpb24pfWBcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaW5zZXJ0QWRkaXRpb25hbERlcGVuZGVuY2llcyAoKSB7XG4gICAgbGV0IGhhc0FkZGl0aW9uYWxEZXBzID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBERVBFTkRFTkNZX1BST1BfTkFNRVMpIHtcbiAgICAgIGlmICghXy5pc0FycmF5KHRoaXNbcHJvcE5hbWVdKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3Byb3BOYW1lfScgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNFbXB0eSh0aGlzW3Byb3BOYW1lXS5maWx0ZXIoKGxpbmUpID0+IF8udHJpbShsaW5lKSkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGRlcCBvZiB0aGlzW3Byb3BOYW1lXSkge1xuICAgICAgICBpZiAoL1tcXHMnXFxcXCRdLy50ZXN0KGRlcCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpbmdsZSBxdW90ZXMsIGRvbGxhciBjaGFyYWN0ZXJzIGFuZCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMnICtcbiAgICAgICAgICAgIGAgYXJlIGRpc2FsbG93ZWQgaW4gYWRkaXRpb25hbCBkZXBlbmRlbmNpZXM6ICR7ZGVwfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBoYXNBZGRpdGlvbmFsRGVwcyA9IHRydWU7XG4gICAgfVxuICAgIGlmICghaGFzQWRkaXRpb25hbERlcHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZFBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5zZXJ2ZXJQYXRoLCAnYXBwJywgJ2J1aWxkLmdyYWRsZS5rdHMnKTtcbiAgICBsZXQgY29uZmlndXJhdGlvbiA9IGF3YWl0IGZzLnJlYWRGaWxlKGJ1aWxkUGF0aCwgJ3V0ZjgnKTtcbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIERFUEVOREVOQ1lfUFJPUF9OQU1FUykge1xuICAgICAgY29uc3QgcHJlZml4ID0gcHJvcE5hbWUgPT09IERFUEVOREVOQ1lfUFJPUF9OQU1FU1swXVxuICAgICAgICA/ICdpbXBsZW1lbnRhdGlvbidcbiAgICAgICAgOiAnYW5kcm9pZFRlc3RJbXBsZW1lbnRhdGlvbic7XG4gICAgICBjb25zdCBkZXBzID0gdGhpc1twcm9wTmFtZV1cbiAgICAgICAgLmZpbHRlcigobGluZSkgPT4gXy50cmltKGxpbmUpKVxuICAgICAgICAubWFwKChsaW5lKSA9PiBgJHtwcmVmaXh9KFwiJHtsaW5lfVwiKWApO1xuICAgICAgaWYgKF8uaXNFbXB0eShkZXBzKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbG9nLmluZm8oYEFkZGluZyB0aGUgZm9sbG93aW5nICR7cHJvcE5hbWV9IHRvIGJ1aWxkLmdyYWRsZS5rdHM6ICR7ZGVwc31gKTtcbiAgICAgIGNvbmZpZ3VyYXRpb24gPSB1cGRhdGVEZXBlbmRlbmN5TGluZXMoY29uZmlndXJhdGlvbiwgcHJvcE5hbWUsIGRlcHMpO1xuICAgIH1cbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoYnVpbGRQYXRoLCBjb25maWd1cmF0aW9uLCAndXRmOCcpO1xuICB9XG5cbiAgYXN5bmMgcnVuQnVpbGRQcm9jZXNzICgpIHtcbiAgICBjb25zdCB7Y21kLCBhcmdzfSA9IHRoaXMuZ2V0Q29tbWFuZCgpO1xuICAgIGxvZy5kZWJ1ZyhgQmVnaW5uaW5nIGJ1aWxkIHdpdGggY29tbWFuZCAnJHtjbWR9ICR7YXJncy5qb2luKCcgJyl9JyBgICtcbiAgICAgIGBpbiBkaXJlY3RvcnkgJyR7dGhpcy5zZXJ2ZXJQYXRofSdgKTtcbiAgICBjb25zdCBncmFkbGVidWlsZCA9IG5ldyBTdWJQcm9jZXNzKGNtZCwgYXJncywge1xuICAgICAgY3dkOiB0aGlzLnNlcnZlclBhdGgsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgICB3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHM6IHRydWVcbiAgICB9KTtcbiAgICBsZXQgYnVpbGRMYXN0TGluZXMgPSBbXTtcblxuICAgIGNvbnN0IGxvZ01zZyA9IGBPdXRwdXQgZnJvbSBHcmFkbGUgJHt0aGlzLnNob3dHcmFkbGVMb2cgPyAnd2lsbCcgOiAnd2lsbCBub3QnfSBiZSBsb2dnZWRgO1xuICAgIGxvZy5kZWJ1ZyhgJHtsb2dNc2d9LiBUbyBjaGFuZ2UgdGhpcywgdXNlICdzaG93R3JhZGxlTG9nJyBkZXNpcmVkIGNhcGFiaWxpdHlgKTtcbiAgICBncmFkbGVidWlsZC5vbignc3RyZWFtLWxpbmUnLCAobGluZSkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2hvd0dyYWRsZUxvZykge1xuICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCdbU1RERVJSXScpKSB7XG4gICAgICAgICAgZ3JhZGxlTG9nLndhcm4obGluZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JhZGxlTG9nLmluZm8obGluZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJ1aWxkTGFzdExpbmVzLnB1c2goYCR7RU9MfSR7bGluZX1gKTtcbiAgICAgIGlmIChidWlsZExhc3RMaW5lcy5sZW5ndGggPiBHUkFETEVfTUFYX0VSUk9SX0xPR19MSU5FUykge1xuICAgICAgICBidWlsZExhc3RMaW5lcyA9IGJ1aWxkTGFzdExpbmVzLnNsaWNlKC1HUkFETEVfTUFYX0VSUk9SX0xPR19MSU5FUyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZ3JhZGxlYnVpbGQuc3RhcnQoKTtcbiAgICAgIGF3YWl0IGdyYWRsZWJ1aWxkLmpvaW4oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxldCBtc2cgPSBgVW5hYmxlIHRvIGJ1aWxkIEVzcHJlc3NvIHNlcnZlciAtICR7ZXJyLm1lc3NhZ2V9XFxuYCArXG4gICAgICAgIGBHcmFkbGUgZXJyb3IgbWVzc2FnZToke0VPTH0ke2J1aWxkTGFzdExpbmVzfWA7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhtc2cpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBTZXJ2ZXJCdWlsZGVyLCBWRVJTSU9OX0tFWVMsIEdSQURMRV9VUkxfVEVNUExBVEUsIGJ1aWxkU2VydmVyU2lnbmluZ0NvbmZpZyB9O1xuZXhwb3J0IGRlZmF1bHQgU2VydmVyQnVpbGRlcjtcbiJdLCJmaWxlIjoibGliL3NlcnZlci1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|
|
Binary file
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version":
|
|
2
|
+
"version": 3,
|
|
3
3
|
"artifactType": {
|
|
4
4
|
"type": "APK",
|
|
5
5
|
"kind": "Directory"
|
|
6
6
|
},
|
|
7
7
|
"applicationId": "io.appium.espressoserver.test",
|
|
8
|
-
"variantName": "
|
|
8
|
+
"variantName": "debugAndroidTest",
|
|
9
9
|
"elements": [
|
|
10
10
|
{
|
|
11
11
|
"type": "SINGLE",
|
|
12
12
|
"filters": [],
|
|
13
|
+
"attributes": [],
|
|
13
14
|
"versionCode": 0,
|
|
14
15
|
"versionName": "",
|
|
15
16
|
"outputFile": "app-debug-androidTest.apk"
|
|
16
17
|
}
|
|
17
|
-
]
|
|
18
|
+
],
|
|
19
|
+
"elementType": "File"
|
|
18
20
|
}
|
|
@@ -4,8 +4,8 @@ plugins {
|
|
|
4
4
|
}
|
|
5
5
|
|
|
6
6
|
android {
|
|
7
|
-
|
|
8
|
-
buildToolsVersion
|
|
7
|
+
compileSdk = getIntProperty("appiumCompileSdk", 30)
|
|
8
|
+
buildToolsVersion = getStringProperty("appiumBuildTools", "30.0.3")
|
|
9
9
|
defaultConfig {
|
|
10
10
|
// <instrumentation android:targetPackage=""/>
|
|
11
11
|
applicationId = getStringProperty("appiumTargetPackage", "io.appium.espressoserver")
|
|
@@ -13,8 +13,8 @@ android {
|
|
|
13
13
|
testApplicationId = "io.appium.espressoserver.test"
|
|
14
14
|
testHandleProfiling = false
|
|
15
15
|
testFunctionalTest = false
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
minSdk = getIntProperty("appiumMinSdk", 21)
|
|
17
|
+
targetSdk = getIntProperty("appiumTargetSdk", 28)
|
|
18
18
|
versionCode = 1
|
|
19
19
|
versionName = "1.0"
|
|
20
20
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
|
@@ -22,7 +22,7 @@ android {
|
|
|
22
22
|
|
|
23
23
|
buildTypes {
|
|
24
24
|
getByName("debug") {
|
|
25
|
-
|
|
25
|
+
isZipAlignEnabled = getBooleanProperty("appiumZipAlign", true)
|
|
26
26
|
}
|
|
27
27
|
getByName("release") {
|
|
28
28
|
isMinifyEnabled = false
|
|
@@ -43,19 +43,19 @@ android {
|
|
|
43
43
|
signingConfigs {
|
|
44
44
|
getByName("debug") {
|
|
45
45
|
findProperty("appiumKeystoreFile")?.also {
|
|
46
|
-
storeFile
|
|
46
|
+
storeFile = File(it.toString())
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
findProperty("appiumKeystorePassword")?.also {
|
|
50
|
-
storePassword
|
|
50
|
+
storePassword = it.toString()
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
findProperty("appiumKeyAlias")?.also {
|
|
54
|
-
keyAlias
|
|
54
|
+
keyAlias = it.toString()
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
findProperty("appiumKeyPassword")?.also {
|
|
58
|
-
keyPassword
|
|
58
|
+
keyPassword = it.toString()
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
}
|
|
@@ -80,7 +80,7 @@ android {
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
packagingOptions {
|
|
83
|
-
|
|
83
|
+
resources.excludes.add("META-INF/**")
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
|
|
@@ -140,17 +140,17 @@ tasks.withType<Test> {
|
|
|
140
140
|
|
|
141
141
|
object Version {
|
|
142
142
|
const val kotlin = "1.5.10"
|
|
143
|
-
const val espresso = "3.
|
|
144
|
-
const val testlib = "1.
|
|
145
|
-
const val mocklib = "
|
|
146
|
-
const val gson = "2.8.
|
|
143
|
+
const val espresso = "3.4.0"
|
|
144
|
+
const val testlib = "1.4.0"
|
|
145
|
+
const val mocklib = "2.0.9"
|
|
146
|
+
const val gson = "2.8.9"
|
|
147
147
|
const val uia = "2.2.0"
|
|
148
148
|
const val nanohttpd = "2.3.1"
|
|
149
|
-
const val annotation = "1.
|
|
150
|
-
const val mockito = "
|
|
149
|
+
const val annotation = "1.3.0"
|
|
150
|
+
const val mockito = "4.0.0"
|
|
151
151
|
const val robolectric = "4.5.1"
|
|
152
|
-
const val junit = "4.13"
|
|
153
|
-
const val compose = "1.0.
|
|
152
|
+
const val junit = "4.13.2"
|
|
153
|
+
const val compose = "1.0.5"
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
fun Project.getStringProperty(name: String, default: String): String =
|
|
@@ -19,7 +19,7 @@ import kotlin.test.assertTrue
|
|
|
19
19
|
class `KReflectionUtils Test` {
|
|
20
20
|
|
|
21
21
|
@Test
|
|
22
|
-
fun `
|
|
22
|
+
fun `'invokeMethod' should find methods specific to parameters provided and call it`(){
|
|
23
23
|
val obj = TestClass()
|
|
24
24
|
|
|
25
25
|
var methodResult = ReflectionUtils.invokeInstanceMethod(obj, "plus", null, 1)
|
|
@@ -36,13 +36,13 @@ class `KReflectionUtils Test` {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
@Test
|
|
39
|
-
fun `
|
|
39
|
+
fun `'invokeInstanceMethod' should extract method of an object`() {
|
|
40
40
|
val methodResult = ReflectionUtils.extractMethod(TestClass::class.java, "plus", Int::class.java, Int::class.java)
|
|
41
41
|
assertNotNull(methodResult)
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
@Test
|
|
45
|
-
fun `
|
|
45
|
+
fun `'invokeInstanceMethod' should invoke method on instance of an object`() {
|
|
46
46
|
val obj = TestClass()
|
|
47
47
|
val methodResult = ReflectionUtils.invokeInstanceMethod(obj, "plus", 2, 2)
|
|
48
48
|
assertTrue(methodResult is Number)
|
|
@@ -56,7 +56,7 @@ class `KReflectionUtils Test` {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
@Test
|
|
59
|
-
fun `should parse Driver Atoms
|
|
59
|
+
fun `should parse Driver Atoms 'findElement'`() {
|
|
60
60
|
val findElementAtom = invokeStaticMethod(DriverAtoms::class.java,
|
|
61
61
|
"findElement", Locator.ID, "some Identifier")
|
|
62
62
|
assertTrue(findElementAtom is Atom<*>)
|
package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileClickTest.kt
CHANGED
|
@@ -15,7 +15,7 @@ import kotlin.test.assertEquals
|
|
|
15
15
|
class `mobile clickAction test` {
|
|
16
16
|
|
|
17
17
|
@Test
|
|
18
|
-
fun `should parse
|
|
18
|
+
fun `should parse 'MobileClickParams' and set defaults if some params not provided` () {
|
|
19
19
|
val jsonElement = JsonObject()
|
|
20
20
|
val clickActionParams = MobileClickActionParams.MobileClickActionParamsDeserializer()
|
|
21
21
|
.deserialize(jsonElement, null, null)
|
|
@@ -27,7 +27,7 @@ class `mobile clickAction test` {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
@Test
|
|
30
|
-
fun `should parse
|
|
30
|
+
fun `should parse 'MobileClickParams' and set values if all params provided` () {
|
|
31
31
|
val jsonElement = JsonObject()
|
|
32
32
|
jsonElement.add("inputDevice", JsonPrimitive(2))
|
|
33
33
|
jsonElement.add("buttonState", JsonPrimitive("3"))
|
package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileSwipeTest.kt
CHANGED
|
@@ -15,7 +15,7 @@ import kotlin.test.assertEquals
|
|
|
15
15
|
class `mobile swipe test` {
|
|
16
16
|
|
|
17
17
|
@Test
|
|
18
|
-
fun `should parse
|
|
18
|
+
fun `should parse 'MobileSwipeActionParams' with 'direction' property` () {
|
|
19
19
|
val jsonElement = JsonObject()
|
|
20
20
|
jsonElement.add("direction", JsonPrimitive("DOWN"))
|
|
21
21
|
val mobileSwipeActionParams = MobileSwipeActionParamsDeserializer()
|
|
@@ -24,7 +24,7 @@ class `mobile swipe test` {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
@Test
|
|
27
|
-
fun `should parse
|
|
27
|
+
fun `should parse 'MobileSwipeActionParams' with 'swiper' property and use default parameters` () {
|
|
28
28
|
val jsonElement = JsonObject()
|
|
29
29
|
jsonElement.add("swiper", JsonPrimitive("FAST"))
|
|
30
30
|
val mobileSwipeActionParams = MobileSwipeActionParamsDeserializer()
|
|
@@ -36,7 +36,7 @@ class `mobile swipe test` {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
@Test
|
|
39
|
-
fun `should parse
|
|
39
|
+
fun `should parse 'MobileSwipeActionParams' with 'swiper' property plus other parameters` () {
|
|
40
40
|
val jsonElement = JsonObject()
|
|
41
41
|
jsonElement.add("swiper", JsonPrimitive("FAST"))
|
|
42
42
|
jsonElement.add("startCoordinates", JsonPrimitive("TOP_LEFT"))
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
|
2
2
|
|
|
3
3
|
buildscript {
|
|
4
|
+
|
|
4
5
|
val appiumKotlin =
|
|
5
6
|
properties.getOrDefault("appiumKotlin", "1.5.10")
|
|
6
7
|
|
|
7
8
|
val appiumAndroidGradlePlugin =
|
|
8
|
-
properties.getOrDefault("appiumAndroidGradlePlugin", "
|
|
9
|
+
properties.getOrDefault("appiumAndroidGradlePlugin", "7.0.3")
|
|
9
10
|
|
|
10
11
|
repositories {
|
|
11
12
|
google()
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
distributionBase=GRADLE_USER_HOME
|
|
2
2
|
distributionPath=wrapper/dists
|
|
3
|
-
distributionUrl=https\://services.gradle.org/distributions/gradle-
|
|
3
|
+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip
|
|
4
4
|
zipStoreBase=GRADLE_USER_HOME
|
|
5
5
|
zipStorePath=wrapper/dists
|
package/lib/driver.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import _ from 'lodash';
|
|
2
|
+
import path from 'path';
|
|
2
3
|
import { BaseDriver, errors, isErrorType, DeviceSettings} from '@appium/base-driver';
|
|
3
4
|
import { EspressoRunner, TEST_APK_PKG } from './espresso-runner';
|
|
4
|
-
import { fs } from '@appium/support';
|
|
5
|
+
import { fs, tempDir, zip } from '@appium/support';
|
|
5
6
|
import logger from './logger';
|
|
6
7
|
import commands from './commands';
|
|
7
8
|
import { DEFAULT_ADB_PORT } from 'appium-adb';
|
|
@@ -119,8 +120,10 @@ const CHROME_NO_PROXY = [
|
|
|
119
120
|
['POST', new RegExp('^/session/[^/]+/se/log')],
|
|
120
121
|
];
|
|
121
122
|
|
|
122
|
-
const APP_EXTENSION = '.apk';
|
|
123
123
|
|
|
124
|
+
const APK_EXT = '.apk';
|
|
125
|
+
const AAB_EXT = '.aab';
|
|
126
|
+
const SUPPORTED_EXTENSIONS = [APK_EXT, AAB_EXT];
|
|
124
127
|
|
|
125
128
|
class EspressoDriver extends BaseDriver {
|
|
126
129
|
constructor (opts = {}, shouldValidateCaps = true) {
|
|
@@ -177,12 +180,12 @@ class EspressoDriver extends BaseDriver {
|
|
|
177
180
|
|
|
178
181
|
if (this.isChromeSession) {
|
|
179
182
|
if (this.opts.app) {
|
|
180
|
-
logger.warn(`
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
`);
|
|
183
|
+
logger.warn(`'browserName' capability will be ignored`);
|
|
184
|
+
logger.warn(`Chrome browser cannot be run in Espresso sessions because Espresso automation doesn't ` +
|
|
185
|
+
`have permission to access Chrome`);
|
|
184
186
|
} else {
|
|
185
|
-
logger.errorAndThrow(`Chrome browser sessions cannot be run in Espresso because Espresso
|
|
187
|
+
logger.errorAndThrow(`Chrome browser sessions cannot be run in Espresso because Espresso ` +
|
|
188
|
+
`automation doesn't have permission to access Chrome`);
|
|
186
189
|
}
|
|
187
190
|
}
|
|
188
191
|
|
|
@@ -191,25 +194,41 @@ class EspressoDriver extends BaseDriver {
|
|
|
191
194
|
this.addWipeDataToAvdArgs();
|
|
192
195
|
}
|
|
193
196
|
|
|
197
|
+
this.opts.systemPort = this.opts.systemPort
|
|
198
|
+
|| await findAPortNotInUse(SYSTEM_PORT_RANGE[0], SYSTEM_PORT_RANGE[1]);
|
|
199
|
+
this.opts.adbPort = this.opts.adbPort || DEFAULT_ADB_PORT;
|
|
200
|
+
// get device udid for this session
|
|
201
|
+
const {udid, emPort} = await helpers.getDeviceInfoFromCaps(this.opts);
|
|
202
|
+
this.opts.udid = udid;
|
|
203
|
+
this.opts.emPort = emPort;
|
|
204
|
+
// now that we know our java version and device info, we can create our
|
|
205
|
+
// ADB instance
|
|
206
|
+
this.adb = await androidHelpers.createADB(this.opts);
|
|
207
|
+
|
|
194
208
|
if (this.opts.app) {
|
|
195
209
|
// find and copy, or download and unzip an app url or path
|
|
196
|
-
this.opts.app = await this.helpers.configureApp(this.opts.app,
|
|
197
|
-
|
|
210
|
+
this.opts.app = await this.helpers.configureApp(this.opts.app, {
|
|
211
|
+
onPostProcess: this.onPostConfigureApp.bind(this),
|
|
212
|
+
supportedExtensions: SUPPORTED_EXTENSIONS
|
|
213
|
+
});
|
|
198
214
|
} else if (this.appOnDevice) {
|
|
199
215
|
// the app isn't an actual app file but rather something we want to
|
|
200
216
|
// assume is on the device and just launch via the appPackage
|
|
201
217
|
logger.info(`App file was not listed, instead we're going to run ` +
|
|
202
218
|
`${this.opts.appPackage} directly on the device`);
|
|
203
|
-
await this.
|
|
219
|
+
if (!await this.adb.isAppInstalled(this.opts.appPackage)) {
|
|
220
|
+
logger.errorAndThrow(`Could not find the package '${this.opts.appPackage}' ` +
|
|
221
|
+
`installed on the device`);
|
|
222
|
+
}
|
|
204
223
|
}
|
|
205
224
|
|
|
206
|
-
this.opts.systemPort = this.opts.systemPort || await findAPortNotInUse(SYSTEM_PORT_RANGE[0], SYSTEM_PORT_RANGE[1]);
|
|
207
|
-
this.opts.adbPort = this.opts.adbPort || DEFAULT_ADB_PORT;
|
|
208
225
|
await this.startEspressoSession();
|
|
209
226
|
return [sessionId, caps];
|
|
210
227
|
} catch (e) {
|
|
211
228
|
await this.deleteSession();
|
|
212
|
-
e.message += '.
|
|
229
|
+
e.message += `${_.endsWith(e.message, '.') ? '' : '.'} Check ` +
|
|
230
|
+
'https://github.com/appium/appium-espresso-driver#troubleshooting ' +
|
|
231
|
+
'regarding advanced session startup troubleshooting.';
|
|
213
232
|
if (isErrorType(e, errors.SessionNotCreatedError)) {
|
|
214
233
|
throw e;
|
|
215
234
|
}
|
|
@@ -219,6 +238,102 @@ class EspressoDriver extends BaseDriver {
|
|
|
219
238
|
}
|
|
220
239
|
}
|
|
221
240
|
|
|
241
|
+
/**
|
|
242
|
+
* Unzip the given app path and return the first package that has SUPPORTED_EXTENSIONS
|
|
243
|
+
* in the archived file.
|
|
244
|
+
*
|
|
245
|
+
* @param {string} appPath The path to app file.
|
|
246
|
+
* @returns {string} Retuns the path to an unzipped app file path.
|
|
247
|
+
* @throws Raise an exception if the zip did not have any SUPPORTED_EXTENSIONS packages.
|
|
248
|
+
*/
|
|
249
|
+
async unzipApp (appPath) {
|
|
250
|
+
const useSystemUnzipEnv = process.env.APPIUM_PREFER_SYSTEM_UNZIP;
|
|
251
|
+
const useSystemUnzip = _.isEmpty(useSystemUnzipEnv)
|
|
252
|
+
|| !['0', 'false'].includes(_.toLower(useSystemUnzipEnv));
|
|
253
|
+
const tmpRoot = await tempDir.openDir();
|
|
254
|
+
await zip.extractAllTo(appPath, tmpRoot, {useSystemUnzip});
|
|
255
|
+
|
|
256
|
+
const globPattern = `**/*.+(${SUPPORTED_EXTENSIONS.map((ext) => ext.replace(/^\./, '')).join('|')})`;
|
|
257
|
+
const sortedBundleItems = (await fs.glob(globPattern, {
|
|
258
|
+
cwd: tmpRoot,
|
|
259
|
+
strict: false,
|
|
260
|
+
})).sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);
|
|
261
|
+
if (sortedBundleItems.length === 0) {
|
|
262
|
+
// no expected packages in the zip
|
|
263
|
+
logger.errorAndThrow(`${this.opts.app} did not have any of '${SUPPORTED_EXTENSIONS.join(', ')}' ` +
|
|
264
|
+
`extension packages. Please make sure the provided .zip archive contains at least one valid application package.`);
|
|
265
|
+
}
|
|
266
|
+
const unzippedAppPath = path.join(tmpRoot, _.first(sortedBundleItems));
|
|
267
|
+
logger.debug(`'${unzippedAppPath}' is the unzipped file from '${appPath}'`);
|
|
268
|
+
return unzippedAppPath;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
async onPostConfigureApp ({cachedAppInfo, isUrl, appPath}) {
|
|
272
|
+
const presignApp = async (appLocation) => {
|
|
273
|
+
if (this.opts.noSign) {
|
|
274
|
+
logger.info('Skipping application signing because noSign capability is set to true. ' +
|
|
275
|
+
'Having the application under test with improper signature/non-signed will cause ' +
|
|
276
|
+
'Espresso automation startup failure.');
|
|
277
|
+
} else if (!await this.adb.checkApkCert(appLocation, this.opts.appPackage)) {
|
|
278
|
+
await this.adb.sign(appLocation, this.opts.appPackage);
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
const hasApkExt = (appPath) => _.endsWith(_.toLower(appPath), APK_EXT);
|
|
283
|
+
const hasAabExt = (appPath) => _.endsWith(_.toLower(appPath), AAB_EXT);
|
|
284
|
+
const extractUniversalApk = async (shouldExtract, appPath) =>
|
|
285
|
+
shouldExtract ? appPath : await this.adb.extractUniversalApk(appPath);
|
|
286
|
+
|
|
287
|
+
let pathInCache = null;
|
|
288
|
+
let isResultAppPathAlreadyCached = false;
|
|
289
|
+
if (_.isPlainObject(cachedAppInfo)) {
|
|
290
|
+
const packageHash = await fs.hash(appPath);
|
|
291
|
+
if (packageHash === cachedAppInfo.packageHash && await fs.exists(cachedAppInfo.fullPath)) {
|
|
292
|
+
logger.info(`Using '${cachedAppInfo.fullPath}' which is cached from '${appPath}'`);
|
|
293
|
+
isResultAppPathAlreadyCached = true;
|
|
294
|
+
pathInCache = cachedAppInfo.fullPath;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// appPath can be .zip, .apk or .aab
|
|
299
|
+
const isApk = hasApkExt(appPath);
|
|
300
|
+
// Only local .apk files that are available in-place should not be cached
|
|
301
|
+
const shouldResultAppPathBeCached = !isApk || (isApk && isUrl);
|
|
302
|
+
|
|
303
|
+
if (!isResultAppPathAlreadyCached) {
|
|
304
|
+
if (shouldResultAppPathBeCached) {
|
|
305
|
+
// .zip, .aab or downloaded .apk
|
|
306
|
+
|
|
307
|
+
let unzippedAppPath;
|
|
308
|
+
let isUnzippedApk = false;
|
|
309
|
+
if (!(hasApkExt(appPath) || hasAabExt(appPath))) {
|
|
310
|
+
unzippedAppPath = await this.unzipApp(appPath);
|
|
311
|
+
isUnzippedApk = hasApkExt(unzippedAppPath);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// unzippedAppPath or appPath has SUPPORTED_EXTENSIONS.
|
|
315
|
+
pathInCache = unzippedAppPath
|
|
316
|
+
? await extractUniversalApk(isUnzippedApk, unzippedAppPath)
|
|
317
|
+
: await extractUniversalApk(isApk, appPath);
|
|
318
|
+
|
|
319
|
+
if (!isApk && isUrl) {
|
|
320
|
+
// Clean up the temporarily downloaded .aab or .zip package
|
|
321
|
+
await fs.rimraf(appPath);
|
|
322
|
+
}
|
|
323
|
+
if (hasAabExt(unzippedAppPath)) {
|
|
324
|
+
// Cleanup the local unzipped .aab file
|
|
325
|
+
await fs.rimraf(unzippedAppPath);
|
|
326
|
+
}
|
|
327
|
+
await presignApp(pathInCache);
|
|
328
|
+
} else if (isApk) {
|
|
329
|
+
// It is probably not the best idea to modify the provided app in-place,
|
|
330
|
+
// but this is how it was always working
|
|
331
|
+
await presignApp(appPath);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return shouldResultAppPathBeCached ? {appPath: pathInCache} : false;
|
|
335
|
+
}
|
|
336
|
+
|
|
222
337
|
get driverData () {
|
|
223
338
|
// TODO fille out resource info here
|
|
224
339
|
return {};
|
|
@@ -257,15 +372,6 @@ class EspressoDriver extends BaseDriver {
|
|
|
257
372
|
async startEspressoSession () {
|
|
258
373
|
logger.info(`EspressoDriver version: ${version}`);
|
|
259
374
|
|
|
260
|
-
// get device udid for this session
|
|
261
|
-
let {udid, emPort} = await helpers.getDeviceInfoFromCaps(this.opts);
|
|
262
|
-
this.opts.udid = udid;
|
|
263
|
-
this.opts.emPort = emPort;
|
|
264
|
-
|
|
265
|
-
// now that we know our java version and device info, we can create our
|
|
266
|
-
// ADB instance
|
|
267
|
-
this.adb = await androidHelpers.createADB(this.opts);
|
|
268
|
-
|
|
269
375
|
// Read https://github.com/appium/appium-android-driver/pull/461 what happens if ther is no setHiddenApiPolicy for Android P+
|
|
270
376
|
if (await this.adb.getApiLevel() >= 28) { // Android P
|
|
271
377
|
logger.warn('Relaxing hidden api policy');
|
|
@@ -438,13 +544,6 @@ class EspressoDriver extends BaseDriver {
|
|
|
438
544
|
await this.adb.uninstallApk(this.opts.appPackage);
|
|
439
545
|
}
|
|
440
546
|
if (this.opts.app) {
|
|
441
|
-
if (this.opts.noSign) {
|
|
442
|
-
logger.info('Skipping application signing because noSign capability is set to true. ' +
|
|
443
|
-
'Having the application under test with improper signature/non-signed will cause ' +
|
|
444
|
-
'Espresso automation startup failure.');
|
|
445
|
-
} else if (!await this.adb.checkApkCert(this.opts.app, this.opts.appPackage)) {
|
|
446
|
-
await this.adb.sign(this.opts.app, this.opts.appPackage);
|
|
447
|
-
}
|
|
448
547
|
await helpers.installApk(this.adb, this.opts);
|
|
449
548
|
}
|
|
450
549
|
if (this.opts.skipServerInstallation) {
|
|
@@ -525,14 +624,6 @@ class EspressoDriver extends BaseDriver {
|
|
|
525
624
|
}
|
|
526
625
|
}
|
|
527
626
|
|
|
528
|
-
// TODO method is duplicated from uiautomator2
|
|
529
|
-
async checkAppPresent () {
|
|
530
|
-
logger.debug('Checking whether app is actually present');
|
|
531
|
-
if (!(await fs.exists(this.opts.app))) {
|
|
532
|
-
logger.errorAndThrow(`Could not find app apk at '${this.opts.app}'`);
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
|
|
536
627
|
async onSettingsUpdate () {
|
|
537
628
|
// intentionally do nothing here, since commands.updateSettings proxies
|
|
538
629
|
// settings to the espresso server already
|
|
@@ -567,6 +658,10 @@ class EspressoDriver extends BaseDriver {
|
|
|
567
658
|
get isChromeSession () {
|
|
568
659
|
return helpers.isChromeBrowser(this.opts.browserName);
|
|
569
660
|
}
|
|
661
|
+
|
|
662
|
+
get appOnDevice () {
|
|
663
|
+
return !this.opts.app && this.helpers.isPackageOrBundle(this.opts.appPackage);
|
|
664
|
+
}
|
|
570
665
|
}
|
|
571
666
|
|
|
572
667
|
// first add the android-driver commands which we will fall back to
|
package/lib/server-builder.js
CHANGED
|
@@ -22,7 +22,7 @@ const VERSION_KEYS = [
|
|
|
22
22
|
'kotlin',
|
|
23
23
|
'sourceCompatibility',
|
|
24
24
|
'targetCompatibility',
|
|
25
|
-
'jvmTarget'
|
|
25
|
+
'jvmTarget'
|
|
26
26
|
];
|
|
27
27
|
|
|
28
28
|
const gradleLog = logger.getLogger('Gradle');
|
|
@@ -163,6 +163,7 @@ class ServerBuilder {
|
|
|
163
163
|
const gradlebuild = new SubProcess(cmd, args, {
|
|
164
164
|
cwd: this.serverPath,
|
|
165
165
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
166
|
+
windowsVerbatimArguments: true
|
|
166
167
|
});
|
|
167
168
|
let buildLastLines = [];
|
|
168
169
|
|