### Question:
ExecutionVenueNioClient extends AbstractClientTransport implements ApplicationContextAware, InitializingBean { public synchronized FutureTask<Boolean> start() { this.sessionFactory.start(); if (rpcTimeoutChecker != null) { rpcTimeoutChecker.getThread().start(); } final FutureTask<Boolean> futureTask = new FutureTask<Boolean>( new Callable<Boolean>() { @Override public Boolean call() throws Exception { while (!ExecutionVenueNioClient.this.sessionFactory.isConnected()) { Thread.sleep(50); } return true; } }); final Thread thread = new Thread(futureTask); thread.setDaemon(true); thread.start(); return futureTask; } ExecutionVenueNioClient(NioLogger logger, NioConfig nioConfig, CougarObjectIOFactory objectIOFactory, ClientConnectedObjectManager connectedObjectManager, ClientSocketTransportInfo clientSocketTransportInfo, String addressList,
                                   JMXReportingThreadPoolExecutor ioExecutorService, JMXReportingThreadPoolExecutor reconnectExecutor, NetworkAddressResolver addressResolver, Tracer tracer);  ExecutionVenueNioClient(NioLogger logger, NioConfig nioConfig, CougarObjectIOFactory objectIOFactory, ClientConnectedObjectManager connectedObjectManager, ClientSocketTransportInfo clientSocketTransportInfo, String addressList,
                                   JMXReportingThreadPoolExecutor ioExecutorService, JMXReportingThreadPoolExecutor reconnectExecutor,
                                   int reconnectInterval, int handshakeResponseTimeout, long sessionRecycleInterval,
                                   NetworkAddressResolver addressResolver, Tracer tracer); IoSessionFactory getSessionFactory(); void addListener(HandlerListener listener); synchronized FutureTask<Boolean> start(); synchronized FutureTask<Boolean> stop(); @Override String toString(); int getOutstandingRequestCount(IoSession session); @Override void execute(ExecutionContext ctx, OperationKey key, Object[] args, ExecutionObserver observer,
                        ExecutionVenue executionVenue, TimeConstraints timeConstraints); void execute(final ExecutionContext ctx, final OperationDefinition def, final Object[] args,
                        final ExecutionObserver origObserver, final TimeConstraints timeConstraints); void setMarshaller(RemotableMethodInvocationMarshaller marshaller); RemotableMethodInvocationMarshaller getMarshaller(); @Required void setContextEmitter(ContextEmitter<Map<String, String>, ?> contextEmitter); @Override void setApplicationContext(ApplicationContext applicationContext); @Override void afterPropertiesSet(); @ManagedAttribute boolean isHardFailEnumDeserialisation(); void setHardFailEnumDeserialisation(boolean hardFailEnumDeserialisation);  }### Answer:
@Test public void testRPCTimeout() throws InterruptedException, ExecutionException, TimeoutException, IOException { nioLogger.log(NioLogger.LoggingLevel.SESSION, (String)null, "Starting testRPCTimeout()"); TlsNioConfig config = ServerClientFactory.getDefaultConfig(); config.setRpcTimeoutMillis(1000); ExecutionVenueNioClient timeoutClient = ServerClientFactory.createClient(connectionString, config); timeoutClient.start().get(100, TimeUnit.SECONDS); ClientTestExecutionObserver timeoutObserver = new ClientTestExecutionObserver(new CougarClientException(ServerFaultCode.Timeout, "Exception occurred in Client: Read timed out: tcp: performRequestAsync(timeoutClient, timeoutObserver, new Object[]{true, ServerClientFactory.COMMAND_SLEEP_60S, "60s sleep"}); assertNotNull(timeoutObserver.getExecutionResultFuture().get(2000, TimeUnit.MILLISECONDS)); timeoutObserver.assertResult(); nioLogger.log(NioLogger.LoggingLevel.SESSION, (String)null, "Stopping testRPCTimeout()"); }