From 5c17c6722bc5232594a35fcf3ac80751387cf51e Mon Sep 17 00:00:00 2001 From: Ilia Motornyi Date: Tue, 4 Sep 2018 13:41:44 +0300 Subject: [PATCH] Upgrade to new Atmosphere (#11122), replace SSH proxy with java-based trivial one, fix tests --- pom.xml | 7 +- .../java/com/vaadin/server/Constants.java | 2 +- uitest/pom.xml | 4 - .../application/ReconnectDialogUITest.java | 9 +- .../tests/debug/PushVersionInfoTest.java | 6 +- .../com/vaadin/tests/push/BasicPushTest.java | 12 +- .../com/vaadin/tests/push/ReconnectTest.java | 20 +++- .../com/vaadin/tests/tb3/AbstractTB3Test.java | 8 +- .../tests/tb3/MultiBrowserTestWithProxy.java | 44 ++----- .../com/vaadin/tests/tb3/SimpleProxy.java | 109 ++++++++++++++++++ 10 files changed, 158 insertions(+), 63 deletions(-) create mode 100644 uitest/src/test/java/com/vaadin/tests/tb3/SimpleProxy.java diff --git a/pom.xml b/pom.xml index 04ccbb9940..96d5c82c05 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ 2.0 0.9.13 - 2.4.24.vaadin1 + 2.4.30.vaadin1 JavaSE-1.8 @@ -281,11 +281,6 @@ jetty-proxy ${jetty.version} - - com.jcraft - jsch - 0.1.52 - org.eclipse.jgit org.eclipse.jgit diff --git a/server/src/main/java/com/vaadin/server/Constants.java b/server/src/main/java/com/vaadin/server/Constants.java index 2623f80dfe..16b685a24e 100644 --- a/server/src/main/java/com/vaadin/server/Constants.java +++ b/server/src/main/java/com/vaadin/server/Constants.java @@ -66,7 +66,7 @@ public interface Constants { + "================================================================="; // Keep the version number in sync with pom.xml - static final String REQUIRED_ATMOSPHERE_RUNTIME_VERSION = "2.4.24.vaadin1"; + static final String REQUIRED_ATMOSPHERE_RUNTIME_VERSION = "2.4.30.vaadin1"; static final String INVALID_ATMOSPHERE_VERSION_WARNING = "\n" + "=================================================================\n" diff --git a/uitest/pom.xml b/uitest/pom.xml index 630d83144d..00e0ca74b0 100644 --- a/uitest/pom.xml +++ b/uitest/pom.xml @@ -179,10 +179,6 @@ provided - - com.jcraft - jsch - commons-codec commons-codec diff --git a/uitest/src/test/java/com/vaadin/tests/application/ReconnectDialogUITest.java b/uitest/src/test/java/com/vaadin/tests/application/ReconnectDialogUITest.java index a0971e2c2e..647f116e02 100644 --- a/uitest/src/test/java/com/vaadin/tests/application/ReconnectDialogUITest.java +++ b/uitest/src/test/java/com/vaadin/tests/application/ReconnectDialogUITest.java @@ -8,16 +8,15 @@ import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; -import com.jcraft.jsch.JSchException; import com.vaadin.testbench.elements.ButtonElement; -import com.vaadin.testbench.parallel.TestCategory; import com.vaadin.tests.tb3.MultiBrowserTestWithProxy; -@TestCategory("needs-ssh") +import java.io.IOException; + public class ReconnectDialogUITest extends MultiBrowserTestWithProxy { @Test - public void reconnectTogglesBodyStyle() throws JSchException { + public void reconnectTogglesBodyStyle() throws IOException { openTestURL(); getButton().click(); disconnectProxy(); @@ -33,7 +32,7 @@ public class ReconnectDialogUITest extends MultiBrowserTestWithProxy { } @Test - public void reconnectDialogShownAndDisappears() throws JSchException { + public void reconnectDialogShownAndDisappears() throws IOException { openTestURL(); getButton().click(); assertEquals("1. Hello from the server", getLogRow(0)); diff --git a/uitest/src/test/java/com/vaadin/tests/debug/PushVersionInfoTest.java b/uitest/src/test/java/com/vaadin/tests/debug/PushVersionInfoTest.java index 5ea4fc1743..6e6893d3be 100644 --- a/uitest/src/test/java/com/vaadin/tests/debug/PushVersionInfoTest.java +++ b/uitest/src/test/java/com/vaadin/tests/debug/PushVersionInfoTest.java @@ -21,11 +21,12 @@ import com.vaadin.tests.tb3.SingleBrowserTest; public class PushVersionInfoTest extends SingleBrowserTest { @Test - public void testDisabledPush() { + public void testDisabledPush() throws InterruptedException { setDebug(true); openTestURL(); selectInfoTab(); + Thread.sleep(500); assertNull("Found push info server string for disabled Push", getPushRowValue("Push server version")); assertNull("Found push info client string for disabled Push", @@ -33,11 +34,12 @@ public class PushVersionInfoTest extends SingleBrowserTest { } @Test - public void testEnabledPush() { + public void testEnabledPush() throws InterruptedException { setDebug(true); openTestURL("enablePush=true"); selectInfoTab(); + Thread.sleep(500); WebElement pushRow = getPushRowValue("Push server version"); String atmVersion = findElement(By.className("atmosphere-version")) .getText(); diff --git a/uitest/src/test/java/com/vaadin/tests/push/BasicPushTest.java b/uitest/src/test/java/com/vaadin/tests/push/BasicPushTest.java index ab0fcf7c0f..1264affcf2 100644 --- a/uitest/src/test/java/com/vaadin/tests/push/BasicPushTest.java +++ b/uitest/src/test/java/com/vaadin/tests/push/BasicPushTest.java @@ -2,6 +2,7 @@ package com.vaadin.tests.push; import org.junit.Test; import org.openqa.selenium.By; +import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.WebElement; import com.vaadin.testbench.parallel.TestCategory; @@ -68,9 +69,14 @@ public abstract class BasicPushTest extends MultiBrowserTest { } protected void waitUntilClientCounterChanges(final int expectedValue) { - waitUntil( - input -> BasicPushTest - .getClientCounter(BasicPushTest.this) == expectedValue, + waitUntil(input -> { + try { + return BasicPushTest + .getClientCounter(BasicPushTest.this) == expectedValue; + } catch (NoSuchElementException e) { + return false; + } + }, 10); } diff --git a/uitest/src/test/java/com/vaadin/tests/push/ReconnectTest.java b/uitest/src/test/java/com/vaadin/tests/push/ReconnectTest.java index f3559d0574..8551d8eeea 100644 --- a/uitest/src/test/java/com/vaadin/tests/push/ReconnectTest.java +++ b/uitest/src/test/java/com/vaadin/tests/push/ReconnectTest.java @@ -1,11 +1,13 @@ package com.vaadin.tests.push; import org.junit.Test; +import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.WebElement; -import com.jcraft.jsch.JSchException; import com.vaadin.tests.tb3.MultiBrowserTestWithProxy; +import java.io.IOException; + public abstract class ReconnectTest extends MultiBrowserTestWithProxy { @Override @@ -23,7 +25,7 @@ public abstract class ReconnectTest extends MultiBrowserTestWithProxy { } @Test - public void messageIsQueuedOnDisconnect() throws JSchException { + public void messageIsQueuedOnDisconnect() throws IOException { disconnectProxy(); clickButtonAndWaitForTwoReconnectAttempts(); @@ -34,7 +36,7 @@ public abstract class ReconnectTest extends MultiBrowserTestWithProxy { @Test public void messageIsNotSentBeforeConnectionIsEstablished() - throws JSchException, InterruptedException { + throws IOException, InterruptedException { disconnectProxy(); waitForNextReconnectionAttempt(); @@ -65,7 +67,7 @@ public abstract class ReconnectTest extends MultiBrowserTestWithProxy { waitForDebugMessage("Reopening push connection"); } - private void connectAndVerifyConnectionEstablished() throws JSchException { + private void connectAndVerifyConnectionEstablished() throws IOException { connectProxy(); waitUntilServerCounterChanges(); } @@ -76,8 +78,14 @@ public abstract class ReconnectTest extends MultiBrowserTestWithProxy { private void waitUntilServerCounterChanges() { final int counter = BasicPushTest.getServerCounter(this); - waitUntil(input -> BasicPushTest - .getServerCounter(ReconnectTest.this) > counter, 30); + waitUntil(input -> { + try { + return BasicPushTest + .getServerCounter(ReconnectTest.this) > counter; + } catch (NoSuchElementException e) { + return false; + } + }, 30); } private void waitUntilClientCounterChanges(final int expectedValue) { diff --git a/uitest/src/test/java/com/vaadin/tests/tb3/AbstractTB3Test.java b/uitest/src/test/java/com/vaadin/tests/tb3/AbstractTB3Test.java index b8ae59b4c8..1e054ca404 100644 --- a/uitest/src/test/java/com/vaadin/tests/tb3/AbstractTB3Test.java +++ b/uitest/src/test/java/com/vaadin/tests/tb3/AbstractTB3Test.java @@ -801,8 +801,12 @@ public abstract class AbstractTB3Test extends ParallelTest { protected void openDebugLogTab() { waitUntil(input -> { - WebElement element = getDebugLogButton(); - return element != null; + try { + WebElement element = getDebugLogButton(); + return element != null; + } catch (NoSuchElementException e) { + return false; + } }, 15); getDebugLogButton().click(); } diff --git a/uitest/src/test/java/com/vaadin/tests/tb3/MultiBrowserTestWithProxy.java b/uitest/src/test/java/com/vaadin/tests/tb3/MultiBrowserTestWithProxy.java index 4b852ba534..314c02759e 100644 --- a/uitest/src/test/java/com/vaadin/tests/tb3/MultiBrowserTestWithProxy.java +++ b/uitest/src/test/java/com/vaadin/tests/tb3/MultiBrowserTestWithProxy.java @@ -1,25 +1,17 @@ package com.vaadin.tests.tb3; -import java.io.File; -import java.util.concurrent.atomic.AtomicInteger; - +import com.vaadin.testbench.parallel.TestCategory; import org.junit.After; -import com.jcraft.jsch.JSch; -import com.jcraft.jsch.JSchException; -import com.jcraft.jsch.Session; -import com.vaadin.testbench.parallel.TestCategory; +import java.io.IOException; +import java.util.concurrent.atomic.AtomicInteger; @TestCategory("push") public abstract class MultiBrowserTestWithProxy extends MultiBrowserTest { private static AtomicInteger availablePort = new AtomicInteger(2000); - private Session proxySession; + private SimpleProxy proxySession; private Integer proxyPort = null; - private JSch jsch; - private static String sshDir = System.getProperty("user.home") + "/.ssh/"; - private String[] publicKeys = { System.getProperty("sshkey.file"), - sshDir + "id_rsa", sshDir + "id_dsa", sshDir + "id_rsa2" }; @Override public void setup() throws Exception { @@ -60,7 +52,7 @@ public abstract class MultiBrowserTestWithProxy extends MultiBrowserTest { /** * Ensure the proxy is active. Does nothing if the proxy is already active. */ - protected void connectProxy() throws JSchException { + protected void connectProxy() throws IOException { if (proxySession != null) { return; } @@ -70,7 +62,7 @@ public abstract class MultiBrowserTestWithProxy extends MultiBrowserTest { try { createProxy(getProxyPort()); break; - } catch (JSchException e) { + } catch (IOException e) { sleep(500); if (i == 9) { throw new RuntimeException( @@ -80,26 +72,10 @@ public abstract class MultiBrowserTestWithProxy extends MultiBrowserTest { } } - private void createProxy(int proxyPort) throws JSchException { - if (jsch == null) { - jsch = new JSch(); - - String keyFile = null; - for (String publicKey : publicKeys) { - if (publicKey != null) { - if (new File(publicKey).exists()) { - keyFile = publicKey; - break; - } - } - } - jsch.addIdentity(keyFile); - } - proxySession = jsch.getSession("localhost"); - proxySession.setConfig("StrictHostKeyChecking", "no"); - proxySession.setPortForwardingL("0.0.0.0", proxyPort, - super.getDeploymentHostname(), super.getDeploymentPort()); - proxySession.connect(); + private void createProxy(int proxyPort) throws IOException { + proxySession = new SimpleProxy(proxyPort, getDeploymentHostname(), + getDeploymentPort()); + proxySession.start(); } @Override diff --git a/uitest/src/test/java/com/vaadin/tests/tb3/SimpleProxy.java b/uitest/src/test/java/com/vaadin/tests/tb3/SimpleProxy.java new file mode 100644 index 0000000000..4c72d7eb6d --- /dev/null +++ b/uitest/src/test/java/com/vaadin/tests/tb3/SimpleProxy.java @@ -0,0 +1,109 @@ +package com.vaadin.tests.tb3; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketException; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +public class SimpleProxy extends Thread { + private final ThreadGroup proxyThreads; + private final Queue sockets = new ConcurrentLinkedQueue<>(); + private final ServerSocket serverSocket; + private final String remoteHost; + private final int remotePort; + + public SimpleProxy(int localPort, String remoteHost, int remotePort) + throws IOException { + super(new ThreadGroup("proxy " + localPort), "server"); + this.remoteHost = remoteHost; + this.remotePort = remotePort; + proxyThreads = getThreadGroup(); + serverSocket = new ServerSocket(localPort, 100, + InetAddress.getByName("0.0.0.0")); + + setDaemon(true); + } + + @Override + public void run() { + try { + while (!isInterrupted() && !serverSocket.isClosed()) { + try { + Socket proxySocket = serverSocket.accept(); + sockets.add(proxySocket); + Socket remoteSocket = new Socket(remoteHost, remotePort); + sockets.add(remoteSocket); + new CopySocket(proxyThreads, proxySocket, remoteSocket) + .start(); + new CopySocket(proxyThreads, remoteSocket, proxySocket) + .start(); + } catch (SocketException e) { + if (!serverSocket.isClosed()) { + throw new RuntimeException(e); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } finally { + disconnect(); + } + } + + public void disconnect() { + proxyThreads.interrupt(); + for (Socket socket : sockets) { + try { + socket.close(); + } catch (IOException ignored) { + } + } + try { + serverSocket.close(); + } catch (IOException ignored) { + } + } + + private class CopySocket extends Thread { + + private final InputStream inputStream; + private final OutputStream outputStream; + + private CopySocket(ThreadGroup proxyThreads, Socket srcSocket, + Socket dstSocket) throws IOException { + super(proxyThreads, "proxy worker"); + setDaemon(true); + inputStream = srcSocket.getInputStream(); + outputStream = dstSocket.getOutputStream(); + } + + @Override + public void run() { + try { + for (int b; (b = inputStream.read()) >= 0;) { + outputStream.write(b); + } + } catch (SocketException ignored) { + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + inputStream.close(); + } catch (IOException ignored) { + + } + try { + outputStream.close(); + } catch (IOException ignored) { + + } + } + } + } + +} -- 2.39.5