Move idb iOSBridge free-functions into class

Summary:
This isn't that important right now, but will help as the `IOSBridge` is expanded in the future. There's also an argument for logical ordering of functions within a container (a class!), but that's not the real motivation here.

The existence of `bind` shows that this free function is effectively closing over this argument anyway.

Reviewed By: passy, lblasa

Differential Revision: D33818267

fbshipit-source-id: e7b83f013121cedbd31cb28746b69c1fa76a0803
This commit is contained in:
Lawrence Lomax
2022-01-28 00:34:05 -08:00
committed by Facebook GitHub Bot
parent 9d17411073
commit 1e5a070dbd

View File

@@ -34,6 +34,39 @@ export interface IOSBridge {
) => child_process.ChildProcess; ) => child_process.ChildProcess;
} }
class IDBBridge implements IOSBridge {
constructor(private idbPath: string) {}
async navigate(serial: string, location: string): Promise<void> {
exec(`idb open --udid ${serial} "${location}"`);
}
recordVideo(serial: string, outputFile: string): child_process.ChildProcess {
console.log(`Starting screen record via idb to ${outputFile}.`);
return exec(`idb record-video --udid ${serial} ${outputFile}`);
}
async screenshot(serial: string): Promise<Buffer> {
const imagePath = makeTempScreenshotFilePath();
const command = `idb screenshot --udid ${serial} ${imagePath}`;
return runScreenshotCommand(command, imagePath);
}
startLogListener(
udid: string,
deviceType: DeviceType,
): child_process.ChildProcessWithoutNullStreams {
return child_process.spawn(
this.idbPath,
['log', '--udid', udid, '--', ...getLogExtraArgs(deviceType)],
{
env: {
PYTHONUNBUFFERED: '1',
},
},
);
}
}
async function isAvailable(idbPath: string): Promise<boolean> { async function isAvailable(idbPath: string): Promise<boolean> {
if (!idbPath) { if (!idbPath) {
return false; return false;
@@ -62,22 +95,6 @@ function getLogExtraArgs(deviceType: DeviceType) {
} }
} }
export function idbStartLogListener(
idbPath: string,
udid: string,
deviceType: DeviceType,
): child_process.ChildProcessWithoutNullStreams {
return child_process.spawn(
idbPath,
['log', '--udid', udid, '--', ...getLogExtraArgs(deviceType)],
{
env: {
PYTHONUNBUFFERED: '1',
},
},
);
}
export function xcrunStartLogListener(udid: string, deviceType: DeviceType) { export function xcrunStartLogListener(udid: string, deviceType: DeviceType) {
if (deviceType === 'physical') { if (deviceType === 'physical') {
throw new Error(ERR_PHYSICAL_DEVICE_LOGS_WITHOUT_IDB); throw new Error(ERR_PHYSICAL_DEVICE_LOGS_WITHOUT_IDB);
@@ -121,12 +138,6 @@ export async function xcrunScreenshot(serial: string): Promise<Buffer> {
return runScreenshotCommand(command, imagePath); return runScreenshotCommand(command, imagePath);
} }
export async function idbScreenshot(serial: string): Promise<Buffer> {
const imagePath = makeTempScreenshotFilePath();
const command = `idb screenshot --udid ${serial} ${imagePath}`;
return runScreenshotCommand(command, imagePath);
}
export async function xcrunNavigate( export async function xcrunNavigate(
serial: string, serial: string,
location: string, location: string,
@@ -134,13 +145,6 @@ export async function xcrunNavigate(
exec(`xcrun simctl io ${serial} launch url "${location}"`); exec(`xcrun simctl io ${serial} launch url "${location}"`);
} }
export async function idbNavigate(
serial: string,
location: string,
): Promise<void> {
exec(`idb open --udid ${serial} "${location}"`);
}
export function xcrunRecordVideo( export function xcrunRecordVideo(
serial: string, serial: string,
outputFile: string, outputFile: string,
@@ -151,14 +155,6 @@ export function xcrunRecordVideo(
); );
} }
export function idbRecordVideo(
serial: string,
outputFile: string,
): child_process.ChildProcess {
console.log(`Starting screen record via idb to ${outputFile}.`);
return exec(`idb record-video --udid ${serial} ${outputFile}`);
}
export async function makeIOSBridge( export async function makeIOSBridge(
idbPath: string, idbPath: string,
isXcodeDetected: boolean, isXcodeDetected: boolean,
@@ -166,12 +162,7 @@ export async function makeIOSBridge(
): Promise<IOSBridge> { ): Promise<IOSBridge> {
// prefer idb // prefer idb
if (await isAvailableFn(idbPath)) { if (await isAvailableFn(idbPath)) {
return { return new IDBBridge(idbPath);
startLogListener: idbStartLogListener.bind(null, idbPath),
screenshot: idbScreenshot,
navigate: idbNavigate,
recordVideo: idbRecordVideo,
};
} }
// no idb, if it's a simulator and xcode is available, we can use xcrun // no idb, if it's a simulator and xcode is available, we can use xcrun