time for more tests - one less defect now

This commit is contained in:
rusefi 2020-07-26 13:31:08 -04:00
parent f8518cd0d6
commit 144df50d55
5 changed files with 48 additions and 8 deletions

View File

@ -17,6 +17,7 @@ import java.net.Socket;
import static com.devexperts.logging.Logging.getLogging;
import static com.rusefi.io.tcp.BinaryProtocolServer.getPacketLength;
import static com.rusefi.io.tcp.BinaryProtocolServer.readPromisedBytes;
import static com.rusefi.shared.FileUtil.close;
public class BaseBroadcastingThread {
private static final Logging log = getLogging(BaseBroadcastingThread.class);
@ -25,11 +26,12 @@ public class BaseBroadcastingThread {
@SuppressWarnings("InfiniteLoopStatement")
public BaseBroadcastingThread(Socket socket, SessionDetails sessionDetails, TcpIoStream.DisconnectListener disconnectListener) throws IOException {
TcpIoStream stream = new TcpIoStream("[broadcast] ", socket, disconnectListener);
IncomingDataBuffer in = stream.getDataBuffer();
thread = BASE_BROADCASTING_THREAD.newThread(() -> {
TcpIoStream stream = null;
try {
stream = new TcpIoStream("[broadcast] ", socket, disconnectListener);
IncomingDataBuffer in = stream.getDataBuffer();
boolean isFirstHello = true;
while (true) {
int ioTimeout;
@ -59,7 +61,7 @@ public class BaseBroadcastingThread {
}
} catch (IOException e) {
log.error("exiting thread " + e);
stream.close();
close(stream);
}
});
}

View File

@ -18,6 +18,7 @@ import com.rusefi.tools.online.HttpUtil;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.net.Socket;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
@ -31,7 +32,7 @@ import static com.rusefi.binaryprotocol.BinaryProtocol.sleep;
public class NetworkConnector {
private final static Logging log = Logging.getLogging(NetworkConnector.class);
public static NetworkConnectorResult runNetworkConnector(String authToken, String controllerPort, NetworkConnectorContext context) {
public static NetworkConnectorResult runNetworkConnector(String authToken, String controllerPort, NetworkConnectorContext context, ReconnectListener reconnectListener) {
LinkManager controllerConnector = new LinkManager()
.setCompositeLogicEnabled(false)
.setNeedPullData(false);
@ -76,6 +77,7 @@ public class NetworkConnector {
log.error("Disconnect from proxy server detected, now sleeping " + context.reconnectDelay() + " seconds");
sleep(context.reconnectDelay() * Timeouts.SECOND);
proxyReconnectSemaphore.release();
reconnectListener.onReconnect();
}, oneTimeToken, controllerInfo);
} catch (IOException e) {
log.error("IO error", e);
@ -95,7 +97,15 @@ public class NetworkConnector {
SessionDetails deviceSessionDetails = new SessionDetails(controllerInfo, authToken, oneTimeToken);
BaseBroadcastingThread baseBroadcastingThread = new BaseBroadcastingThread(rusEFISSLContext.getSSLSocket(HttpUtil.RUSEFI_PROXY_HOSTNAME, serverPortForControllers),
Socket socket;
try {
socket = rusEFISSLContext.getSSLSocket(HttpUtil.RUSEFI_PROXY_HOSTNAME, serverPortForControllers);
} catch (IOException e) {
// socket open exception is a special case and should be handled separately
disconnectListener.onDisconnect();
return deviceSessionDetails;
}
BaseBroadcastingThread baseBroadcastingThread = new BaseBroadcastingThread(socket,
deviceSessionDetails,
disconnectListener) {
@Override
@ -147,4 +157,14 @@ public class NetworkConnector {
}
}
public interface ReconnectListener {
ReconnectListener VOID = new ReconnectListener() {
@Override
public void onReconnect() {
}
};
void onReconnect();
}
}

View File

@ -4,6 +4,7 @@ import com.devexperts.logging.Logging;
import com.rusefi.auth.AutoTokenUtil;
import com.rusefi.autodetect.PortDetector;
import com.rusefi.proxy.NetworkConnector;
import com.rusefi.proxy.NetworkConnectorContext;
import com.rusefi.tools.online.ProxyClient;
import com.rusefi.ui.AuthTokenPanel;
@ -22,7 +23,9 @@ public class NetworkConnectorStartup {
return;
}
NetworkConnector.NetworkConnectorResult networkConnectorResult = NetworkConnector.runNetworkConnector(authToken, autoDetectedPort, ProxyClient.SERVER_PORT_FOR_CONTROLLERS);
NetworkConnectorContext connectorContext = new NetworkConnectorContext();
NetworkConnector.NetworkConnectorResult networkConnectorResult = NetworkConnector.runNetworkConnector(authToken, autoDetectedPort, connectorContext, NetworkConnector.ReconnectListener.VOID);
log.info("Running with oneTimeToken=" + networkConnectorResult.getOneTimeToken());
}
}

View File

@ -98,7 +98,7 @@ 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(TestHelper.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, networkConnectorContext);
NetworkConnector.NetworkConnectorResult networkConnectorResult = NetworkConnector.runNetworkConnector(TestHelper.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, networkConnectorContext, NetworkConnector.ReconnectListener.VOID);
ControllerInfo controllerInfo = networkConnectorResult.getControllerInfo();
assertTrue("controllerRegistered", controllerRegistered.await(READ_IMAGE_TIMEOUT, TimeUnit.MILLISECONDS));

View File

@ -7,6 +7,11 @@ import com.rusefi.config.generated.Fields;
import com.rusefi.server.Backend;
import org.junit.Test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.assertTrue;
public class NetworkConnectorTest {
@Test
public void testReconnect() throws InterruptedException {
@ -30,8 +35,18 @@ public class NetworkConnectorTest {
}
};
CountDownLatch reconnectCounter = new CountDownLatch(1);
// 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(TestHelper.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, connectorContext);
NetworkConnector.ReconnectListener reconnectListener = new NetworkConnector.ReconnectListener() {
@Override
public void onReconnect() {
reconnectCounter.countDown();
}
};
NetworkConnector.NetworkConnectorResult networkConnectorResult = NetworkConnector.runNetworkConnector(TestHelper.TEST_TOKEN_1, TestHelper.LOCALHOST + ":" + controllerPort, connectorContext, reconnectListener);
assertTrue(reconnectCounter.await(30, TimeUnit.SECONDS));
Backend backend = new Backend(BackendTestHelper.createTestUserResolver(), httpPort);