From 4a3180aca9eaeda9cdbe84962ac7fb3448e7ec23 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Thu, 21 Apr 2022 22:16:42 +0200 Subject: [PATCH] chore: make Android host option configurable (#13685) --- docs/src/api/class-android.md | 7 ++++- .../playwright-core/src/protocol/channels.ts | 2 ++ .../playwright-core/src/protocol/protocol.yml | 1 + .../playwright-core/src/protocol/validator.ts | 1 + .../src/server/android/backendAdb.ts | 29 ++++++++++++------- packages/playwright-core/src/server/types.ts | 1 + packages/playwright-core/types/types.d.ts | 7 ++++- 7 files changed, 36 insertions(+), 12 deletions(-) diff --git a/docs/src/api/class-android.md b/docs/src/api/class-android.md index 5cb4eed5e9..de668051e2 100644 --- a/docs/src/api/class-android.md +++ b/docs/src/api/class-android.md @@ -82,10 +82,15 @@ PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm i -D playwright Returns the list of detected Android devices. +### option: Android.devices.host +- `host` <[string]> + +Optional host to establish ADB server connection. Default to `127.0.0.1`. + ### option: Android.devices.port - `port` <[int]> -Optional port to establish ADB server connection. +Optional port to establish ADB server connection. Default to `5037`. ### option: Android.devices.omitDriverInstall - `omitDriverInstall` <[boolean]> diff --git a/packages/playwright-core/src/protocol/channels.ts b/packages/playwright-core/src/protocol/channels.ts index 28f2447e36..6f6c89df4d 100644 --- a/packages/playwright-core/src/protocol/channels.ts +++ b/packages/playwright-core/src/protocol/channels.ts @@ -3697,10 +3697,12 @@ export interface AndroidChannel extends AndroidEventTarget, Channel { setDefaultTimeoutNoReply(params: AndroidSetDefaultTimeoutNoReplyParams, metadata?: Metadata): Promise; } export type AndroidDevicesParams = { + host?: string, port?: number, omitDriverInstall?: boolean, }; export type AndroidDevicesOptions = { + host?: string, port?: number, omitDriverInstall?: boolean, }; diff --git a/packages/playwright-core/src/protocol/protocol.yml b/packages/playwright-core/src/protocol/protocol.yml index d50a9bc456..20d8074083 100644 --- a/packages/playwright-core/src/protocol/protocol.yml +++ b/packages/playwright-core/src/protocol/protocol.yml @@ -2852,6 +2852,7 @@ Android: devices: parameters: + host: string? port: number? omitDriverInstall: boolean? returns: diff --git a/packages/playwright-core/src/protocol/validator.ts b/packages/playwright-core/src/protocol/validator.ts index 46c4df28b0..4a5ab124a0 100644 --- a/packages/playwright-core/src/protocol/validator.ts +++ b/packages/playwright-core/src/protocol/validator.ts @@ -1308,6 +1308,7 @@ export function createScheme(tChannel: (name: string) => Validator): Scheme { }); scheme.ElectronApplicationCloseParams = tOptional(tObject({})); scheme.AndroidDevicesParams = tObject({ + host: tOptional(tString), port: tOptional(tNumber), omitDriverInstall: tOptional(tBoolean), }); diff --git a/packages/playwright-core/src/server/android/backendAdb.ts b/packages/playwright-core/src/server/android/backendAdb.ts index 86cfc027d8..754e62261f 100644 --- a/packages/playwright-core/src/server/android/backendAdb.ts +++ b/packages/playwright-core/src/server/android/backendAdb.ts @@ -23,18 +23,27 @@ import { assert, createGuid } from '../../utils'; export class AdbBackend implements Backend { async devices(options: types.AndroidDeviceOptions = {}): Promise { - const port = options.port ? options.port : 5037; - const result = await runCommand('host:devices', port); + const result = await runCommand('host:devices', options.host, options.port); const lines = result.toString().trim().split('\n'); return lines.map(line => { const [serial, status] = line.trim().split('\t'); - return new AdbDevice(serial, status, port); + return new AdbDevice(serial, status, options.host, options.port); }); } } class AdbDevice implements DeviceBackend { - constructor(readonly serial: string, readonly status: string, readonly port: number) { } + serial: string; + status: string; + host: string | undefined; + port: number | undefined; + + constructor(serial: string, status: string, host?: string, port?: number) { + this.serial = serial; + this.status = status; + this.host = host; + this.port = port; + } async init() { } @@ -43,19 +52,19 @@ class AdbDevice implements DeviceBackend { } runCommand(command: string): Promise { - return runCommand(command, this.port, this.serial); + return runCommand(command, this.host, this.port, this.serial); } async open(command: string): Promise { - const result = await open(command, this.port, this.serial); + const result = await open(command, this.host, this.port, this.serial); result.becomeSocket(); return result; } } -async function runCommand(command: string, port: number = 5037, serial?: string): Promise { +async function runCommand(command: string, host: string = '127.0.0.1', port: number = 5037, serial?: string): Promise { debug('pw:adb:runCommand')(command, serial); - const socket = new BufferedSocketWrapper(command, net.createConnection({ port })); + const socket = new BufferedSocketWrapper(command, net.createConnection({ host, port })); if (serial) { await socket.write(encodeMessage(`host:transport:${serial}`)); const status = await socket.read(4); @@ -75,8 +84,8 @@ async function runCommand(command: string, port: number = 5037, serial?: string) return commandOutput; } -async function open(command: string, port: number = 5037, serial?: string): Promise { - const socket = new BufferedSocketWrapper(command, net.createConnection({ port })); +async function open(command: string, host: string = '127.0.0.1', port: number = 5037, serial?: string): Promise { + const socket = new BufferedSocketWrapper(command, net.createConnection({ host, port })); if (serial) { await socket.write(encodeMessage(`host:transport:${serial}`)); const status = await socket.read(4); diff --git a/packages/playwright-core/src/server/types.ts b/packages/playwright-core/src/server/types.ts index 87112292d6..6ae1d5e83a 100644 --- a/packages/playwright-core/src/server/types.ts +++ b/packages/playwright-core/src/server/types.ts @@ -369,6 +369,7 @@ export type APIResponse = { }; export type AndroidDeviceOptions = { + host?: string, port?: number, omitDriverInstall?: boolean, }; diff --git a/packages/playwright-core/types/types.d.ts b/packages/playwright-core/types/types.d.ts index c90f8a5587..7c94b70499 100644 --- a/packages/playwright-core/types/types.d.ts +++ b/packages/playwright-core/types/types.d.ts @@ -11108,13 +11108,18 @@ export interface Android { * @param options */ devices(options?: { + /** + * Optional host to establish ADB server connection. Default to `127.0.0.1`. + */ + host?: string; + /** * Prevents automatic playwright driver installation on attach. Assumes that the drivers have been installed already. */ omitDriverInstall?: boolean; /** - * Optional port to establish ADB server connection. + * Optional port to establish ADB server connection. Default to `5037`. */ port?: number; }): Promise>;