time for more tests

This commit is contained in:
rusefi 2020-07-25 23:03:40 -04:00
parent 240b647595
commit 8ce0974b27
10 changed files with 133 additions and 54 deletions

View File

@ -4,6 +4,7 @@ import com.devexperts.logging.Logging;
import com.opensr5.ConfigurationImage;
import com.opensr5.Logger;
import com.rusefi.Listener;
import com.rusefi.NamedThreadFactory;
import com.rusefi.Timeouts;
import com.rusefi.binaryprotocol.*;
import com.rusefi.config.generated.Fields;
@ -16,6 +17,8 @@ import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
@ -52,6 +55,8 @@ public class BinaryProtocolServer implements BinaryProtocolCommands {
}
};
private static ConcurrentHashMap<String, ThreadFactory> THREAD_FACTORIES_BY_NAME = new ConcurrentHashMap<>();
public void start(LinkManager linkManager) {
start(linkManager, DEFAULT_PROXY_PORT, Listener.empty());
}
@ -84,6 +89,8 @@ public class BinaryProtocolServer implements BinaryProtocolCommands {
}
public static ServerSocketReference tcpServerSocket(Function<Socket, Runnable> clientSocketRunnableFactory, int port, String threadName, Listener serverSocketCreationCallback, Function<Integer, ServerSocket> nonSecureSocketFunction) {
ThreadFactory threadFactory = THREAD_FACTORIES_BY_NAME.computeIfAbsent(threadName, NamedThreadFactory::new);
Objects.requireNonNull(serverSocketCreationCallback, "serverSocketCreationCallback");
ServerSocket serverSocket = nonSecureSocketFunction.apply(port);
@ -101,10 +108,10 @@ public class BinaryProtocolServer implements BinaryProtocolCommands {
continue;
}
log.info("Binary protocol proxy port connection");
new Thread(clientSocketRunnableFactory.apply(clientSocket), "proxy connection").start();
threadFactory.newThread(clientSocketRunnableFactory.apply(clientSocket)).start();
}
};
new Thread(runnable, threadName).start();
threadFactory.newThread(runnable).start();
return holder;
}

View File

