appium-ios-simulator
Version:
iOS Simulator interface for Appium.
474 lines (473 loc) • 16.8 kB
HTML
<html lang="en">
<head>
<title>Code coverage report for lib/simulator-xcode-9.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../prettify.css" />
<link rel="stylesheet" href="../base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="../index.html">All files</a> / <a href="index.html">lib</a> simulator-xcode-9.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">7.41% </span>
<span class="quiet">Statements</span>
<span class='fraction'>2/27</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/8</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/9</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">7.41% </span>
<span class="quiet">Lines</span>
<span class='fraction'>2/27</span>
</div>
</div>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137</td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import SimulatorXcode8 from './simulator-xcode-8';
import AsyncLock from 'async-lock';
import log from './logger';
import { shutdown as simctlShutdown, bootDevice, eraseDevice } from 'node-simctl';
import { waitForCondition } from 'asyncbox';
import { restoreTouchEnrollShortcuts, backupTouchEnrollShortcuts,
setTouchEnrollKey } from './touch-enroll.js';
const SIMULATOR_SHUTDOWN_TIMEOUT = 15 * 1000;
const startupLock = new AsyncLock();
class <span class="fstat-no" title="function not covered" >SimulatorXcode9 </span>extends SimulatorXcode8 {
constructor (udid, xcodeVersion) {
<span class="cstat-no" title="statement not covered" > super(udid, xcodeVersion);</span>
}
/**
* Executes given Simulator with options. The Simulator will not be restarted if
* it is already running and the current UI state matches to `isHeadless` option.
* @override
*
* @param {object} opts - One or more of available Simulator options:
* - {string} scaleFactor: can be one of ['1.0', '0.75', '0.5', '0.33', '0.25'].
* Defines the window scale value for the UI client window for the current Simulator.
* Equals to null by default, which keeps the current scale unchanged.
* - {boolean} connectHardwareKeyboard: whether to connect the hardware keyboard to the
* Simulator UI client. Equals to false by default.
* - {boolean} allowTouchEnroll: whether to enroll Touch ID in the Simulator UI client.
* Equals to false by default.
* - {number} startupTimeout: number of milliseconds to wait until Simulator booting
* process is completed. The default timeout will be used if not set explicitly.
* - {boolean} isHeadless: whether to start the Simulator in headless mode (with UI
* client invisible). `false` by default.
*/
async run <span class="fstat-no" title="function not covered" >(opts<span class="cstat-no" title="statement not covered" > = {})</span> {</span>
<span class="cstat-no" title="statement not covered" > opts = Object.assign({</span>
isHeadless: false,
allowTouchEnroll: false,
startupTimeout: this.startupTimeout,
}, opts);
const <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >bootSimulator </span>= async () => {</span>
try {
await bootDevice(this.udid);
} catch (err) {
<span class="cstat-no" title="statement not covered" > log.warn(`'xcrun simctl boot ${this.udid}' command has returned non-zero code. The problem was: ${err.stderr}`);</span>
}
};
const <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >waitForShutdown </span>= async () => {</span>
await waitForCondition(<span class="fstat-no" title="function not covered" >async () => {</span>
const {<span class="cstat-no" title="statement not covered" >state}</span> = await this.stat();
return state === 'Shutdown';
}, {waitMs: SIMULATOR_SHUTDOWN_TIMEOUT, intervalMs: 500});
};
let <span class="cstat-no" title="statement not covered" >shouldWaitForBoot = true;</span>
const <span class="cstat-no" title="statement not covered" >startTime = process.hrtime();</span>
await startupLock.acquire(this.uiClientBundleId, <span class="fstat-no" title="function not covered" >async () => {</span>
const <span class="cstat-no" title="statement not covered" >stat </span>= await this.stat();
const <span class="cstat-no" title="statement not covered" >serverState = stat.state;</span>
const <span class="cstat-no" title="statement not covered" >isServerRunning = serverState === 'Booted';</span>
const <span class="cstat-no" title="statement not covered" >isUIClientRunning </span>= await this.isUIClientRunning();
if (opts.isHeadless) {
if (isServerRunning && !isUIClientRunning) {
<span class="cstat-no" title="statement not covered" > log.info(`Simulator with UDID ${this.udid} already booted in headless mode.`);</span>
<span class="cstat-no" title="statement not covered" > shouldWaitForBoot = false;</span>
return;
}
if (await this.killUIClient()) {
// Stopping the UI client also kills all running servers. Sad but true
<span class="cstat-no" title="statement not covered" > log.info(`Detected the UI client was running and killed it. Verifying the Simulator is in Shutdown state...`);</span>
await waitForShutdown();
}
<span class="cstat-no" title="statement not covered" > log.info(`Booting Simulator with UDID ${this.udid} in headless mode. All UI-related capabilities are going to be ignored.`);</span>
await bootSimulator();
} else {
if (isServerRunning && isUIClientRunning) {
<span class="cstat-no" title="statement not covered" > log.info(`Both Simulator with UDID ${this.udid} and the UI client are currently running`);</span>
<span class="cstat-no" title="statement not covered" > shouldWaitForBoot = false;</span>
return;
}
if (['Shutdown', 'Booted'].indexOf(serverState) === -1) {
<span class="cstat-no" title="statement not covered" > log.info(`Simulator ${this.udid} is in '${serverState}' state. Trying to shutdown...`);</span>
try {
await this.shutdown();
} catch (err) {
<span class="cstat-no" title="statement not covered" > log.warn(`Error on Simulator shutdown: ${err.message}`);</span>
}
await waitForShutdown();
}
// Set the 'Touch ID Enroll' key bindings before the Simulator starts
if (opts.allowTouchEnroll) {
await setTouchEnrollKey();
}
<span class="cstat-no" title="statement not covered" > log.info(`Booting Simulator with UDID ${this.udid}...`);</span>
await bootSimulator();
if (!isUIClientRunning) {
await this.startUIClient(opts);
}
}
});
if (shouldWaitForBoot) {
await this.waitForBoot(opts.startupTimeout);
<span class="cstat-no" title="statement not covered" > log.info(`Simulator with UDID ${this.udid} booted in ${process.hrtime(startTime)[0]} seconds`);</span>
}
}
/**
* Shut down the current Simulator.
* @override
*/
async shutdown <span class="fstat-no" title="function not covered" >() {</span>
await restoreTouchEnrollShortcuts();
const {<span class="cstat-no" title="statement not covered" >state}</span> = await this.stat();
if (state === 'Shutdown') {
return;
}
await simctlShutdown(this.udid);
}
async enrollTouchID <span class="fstat-no" title="function not covered" >() {</span>
await backupTouchEnrollShortcuts();
await super.enrollTouchID();
}
/**
* Reset the current Simulator to the clean state.
* @override
*/
async clean <span class="fstat-no" title="function not covered" >() {</span>
<span class="cstat-no" title="statement not covered" > log.info(`Cleaning simulator ${this.udid}`);</span>
await eraseDevice(this.udid, 10000);
}
}
export default SimulatorXcode9;
</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Fri Aug 11 2017 08:34:01 GMT-0400 (EDT)
</div>
</div>
<script src="../prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="../sorter.js"></script>
</body>
</html>