diff --git a/java_console/io/src/main/java/com/rusefi/Listener.java b/java_console/io/src/main/java/com/rusefi/Listener.java index 3722c6e526..064e0f8f85 100644 --- a/java_console/io/src/main/java/com/rusefi/Listener.java +++ b/java_console/io/src/main/java/com/rusefi/Listener.java @@ -2,4 +2,9 @@ package com.rusefi; public interface Listener { void onResult(T parameter); + + static Listener empty() { + return parameter -> { + }; + } } 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 a38d188c11..df00562939 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 @@ -1,6 +1,7 @@ package com.rusefi.io.tcp; import com.devexperts.logging.Logging; +import com.rusefi.Listener; import com.rusefi.Timeouts; import com.rusefi.binaryprotocol.BinaryProtocol; import com.rusefi.binaryprotocol.IncomingDataBuffer; @@ -27,7 +28,7 @@ public class BinaryProtocolProxy { */ public static final int USER_IO_TIMEOUT = 10 * Timeouts.MINUTE; - public static ServerHolder createProxy(IoStream targetEcuSocket, int serverProxyPort) { + public static ServerSocketReference createProxy(IoStream targetEcuSocket, int serverProxyPort) { Function clientSocketRunnableFactory = clientSocket -> () -> { TcpIoStream clientStream = null; try { @@ -38,7 +39,7 @@ public class BinaryProtocolProxy { close(clientStream); } }; - return BinaryProtocolServer.tcpServerSocket(serverProxyPort, "proxy", clientSocketRunnableFactory, null); + return BinaryProtocolServer.tcpServerSocket(serverProxyPort, "proxy", clientSocketRunnableFactory, Listener.empty()); } public static void runProxy(IoStream targetEcu, IoStream clientStream) throws IOException { 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 497b6599b2..b195bacebf 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 @@ -11,7 +11,6 @@ import com.rusefi.io.IoStream; import com.rusefi.io.LinkManager; import com.rusefi.io.commands.HelloCommand; import com.rusefi.server.rusEFISSLContext; -import com.rusefi.shared.FileUtil; import java.io.*; import java.net.ServerSocket; @@ -54,7 +53,7 @@ public class BinaryProtocolServer implements BinaryProtocolCommands { }; public void start(LinkManager linkManager) { - start(linkManager, DEFAULT_PROXY_PORT, null); + start(linkManager, DEFAULT_PROXY_PORT, Listener.empty()); } public void start(LinkManager linkManager, int port, Listener serverSocketCreationCallback) { @@ -80,23 +79,17 @@ public class BinaryProtocolServer implements BinaryProtocolCommands { * @param serverSocketCreationCallback this callback is invoked once we open the server socket * @return */ - public static ServerHolder tcpServerSocket(int port, String threadName, Function socketRunnableFactory, Listener serverSocketCreationCallback) { + public static ServerSocketReference tcpServerSocket(int port, String threadName, Function socketRunnableFactory, Listener serverSocketCreationCallback) { return tcpServerSocket(socketRunnableFactory, port, threadName, serverSocketCreationCallback, PLAIN_SOCKET_FACTORY); } - public static ServerHolder tcpServerSocket(Function clientSocketRunnableFactory, int port, String threadName, Listener serverSocketCreationCallback, Function nonSecureSocketFunction) { + public static ServerSocketReference tcpServerSocket(Function clientSocketRunnableFactory, int port, String threadName, Listener serverSocketCreationCallback, Function nonSecureSocketFunction) { + Objects.requireNonNull(serverSocketCreationCallback, "serverSocketCreationCallback"); ServerSocket serverSocket = nonSecureSocketFunction.apply(port); - ServerHolder holder = new ServerHolder() { - @Override - public void close() { - super.close(); - FileUtil.close(serverSocket); - } - }; + ServerSocketReference holder = new ServerSocketReference(serverSocket); - if (serverSocketCreationCallback != null) - serverSocketCreationCallback.onResult(null); + serverSocketCreationCallback.onResult(null); Runnable runnable = () -> { while (!holder.isClosed()) { // Wait for a connection diff --git a/java_console/io/src/main/java/com/rusefi/io/tcp/ServerHolder.java b/java_console/io/src/main/java/com/rusefi/io/tcp/ServerHolder.java deleted file mode 100644 index 134ff36247..0000000000 --- a/java_console/io/src/main/java/com/rusefi/io/tcp/ServerHolder.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.rusefi.io.tcp; - -import java.io.Closeable; - -public class ServerHolder implements Closeable { - private boolean isClosed; - - public void close() { - isClosed = true; - } - - public boolean isClosed() { - return isClosed; - } -} diff --git a/java_console/io/src/main/java/com/rusefi/io/tcp/ServerSocketReference.java b/java_console/io/src/main/java/com/rusefi/io/tcp/ServerSocketReference.java new file mode 100644 index 0000000000..caac6887f8 --- /dev/null +++ b/java_console/io/src/main/java/com/rusefi/io/tcp/ServerSocketReference.java @@ -0,0 +1,25 @@ +package com.rusefi.io.tcp; + +import com.rusefi.shared.FileUtil; + +import java.io.Closeable; +import java.net.ServerSocket; + +public class ServerSocketReference implements Closeable { + private final ServerSocket serverSocket; + private boolean isClosed; + + public ServerSocketReference(ServerSocket serverSocket) { + this.serverSocket = serverSocket; + } + + @Override + public void close() { + isClosed = true; + FileUtil.close(serverSocket); + } + + public boolean isClosed() { + return isClosed; + } +} diff --git a/java_console/io/src/main/java/com/rusefi/proxy/client/LocalApplicationProxy.java b/java_console/io/src/main/java/com/rusefi/proxy/client/LocalApplicationProxy.java index a1f6b0a9a4..dd3052ee65 100644 --- a/java_console/io/src/main/java/com/rusefi/proxy/client/LocalApplicationProxy.java +++ b/java_console/io/src/main/java/com/rusefi/proxy/client/LocalApplicationProxy.java @@ -4,7 +4,7 @@ import com.devexperts.logging.Logging; import com.rusefi.io.IoStream; import com.rusefi.io.commands.HelloCommand; import com.rusefi.io.tcp.BinaryProtocolProxy; -import com.rusefi.io.tcp.ServerHolder; +import com.rusefi.io.tcp.ServerSocketReference; import com.rusefi.io.tcp.TcpIoStream; import com.rusefi.server.ApplicationRequest; import com.rusefi.server.rusEFISSLContext; @@ -20,10 +20,10 @@ public class LocalApplicationProxy implements Closeable { private static final Logging log = getLogging(LocalApplicationProxy.class); public static final int SERVER_PORT_FOR_APPLICATIONS = HttpUtil.getIntProperty("applications.port", 8002); private final ApplicationRequest applicationRequest; - private final ServerHolder serverHolder; + private final ServerSocketReference serverHolder; private final IoStream authenticatorToProxyStream; - public LocalApplicationProxy(ApplicationRequest applicationRequest, ServerHolder serverHolder, IoStream authenticatorToProxyStream) { + public LocalApplicationProxy(ApplicationRequest applicationRequest, ServerSocketReference serverHolder, IoStream authenticatorToProxyStream) { this.applicationRequest = applicationRequest; this.serverHolder = serverHolder; this.authenticatorToProxyStream = authenticatorToProxyStream; @@ -34,6 +34,7 @@ public class LocalApplicationProxy implements Closeable { } /** + * @param context * @param serverPortForRemoteUsers port on which rusEFI proxy accepts authenticator connections * @param applicationRequest remote session we want to connect to * @param localApplicationPort local port we would bind for TunerStudio to connect to @@ -41,8 +42,8 @@ public class LocalApplicationProxy implements Closeable { * @param disconnectListener * @param connectionListener */ - public static ServerHolder startAndRun(int serverPortForRemoteUsers, ApplicationRequest applicationRequest, int localApplicationPort, int jsonHttpPort, TcpIoStream.DisconnectListener disconnectListener, ConnectionListener connectionListener) throws IOException { - String version = HttpUtil.executeGet(ProxyClient.getHttpAddress(jsonHttpPort) + ProxyClient.VERSION_PATH); + public static ServerSocketReference startAndRun(LocalApplicationProxyContext context, int serverPortForRemoteUsers, ApplicationRequest applicationRequest, int localApplicationPort, int jsonHttpPort, TcpIoStream.DisconnectListener disconnectListener, ConnectionListener connectionListener) throws IOException { + String version = context.executeGet(ProxyClient.getHttpAddress(jsonHttpPort) + ProxyClient.VERSION_PATH); log.info("Server says version=" + version); if (!version.contains(ProxyClient.BACKEND_VERSION)) throw new IOException("Unexpected backend version " + version + " while we want " + ProxyClient.BACKEND_VERSION); @@ -50,7 +51,7 @@ public class LocalApplicationProxy implements Closeable { IoStream authenticatorToProxyStream = new TcpIoStream("authenticatorToProxyStream ", rusEFISSLContext.getSSLSocket(HttpUtil.RUSEFI_PROXY_HOSTNAME, serverPortForRemoteUsers), disconnectListener); LocalApplicationProxy.sendHello(authenticatorToProxyStream, applicationRequest); - ServerHolder serverHolder = BinaryProtocolProxy.createProxy(authenticatorToProxyStream, localApplicationPort); + ServerSocketReference serverHolder = BinaryProtocolProxy.createProxy(authenticatorToProxyStream, localApplicationPort); LocalApplicationProxy localApplicationProxy = new LocalApplicationProxy(applicationRequest, serverHolder, authenticatorToProxyStream); connectionListener.onConnected(localApplicationProxy); return serverHolder; diff --git a/java_console/io/src/main/java/com/rusefi/proxy/client/LocalApplicationProxyContext.java b/java_console/io/src/main/java/com/rusefi/proxy/client/LocalApplicationProxyContext.java new file mode 100644 index 0000000000..b3b75aec18 --- /dev/null +++ b/java_console/io/src/main/java/com/rusefi/proxy/client/LocalApplicationProxyContext.java @@ -0,0 +1,7 @@ +package com.rusefi.proxy.client; + +import java.io.IOException; + +public interface LocalApplicationProxyContext { + String executeGet(String url) throws IOException; +} diff --git a/java_console/io/src/main/java/com/rusefi/proxy/client/LocalApplicationProxyContextImpl.java b/java_console/io/src/main/java/com/rusefi/proxy/client/LocalApplicationProxyContextImpl.java new file mode 100644 index 0000000000..c4a3f35d4c --- /dev/null +++ b/java_console/io/src/main/java/com/rusefi/proxy/client/LocalApplicationProxyContextImpl.java @@ -0,0 +1,12 @@ +package com.rusefi.proxy.client; + +import com.rusefi.tools.online.HttpUtil; + +import java.io.IOException; + +public class LocalApplicationProxyContextImpl implements LocalApplicationProxyContext { + @Override + public String executeGet(String url) throws IOException { + return HttpUtil.executeGet(url); + } +} diff --git a/java_console/ui/src/test/java/com/rusefi/TestHelper.java b/java_console/io/src/test/java/com/rusefi/TestHelper.java similarity index 79% rename from java_console/ui/src/test/java/com/rusefi/TestHelper.java rename to java_console/io/src/test/java/com/rusefi/TestHelper.java index d974b6fb19..6c4201b1f6 100644 --- a/java_console/ui/src/test/java/com/rusefi/TestHelper.java +++ b/java_console/io/src/test/java/com/rusefi/TestHelper.java @@ -11,7 +11,7 @@ import com.rusefi.io.LinkConnector; import com.rusefi.io.LinkManager; import com.rusefi.io.tcp.BinaryProtocolServer; import com.rusefi.io.tcp.TcpIoStream; -import com.rusefi.server.Backend; +import com.rusefi.server.ControllerInfo; import com.rusefi.server.rusEFISSLContext; import com.rusefi.tune.xml.Constant; import org.jetbrains.annotations.NotNull; @@ -26,6 +26,9 @@ import static org.junit.Assert.assertTrue; public class TestHelper { public static final String LOCALHOST = "localhost"; + public static final String TEST_SIGNATURE_1 = "rusEFI 2020.07.06.frankenso_na6.2468827536"; + public static final String TEST_SIGNATURE_2 = "rusEFI 2020.07.11.proteus_f4.1986715563"; + public static final ControllerInfo CONTROLLER_INFO = new ControllerInfo("name", "make", "code", Fields.TS_SIGNATURE); @NotNull public static ScalarIniField createIniField(Field field) { @@ -81,16 +84,4 @@ public class TestHelper { assertTrue(controllerCreated.await(READ_IMAGE_TIMEOUT, TimeUnit.MILLISECONDS)); return server; } - - public static void runApplicationConnectorBlocking(Backend backend, int serverPortForRemoteUsers) throws InterruptedException { - CountDownLatch applicationServerCreated = new CountDownLatch(1); - backend.runApplicationConnector(serverPortForRemoteUsers, parameter -> applicationServerCreated.countDown()); - assertTrue(applicationServerCreated.await(READ_IMAGE_TIMEOUT, TimeUnit.MILLISECONDS)); - } - - public static void runControllerConnectorBlocking(Backend backend, int serverPortForControllers) throws InterruptedException { - CountDownLatch controllerServerCreated = new CountDownLatch(1); - backend.runControllerConnector(serverPortForControllers, parameter -> controllerServerCreated.countDown()); - assertTrue(controllerServerCreated.await(READ_IMAGE_TIMEOUT, TimeUnit.MILLISECONDS)); - } } diff --git a/java_console/io/src/test/java/com/rusefi/proxy/client/LocalApplicationProxyTest.java b/java_console/io/src/test/java/com/rusefi/proxy/client/LocalApplicationProxyTest.java new file mode 100644 index 0000000000..66cc15bead --- /dev/null +++ b/java_console/io/src/test/java/com/rusefi/proxy/client/LocalApplicationProxyTest.java @@ -0,0 +1,10 @@ +package com.rusefi.proxy.client; + +import org.junit.Test; + +public class LocalApplicationProxyTest { + @Test + public void testLocalApplication() { + + } +} diff --git a/java_console/ui/src/test/java/com/rusefi/BackendTestHelper.java b/java_console/ui/src/test/java/com/rusefi/BackendTestHelper.java new file mode 100644 index 0000000000..2b39602358 --- /dev/null +++ b/java_console/ui/src/test/java/com/rusefi/BackendTestHelper.java @@ -0,0 +1,23 @@ +package com.rusefi; + +import com.rusefi.server.Backend; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import static com.rusefi.Timeouts.READ_IMAGE_TIMEOUT; +import static org.junit.Assert.assertTrue; + +public class BackendTestHelper { + public static void runApplicationConnectorBlocking(Backend backend, int serverPortForRemoteUsers) throws InterruptedException { + CountDownLatch applicationServerCreated = new CountDownLatch(1); + backend.runApplicationConnector(serverPortForRemoteUsers, parameter -> applicationServerCreated.countDown()); + assertTrue(applicationServerCreated.await(READ_IMAGE_TIMEOUT, TimeUnit.MILLISECONDS)); + } + + public static void runControllerConnectorBlocking(Backend backend, int serverPortForControllers) throws InterruptedException { + CountDownLatch controllerServerCreated = new CountDownLatch(1); + backend.runControllerConnector(serverPortForControllers, parameter -> controllerServerCreated.countDown()); + assertTrue(controllerServerCreated.await(READ_IMAGE_TIMEOUT, TimeUnit.MILLISECONDS)); + } +} diff --git a/java_console/ui/src/test/java/com/rusefi/FullServerTest.java b/java_console/ui/src/test/java/com/rusefi/FullServerTest.java index 34bf3df578..1b86ecd945 100644 --- a/java_console/ui/src/test/java/com/rusefi/FullServerTest.java +++ b/java_console/ui/src/test/java/com/rusefi/FullServerTest.java @@ -9,6 +9,7 @@ import com.rusefi.io.LinkManager; import com.rusefi.io.tcp.TcpIoStream; import com.rusefi.proxy.NetworkConnector; import com.rusefi.proxy.client.LocalApplicationProxy; +import com.rusefi.proxy.client.LocalApplicationProxyContextImpl; import com.rusefi.server.*; import org.junit.Before; import org.junit.Test; @@ -63,8 +64,8 @@ public class FullServerTest { // first start backend server - TestHelper.runControllerConnectorBlocking(backend, serverPortForControllers); - TestHelper.runApplicationConnectorBlocking(backend, serverPortForRemoteUsers); + BackendTestHelper.runControllerConnectorBlocking(backend, serverPortForControllers); + BackendTestHelper.runApplicationConnectorBlocking(backend, serverPortForRemoteUsers); // create virtual controller to which "rusEFI network connector" connects to int controllerPort = 7002; @@ -83,7 +84,7 @@ public class FullServerTest { // start authenticator int authenticatorPort = 7004; // local port on which authenticator accepts connections from Tuner Studio - LocalApplicationProxy.startAndRun(serverPortForRemoteUsers, applicationRequest, authenticatorPort, httpPort, + LocalApplicationProxy.startAndRun(new LocalApplicationProxyContextImpl(), serverPortForRemoteUsers, applicationRequest, authenticatorPort, httpPort, TcpIoStream.DisconnectListener.VOID, LocalApplicationProxy.ConnectionListener.VOID); diff --git a/java_console/ui/src/test/java/com/rusefi/ServerTest.java b/java_console/ui/src/test/java/com/rusefi/ServerTest.java index cd4b8f290f..84e4ec5372 100644 --- a/java_console/ui/src/test/java/com/rusefi/ServerTest.java +++ b/java_console/ui/src/test/java/com/rusefi/ServerTest.java @@ -80,8 +80,8 @@ public class ServerTest { assertEquals(0, backend.getControllersCount()); - new MockRusEfiDevice(MockRusEfiDevice.TEST_TOKEN_1, "rusEFI 2020.07.06.frankenso_na6.2468827536", logger).connect(serverPortForControllers); - new MockRusEfiDevice("12345678-1234-1234-1234-123456789012", "rusEFI 2020.07.11.proteus_f4.1986715563", logger).connect(serverPortForControllers); + new MockRusEfiDevice(MockRusEfiDevice.TEST_TOKEN_1, TestHelper.TEST_SIGNATURE_1, logger).connect(serverPortForControllers); + new MockRusEfiDevice("12345678-1234-1234-1234-123456789012", TestHelper.TEST_SIGNATURE_2, logger).connect(serverPortForControllers); assertTrue("onConnected", onConnected.await(30, TimeUnit.SECONDS)); @@ -152,7 +152,7 @@ covered by FullServerTest } }) { - TestHelper.runApplicationConnectorBlocking(backend, serverPortForRemoteUsers); + BackendTestHelper.runApplicationConnectorBlocking(backend, serverPortForRemoteUsers); // start authenticator IoStream authenticatorToProxyStream = TestHelper.secureConnectToLocalhost(serverPortForRemoteUsers, logger); @@ -183,7 +183,7 @@ covered by FullServerTest } }) { - TestHelper.runApplicationConnectorBlocking(backend, serverPortForRemoteUsers); + BackendTestHelper.runApplicationConnectorBlocking(backend, serverPortForRemoteUsers); SessionDetails sessionDetails = MockRusEfiDevice.createTestSession(MockRusEfiDevice.TEST_TOKEN_1, Fields.TS_SIGNATURE); ApplicationRequest applicationRequest = new ApplicationRequest(sessionDetails, createTestUserResolver().apply(MockRusEfiDevice.TEST_TOKEN_1)); diff --git a/java_tools/proxy_server/src/test/java/com/rusefi/server/SessionDetailsTest.java b/java_tools/proxy_server/src/test/java/com/rusefi/server/SessionDetailsTest.java index 5692c71883..0149866e01 100644 --- a/java_tools/proxy_server/src/test/java/com/rusefi/server/SessionDetailsTest.java +++ b/java_tools/proxy_server/src/test/java/com/rusefi/server/SessionDetailsTest.java @@ -1,14 +1,15 @@ package com.rusefi.server; +import com.rusefi.TestHelper; import org.junit.Test; import static org.junit.Assert.assertEquals; public class SessionDetailsTest { + @Test public void testSerialization() { - ControllerInfo ci = new ControllerInfo("name", "make", "code", "sign"); - SessionDetails sd = new SessionDetails(ci, "auth", 123); + SessionDetails sd = new SessionDetails(TestHelper.CONTROLLER_INFO, "auth", 123); String json = sd.toJson(); SessionDetails fromJson = SessionDetails.valueOf(json); @@ -17,8 +18,7 @@ public class SessionDetailsTest { @Test public void testApplicationRequest() { - ControllerInfo ci = new ControllerInfo("name", "make", "code", "sign"); - SessionDetails sd = new SessionDetails(ci, "auth", 123); + SessionDetails sd = new SessionDetails(TestHelper.CONTROLLER_INFO, "auth", 123); ApplicationRequest ar = new ApplicationRequest(sd, new UserDetails("", 321)); String json = ar.toJson(); diff --git a/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/RemoteTab.java b/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/RemoteTab.java index 9af4c21a83..b5d94fea53 100644 --- a/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/RemoteTab.java +++ b/java_tools/ts_plugin/src/main/java/com/rusefi/ts_plugin/RemoteTab.java @@ -3,9 +3,10 @@ package com.rusefi.ts_plugin; import com.rusefi.NamedThreadFactory; import com.rusefi.SignatureHelper; import com.rusefi.autoupdate.AutoupdateUtil; -import com.rusefi.io.tcp.ServerHolder; +import com.rusefi.io.tcp.ServerSocketReference; import com.rusefi.io.tcp.TcpIoStream; import com.rusefi.proxy.client.LocalApplicationProxy; +import com.rusefi.proxy.client.LocalApplicationProxyContextImpl; import com.rusefi.server.ApplicationRequest; import com.rusefi.server.ControllerInfo; import com.rusefi.server.SessionDetails; @@ -211,17 +212,18 @@ public class RemoteTab { ApplicationRequest applicationRequest = new ApplicationRequest(sessionDetails, publicSession.getUserDetails()); try { - AtomicReference serverHolderAtomicReference = new AtomicReference<>(); + AtomicReference serverHolderAtomicReference = new AtomicReference<>(); TcpIoStream.DisconnectListener disconnectListener = () -> SwingUtilities.invokeLater(() -> { setStatus("Disconnected"); RemoteTabController.INSTANCE.setState(RemoteTabController.State.NOT_CONNECTED); - ServerHolder serverHolder = serverHolderAtomicReference.get(); + ServerSocketReference serverHolder = serverHolderAtomicReference.get(); if (serverHolder != null) serverHolder.close(); }); - ServerHolder serverHolder = LocalApplicationProxy.startAndRun( + ServerSocketReference serverHolder = LocalApplicationProxy.startAndRun( + new LocalApplicationProxyContextImpl(), LocalApplicationProxy.SERVER_PORT_FOR_APPLICATIONS, applicationRequest, Integer.parseInt(getLocalPort()),