@ -61,7 +61,8 @@ public class LocalApplicationProxy implements Closeable {
new HelloCommand(applicationRequest.toJson()).handle(authenticatorToProxyStream);
}
public static void start(String[] strings) {
public static void start() {
throw new UnsupportedOperationException("TODO");
}
@Override

View File

@ -12,6 +12,7 @@ import com.rusefi.io.LinkManager;
import com.rusefi.io.tcp.BinaryProtocolServer;
import com.rusefi.io.tcp.TcpIoStream;
import com.rusefi.server.ControllerInfo;
import com.rusefi.server.SessionDetails;
import com.rusefi.server.rusEFISSLContext;
import com.rusefi.tune.xml.Constant;
import org.jetbrains.annotations.NotNull;
@ -29,6 +30,7 @@ public class TestHelper {
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);
public static final String TEST_TOKEN_1 = "00000000-1234-1234-1234-123456789012";
@NotNull
public static ScalarIniField createIniField(Field field) {
@ -84,4 +86,10 @@ public class TestHelper {
assertTrue(controllerCreated.await(READ_IMAGE_TIMEOUT, TimeUnit.MILLISECONDS));
return server;
}
public static SessionDetails createTestSession(String authToken, String signature) {
ControllerInfo ci = new ControllerInfo("vehicle", "make", "code", signature);
return new SessionDetails(ci, authToken, SessionDetails.createOneTimeCode());
}
}

View File

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

View File

@ -61,7 +61,7 @@ public class ConsoleTools {
registerTool("compile_fsio_file", ConsoleTools::runCompileTool, "Convert all lines from a file to RPN form.");
registerTool("network_connector", strings -> NetworkConnectorStartup.start(), "Connect your rusEFI ECU to rusEFI Online");
registerTool("network_authenticator", LocalApplicationProxy::start, "rusEFI Online Authenticator");
registerTool("network_authenticator", strings -> LocalApplicationProxy.start(), "rusEFI Online Authenticator");
registerTool("print_auth_token", args -> printAuthToken(), "Print current rusEFI Online authentication token.");
registerTool(SET_AUTH_TOKEN, ConsoleTools::setAuthToken, "Set rusEFI authentication token.");

View File

@ -1,7 +1,14 @@
package com.rusefi;
import com.rusefi.binaryprotocol.BinaryProtocol;
import com.rusefi.server.Backend;
import com.rusefi.server.UserDetails;
import com.rusefi.server.UserDetailsResolver;
import com.rusefi.server.rusEFISSLContext;
import com.rusefi.tools.online.HttpUtil;
import org.jetbrains.annotations.NotNull;
import java.net.MalformedURLException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@ -20,4 +27,16 @@ public class BackendTestHelper {
backend.runControllerConnector(serverPortForControllers, parameter -> controllerServerCreated.countDown());
assertTrue(controllerServerCreated.await(READ_IMAGE_TIMEOUT, TimeUnit.MILLISECONDS));
}
@NotNull
public static UserDetailsResolver createTestUserResolver() {
return authToken -> new UserDetails(authToken.substring(0, 5), authToken.charAt(6));
}
public static void commonServerTest() throws MalformedURLException {
HttpUtil.RUSEFI_PROXY_HOSTNAME = TestHelper.LOCALHOST;
BinaryProtocol.DISABLE_LOCAL_CACHE = true;
rusEFISSLContext.init("certificate/test_pkcs12.jks", "password");
}
}

View File

@ -30,9 +30,8 @@ import static org.junit.Assert.assertTrue;
public class FullServerTest {
@Before
public void setTestCertificate() throws MalformedURLException {
ServerTest.commonServerTest();
BinaryProtocol.DISABLE_LOCAL_CACHE = true;
public void setup() throws MalformedURLException {
BackendTestHelper.commonServerTest();
}
@Test
@ -92,13 +91,13 @@ public class FullServerTest {
// start "rusEFI network connector" to connect controller with backend since in real life controller has only local serial port it does not have network
NetworkConnector.NetworkConnectorResult networkConnectorResult = NetworkConnector.runNetworkConnector(MockRusEfiDevice.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, serverPortForControllers);
NetworkConnector.NetworkConnectorResult networkConnectorResult = NetworkConnector.runNetworkConnector(TestHelper.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, serverPortForControllers);
ControllerInfo controllerInfo = networkConnectorResult.getControllerInfo();
assertTrue("controllerRegistered", controllerRegistered.await(READ_IMAGE_TIMEOUT, TimeUnit.MILLISECONDS));
SessionDetails authenticatorSessionDetails = new SessionDetails(controllerInfo, MockRusEfiDevice.TEST_TOKEN_3, networkConnectorResult.getOneTimeToken());
ApplicationRequest applicationRequest = new ApplicationRequest(authenticatorSessionDetails, userDetailsResolver.apply(MockRusEfiDevice.TEST_TOKEN_1));
ApplicationRequest applicationRequest = new ApplicationRequest(authenticatorSessionDetails, userDetailsResolver.apply(TestHelper.TEST_TOKEN_1));
// start authenticator
LocalApplicationProxy.startAndRun(localApplicationProxyContext, applicationRequest, httpPort,

View File

@ -1,11 +1,9 @@
package com.rusefi;
import com.opensr5.Logger;
import com.rusefi.config.generated.Fields;
import com.rusefi.io.tcp.BinaryProtocolServer;
import com.rusefi.io.tcp.TcpIoStream;
import com.rusefi.proxy.BaseBroadcastingThread;
import com.rusefi.server.ControllerInfo;
import com.rusefi.server.SessionDetails;
import com.rusefi.server.rusEFISSLContext;
@ -15,20 +13,11 @@ import java.net.Socket;
import static com.rusefi.TestHelper.LOCALHOST;
public class MockRusEfiDevice {
public static final String TEST_TOKEN_1 = "00000000-1234-1234-1234-123456789012";
public static final String TEST_TOKEN_3 = "33333333-3333-1234-1234-123456789012";
private SessionDetails sessionDetails;
private final Logger logger;
private final SessionDetails sessionDetails;
public MockRusEfiDevice(String authToken, String signature, Logger logger) {
sessionDetails = createTestSession(authToken, signature);
this.logger = logger;
}
public static SessionDetails createTestSession(String authToken, String signature) {
ControllerInfo ci = new ControllerInfo("vehicle", "make", "code", signature);
return new SessionDetails(ci, authToken, SessionDetails.createOneTimeCode());
public MockRusEfiDevice(String authToken, String signature) {
sessionDetails = TestHelper.createTestSession(authToken, signature);
}
public void connect(int serverPort) throws IOException {

View File

@ -9,7 +9,6 @@ import com.rusefi.server.*;
import com.rusefi.tools.online.HttpUtil;
import com.rusefi.tools.online.ProxyClient;
import com.rusefi.tools.online.PublicSession;
import org.jetbrains.annotations.NotNull;
import org.junit.Before;
import org.junit.Test;
@ -32,14 +31,8 @@ public class ServerTest {
private final static Logger logger = Logger.CONSOLE;
@Before
public void setTestCertificate() throws MalformedURLException {
commonServerTest();
}
static void commonServerTest() throws MalformedURLException {
HttpUtil.RUSEFI_PROXY_HOSTNAME = TestHelper.LOCALHOST;
rusEFISSLContext.init("certificate/test_pkcs12.jks", "password");
public void setup() throws MalformedURLException {
BackendTestHelper.commonServerTest();
}
@Test
@ -54,7 +47,7 @@ public class ServerTest {
CountDownLatch allConnected = new CountDownLatch(1);
try (Backend backend = new Backend(createTestUserResolver(), httpPort) {
try (Backend backend = new Backend(BackendTestHelper.createTestUserResolver(), httpPort) {
@Override
public void register(ControllerConnectionState clientConnectionState) {
super.register(clientConnectionState);
@ -80,8 +73,8 @@ public class ServerTest {
assertEquals(0, backend.getControllersCount());
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);
new MockRusEfiDevice(TestHelper.TEST_TOKEN_1, TestHelper.TEST_SIGNATURE_1).connect(serverPortForControllers);
new MockRusEfiDevice("12345678-1234-1234-1234-123456789012", TestHelper.TEST_SIGNATURE_2).connect(serverPortForControllers);
assertTrue("onConnected", onConnected.await(30, TimeUnit.SECONDS));
@ -144,7 +137,7 @@ covered by FullServerTest
int httpPort = 8001;
int serverPortForRemoteUsers = 6801;
CountDownLatch disconnectedCountDownLatch = new CountDownLatch(1);
try (Backend backend = new Backend(createTestUserResolver(), httpPort) {
try (Backend backend = new Backend(BackendTestHelper.createTestUserResolver(), httpPort) {
@Override
protected void onDisconnectApplication(ApplicationConnectionState applicationConnectionState) {
super.onDisconnectApplication(applicationConnectionState);
@ -162,11 +155,6 @@ covered by FullServerTest
}
}
@NotNull
private static UserDetailsResolver createTestUserResolver() {
return authToken -> new UserDetails(authToken.substring(0, 5), authToken.charAt(6));
}
@Test
public void testAuthenticatorRequestUnknownSession() throws InterruptedException, IOException {
int serverPortForRemoteUsers = 6800;
@ -175,7 +163,7 @@ covered by FullServerTest
CountDownLatch disconnectedCountDownLatch = new CountDownLatch(1);
try (Backend backend = new Backend(createTestUserResolver(), httpPort) {
try (Backend backend = new Backend(BackendTestHelper.createTestUserResolver(), httpPort) {
@Override
protected void onDisconnectApplication(ApplicationConnectionState applicationConnectionState) {
super.onDisconnectApplication(applicationConnectionState);
@ -185,8 +173,8 @@ covered by FullServerTest
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));
SessionDetails sessionDetails = TestHelper.createTestSession(TestHelper.TEST_TOKEN_1, Fields.TS_SIGNATURE);
ApplicationRequest applicationRequest = new ApplicationRequest(sessionDetails, BackendTestHelper.createTestUserResolver().apply(TestHelper.TEST_TOKEN_1));
// start authenticator
IoStream authenticatorToProxyStream = TestHelper.secureConnectToLocalhost(serverPortForRemoteUsers, logger);

View File

@ -0,0 +1,78 @@
package com.rusefi.proxy.client;
import com.rusefi.BackendTestHelper;
import com.rusefi.TestHelper;
import com.rusefi.config.generated.Fields;
import com.rusefi.io.tcp.BinaryProtocolServer;
import com.rusefi.io.tcp.ServerSocketReference;
import com.rusefi.io.tcp.TcpIoStream;
import com.rusefi.server.ApplicationRequest;
import com.rusefi.server.SessionDetails;
import com.rusefi.tools.online.ProxyClient;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.Socket;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import static com.rusefi.BackendTestHelper.createTestUserResolver;
import static com.rusefi.TestHelper.TEST_TOKEN_1;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class LocalApplicationProxyTest {
@Before
public void setup() throws MalformedURLException {
BackendTestHelper.commonServerTest();
}
@Test
public void testLocalApplication() throws IOException, InterruptedException {
LocalApplicationProxyContext context = new LocalApplicationProxyContext() {
@Override
public String executeGet(String url) {
if (url.endsWith(ProxyClient.VERSION_PATH))
return ProxyClient.BACKEND_VERSION;
throw new UnsupportedOperationException(url);
}
@Override
public int serverPortForRemoteApplications() {
return 5999;
}
@Override
public int authenticatorPort() {
return 5998;
}
};
CountDownLatch backendCreated = new CountDownLatch(1);
ServerSocketReference mockBackend = BinaryProtocolServer.tcpServerSocket(context.serverPortForRemoteApplications(), "localAppTest", new Function<Socket, Runnable>() {
@Override
public Runnable apply(Socket socket) {
return new Runnable() {
@Override
public void run() {
}
};
}
}, parameter -> backendCreated.countDown());
assertTrue(backendCreated.await(30, TimeUnit.SECONDS));
SessionDetails sessionDetails = TestHelper.createTestSession(TEST_TOKEN_1, Fields.TS_SIGNATURE);
ApplicationRequest applicationRequest = new ApplicationRequest(sessionDetails, createTestUserResolver().apply(TEST_TOKEN_1));
LocalApplicationProxy.startAndRun(context, applicationRequest, -1, TcpIoStream.DisconnectListener.VOID, LocalApplicationProxy.ConnectionListener.VOID);
mockBackend.close();
}
}