From ca49ca324f61998ed346eaba98d90bfec015c54e Mon Sep 17 00:00:00 2001
From: Jeroen van Erp
Date: Fri, 18 Mar 2016 10:53:15 +0100
Subject: [PATCH] Added reproducing testcase
---
build.gradle | 2 +
.../forwarded/RemotePortForwarderTest.java | 44 ++++++++++++++++++
.../com/hierynomus/sshj/test/HttpServer.java | 45 +++++++++++++++++++
3 files changed, 91 insertions(+)
create mode 100644 src/test/java/com/hierynomus/sshj/connection/channel/forwarded/RemotePortForwarderTest.java
create mode 100644 src/test/java/com/hierynomus/sshj/test/HttpServer.java
diff --git a/build.gradle b/build.gradle
index d089fca6..dc9be4a6 100644
--- a/build.gradle
+++ b/build.gradle
@@ -57,6 +57,8 @@ dependencies {
testCompile "org.mockito:mockito-core:1.9.5"
testCompile "org.apache.sshd:sshd-core:1.0.0"
testRuntime "ch.qos.logback:logback-classic:1.1.2"
+ testCompile 'org.glassfish.grizzly:grizzly-http-server:2.3.17'
+
}
jar {
diff --git a/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/RemotePortForwarderTest.java b/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/RemotePortForwarderTest.java
new file mode 100644
index 00000000..579f06a9
--- /dev/null
+++ b/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/RemotePortForwarderTest.java
@@ -0,0 +1,44 @@
+package com.hierynomus.sshj.connection.channel.forwarded;
+
+import com.hierynomus.sshj.test.HttpServer;
+import com.hierynomus.sshj.test.SshFixture;
+import com.hierynomus.sshj.test.util.FileUtil;
+import net.schmizz.sshj.SSHClient;
+import net.schmizz.sshj.connection.channel.forwarded.RemotePortForwarder;
+import net.schmizz.sshj.connection.channel.forwarded.SocketForwardingConnectListener;
+import org.apache.sshd.server.forward.AcceptAllForwardingFilter;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+import static org.junit.Assert.*;
+
+public class RemotePortForwarderTest {
+
+ @Rule
+ public SshFixture fixture = new SshFixture();
+
+ @Rule
+ public HttpServer httpServer = new HttpServer();
+
+ @Test
+ public void shouldDynamicallyForwardPort() throws IOException {
+ fixture.getServer().setTcpipForwardingFilter(new AcceptAllForwardingFilter());
+ File file = httpServer.getDocRoot().newFile("index.html");
+ FileUtil.writeToFile(file, "
Hi!
");
+ SSHClient sshClient = fixture.setupConnectedDefaultClient();
+ sshClient.authPassword("jeroen", "jeroen");
+ sshClient.getRemotePortForwarder().bind(
+ // where the server should listen
+ new RemotePortForwarder.Forward(0),
+ // what we do with incoming connections that are forwarded to us
+ new SocketForwardingConnectListener(new InetSocketAddress("127.0.0.1", 8080)));
+
+ }
+}
diff --git a/src/test/java/com/hierynomus/sshj/test/HttpServer.java b/src/test/java/com/hierynomus/sshj/test/HttpServer.java
new file mode 100644
index 00000000..9f6044fa
--- /dev/null
+++ b/src/test/java/com/hierynomus/sshj/test/HttpServer.java
@@ -0,0 +1,45 @@
+package com.hierynomus.sshj.test;
+
+import org.junit.rules.ExternalResource;
+import org.junit.rules.TemporaryFolder;
+
+import java.io.File;
+
+/**
+ * Can be used to setup a test HTTP server
+ */
+public class HttpServer extends ExternalResource {
+
+ private org.glassfish.grizzly.http.server.HttpServer httpServer;
+
+ private TemporaryFolder docRoot = new TemporaryFolder();
+
+ public HttpServer() {
+ }
+
+ @Override
+ protected void before() throws Throwable {
+ docRoot.create();
+ httpServer = org.glassfish.grizzly.http.server.HttpServer.createSimpleServer(docRoot.getRoot().getAbsolutePath());
+ httpServer.start();
+ }
+
+ @Override
+ protected void after() {
+ try {
+ httpServer.shutdownNow();
+ } catch (Exception e) {}
+ try {
+ docRoot.delete();
+ } catch (Exception e) {}
+
+ }
+
+ public org.glassfish.grizzly.http.server.HttpServer getHttpServer() {
+ return httpServer;
+ }
+
+ public TemporaryFolder getDocRoot() {
+ return docRoot;
+ }
+}