async def test_spawn_companion(self) -> None: tailer = CompanionTailer("idb_path", mock.Mock()) tailer._log_file_path = mock.Mock() with mock.patch( "idb.daemon.companion_tailer.asyncio.create_subprocess_exec", new=AsyncMock(), ) as exec_mock, mock.patch("idb.daemon.companion_tailer.open"): process_mock = mock.Mock() process_mock.stdout.readline = AsyncMock(return_value=None) exec_mock.return_value = process_mock await tailer.start() exec_mock.assert_called_once_with( "idb_path", "--notify", "1", stdout=mock.ANY, stderr=mock.ANY ) self.assertEqual(tailer.process, process_mock)
async def start_daemon_server(args: Namespace, logger: Logger) -> Server: grpc_port = args.daemon_grpc_port notifier_path = args.notifier_path companion_manager = CompanionManager(companion_path=notifier_path, logger=logger) boot_manager = BootManager(companion_path=notifier_path) grpc_handler = GRPCHandler(companion_manager=companion_manager, boot_manager=boot_manager, logger=logger) grpc_server = GRPCServer(handler=grpc_handler, logger=logger) await grpc_server.start("localhost", grpc_port) servers: List[Server] = [grpc_server] if notifier_path: companion_tailer = CompanionTailer(notifier_path=notifier_path, companion_manager=companion_manager) await companion_tailer.start() servers.append(companion_tailer) servers = await plugin.resolve_servers( args=args, companion_manager=companion_manager, boot_manager=boot_manager, logger=logger, servers=servers, ) logger.debug(f"Started servers {servers}") return CompositeServer(servers=servers, logger=logger)
async def test_close(self) -> None: tailer = CompanionTailer("idb_path", mock.Mock()) process_mock = mock.Mock() tailer.process = process_mock tailer._reading_forever_fut = mock.Mock() tailer.close() process_mock.terminate.assert_called_once() tailer._reading_forever_fut.cancel.assert_called_once()
async def test_read_stream(self) -> None: class StreamMock: i = 0 lines: List[bytes] = [ json.dumps({ "udid": "udid", "state": "state", "type": "type", "name": "name", "os_version": "os_version", "architecture": "architecture", }).encode("utf-8"), json.dumps({ "initial_state_ended": True }).encode("utf-8"), ] async def readline(self) -> bytes: result = self.lines[self.i] self.i += 1 return result manager = CompanionManager(mock.MagicMock()) tailer = CompanionTailer("idb_path", manager) await tailer._read_stream(StreamMock()) # pyre-ignore self.assertEqual( manager._udid_target_map, { "udid": TargetDescription( udid="udid", name="name", state="state", target_type="type", os_version="os_version", architecture="architecture", companion_info=None, screen_dimensions=None, ) }, )