time for more tests

This commit is contained in:
rusefi 2020-07-25 22:22:40 -04:00
parent 60c327f11f
commit a7961de5cd
15 changed files with 120 additions and 64 deletions

View File

@ -2,4 +2,9 @@ package com.rusefi;
public interface Listener<T> {
void onResult(T parameter);
static <T> Listener<T> empty() {
return parameter -> {
};
}
}

View File

@ -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<Socket, Runnable> 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 {

View File

@ -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<Socket, Runnable> socketRunnableFactory, Listener serverSocketCreationCallback) {
public static ServerSocketReference tcpServerSocket(int port, String threadName, Function<Socket, Runnable> socketRunnableFactory, Listener serverSocketCreationCallback) {
return tcpServerSocket(socketRunnableFactory, port, threadName, serverSocketCreationCallback, PLAIN_SOCKET_FACTORY);
}
public static ServerHolder tcpServerSocket(Function<Socket, Runnable> clientSocketRunnableFactory, int port, String threadName, Listener serverSocketCreationCallback, Function<Integer, ServerSocket> nonSecureSocketFunction) {
public static ServerSocketReference tcpServerSocket(Function<Socket, Runnable> clientSocketRunnableFactory, int port, String threadName, Listener serverSocketCreationCallback, Function<Integer, ServerSocket> 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

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -0,0 +1,7 @@
package com.rusefi.proxy.client;
import java.io.IOException;
public interface LocalApplicationProxyContext {
String executeGet(String url) throws IOException;
}

View File

@ -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);
}
}

View File

@ -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));
}
}

View File

@ -0,0 +1,10 @@
package com.rusefi.proxy.client;
import org.junit.Test;
public class LocalApplicationProxyTest {
@Test
public void testLocalApplication() {
}
}

View File

@ -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));
}
}

View File

@ -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);

View File

@ -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));

View File

@ -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();

View File

@ -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<ServerHolder> serverHolderAtomicReference = new AtomicReference<>();
AtomicReference<ServerSocketReference> 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()),