Summary: This turns the bridge type into a simpler struct with always-present methods so you don't need to add additional null check to the calling logic which are hard to deal with. Reviewed By: mweststrate Differential Revision: D30248628 fbshipit-source-id: cdaee44efcbb19dcbb301099b4a7d0eb0c350e67
116 lines
2.8 KiB
TypeScript
116 lines
2.8 KiB
TypeScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @format
|
|
*/
|
|
|
|
import {makeIOSBridge} from '../IOSBridge';
|
|
import childProcess from 'child_process';
|
|
import * as promisifyChildProcess from 'promisify-child-process';
|
|
import {mocked} from 'ts-jest/utils';
|
|
|
|
jest.mock('child_process');
|
|
const spawn = mocked(childProcess.spawn);
|
|
|
|
jest.mock('promisify-child-process');
|
|
const exec = mocked(promisifyChildProcess.exec);
|
|
|
|
test('uses xcrun with no idb when xcode is detected', async () => {
|
|
const ib = await makeIOSBridge('', true);
|
|
|
|
ib.startLogListener('deadbeef', 'emulator');
|
|
|
|
expect(spawn).toHaveBeenCalledWith(
|
|
'xcrun',
|
|
[
|
|
'simctl',
|
|
'spawn',
|
|
'deadbeef',
|
|
'log',
|
|
'stream',
|
|
'--style',
|
|
'json',
|
|
'--predicate',
|
|
'senderImagePath contains "Containers"',
|
|
'--debug',
|
|
'--info',
|
|
],
|
|
{},
|
|
);
|
|
});
|
|
|
|
test('uses idb when present and xcode detected', async () => {
|
|
const ib = await makeIOSBridge('/usr/local/bin/idb', true, async (_) => true);
|
|
|
|
ib.startLogListener('deadbeef', 'emulator');
|
|
|
|
expect(spawn).toHaveBeenCalledWith(
|
|
'/usr/local/bin/idb',
|
|
[
|
|
'log',
|
|
'--udid',
|
|
'deadbeef',
|
|
'--',
|
|
'--style',
|
|
'json',
|
|
'--predicate',
|
|
'senderImagePath contains "Containers"',
|
|
'--debug',
|
|
'--info',
|
|
],
|
|
{},
|
|
);
|
|
});
|
|
|
|
test('uses idb when present and xcode detected and physical device connected', async () => {
|
|
const ib = await makeIOSBridge('/usr/local/bin/idb', true, async (_) => true);
|
|
|
|
ib.startLogListener('deadbeef', 'physical');
|
|
|
|
expect(spawn).toHaveBeenCalledWith(
|
|
'/usr/local/bin/idb',
|
|
[
|
|
'log',
|
|
'--udid',
|
|
'deadbeef',
|
|
'--',
|
|
// no further args; not supported by idb atm
|
|
],
|
|
{},
|
|
);
|
|
});
|
|
|
|
test("without idb physical devices can't log", async () => {
|
|
const ib = await makeIOSBridge('', true);
|
|
expect(ib.startLogListener).toBeDefined(); // since we have xcode
|
|
});
|
|
|
|
test('throws if no iOS support', async () => {
|
|
await expect(makeIOSBridge('', false)).rejects.toThrow(
|
|
'Neither Xcode nor idb available. Cannot provide iOS device functionality.',
|
|
);
|
|
});
|
|
|
|
test('uses xcrun to take screenshots with no idb when xcode is detected', async () => {
|
|
const ib = await makeIOSBridge('', true);
|
|
|
|
ib.screenshot('deadbeef');
|
|
|
|
expect(exec).toHaveBeenCalledWith(
|
|
'xcrun simctl io deadbeef screenshot /temp/00000000-0000-0000-0000-000000000000.png',
|
|
);
|
|
});
|
|
|
|
test('uses idb to take screenshots when available', async () => {
|
|
const ib = await makeIOSBridge('/usr/local/bin/idb', true, async (_) => true);
|
|
|
|
ib.screenshot('deadbeef');
|
|
|
|
expect(exec).toHaveBeenCalledWith(
|
|
'idb screenshot --udid deadbeef /temp/00000000-0000-0000-0000-000000000000.png',
|
|
);
|
|
});
|