From 83133618d6f78a76cb782e35bccd128e82f79b43 Mon Sep 17 00:00:00 2001 From: Andres Orozco Gonzalez Date: Wed, 23 Mar 2022 04:24:23 -0700 Subject: [PATCH] add adbkit configurations settings Summary: Adbkit configurations settings may be neccesary when we want to run flipper-server in an IPv6 stack machine as localhost would bind to [::1] rather than 127.0.0.1 which is where the adb server usually runs Reviewed By: mweststrate Differential Revision: D34964851 fbshipit-source-id: 9cf70f9bdc0c40e92382b1537013439f85983f65 --- desktop/flipper-common/src/settings.tsx | 13 ++++++ .../android/__tests__/adbConfig.node.tsx | 40 +++++++++++++++++++ .../src/devices/android/adbClient.tsx | 6 ++- .../src/devices/android/adbConfig.tsx | 5 ++- 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/desktop/flipper-common/src/settings.tsx b/desktop/flipper-common/src/settings.tsx index 89046449d..a97f74dd5 100644 --- a/desktop/flipper-common/src/settings.tsx +++ b/desktop/flipper-common/src/settings.tsx @@ -45,6 +45,19 @@ export type Settings = { enablePluginMarketplace: boolean; marketplaceURL: string; enablePluginMarketplaceAutoUpdate: boolean; + /** + * Adbkit settings are needed because localhost can resolve to + * 127.0.0.1 or [::1] depending on the machine (IPV4 or IPV6) + * this unknown behaviour of which address will be used by the + * adbkit may cause it not to connect to the correct address where the + * adb server is running. Notice that using the env variable ADB_SERVER_SOCKET + * set to tcp:127.0.0.1:5037 would make the adb start-server fail and so + * cannot be used as a solution. + */ + adbKitSettings?: { + host?: string; + port?: number; + }; }; export enum ReleaseChannel { diff --git a/desktop/flipper-server-core/src/devices/android/__tests__/adbConfig.node.tsx b/desktop/flipper-server-core/src/devices/android/__tests__/adbConfig.node.tsx index b93818f87..808dedbbe 100644 --- a/desktop/flipper-server-core/src/devices/android/__tests__/adbConfig.node.tsx +++ b/desktop/flipper-server-core/src/devices/android/__tests__/adbConfig.node.tsx @@ -45,3 +45,43 @@ test('have defaults', () => { expect(port).toBe(5037); expect(host).toBe('localhost'); }); + +test('prefer settings parameters over ANDROID_ADB_SERVER_PORT', () => { + process.env.ANDROID_ADB_SERVER_PORT = '1337'; + process.env.ADB_SERVER_SOCKET = undefined; + const {port, host} = adbConfig({host: '::1', port: 1338}); + expect(port).toBe(1338); + expect(host).toBe('::1'); +}); + +test('prefer settings parameters over ADB_SERVER_SOCKET', () => { + process.env.ANDROID_ADB_SERVER_PORT = undefined; + process.env.ADB_SERVER_SOCKET = 'tcp:127.0.0.1:5037'; + const {port, host} = adbConfig({host: '::1', port: 1338}); + expect(port).toBe(1338); + expect(host).toBe('::1'); +}); + +test('prefer host settings parameters over ADB_SERVER_SOCKET', () => { + process.env.ANDROID_ADB_SERVER_PORT = undefined; + process.env.ADB_SERVER_SOCKET = 'tcp:127.0.0.1:5037'; + const {port, host} = adbConfig({host: '::1'}); + expect(port).toBe(5037); + expect(host).toBe('::1'); +}); + +test('prefer port settings parameters over ADB_SERVER_SOCKET', () => { + process.env.ANDROID_ADB_SERVER_PORT = undefined; + process.env.ADB_SERVER_SOCKET = 'tcp:127.0.0.1:5037'; + const {port, host} = adbConfig({port: 1338}); + expect(port).toBe(1338); + expect(host).toBe('127.0.0.1'); +}); + +test('prefer port settings parameters over ANDROID_ADB_SERVER_PORT', () => { + process.env.ANDROID_ADB_SERVER_PORT = '1337'; + process.env.ADB_SERVER_SOCKET = undefined; + const {port, host} = adbConfig({port: 1338}); + expect(port).toBe(1338); + expect(host).toBe('localhost'); +}); diff --git a/desktop/flipper-server-core/src/devices/android/adbClient.tsx b/desktop/flipper-server-core/src/devices/android/adbClient.tsx index 5b2c9c8f7..b9c0b96ba 100644 --- a/desktop/flipper-server-core/src/devices/android/adbClient.tsx +++ b/desktop/flipper-server-core/src/devices/android/adbClient.tsx @@ -15,6 +15,10 @@ import path from 'path'; type Config = { androidHome: string; + adbKitSettings?: { + host?: string; + port?: number; + }; }; export async function initializeAdbClient( @@ -38,7 +42,7 @@ export async function initializeAdbClient( async function createClient(config: Config): Promise { return reportPlatformFailures( startAdbServer(config.androidHome).then(() => - adbkit.createClient(adbConfig()), + adbkit.createClient(adbConfig(config.adbKitSettings)), ), 'createADBClient.shell', ); diff --git a/desktop/flipper-server-core/src/devices/android/adbConfig.tsx b/desktop/flipper-server-core/src/devices/android/adbConfig.tsx index afa65d44b..c3dba0016 100644 --- a/desktop/flipper-server-core/src/devices/android/adbConfig.tsx +++ b/desktop/flipper-server-core/src/devices/android/adbConfig.tsx @@ -9,7 +9,7 @@ import {parseEnvironmentVariableAsNumber} from '../../utils/environmentVariables'; -export default () => { +export default (settings?: {host?: string; port?: number}) => { let port = parseEnvironmentVariableAsNumber( 'ANDROID_ADB_SERVER_PORT', 5037, @@ -26,6 +26,9 @@ export default () => { } } + host = settings?.host ?? host; + port = settings?.port ?? port; + return { port, host,