kuben-appium-xcuitest-driver
Version:
Appium driver for iOS using XCUITest for backend
75 lines (63 loc) • 2.06 kB
JavaScript
import log from '../logger';
import { killProcess } from './utils';
import B from 'bluebird';
import { logger } from 'appium-support';
import { SubProcess } from 'teen_process';
const IPROXY_TIMEOUT = 5000;
const iproxyLog = logger.getLogger('iProxy');
class iProxy {
constructor (udid, localport, deviceport) {
log.debug(`Starting iproxy to forward traffic from local port ${localport} to device port ${deviceport} over USB ` +
`for the device ${udid}`);
this.expectIProxyErrors = true;
this.iproxy = new SubProcess('iproxy', [localport, deviceport, udid], {
detached: true,
stdio: ['ignore', 'pipe', 'pipe'],
});
}
async start () {
this.expectIProxyErrors = true;
return await new B((resolve, reject) => {
this.iproxy.on('exit', (code) => {
log.debug(`iproxy exited with code '${code}'`);
if (code) {
return reject(new Error(`iproxy exited with code '${code}'`));
}
});
this.iproxy.on('output', (stdout, stderr) => {
// do nothing if we expect errors
if (this.expectIProxyErrors) {
return;
}
let out = stdout || stderr;
for (let line of out.split('\n')) {
if (!line.length) {
continue;
}
if (line.includes('Resource temporarily unavailable')) {
// this generally happens when WDA does not respond,
// so print a more useful message
log.debug('Connection to WDA timed out');
} else {
iproxyLog.debug(line);
}
}
});
return (async () => {
try {
await this.iproxy.start(IPROXY_TIMEOUT, true);
resolve();
} catch (err) {
log.error(`Error starting iproxy: '${err.message}'`);
reject(new Error('Unable to start iproxy. Is it installed?'));
}
})();
});
}
async quit () {
await killProcess('iproxy', this.iproxy);
this.expectIProxyErrors = true;
}
}
export { iProxy };
export default iProxy;