From c412bf7bd5b14bdfa5f2f5b51d8a1bc27301cf3e Mon Sep 17 00:00:00 2001 From: rusefi Date: Wed, 8 Jul 2020 01:07:50 -0400 Subject: [PATCH] race conditions are cool --- .../rusefi/io/tcp/BinaryProtocolProxy.java | 2 +- .../rusefi/io/tcp/BinaryProtocolServer.java | 11 +++++--- .../io/TcpCommunicationIntegrationTest.java | 27 ++++++++++++++----- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/java_console/io/src/main/java/com/rusefi/io/tcp/BinaryProtocolProxy.java b/java_console/io/src/main/java/com/rusefi/io/tcp/BinaryProtocolProxy.java index 7c738b5ef1..ed35fc5946 100644 --- a/java_console/io/src/main/java/com/rusefi/io/tcp/BinaryProtocolProxy.java +++ b/java_console/io/src/main/java/com/rusefi/io/tcp/BinaryProtocolProxy.java @@ -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) { diff --git a/java_console/io/src/main/java/com/rusefi/io/tcp/BinaryProtocolServer.java b/java_console/io/src/main/java/com/rusefi/io/tcp/BinaryProtocolServer.java index b4eb525fae..fa95ebb170 100644 --- a/java_console/io/src/main/java/com/rusefi/io/tcp/BinaryProtocolServer.java +++ b/java_console/io/src/main/java/com/rusefi/io/tcp/BinaryProtocolServer.java @@ -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 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 clientSocketRunnableFactory, final Logger logger) { + public static void tcpServerSocket(int port, String threadName, Function 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) { diff --git a/java_console/ui/src/test/java/com/rusefi/io/TcpCommunicationIntegrationTest.java b/java_console/ui/src/test/java/com/rusefi/io/TcpCommunicationIntegrationTest.java index 7ef159527e..a5ae112bba 100644 --- a/java_console/ui/src/test/java/com/rusefi/io/TcpCommunicationIntegrationTest.java +++ b/java_console/ui/src/test/java/com/rusefi/io/TcpCommunicationIntegrationTest.java @@ -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; }