race conditions are cool

This commit is contained in:
rusefi 2020-07-08 01:07:50 -04:00
parent 3d2ddb2612
commit c412bf7bd5
3 changed files with 29 additions and 11 deletions

View File

@ -24,7 +24,7 @@ public class BinaryProtocolProxy {
};
}
};
BinaryProtocolServer.tcpServerSocket(serverProxyPort, "proxy", clientSocketRunnableFactory, Logger.CONSOLE);
BinaryProtocolServer.tcpServerSocket(serverProxyPort, "proxy", clientSocketRunnableFactory, Logger.CONSOLE, null);
}
private static void runProxy(Socket targetEcuSocket, Socket clientSocket) {

View File

@ -2,6 +2,7 @@ package com.rusefi.io.tcp;
import com.opensr5.ConfigurationImage;
import com.opensr5.Logger;
import com.rusefi.Listener;
import com.rusefi.binaryprotocol.BinaryProtocolCommands;
import com.rusefi.binaryprotocol.BinaryProtocolState;
import com.rusefi.binaryprotocol.IoHelper;
@ -38,10 +39,10 @@ public class BinaryProtocolServer implements BinaryProtocolCommands {
}
public void start(LinkManager linkManager) {
start(linkManager, DEFAULT_PROXY_PORT);
start(linkManager, DEFAULT_PROXY_PORT, null);
}
public void start(LinkManager linkManager, int port) {
public void start(LinkManager linkManager, int port, Listener serverSocketCreationCallback) {
logger.info("BinaryProtocolServer on " + port);
Function<Socket, Runnable> clientSocketRunnableFactory = clientSocket -> () -> {
@ -52,10 +53,10 @@ public class BinaryProtocolServer implements BinaryProtocolCommands {
}
};
tcpServerSocket(port, "BinaryProtocolServer", clientSocketRunnableFactory, logger);
tcpServerSocket(port, "BinaryProtocolServer", clientSocketRunnableFactory, logger, serverSocketCreationCallback);
}
public static void tcpServerSocket(int port, String threadName, Function<Socket, Runnable> clientSocketRunnableFactory, final Logger logger) {
public static void tcpServerSocket(int port, String threadName, Function<Socket, Runnable> clientSocketRunnableFactory, final Logger logger, Listener serverSocketCreationCallback) {
Runnable runnable = new Runnable() {
@SuppressWarnings("InfiniteLoopStatement")
@Override
@ -67,6 +68,8 @@ public class BinaryProtocolServer implements BinaryProtocolCommands {
logger.error("Error binding server socket" + e);
return;
}
if (serverSocketCreationCallback!=null)
serverSocketCreationCallback.onResult(null);
try {
while (true) {

View File

@ -3,6 +3,7 @@ package com.rusefi.io;
import com.opensr5.ConfigurationImage;
import com.opensr5.Logger;
import com.opensr5.ini.field.ScalarIniField;
import com.rusefi.Listener;
import com.rusefi.binaryprotocol.BinaryProtocol;
import com.rusefi.binaryprotocol.BinaryProtocolState;
import com.rusefi.config.Field;
@ -56,7 +57,7 @@ public class TcpCommunicationIntegrationTest {
int value = 239;
ConfigurationImage serverImage = prepareImage(value, iniField);
int port = 6100;
BinaryProtocolServer server = createVirtualController(serverImage, port);
BinaryProtocolServer server = createVirtualController(serverImage, port, null);
CountDownLatch connectionEstablishedCountDownLatch = new CountDownLatch(1);
@ -88,13 +89,27 @@ public class TcpCommunicationIntegrationTest {
}
@Test
public void testProxy() throws InterruptedException, IOException {
public void testProxy() throws InterruptedException {
ConfigurationImage serverImage = prepareImage(239, createIniField(Fields.CYLINDERSCOUNT));
int controllerPort = 6102;
BinaryProtocolServer server = createVirtualController(serverImage, controllerPort);
CountDownLatch serverCreated = new CountDownLatch(1);
BinaryProtocolServer server = createVirtualController(serverImage, controllerPort, new Listener() {
@Override
public void onResult(Object parameter) {
serverCreated.countDown();
}
});
assertTrue(serverCreated.await(30, TimeUnit.SECONDS));
int proxyPort = 6103;
BinaryProtocolProxy.createProxy(new Socket("localhost", controllerPort), proxyPort);
Socket targetEcuSocket;
try {
targetEcuSocket = new Socket(LOCALHOST, controllerPort);
} catch (IOException e) {
throw new IllegalStateException("Failed to connect to controller " + LOCALHOST + ":" + controllerPort);
}
BinaryProtocolProxy.createProxy(targetEcuSocket, proxyPort);
CountDownLatch connectionEstablishedCountDownLatch = new CountDownLatch(1);
@ -121,7 +136,7 @@ public class TcpCommunicationIntegrationTest {
}
@NotNull
private BinaryProtocolServer createVirtualController(ConfigurationImage ci, int port) {
private BinaryProtocolServer createVirtualController(ConfigurationImage ci, int port, Listener serverSocketCreationCallback) {
BinaryProtocolState state = new BinaryProtocolState();
state.setController(ci);
state.setCurrentOutputs(new byte[1 + Fields.TS_OUTPUT_SIZE]);
@ -129,7 +144,7 @@ public class TcpCommunicationIntegrationTest {
LinkManager linkManager = new LinkManager(LOGGER);
linkManager.setConnector(LinkConnector.getDetachedConnector(state));
BinaryProtocolServer server = new BinaryProtocolServer(LOGGER);
server.start(linkManager, port);
server.start(linkManager, port, serverSocketCreationCallback);
return server;
}