appium-xcuitest-driver 3.60.1 → 3.61.0
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.
|
@@ -21,9 +21,15 @@ var _path = _interopRequireDefault(require("path"));
|
|
|
21
21
|
|
|
22
22
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
23
23
|
|
|
24
|
+
var _pyIosDeviceClient = _interopRequireDefault(require("../py-ios-device-client"));
|
|
25
|
+
|
|
26
|
+
const REAL_DEVICE_MAGIC = '3620bbb0-fb9f-4b62-a668-896f2edc4d88';
|
|
27
|
+
const MAGIC_SEP = '/';
|
|
28
|
+
|
|
24
29
|
class IOSCrashLog {
|
|
25
30
|
constructor(opts = {}) {
|
|
26
31
|
this.udid = opts.udid;
|
|
32
|
+
this.pyideviceClient = this.udid ? new _pyIosDeviceClient.default(this.udid) : null;
|
|
27
33
|
const logDir = opts.udid ? _path.default.resolve(process.env.HOME, 'Library', 'Logs', 'CrashReporter', 'MobileDevice') : _path.default.resolve(process.env.HOME, 'Library', 'Logs', 'DiagnosticReports');
|
|
28
34
|
this.logDir = logDir || _path.default.resolve(process.env.HOME || '/', 'Library', 'Logs', 'DiagnosticReports');
|
|
29
35
|
this.prevLogs = [];
|
|
@@ -32,7 +38,11 @@ class IOSCrashLog {
|
|
|
32
38
|
this.sim = opts.sim;
|
|
33
39
|
}
|
|
34
40
|
|
|
35
|
-
async
|
|
41
|
+
async _gatherFromRealDevice() {
|
|
42
|
+
if (await this.pyideviceClient.assertExists(false)) {
|
|
43
|
+
return (await this.pyideviceClient.listCrashes()).map(x => `${REAL_DEVICE_MAGIC}${MAGIC_SEP}${x}`);
|
|
44
|
+
}
|
|
45
|
+
|
|
36
46
|
let crashLogsRoot = this.logDir;
|
|
37
47
|
|
|
38
48
|
if (this.udid) {
|
|
@@ -49,11 +59,19 @@ class IOSCrashLog {
|
|
|
49
59
|
const foundFiles = await _appiumSupport.fs.glob(`${crashLogsRoot}/**/*.crash`, {
|
|
50
60
|
strict: false
|
|
51
61
|
});
|
|
62
|
+
return foundFiles;
|
|
63
|
+
}
|
|
52
64
|
|
|
53
|
-
|
|
54
|
-
|
|
65
|
+
async _gatherFromSimulator() {
|
|
66
|
+
if (!(await _appiumSupport.fs.exists(this.logDir))) {
|
|
67
|
+
_logger.default.debug(`Crash reports root '${this.logDir}' does not exist. Got nothing to gather.`);
|
|
68
|
+
|
|
69
|
+
return [];
|
|
55
70
|
}
|
|
56
71
|
|
|
72
|
+
const foundFiles = await _appiumSupport.fs.glob(`${this.logDir}/**/*.crash`, {
|
|
73
|
+
strict: false
|
|
74
|
+
});
|
|
57
75
|
return await _bluebird.default.filter(foundFiles, async x => {
|
|
58
76
|
try {
|
|
59
77
|
const content = await _appiumSupport.fs.readFile(x, 'utf8');
|
|
@@ -64,6 +82,10 @@ class IOSCrashLog {
|
|
|
64
82
|
});
|
|
65
83
|
}
|
|
66
84
|
|
|
85
|
+
async getCrashes() {
|
|
86
|
+
return this.udid ? await this._gatherFromRealDevice() : await this._gatherFromSimulator();
|
|
87
|
+
}
|
|
88
|
+
|
|
67
89
|
async startCapture() {
|
|
68
90
|
this.prevLogs = await this.getCrashes();
|
|
69
91
|
}
|
|
@@ -88,14 +110,34 @@ class IOSCrashLog {
|
|
|
88
110
|
}
|
|
89
111
|
|
|
90
112
|
async filesToJSON(paths) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
113
|
+
const tmpRoot = await _appiumSupport.tempDir.openDir();
|
|
114
|
+
|
|
115
|
+
try {
|
|
116
|
+
return (await _bluebird.default.map(paths, async fullPath => {
|
|
117
|
+
if (_lodash.default.includes(fullPath, REAL_DEVICE_MAGIC)) {
|
|
118
|
+
const fileName = _lodash.default.last(fullPath.split(MAGIC_SEP));
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
await this.pyideviceClient.exportCrash(fileName, tmpRoot);
|
|
122
|
+
} catch (e) {
|
|
123
|
+
_logger.default.warn(`Cannot export the crash report '${fileName}'. Skipping it. ` + `Original error: ${e.message}`);
|
|
124
|
+
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
fullPath = _path.default.join(tmpRoot, fileName);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const stat = await _appiumSupport.fs.stat(fullPath);
|
|
132
|
+
return {
|
|
133
|
+
timestamp: stat.ctime.getTime(),
|
|
134
|
+
level: 'ALL',
|
|
135
|
+
message: await _appiumSupport.fs.readFile(fullPath, 'utf8')
|
|
136
|
+
};
|
|
137
|
+
})).filter(Boolean);
|
|
138
|
+
} finally {
|
|
139
|
+
await _appiumSupport.fs.rimraf(tmpRoot);
|
|
140
|
+
}
|
|
99
141
|
}
|
|
100
142
|
|
|
101
143
|
}
|
|
@@ -105,4 +147,4 @@ var _default = IOSCrashLog;
|
|
|
105
147
|
exports.default = _default;require('source-map-support').install();
|
|
106
148
|
|
|
107
149
|
|
|
108
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kZXZpY2UtbG9nL2lvcy1jcmFzaC1sb2cuanMiXSwibmFtZXMiOlsiSU9TQ3Jhc2hMb2ciLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJ1ZGlkIiwibG9nRGlyIiwicGF0aCIsInJlc29sdmUiLCJwcm9jZXNzIiwiZW52IiwiSE9NRSIsInByZXZMb2dzIiwibG9nc1NpbmNlTGFzdFJlcXVlc3QiLCJwaG9uZU5hbWUiLCJzaW0iLCJnZXRDcmFzaGVzIiwiY3Jhc2hMb2dzUm9vdCIsInV0aWxpdGllcyIsImdldERldmljZU5hbWUiLCJmcyIsImV4aXN0cyIsImxvZyIsImRlYnVnIiwiZm91bmRGaWxlcyIsImdsb2IiLCJzdHJpY3QiLCJCIiwiZmlsdGVyIiwieCIsImNvbnRlbnQiLCJyZWFkRmlsZSIsInRvVXBwZXJDYXNlIiwiaW5jbHVkZXMiLCJlcnIiLCJzdGFydENhcHR1cmUiLCJzdG9wQ2FwdHVyZSIsImdldExvZ3MiLCJjcmFzaEZpbGVzIiwiZGlmZiIsIl8iLCJkaWZmZXJlbmNlIiwidW5pb24iLCJmaWxlc1RvSlNPTiIsImdldEFsbExvZ3MiLCJsb2dGaWxlcyIsInBhdGhzIiwibWFwIiwiZnVsbFBhdGgiLCJzdGF0IiwidGltZXN0YW1wIiwiY3RpbWUiLCJnZXRUaW1lIiwibGV2ZWwiLCJtZXNzYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLFdBQU4sQ0FBa0I7QUFDaEJDLEVBQUFBLFdBQVcsQ0FBRUMsSUFBSSxHQUFHLEVBQVQsRUFBYTtBQUN0QixTQUFLQyxJQUFMLEdBQVlELElBQUksQ0FBQ0MsSUFBakI7QUFDQSxVQUFNQyxNQUFNLEdBQUdGLElBQUksQ0FBQ0MsSUFBTCxHQUNYRSxjQUFLQyxPQUFMLENBQWFDLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyxJQUF6QixFQUErQixTQUEvQixFQUEwQyxNQUExQyxFQUFrRCxlQUFsRCxFQUFtRSxjQUFuRSxD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QixXQUFPLE1BQU1uQixrQkFBRW9CLEdBQUYsQ0FBTUQsS0FBTixFQUFhLE1BQU9FLFFBQVAsSUFBb0I7QUFDNUMsWUFBTUMsSUFBSSxHQUFHLE1BQU03QixrQkFBRzZCLElBQUgsQ0FBUUQsUUFBUixDQUFuQjtBQUNBLGFBQU87QUFDTEUsUUFBQUEsU0FBUyxFQUFFRCxJQUFJLENBQUNFLEtBQUwsQ0FBV0MsT0FBWCxFQUROO0FBRUxDLFFBQUFBLEtBQUssRUFBRSxLQUZGO0FBR0xDLFFBQUFBLE9BQU8sRUFBRSxNQUFNbEMsa0JBQUdXLFFBQUgsQ0FBWWlCLFFBQVosRUFBc0IsTUFBdEI7QUFIVixPQUFQO0FBS0QsS0FQWSxDQUFiO0FBUUQ7O0FBdkVlOzs7ZUEyRUg5QyxXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnMgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyB1dGlsaXRpZXMgfSBmcm9tICdhcHBpdW0taW9zLWRldmljZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cblxuY2xhc3MgSU9TQ3Jhc2hMb2cge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9KSB7XG4gICAgdGhpcy51ZGlkID0gb3B0cy51ZGlkO1xuICAgIGNvbnN0IGxvZ0RpciA9IG9wdHMudWRpZFxuICAgICAgPyBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuSE9NRSwgJ0xpYnJhcnknLCAnTG9ncycsICdDcmFzaFJlcG9ydGVyJywgJ01vYmlsZURldmljZScpXG4gICAgICA6IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5IT01FLCAnTGlicmFyeScsICdMb2dzJywgJ0RpYWdub3N0aWNSZXBvcnRzJyk7XG4gICAgdGhpcy5sb2dEaXIgPSBsb2dEaXJcbiAgICAgIHx8IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5IT01FIHx8ICcvJywgJ0xpYnJhcnknLCAnTG9ncycsICdEaWFnbm9zdGljUmVwb3J0cycpO1xuICAgIHRoaXMucHJldkxvZ3MgPSBbXTtcbiAgICB0aGlzLmxvZ3NTaW5jZUxhc3RSZXF1ZXN0ID0gW107XG4gICAgdGhpcy5waG9uZU5hbWUgPSBudWxsO1xuICAgIHRoaXMuc2ltID0gb3B0cy5zaW07XG4gIH1cblxuICBhc3luYyBnZXRDcmFzaGVzICgpIHtcbiAgICBsZXQgY3Jhc2hMb2dzUm9vdCA9IHRoaXMubG9nRGlyO1xuICAgIGlmICh0aGlzLnVkaWQpIHtcbiAgICAgIHRoaXMucGhvbmVOYW1lID0gdGhpcy5waG9uZU5hbWUgfHwgYXdhaXQgdXRpbGl0aWVzLmdldERldmljZU5hbWUodGhpcy51ZGlkKTtcbiAgICAgIGNyYXNoTG9nc1Jvb3QgPSBwYXRoLnJlc29sdmUoY3Jhc2hMb2dzUm9vdCwgdGhpcy5waG9uZU5hbWUpO1xuICAgIH1cbiAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhjcmFzaExvZ3NSb290KSkge1xuICAgICAgbG9nLmRlYnVnKGBDcmFzaCByZXBvcnRzIHJvb3QgJyR7Y3Jhc2hMb2dzUm9vdH0nIGRvZXMgbm90IGV4aXN0LiBHb3Qgbm90aGluZyB0byBnYXRoZXIuYCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGZvdW5kRmlsZXMgPSBhd2FpdCBmcy5nbG9iKGAke2NyYXNoTG9nc1Jvb3R9LyoqLyouY3Jhc2hgLCB7XG4gICAgICBzdHJpY3Q6IGZhbHNlXG4gICAgfSk7XG4gICAgaWYgKHRoaXMudWRpZCkge1xuICAgICAgcmV0dXJuIGZvdW5kRmlsZXM7XG4gICAgfVxuICAgIC8vIEZvciBTaW11bGF0b3Igb25seSBpbmNsdWRlIGZpbGVzLCB0aGF0IGNvbnRhaW4gY3VycmVudCBVRElEXG4gICAgcmV0dXJuIGF3YWl0IEIuZmlsdGVyKGZvdW5kRmlsZXMsIGFzeW5jICh4KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoeCwgJ3V0ZjgnKTtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQudG9VcHBlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNpbS51ZGlkLnRvVXBwZXJDYXNlKCkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0Q2FwdHVyZSAoKSB7XG4gICAgdGhpcy5wcmV2TG9ncyA9IGF3YWl0IHRoaXMuZ2V0Q3Jhc2hlcygpO1xuICB9XG5cbiAgYXN5bmMgc3RvcENhcHR1cmUgKCkge1xuICAgIC8vIG5lZWRlZCBmb3IgY29uc2lzdGVudCBBUEkgd2l0aCBvdGhlciBsb2dzXG4gIH1cblxuICBhc3luYyBnZXRMb2dzICgpIHtcbiAgICBsZXQgY3Jhc2hGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0Q3Jhc2hlcygpO1xuICAgIGxldCBkaWZmID0gXy5kaWZmZXJlbmNlKGNyYXNoRmlsZXMsIHRoaXMucHJldkxvZ3MsIHRoaXMubG9nc1NpbmNlTGFzdFJlcXVlc3QpO1xuICAgIHRoaXMubG9nc1NpbmNlTGFzdFJlcXVlc3QgPSBfLnVuaW9uKHRoaXMubG9nc1NpbmNlTGFzdFJlcXVlc3QsIGRpZmYpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbGVzVG9KU09OKGRpZmYpO1xuICB9XG5cbiAgYXN5bmMgZ2V0QWxsTG9ncyAoKSB7XG4gICAgbGV0IGNyYXNoRmlsZXMgPSBhd2FpdCB0aGlzLmdldENyYXNoZXMoKTtcbiAgICBsZXQgbG9nRmlsZXMgPSBfLmRpZmZlcmVuY2UoY3Jhc2hGaWxlcywgdGhpcy5wcmV2TG9ncyk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmlsZXNUb0pTT04obG9nRmlsZXMpO1xuICB9XG5cbiAgYXN5bmMgZmlsZXNUb0pTT04gKHBhdGhzKSB7XG4gICAgcmV0dXJuIGF3YWl0IEIubWFwKHBhdGhzLCBhc3luYyAoZnVsbFBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KGZ1bGxQYXRoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpbWVzdGFtcDogc3RhdC5jdGltZS5nZXRUaW1lKCksXG4gICAgICAgIGxldmVsOiAnQUxMJyxcbiAgICAgICAgbWVzc2FnZTogYXdhaXQgZnMucmVhZEZpbGUoZnVsbFBhdGgsICd1dGY4JylcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgSU9TQ3Jhc2hMb2cgfTtcbmV4cG9ydCBkZWZhdWx0IElPU0NyYXNoTG9nO1xuIl0sImZpbGUiOiJsaWIvZGV2aWNlLWxvZy9pb3MtY3Jhc2gtbG9nLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
|
150
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kZXZpY2UtbG9nL2lvcy1jcmFzaC1sb2cuanMiXSwibmFtZXMiOlsiUkVBTF9ERVZJQ0VfTUFHSUMiLCJNQUdJQ19TRVAiLCJJT1NDcmFzaExvZyIsImNvbnN0cnVjdG9yIiwib3B0cyIsInVkaWQiLCJweWlkZXZpY2VDbGllbnQiLCJQeWlkZXZpY2UiLCJsb2dEaXIiLCJwYXRoIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJlbnYiLCJIT01FIiwicHJldkxvZ3MiLCJsb2dzU2luY2VMYXN0UmVxdWVzdCIsInBob25lTmFtZSIsInNpbSIsIl9nYXRoZXJGcm9tUmVhbERldmljZSIsImFzc2VydEV4aXN0cyIsImxpc3RDcmFzaGVzIiwibWFwIiwieCIsImNyYXNoTG9nc1Jvb3QiLCJ1dGlsaXRpZXMiLCJnZXREZXZpY2VOYW1lIiwiZnMiLCJleGlzdHMiLCJsb2ciLCJkZWJ1ZyIsImZvdW5kRmlsZXMiLCJnbG9iIiwic3RyaWN0IiwiX2dhdGhlckZyb21TaW11bGF0b3IiLCJCIiwiZmlsdGVyIiwiY29udGVudCIsInJlYWRGaWxlIiwidG9VcHBlckNhc2UiLCJpbmNsdWRlcyIsImVyciIsImdldENyYXNoZXMiLCJzdGFydENhcHR1cmUiLCJzdG9wQ2FwdHVyZSIsImdldExvZ3MiLCJjcmFzaEZpbGVzIiwiZGlmZiIsIl8iLCJkaWZmZXJlbmNlIiwidW5pb24iLCJmaWxlc1RvSlNPTiIsImdldEFsbExvZ3MiLCJsb2dGaWxlcyIsInBhdGhzIiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwiZnVsbFBhdGgiLCJmaWxlTmFtZSIsImxhc3QiLCJzcGxpdCIsImV4cG9ydENyYXNoIiwiZSIsIndhcm4iLCJtZXNzYWdlIiwiam9pbiIsInN0YXQiLCJ0aW1lc3RhbXAiLCJjdGltZSIsImdldFRpbWUiLCJsZXZlbCIsIkJvb2xlYW4iLCJyaW1yYWYiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsaUJBQWlCLEdBQUcsc0NBQTFCO0FBQ0EsTUFBTUMsU0FBUyxHQUFHLEdBQWxCOztBQUdBLE1BQU1DLFdBQU4sQ0FBa0I7QUFDaEJDLEVBQUFBLFdBQVcsQ0FBRUMsSUFBSSxHQUFHLEVBQVQsRUFBYTtBQUN0QixTQUFLQyxJQUFMLEdBQVlELElBQUksQ0FBQ0MsSUFBakI7QUFDQSxTQUFLQyxlQUFMLEdBQXVCLEtBQUtELElBQUwsR0FBWSxJQUFJRSwwQkFBSixDQUFjLEtBQUtGLElBQW5CLENBQVosR0FBdUMsSUFBOUQ7QUFDQSxVQUFNRyxNQUFNLEdBQUdKLElBQUksQ0FBQ0MsSUFBTCxHQUNYSSxjQUFLQyxPQUFMLENBQWFDLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyxJQUF6QixFQUErQixTQUEvQixFQUEwQyxNQUExQyxFQUFrRCxlQUFsRCxFQUFtRSxjQUFuRSxDQURXLEdBRVhKLGNBQUtDLE9BQUwsQ0FBYUMsT0FBTyxDQUFDQyxHQUFSLENBQVlDLElBQXpCLEVBQStCLFNBQS9CLEVBQTBDLE1BQTFDLEVBQWtELG1CQUFsRCxDQUZKO0FBR0EsU0FBS0wsTUFBTCxHQUFjQSxNQUFNLElBQ2ZDLGNBQUtDLE9BQUwsQ0FBYUMsT0FBTyxDQUFDQyxHQUFSLENBQVlDLElBQVosSUFBb0IsR0FBakMsRUFBc0MsU0FBdEMsRUFBaUQsTUFBakQsRUFBeUQsbUJBQXpELENBREw7QUFFQSxTQUFLQyxRQUFMLEdBQWdCLEVBQWhCO0FBQ0EsU0FBS0Msb0JBQUwsR0FBNEIsRUFBNUI7QUFDQSxTQUFLQyxTQUFMLEdBQWlCLElBQWpCO0FBQ0EsU0FBS0MsR0FBTCxHQUFXYixJQUFJLENBQUNhLEdBQWhCO0FBQ0Q7O0FBRTBCLFFBQXJCQyxxQkFBcUIsR0FBSTtBQUM3QixRQUFJLE1BQU0sS0FBS1osZUFBTCxDQUFxQmEsWUFBckIsQ0FBa0MsS0FBbEMsQ0FBVixFQUFvRDtBQUNsRCxhQUFPLENBQUMsTUFBTSxLQUFLYixlQUFMLENBQXFCYyxXQUFyQixFQUFQLEVBQ0pDLEdBREksQ0FDQ0MsQ0FBRCxJQUFRLEdBQUV0QixpQkFBa0IsR0FBRUMsU0FBVSxHQUFFcUIsQ0FBRSxFQUQ1QyxDQUFQO0FBRUQ7O0FBRUQsUUFBSUMsYUFBYSxHQUFHLEtBQUtmLE1BQXpCOztBQUNBLFFBQUksS0FBS0gsSUFBVCxFQUFlO0FBQ2IsV0FBS1csU0FBTCxHQUFpQixLQUFLQSxTQUFMLEtBQWtCLE1BQU1RLDJCQUFVQyxhQUFWLENBQXdCLEtBQUtwQixJQUE3QixDQUF4QixDQUFqQjtBQUNBa0IsTUFBQUEsYUFBYSxHQUFHZCxjQUFLQyxPQUFMLENBQWFhLGFBQWIsRUFBNEIsS0FBS1AsU0FBakMsQ0FBaEI7QUFDRDs7QUFDRCxRQUFJLEVBQUMsTUFBTVUsa0JBQUdDLE1BQUgsQ0FBVUosYUFBVixDQUFQLENBQUosRUFBcUM7QUFDbkNLLHNCQUFJQyxLQUFKLENBQVcsdUJBQXNCTixhQUFjLDBDQUEvQzs7QUFDQSxhQUFPLEVBQVA7QUFDRDs7QUFDRCxVQUFNTyxVQUFVLEdBQUcsTUFBTUosa0JBQUdLLElBQUgsQ0FBUyxHQUFFUixhQUFjLGFBQXpCLEVBQXVDO0FBQzlEUyxNQUFBQSxNQUFNLEVBQUU7QUFEc0QsS0FBdkMsQ0FBekI7QUFHQSxXQUFPRixVQUFQO0FBQ0Q7O0FBRXlCLFFBQXBCRyxvQkFBb0IsR0FBSTtBQUM1QixRQUFJLEVBQUMsTUFBTVAsa0JBQUdDLE1BQUgsQ0FBVSxLQUFLbkIsTUFBZixDQUFQLENBQUosRUFBbUM7QUFDakNvQixzQkFBSUMsS0FBSixDQUFXLHVCQUFzQixLQUFLckIsTUFBTywwQ0FBN0M7O0FBQ0EsYUFBTyxFQUFQO0FBQ0Q7O0FBQ0QsVUFBTXNCLFVBQVUsR0FBRyxNQUFNSixrQkFBR0ssSUFBSCxDQUFTLEdBQUUsS0FBS3ZCLE1BQU8sYUFBdkIsRUFBcUM7QUFDNUR3QixNQUFBQSxNQUFNLEVBQUU7QUFEb0QsS0FBckMsQ0FBekI7QUFJQSxXQUFPLE1BQU1FLGtCQUFFQyxNQUFGLENBQVNMLFVBQVQsRUFBcUIsTUFBT1IsQ0FBUCxJQUFhO0FBQzdDLFVBQUk7QUFDRixjQUFNYyxPQUFPLEdBQUcsTUFBTVYsa0JBQUdXLFFBQUgsQ0FBWWYsQ0FBWixFQUFlLE1BQWYsQ0FBdEI7QUFDQSxlQUFPYyxPQUFPLENBQUNFLFdBQVIsR0FBc0JDLFFBQXRCLENBQStCLEtBQUt0QixHQUFMLENBQVNaLElBQVQsQ0FBY2lDLFdBQWQsRUFBL0IsQ0FBUDtBQUNELE9BSEQsQ0FHRSxPQUFPRSxHQUFQLEVBQVk7QUFDWixlQUFPLEtBQVA7QUFDRDtBQUNGLEtBUFksQ0FBYjtBQVFEOztBQUVlLFFBQVZDLFVBQVUsR0FBSTtBQUNsQixXQUFPLEtBQUtwQyxJQUFMLEdBQ0gsTUFBTSxLQUFLYSxxQkFBTCxFQURILEdBRUgsTUFBTSxLQUFLZSxvQkFBTCxFQUZWO0FBR0Q7O0FBRWlCLFFBQVpTLFlBQVksR0FBSTtBQUNwQixTQUFLNUIsUUFBTCxHQUFnQixNQUFNLEtBQUsyQixVQUFMLEVBQXRCO0FBQ0Q7O0FBRWdCLFFBQVhFLFdBQVcsR0FBSSxDQUVwQjs7QUFFWSxRQUFQQyxPQUFPLEdBQUk7QUFDZixRQUFJQyxVQUFVLEdBQUcsTUFBTSxLQUFLSixVQUFMLEVBQXZCOztBQUNBLFFBQUlLLElBQUksR0FBR0MsZ0JBQUVDLFVBQUYsQ0FBYUgsVUFBYixFQUF5QixLQUFLL0IsUUFBOUIsRUFBd0MsS0FBS0Msb0JBQTdDLENBQVg7O0FBQ0EsU0FBS0Esb0JBQUwsR0FBNEJnQyxnQkFBRUUsS0FBRixDQUFRLEtBQUtsQyxvQkFBYixFQUFtQytCLElBQW5DLENBQTVCO0FBQ0EsV0FBTyxNQUFNLEtBQUtJLFdBQUwsQ0FBaUJKLElBQWpCLENBQWI7QUFDRDs7QUFFZSxRQUFWSyxVQUFVLEdBQUk7QUFDbEIsUUFBSU4sVUFBVSxHQUFHLE1BQU0sS0FBS0osVUFBTCxFQUF2Qjs7QUFDQSxRQUFJVyxRQUFRLEdBQUdMLGdCQUFFQyxVQUFGLENBQWFILFVBQWIsRUFBeUIsS0FBSy9CLFFBQTlCLENBQWY7O0FBQ0EsV0FBTyxNQUFNLEtBQUtvQyxXQUFMLENBQWlCRSxRQUFqQixDQUFiO0FBQ0Q7O0FBRWdCLFFBQVhGLFdBQVcsQ0FBRUcsS0FBRixFQUFTO0FBQ3hCLFVBQU1DLE9BQU8sR0FBRyxNQUFNQyx1QkFBUUMsT0FBUixFQUF0Qjs7QUFDQSxRQUFJO0FBQ0YsYUFBTyxDQUFDLE1BQU10QixrQkFBRWIsR0FBRixDQUFNZ0MsS0FBTixFQUFhLE1BQU9JLFFBQVAsSUFBb0I7QUFDN0MsWUFBSVYsZ0JBQUVSLFFBQUYsQ0FBV2tCLFFBQVgsRUFBcUJ6RCxpQkFBckIsQ0FBSixFQUE2QztBQUMzQyxnQkFBTTBELFFBQVEsR0FBR1gsZ0JBQUVZLElBQUYsQ0FBT0YsUUFBUSxDQUFDRyxLQUFULENBQWUzRCxTQUFmLENBQVAsQ0FBakI7O0FBQ0EsY0FBSTtBQUNGLGtCQUFNLEtBQUtLLGVBQUwsQ0FBcUJ1RCxXQUFyQixDQUFpQ0gsUUFBakMsRUFBMkNKLE9BQTNDLENBQU47QUFDRCxXQUZELENBRUUsT0FBT1EsQ0FBUCxFQUFVO0FBQ1ZsQyw0QkFBSW1DLElBQUosQ0FBVSxtQ0FBa0NMLFFBQVMsa0JBQTVDLEdBQ04sbUJBQWtCSSxDQUFDLENBQUNFLE9BQVEsRUFEL0I7O0FBRUE7QUFDRDs7QUFDRFAsVUFBQUEsUUFBUSxHQUFHaEQsY0FBS3dELElBQUwsQ0FBVVgsT0FBVixFQUFtQkksUUFBbkIsQ0FBWDtBQUNEOztBQUNELGNBQU1RLElBQUksR0FBRyxNQUFNeEMsa0JBQUd3QyxJQUFILENBQVFULFFBQVIsQ0FBbkI7QUFDQSxlQUFPO0FBQ0xVLFVBQUFBLFNBQVMsRUFBRUQsSUFBSSxDQUFDRSxLQUFMLENBQVdDLE9BQVgsRUFETjtBQUVMQyxVQUFBQSxLQUFLLEVBQUUsS0FGRjtBQUdMTixVQUFBQSxPQUFPLEVBQUUsTUFBTXRDLGtCQUFHVyxRQUFILENBQVlvQixRQUFaLEVBQXNCLE1BQXRCO0FBSFYsU0FBUDtBQUtELE9BbEJhLENBQVAsRUFrQkh0QixNQWxCRyxDQWtCSW9DLE9BbEJKLENBQVA7QUFtQkQsS0FwQkQsU0FvQlU7QUFDUixZQUFNN0Msa0JBQUc4QyxNQUFILENBQVVsQixPQUFWLENBQU47QUFDRDtBQUNGOztBQTNHZTs7O2VBK0dIcEQsVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZzLCB0ZW1wRGlyIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgdXRpbGl0aWVzIH0gZnJvbSAnYXBwaXVtLWlvcy1kZXZpY2UnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IFB5aWRldmljZSBmcm9tICcuLi9weS1pb3MtZGV2aWNlLWNsaWVudCc7XG5cbmNvbnN0IFJFQUxfREVWSUNFX01BR0lDID0gJzM2MjBiYmIwLWZiOWYtNGI2Mi1hNjY4LTg5NmYyZWRjNGQ4OCc7XG5jb25zdCBNQUdJQ19TRVAgPSAnLyc7XG5cblxuY2xhc3MgSU9TQ3Jhc2hMb2cge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9KSB7XG4gICAgdGhpcy51ZGlkID0gb3B0cy51ZGlkO1xuICAgIHRoaXMucHlpZGV2aWNlQ2xpZW50ID0gdGhpcy51ZGlkID8gbmV3IFB5aWRldmljZSh0aGlzLnVkaWQpIDogbnVsbDtcbiAgICBjb25zdCBsb2dEaXIgPSBvcHRzLnVkaWRcbiAgICAgID8gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LkhPTUUsICdMaWJyYXJ5JywgJ0xvZ3MnLCAnQ3Jhc2hSZXBvcnRlcicsICdNb2JpbGVEZXZpY2UnKVxuICAgICAgOiBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuSE9NRSwgJ0xpYnJhcnknLCAnTG9ncycsICdEaWFnbm9zdGljUmVwb3J0cycpO1xuICAgIHRoaXMubG9nRGlyID0gbG9nRGlyXG4gICAgICB8fCBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuSE9NRSB8fCAnLycsICdMaWJyYXJ5JywgJ0xvZ3MnLCAnRGlhZ25vc3RpY1JlcG9ydHMnKTtcbiAgICB0aGlzLnByZXZMb2dzID0gW107XG4gICAgdGhpcy5sb2dzU2luY2VMYXN0UmVxdWVzdCA9IFtdO1xuICAgIHRoaXMucGhvbmVOYW1lID0gbnVsbDtcbiAgICB0aGlzLnNpbSA9IG9wdHMuc2ltO1xuICB9XG5cbiAgYXN5bmMgX2dhdGhlckZyb21SZWFsRGV2aWNlICgpIHtcbiAgICBpZiAoYXdhaXQgdGhpcy5weWlkZXZpY2VDbGllbnQuYXNzZXJ0RXhpc3RzKGZhbHNlKSkge1xuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnB5aWRldmljZUNsaWVudC5saXN0Q3Jhc2hlcygpKVxuICAgICAgICAubWFwKCh4KSA9PiBgJHtSRUFMX0RFVklDRV9NQUdJQ30ke01BR0lDX1NFUH0ke3h9YCk7XG4gICAgfVxuXG4gICAgbGV0IGNyYXNoTG9nc1Jvb3QgPSB0aGlzLmxvZ0RpcjtcbiAgICBpZiAodGhpcy51ZGlkKSB7XG4gICAgICB0aGlzLnBob25lTmFtZSA9IHRoaXMucGhvbmVOYW1lIHx8IGF3YWl0IHV0aWxpdGllcy5nZXREZXZpY2VOYW1lKHRoaXMudWRpZCk7XG4gICAgICBjcmFzaExvZ3NSb290ID0gcGF0aC5yZXNvbHZlKGNyYXNoTG9nc1Jvb3QsIHRoaXMucGhvbmVOYW1lKTtcbiAgICB9XG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMoY3Jhc2hMb2dzUm9vdCkpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgQ3Jhc2ggcmVwb3J0cyByb290ICcke2NyYXNoTG9nc1Jvb3R9JyBkb2VzIG5vdCBleGlzdC4gR290IG5vdGhpbmcgdG8gZ2F0aGVyLmApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBmb3VuZEZpbGVzID0gYXdhaXQgZnMuZ2xvYihgJHtjcmFzaExvZ3NSb290fS8qKi8qLmNyYXNoYCwge1xuICAgICAgc3RyaWN0OiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiBmb3VuZEZpbGVzO1xuICB9XG5cbiAgYXN5bmMgX2dhdGhlckZyb21TaW11bGF0b3IgKCkge1xuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHRoaXMubG9nRGlyKSkge1xuICAgICAgbG9nLmRlYnVnKGBDcmFzaCByZXBvcnRzIHJvb3QgJyR7dGhpcy5sb2dEaXJ9JyBkb2VzIG5vdCBleGlzdC4gR290IG5vdGhpbmcgdG8gZ2F0aGVyLmApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBmb3VuZEZpbGVzID0gYXdhaXQgZnMuZ2xvYihgJHt0aGlzLmxvZ0Rpcn0vKiovKi5jcmFzaGAsIHtcbiAgICAgIHN0cmljdDogZmFsc2VcbiAgICB9KTtcbiAgICAvLyBGb3IgU2ltdWxhdG9yIG9ubHkgaW5jbHVkZSBmaWxlcywgdGhhdCBjb250YWluIGN1cnJlbnQgVURJRFxuICAgIHJldHVybiBhd2FpdCBCLmZpbHRlcihmb3VuZEZpbGVzLCBhc3luYyAoeCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHgsICd1dGY4Jyk7XG4gICAgICAgIHJldHVybiBjb250ZW50LnRvVXBwZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zaW0udWRpZC50b1VwcGVyQ2FzZSgpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZXRDcmFzaGVzICgpIHtcbiAgICByZXR1cm4gdGhpcy51ZGlkXG4gICAgICA/IGF3YWl0IHRoaXMuX2dhdGhlckZyb21SZWFsRGV2aWNlKClcbiAgICAgIDogYXdhaXQgdGhpcy5fZ2F0aGVyRnJvbVNpbXVsYXRvcigpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRDYXB0dXJlICgpIHtcbiAgICB0aGlzLnByZXZMb2dzID0gYXdhaXQgdGhpcy5nZXRDcmFzaGVzKCk7XG4gIH1cblxuICBhc3luYyBzdG9wQ2FwdHVyZSAoKSB7XG4gICAgLy8gbmVlZGVkIGZvciBjb25zaXN0ZW50IEFQSSB3aXRoIG90aGVyIGxvZ3NcbiAgfVxuXG4gIGFzeW5jIGdldExvZ3MgKCkge1xuICAgIGxldCBjcmFzaEZpbGVzID0gYXdhaXQgdGhpcy5nZXRDcmFzaGVzKCk7XG4gICAgbGV0IGRpZmYgPSBfLmRpZmZlcmVuY2UoY3Jhc2hGaWxlcywgdGhpcy5wcmV2TG9ncywgdGhpcy5sb2dzU2luY2VMYXN0UmVxdWVzdCk7XG4gICAgdGhpcy5sb2dzU2luY2VMYXN0UmVxdWVzdCA9IF8udW5pb24odGhpcy5sb2dzU2luY2VMYXN0UmVxdWVzdCwgZGlmZik7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmlsZXNUb0pTT04oZGlmZik7XG4gIH1cblxuICBhc3luYyBnZXRBbGxMb2dzICgpIHtcbiAgICBsZXQgY3Jhc2hGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0Q3Jhc2hlcygpO1xuICAgIGxldCBsb2dGaWxlcyA9IF8uZGlmZmVyZW5jZShjcmFzaEZpbGVzLCB0aGlzLnByZXZMb2dzKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5maWxlc1RvSlNPTihsb2dGaWxlcyk7XG4gIH1cblxuICBhc3luYyBmaWxlc1RvSlNPTiAocGF0aHMpIHtcbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoYXdhaXQgQi5tYXAocGF0aHMsIGFzeW5jIChmdWxsUGF0aCkgPT4ge1xuICAgICAgICBpZiAoXy5pbmNsdWRlcyhmdWxsUGF0aCwgUkVBTF9ERVZJQ0VfTUFHSUMpKSB7XG4gICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBfLmxhc3QoZnVsbFBhdGguc3BsaXQoTUFHSUNfU0VQKSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHlpZGV2aWNlQ2xpZW50LmV4cG9ydENyYXNoKGZpbGVOYW1lLCB0bXBSb290KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2cud2FybihgQ2Fubm90IGV4cG9ydCB0aGUgY3Jhc2ggcmVwb3J0ICcke2ZpbGVOYW1lfScuIFNraXBwaW5nIGl0LiBgICtcbiAgICAgICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZnVsbFBhdGggPSBwYXRoLmpvaW4odG1wUm9vdCwgZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KGZ1bGxQYXRoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0aW1lc3RhbXA6IHN0YXQuY3RpbWUuZ2V0VGltZSgpLFxuICAgICAgICAgIGxldmVsOiAnQUxMJyxcbiAgICAgICAgICBtZXNzYWdlOiBhd2FpdCBmcy5yZWFkRmlsZShmdWxsUGF0aCwgJ3V0ZjgnKVxuICAgICAgICB9O1xuICAgICAgfSkpLmZpbHRlcihCb29sZWFuKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBJT1NDcmFzaExvZyB9O1xuZXhwb3J0IGRlZmF1bHQgSU9TQ3Jhc2hMb2c7XG4iXSwiZmlsZSI6ImxpYi9kZXZpY2UtbG9nL2lvcy1jcmFzaC1sb2cuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
@@ -45,6 +45,7 @@ class Pyidevice {
|
|
|
45
45
|
async execute(args, opts = {}) {
|
|
46
46
|
await this.assertExists();
|
|
47
47
|
const {
|
|
48
|
+
cwd,
|
|
48
49
|
format = 'json',
|
|
49
50
|
logStdout = false
|
|
50
51
|
} = opts;
|
|
@@ -59,7 +60,9 @@ class Pyidevice {
|
|
|
59
60
|
_logger.default.debug(`Executing ${cmdStr}`);
|
|
60
61
|
|
|
61
62
|
try {
|
|
62
|
-
const result = await (0, _teen_process.exec)(this.binaryPath, finalArgs
|
|
63
|
+
const result = await (0, _teen_process.exec)(this.binaryPath, finalArgs, {
|
|
64
|
+
cwd
|
|
65
|
+
});
|
|
63
66
|
|
|
64
67
|
if (logStdout) {
|
|
65
68
|
_logger.default.debug(`Command output: ${result.stdout}`);
|
|
@@ -78,31 +81,29 @@ class Pyidevice {
|
|
|
78
81
|
return JSON.parse(stdout);
|
|
79
82
|
}
|
|
80
83
|
|
|
81
|
-
async installProfile(
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
} = opts;
|
|
86
|
-
|
|
84
|
+
async installProfile({
|
|
85
|
+
profilePath,
|
|
86
|
+
payload
|
|
87
|
+
} = {}) {
|
|
87
88
|
if (!profilePath && !payload) {
|
|
88
|
-
throw new
|
|
89
|
+
throw new Error('Either the full path to the profile or its payload must be provided');
|
|
89
90
|
}
|
|
90
91
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
logStdout: true
|
|
94
|
-
});
|
|
95
|
-
} else {
|
|
96
|
-
const tmpRoot = await _appiumSupport.tempDir.openDir();
|
|
92
|
+
let tmpRoot;
|
|
93
|
+
let srcPath = profilePath;
|
|
97
94
|
|
|
98
|
-
|
|
95
|
+
try {
|
|
96
|
+
if (!srcPath) {
|
|
97
|
+
tmpRoot = await _appiumSupport.tempDir.openDir();
|
|
98
|
+
srcPath = _path.default.join(tmpRoot, 'cert.pem');
|
|
99
|
+
await _appiumSupport.fs.writeFile(srcPath, payload, 'utf8');
|
|
100
|
+
}
|
|
99
101
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
} finally {
|
|
102
|
+
await this.execute(['profiles', 'install', '--path', srcPath], {
|
|
103
|
+
logStdout: true
|
|
104
|
+
});
|
|
105
|
+
} finally {
|
|
106
|
+
if (tmpRoot) {
|
|
106
107
|
await _appiumSupport.fs.rimraf(tmpRoot);
|
|
107
108
|
}
|
|
108
109
|
}
|
|
@@ -114,6 +115,20 @@ class Pyidevice {
|
|
|
114
115
|
});
|
|
115
116
|
}
|
|
116
117
|
|
|
118
|
+
async listCrashes() {
|
|
119
|
+
const {
|
|
120
|
+
stdout
|
|
121
|
+
} = await this.execute(['crash', 'list']);
|
|
122
|
+
return JSON.parse(stdout.replace(/'/g, '"')).filter(x => !['.', '..'].includes(x));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async exportCrash(name, dstFolder) {
|
|
126
|
+
await this.execute(['crash', 'export', '--name', name], {
|
|
127
|
+
logStdout: true,
|
|
128
|
+
cwd: dstFolder
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
117
132
|
}
|
|
118
133
|
|
|
119
134
|
exports.Pyidevice = Pyidevice;
|
|
@@ -121,4 +136,4 @@ var _default = Pyidevice;
|
|
|
121
136
|
exports.default = _default;require('source-map-support').install();
|
|
122
137
|
|
|
123
138
|
|
|
124
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
139
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9weS1pb3MtZGV2aWNlLWNsaWVudC5qcyJdLCJuYW1lcyI6WyJCSU5BUllfTkFNRSIsIlB5aWRldmljZSIsImNvbnN0cnVjdG9yIiwidWRpZCIsImJpbmFyeVBhdGgiLCJhc3NlcnRFeGlzdHMiLCJpc1N0cmljdCIsImZzIiwid2hpY2giLCJlIiwiRXJyb3IiLCJleGVjdXRlIiwiYXJncyIsIm9wdHMiLCJjd2QiLCJmb3JtYXQiLCJsb2dTdGRvdXQiLCJmaW5hbEFyZ3MiLCJwdXNoIiwiY21kU3RyIiwidXRpbCIsInF1b3RlIiwibG9nIiwiZGVidWciLCJyZXN1bHQiLCJzdGRvdXQiLCJzdGRlcnIiLCJtZXNzYWdlIiwibGlzdFByb2ZpbGVzIiwiSlNPTiIsInBhcnNlIiwiaW5zdGFsbFByb2ZpbGUiLCJwcm9maWxlUGF0aCIsInBheWxvYWQiLCJ0bXBSb290Iiwic3JjUGF0aCIsInRlbXBEaXIiLCJvcGVuRGlyIiwicGF0aCIsImpvaW4iLCJ3cml0ZUZpbGUiLCJyaW1yYWYiLCJyZW1vdmVQcm9maWxlIiwibmFtZSIsImxpc3RDcmFzaGVzIiwicmVwbGFjZSIsImZpbHRlciIsIngiLCJpbmNsdWRlcyIsImV4cG9ydENyYXNoIiwiZHN0Rm9sZGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUlBLE1BQU1BLFdBQVcsR0FBRyxXQUFwQjs7QUFFQSxNQUFNQyxTQUFOLENBQWdCO0FBQ2RDLEVBQUFBLFdBQVcsQ0FBRUMsSUFBRixFQUFRO0FBQ2pCLFNBQUtBLElBQUwsR0FBWUEsSUFBWjtBQUNBLFNBQUtDLFVBQUwsR0FBa0IsSUFBbEI7QUFDRDs7QUFFaUIsUUFBWkMsWUFBWSxDQUFFQyxRQUFRLEdBQUcsSUFBYixFQUFtQjtBQUNuQyxRQUFJLEtBQUtGLFVBQVQsRUFBcUI7QUFDbkIsYUFBTyxJQUFQO0FBQ0Q7O0FBRUQsUUFBSTtBQUNGLFdBQUtBLFVBQUwsR0FBa0IsTUFBTUcsa0JBQUdDLEtBQUgs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QUVrQixRQUFiUSxhQUFhLENBQUVDLElBQUYsRUFBUTtBQUN6QixVQUFNLEtBQUtoQyxPQUFMLENBQWEsQ0FBQyxVQUFELEVBQWEsUUFBYixFQUF1QmdDLElBQXZCLENBQWIsRUFBMkM7QUFBQzNCLE1BQUFBLFNBQVMsRUFBRTtBQUFaLEtBQTNDLENBQU47QUFDRDs7QUFFZ0IsUUFBWDRCLFdBQVcsR0FBSTtBQUNuQixVQUFNO0FBQUNuQixNQUFBQTtBQUFELFFBQVcsTUFBTSxLQUFLZCxPQUFMLENBQWEsQ0FBQyxPQUFELEVBQVUsTUFBVixDQUFiLENBQXZCO0FBQ0EsV0FBT2tCLElBQUksQ0FBQ0MsS0FBTCxDQUFXTCxNQUFNLENBQUNvQixPQUFQLENBQWUsSUFBZixFQUFxQixHQUFyQixDQUFYLEVBQXNDQyxNQUF0QyxDQUE4Q0MsQ0FBRCxJQUFPLENBQUMsQ0FBQyxHQUFELEVBQU0sSUFBTixFQUFZQyxRQUFaLENBQXFCRCxDQUFyQixDQUFyRCxDQUFQO0FBQ0Q7O0FBRWdCLFFBQVhFLFdBQVcsQ0FBRU4sSUFBRixFQUFRTyxTQUFSLEVBQW1CO0FBQ2xDLFVBQU0sS0FBS3ZDLE9BQUwsQ0FBYSxDQUFDLE9BQUQsRUFBVSxRQUFWLEVBQW9CLFFBQXBCLEVBQThCZ0MsSUFBOUIsQ0FBYixFQUFrRDtBQUN0RDNCLE1BQUFBLFNBQVMsRUFBRSxJQUQyQztBQUd0REYsTUFBQUEsR0FBRyxFQUFFb0M7QUFIaUQsS0FBbEQsQ0FBTjtBQUtEOztBQTVGYTs7O2VBZ0dEakQsUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIHRlbXBEaXIgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vWXVlQ2hlbi1DL3B5LWlvcy1kZXZpY2VcblxuY29uc3QgQklOQVJZX05BTUUgPSAncHlpZGV2aWNlJztcblxuY2xhc3MgUHlpZGV2aWNlIHtcbiAgY29uc3RydWN0b3IgKHVkaWQpIHtcbiAgICB0aGlzLnVkaWQgPSB1ZGlkO1xuICAgIHRoaXMuYmluYXJ5UGF0aCA9IG51bGw7XG4gIH1cblxuICBhc3luYyBhc3NlcnRFeGlzdHMgKGlzU3RyaWN0ID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLmJpbmFyeVBhdGgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmJpbmFyeVBhdGggPSBhd2FpdCBmcy53aGljaChCSU5BUllfTkFNRSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0JJTkFSWV9OQU1FfSBiaW5hcnkgY2Fubm90IGJlIGZvdW5kIGluIFBBVEguIGAgK1xuICAgICAgICAgIGBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGluc3RhbGxlZC4gVmlzaXQgaHR0cHM6Ly9naXRodWIuY29tL1l1ZUNoZW4tQy9weS1pb3MtZGV2aWNlIGZvciBgICtcbiAgICAgICAgICBgbW9yZSBkZXRhaWxzLmApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUgKGFyZ3MsIG9wdHMgPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuYXNzZXJ0RXhpc3RzKCk7XG4gICAgY29uc3Qge1xuICAgICAgY3dkLFxuICAgICAgZm9ybWF0ID0gJ2pzb24nLFxuICAgICAgbG9nU3Rkb3V0ID0gZmFsc2UsXG4gICAgfSA9IG9wdHM7XG5cbiAgICBjb25zdCBmaW5hbEFyZ3MgPSBbLi4uYXJncywgJy0tdWRpZCcsIHRoaXMudWRpZF07XG4gICAgaWYgKGZvcm1hdCkge1xuICAgICAgZmluYWxBcmdzLnB1c2goJy0tZm9ybWF0JywgZm9ybWF0KTtcbiAgICB9XG4gICAgY29uc3QgY21kU3RyID0gdXRpbC5xdW90ZShbdGhpcy5iaW5hcnlQYXRoLCAuLi5maW5hbEFyZ3NdKTtcbiAgICBsb2cuZGVidWcoYEV4ZWN1dGluZyAke2NtZFN0cn1gKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlYyh0aGlzLmJpbmFyeVBhdGgsIGZpbmFsQXJncywge2N3ZH0pO1xuICAgICAgaWYgKGxvZ1N0ZG91dCkge1xuICAgICAgICBsb2cuZGVidWcoYENvbW1hbmQgb3V0cHV0OiAke3Jlc3VsdC5zdGRvdXR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y21kU3RyfScgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLnN0ZGVyciB8fCBlLnN0ZG91dCB8fCBlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbGlzdFByb2ZpbGVzICgpIHtcbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHRoaXMuZXhlY3V0ZShbJ3Byb2ZpbGVzJywgJ2xpc3QnXSk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3Rkb3V0KTtcbiAgfVxuXG4gIGFzeW5jIGluc3RhbGxQcm9maWxlICh7cHJvZmlsZVBhdGgsIHBheWxvYWR9ID0ge30pIHtcbiAgICBpZiAoIXByb2ZpbGVQYXRoICYmICFwYXlsb2FkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VpdGhlciB0aGUgZnVsbCBwYXRoIHRvIHRoZSBwcm9maWxlIG9yIGl0cyBwYXlsb2FkIG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBsZXQgdG1wUm9vdDtcbiAgICBsZXQgc3JjUGF0aCA9IHByb2ZpbGVQYXRoO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXNyY1BhdGgpIHtcbiAgICAgICAgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgICAgICBzcmNQYXRoID0gcGF0aC5qb2luKHRtcFJvb3QsICdjZXJ0LnBlbScpO1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoc3JjUGF0aCwgcGF5bG9hZCwgJ3V0ZjgnKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZShbJ3Byb2ZpbGVzJywgJ2luc3RhbGwnLCAnLS1wYXRoJywgc3JjUGF0aF0sIHtcbiAgICAgICAgbG9nU3Rkb3V0OiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRtcFJvb3QpIHtcbiAgICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbW92ZVByb2ZpbGUgKG5hbWUpIHtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGUoWydwcm9maWxlcycsICdyZW1vdmUnLCBuYW1lXSwge2xvZ1N0ZG91dDogdHJ1ZX0pO1xuICB9XG5cbiAgYXN5bmMgbGlzdENyYXNoZXMgKCkge1xuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgdGhpcy5leGVjdXRlKFsnY3Jhc2gnLCAnbGlzdCddKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdGRvdXQucmVwbGFjZSgvJy9nLCAnXCInKSkuZmlsdGVyKCh4KSA9PiAhWycuJywgJy4uJ10uaW5jbHVkZXMoeCkpO1xuICB9XG5cbiAgYXN5bmMgZXhwb3J0Q3Jhc2ggKG5hbWUsIGRzdEZvbGRlcikge1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZShbJ2NyYXNoJywgJ2V4cG9ydCcsICctLW5hbWUnLCBuYW1lXSwge1xuICAgICAgbG9nU3Rkb3V0OiB0cnVlLFxuICAgICAgLy8gVGhlIHRvb2wgZXhwb3J0cyBjcmFzaCByZXBvcnRzIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyXG4gICAgICBjd2Q6IGRzdEZvbGRlclxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IFB5aWRldmljZSB9O1xuZXhwb3J0IGRlZmF1bHQgUHlpZGV2aWNlO1xuIl0sImZpbGUiOiJsaWIvcHktaW9zLWRldmljZS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
import { fs } from 'appium-support';
|
|
1
|
+
import { fs, tempDir } from 'appium-support';
|
|
2
2
|
import B from 'bluebird';
|
|
3
3
|
import log from '../logger';
|
|
4
4
|
import { utilities } from 'appium-ios-device';
|
|
5
5
|
import path from 'path';
|
|
6
6
|
import _ from 'lodash';
|
|
7
|
+
import Pyidevice from '../py-ios-device-client';
|
|
8
|
+
|
|
9
|
+
const REAL_DEVICE_MAGIC = '3620bbb0-fb9f-4b62-a668-896f2edc4d88';
|
|
10
|
+
const MAGIC_SEP = '/';
|
|
7
11
|
|
|
8
12
|
|
|
9
13
|
class IOSCrashLog {
|
|
10
14
|
constructor (opts = {}) {
|
|
11
15
|
this.udid = opts.udid;
|
|
16
|
+
this.pyideviceClient = this.udid ? new Pyidevice(this.udid) : null;
|
|
12
17
|
const logDir = opts.udid
|
|
13
18
|
? path.resolve(process.env.HOME, 'Library', 'Logs', 'CrashReporter', 'MobileDevice')
|
|
14
19
|
: path.resolve(process.env.HOME, 'Library', 'Logs', 'DiagnosticReports');
|
|
@@ -20,7 +25,12 @@ class IOSCrashLog {
|
|
|
20
25
|
this.sim = opts.sim;
|
|
21
26
|
}
|
|
22
27
|
|
|
23
|
-
async
|
|
28
|
+
async _gatherFromRealDevice () {
|
|
29
|
+
if (await this.pyideviceClient.assertExists(false)) {
|
|
30
|
+
return (await this.pyideviceClient.listCrashes())
|
|
31
|
+
.map((x) => `${REAL_DEVICE_MAGIC}${MAGIC_SEP}${x}`);
|
|
32
|
+
}
|
|
33
|
+
|
|
24
34
|
let crashLogsRoot = this.logDir;
|
|
25
35
|
if (this.udid) {
|
|
26
36
|
this.phoneName = this.phoneName || await utilities.getDeviceName(this.udid);
|
|
@@ -33,9 +43,17 @@ class IOSCrashLog {
|
|
|
33
43
|
const foundFiles = await fs.glob(`${crashLogsRoot}/**/*.crash`, {
|
|
34
44
|
strict: false
|
|
35
45
|
});
|
|
36
|
-
|
|
37
|
-
|
|
46
|
+
return foundFiles;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async _gatherFromSimulator () {
|
|
50
|
+
if (!await fs.exists(this.logDir)) {
|
|
51
|
+
log.debug(`Crash reports root '${this.logDir}' does not exist. Got nothing to gather.`);
|
|
52
|
+
return [];
|
|
38
53
|
}
|
|
54
|
+
const foundFiles = await fs.glob(`${this.logDir}/**/*.crash`, {
|
|
55
|
+
strict: false
|
|
56
|
+
});
|
|
39
57
|
// For Simulator only include files, that contain current UDID
|
|
40
58
|
return await B.filter(foundFiles, async (x) => {
|
|
41
59
|
try {
|
|
@@ -47,6 +65,12 @@ class IOSCrashLog {
|
|
|
47
65
|
});
|
|
48
66
|
}
|
|
49
67
|
|
|
68
|
+
async getCrashes () {
|
|
69
|
+
return this.udid
|
|
70
|
+
? await this._gatherFromRealDevice()
|
|
71
|
+
: await this._gatherFromSimulator();
|
|
72
|
+
}
|
|
73
|
+
|
|
50
74
|
async startCapture () {
|
|
51
75
|
this.prevLogs = await this.getCrashes();
|
|
52
76
|
}
|
|
@@ -69,14 +93,30 @@ class IOSCrashLog {
|
|
|
69
93
|
}
|
|
70
94
|
|
|
71
95
|
async filesToJSON (paths) {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
return {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
96
|
+
const tmpRoot = await tempDir.openDir();
|
|
97
|
+
try {
|
|
98
|
+
return (await B.map(paths, async (fullPath) => {
|
|
99
|
+
if (_.includes(fullPath, REAL_DEVICE_MAGIC)) {
|
|
100
|
+
const fileName = _.last(fullPath.split(MAGIC_SEP));
|
|
101
|
+
try {
|
|
102
|
+
await this.pyideviceClient.exportCrash(fileName, tmpRoot);
|
|
103
|
+
} catch (e) {
|
|
104
|
+
log.warn(`Cannot export the crash report '${fileName}'. Skipping it. ` +
|
|
105
|
+
`Original error: ${e.message}`);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
fullPath = path.join(tmpRoot, fileName);
|
|
109
|
+
}
|
|
110
|
+
const stat = await fs.stat(fullPath);
|
|
111
|
+
return {
|
|
112
|
+
timestamp: stat.ctime.getTime(),
|
|
113
|
+
level: 'ALL',
|
|
114
|
+
message: await fs.readFile(fullPath, 'utf8')
|
|
115
|
+
};
|
|
116
|
+
})).filter(Boolean);
|
|
117
|
+
} finally {
|
|
118
|
+
await fs.rimraf(tmpRoot);
|
|
119
|
+
}
|
|
80
120
|
}
|
|
81
121
|
}
|
|
82
122
|
|
|
@@ -34,6 +34,7 @@ class Pyidevice {
|
|
|
34
34
|
async execute (args, opts = {}) {
|
|
35
35
|
await this.assertExists();
|
|
36
36
|
const {
|
|
37
|
+
cwd,
|
|
37
38
|
format = 'json',
|
|
38
39
|
logStdout = false,
|
|
39
40
|
} = opts;
|
|
@@ -45,7 +46,7 @@ class Pyidevice {
|
|
|
45
46
|
const cmdStr = util.quote([this.binaryPath, ...finalArgs]);
|
|
46
47
|
log.debug(`Executing ${cmdStr}`);
|
|
47
48
|
try {
|
|
48
|
-
const result = await exec(this.binaryPath, finalArgs);
|
|
49
|
+
const result = await exec(this.binaryPath, finalArgs, {cwd});
|
|
49
50
|
if (logStdout) {
|
|
50
51
|
log.debug(`Command output: ${result.stdout}`);
|
|
51
52
|
}
|
|
@@ -60,28 +61,24 @@ class Pyidevice {
|
|
|
60
61
|
return JSON.parse(stdout);
|
|
61
62
|
}
|
|
62
63
|
|
|
63
|
-
async installProfile (
|
|
64
|
-
const {
|
|
65
|
-
profilePath,
|
|
66
|
-
payload,
|
|
67
|
-
} = opts;
|
|
64
|
+
async installProfile ({profilePath, payload} = {}) {
|
|
68
65
|
if (!profilePath && !payload) {
|
|
69
|
-
throw new
|
|
66
|
+
throw new Error('Either the full path to the profile or its payload must be provided');
|
|
70
67
|
}
|
|
71
68
|
|
|
72
|
-
|
|
73
|
-
|
|
69
|
+
let tmpRoot;
|
|
70
|
+
let srcPath = profilePath;
|
|
71
|
+
try {
|
|
72
|
+
if (!srcPath) {
|
|
73
|
+
tmpRoot = await tempDir.openDir();
|
|
74
|
+
srcPath = path.join(tmpRoot, 'cert.pem');
|
|
75
|
+
await fs.writeFile(srcPath, payload, 'utf8');
|
|
76
|
+
}
|
|
77
|
+
await this.execute(['profiles', 'install', '--path', srcPath], {
|
|
74
78
|
logStdout: true
|
|
75
79
|
});
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const tmpProfilePath = path.join(tmpRoot, 'cert.pem');
|
|
79
|
-
try {
|
|
80
|
-
await fs.writeFile(tmpProfilePath, payload, 'utf8');
|
|
81
|
-
await this.execute(['profiles', 'install', '--path', tmpProfilePath], {
|
|
82
|
-
logStdout: true
|
|
83
|
-
});
|
|
84
|
-
} finally {
|
|
80
|
+
} finally {
|
|
81
|
+
if (tmpRoot) {
|
|
85
82
|
await fs.rimraf(tmpRoot);
|
|
86
83
|
}
|
|
87
84
|
}
|
|
@@ -90,6 +87,19 @@ class Pyidevice {
|
|
|
90
87
|
async removeProfile (name) {
|
|
91
88
|
await this.execute(['profiles', 'remove', name], {logStdout: true});
|
|
92
89
|
}
|
|
90
|
+
|
|
91
|
+
async listCrashes () {
|
|
92
|
+
const {stdout} = await this.execute(['crash', 'list']);
|
|
93
|
+
return JSON.parse(stdout.replace(/'/g, '"')).filter((x) => !['.', '..'].includes(x));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async exportCrash (name, dstFolder) {
|
|
97
|
+
await this.execute(['crash', 'export', '--name', name], {
|
|
98
|
+
logStdout: true,
|
|
99
|
+
// The tool exports crash reports to the current working dir
|
|
100
|
+
cwd: dstFolder
|
|
101
|
+
});
|
|
102
|
+
}
|
|
93
103
|
}
|
|
94
104
|
|
|
95
105
|
export { Pyidevice };
|