Skip to content

Commit 119a210

Browse files
committed
test: 添加针对issue-1的单元测试用例1
1 parent ef90c4a commit 119a210

File tree

4 files changed

+115
-5
lines changed

4 files changed

+115
-5
lines changed

src/test/java/top/meethigher/proxy/http/ReverseHttpProxyBugTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ public void server() {
3030

3131
// backend-server
3232
vertx.createHttpServer().requestHandler(req -> {
33-
vertx.setTimer(Duration.ofSeconds(10).toMillis(), id -> {
33+
vertx.setTimer(Duration.ofSeconds(1).toMillis(), id -> {
3434
req.response()
3535
.setStatusCode(200)
3636
.putHeader("Content-Type", "text/plain;charset=utf-8")
37-
.end("Hello World");
37+
.end(req.uri());
3838
});
3939
}).listen(backendServerPort, ar -> {
4040
if (ar.succeeded()) {

src/test/java/top/meethigher/proxy/http/ReverseHttpProxyTest.java

Lines changed: 96 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package top.meethigher.proxy.http;
22

33
import io.vertx.core.Vertx;
4-
import io.vertx.core.http.PoolOptions;
4+
import io.vertx.core.http.*;
55
import io.vertx.ext.web.Router;
6+
import org.junit.Assert;
67
import org.junit.Test;
78
import org.slf4j.Logger;
89
import org.slf4j.LoggerFactory;
910

11+
import java.util.LinkedHashMap;
12+
import java.util.Map;
13+
import java.util.concurrent.ExecutionException;
1014
import java.util.concurrent.TimeUnit;
15+
import java.util.concurrent.locks.LockSupport;
1116

1217
public class ReverseHttpProxyTest {
1318

@@ -58,4 +63,94 @@ public void testDomain80() throws Exception {
5863
proxy.stop();
5964
}
6065

66+
/**
67+
* 用来测试Vertx的route拦截规则。
68+
* 结论
69+
* 像一些特殊的路由,比如/route/、/route,即可以匹配/route/*,也可以匹配/route,就看是谁的优先级更高了
70+
*/
71+
@Test
72+
public void testVertxRoute() throws Exception {
73+
Router router = Router.router(vertx);
74+
router.route("/route/*").handler(ctx -> {
75+
ctx.response().end("/route/*");
76+
});
77+
router.route("/route").order(Integer.MIN_VALUE).handler(ctx -> {
78+
ctx.response().end("/route");
79+
});
80+
vertx.createHttpServer().requestHandler(router).listen(666);
81+
82+
LockSupport.park();
83+
}
84+
85+
86+
/**
87+
* 解决bug
88+
* https://github.com/meethigher/tcp-reverse-proxy/issues/1
89+
* <p>
90+
* 首先需要理解vertx的route匹配规则
91+
*
92+
* @see ReverseHttpProxyTest#testVertxRoute()
93+
*/
94+
@Test
95+
public void testProxyUrl1() throws Exception {
96+
// 启动后端
97+
vertx.createHttpServer().requestHandler(req -> {
98+
req.response().end(req.absoluteURI());
99+
}).listen(888);
100+
// 启动代理
101+
ReverseHttpProxy.create(vertx)
102+
.addRoute(new ProxyRoute()
103+
.setSourceUrl("/*")
104+
.setTargetUrl("http://127.0.0.1:888"), 0)
105+
.addRoute(new ProxyRoute()
106+
.setSourceUrl("/route/*")
107+
.setTargetUrl("http://10.0.0.1:888/route"), -1)
108+
.addRoute(new ProxyRoute()
109+
.setSourceUrl("/route/static")
110+
.setTargetUrl("http://localhost:888/route/static"), -2
111+
)
112+
.port(8080).start();
113+
114+
// 测试用例
115+
// key为测试样例,value为正确返回结果
116+
Map<String, String> cases = new LinkedHashMap<>();
117+
cases.put("http://127.0.0.1:8080", "http://127.0.0.1:888/");
118+
cases.put("http://127.0.0.1:8080/", "http://127.0.0.1:888/");
119+
cases.put("http://127.0.0.1:8080/test/", "http://127.0.0.1:888/test/");
120+
cases.put("http://127.0.0.1:8080/test", "http://127.0.0.1:888/test");
121+
cases.put("http://127.0.0.1:8080/route/static", "http://localhost:888/route/static");
122+
cases.put("http://127.0.0.1:8080/route/1", "http://10.0.0.1:888/route/1");
123+
cases.put("http://127.0.0.1:8080/route/", "http://10.0.0.1:888/route/");
124+
cases.put("http://127.0.0.1:8080/route", "http://10.0.0.1:888/route");
125+
cases.put("http://127.0.0.1:8080/route?name=1&age=1", "http://10.0.0.1:888/route?name=1&age=1");
126+
127+
proxyUrlCommon(cases);
128+
129+
130+
}
131+
132+
private void proxyUrlCommon(Map<String, String> cases) throws InterruptedException, ExecutionException {
133+
HttpClient httpClient = Vertx.vertx().createHttpClient();
134+
135+
boolean actual = true;
136+
137+
for (String key : cases.keySet()) {
138+
HttpClientRequest httpClientRequest = httpClient.request(new RequestOptions().setMethod(HttpMethod.GET).setAbsoluteURI(key))
139+
.toCompletionStage() // 转换为 CompletionStage
140+
.toCompletableFuture() // 转换为 CompletableFuture
141+
.get();// 阻塞等待完成
142+
HttpClientResponse httpClientResponse = httpClientRequest.send().toCompletionStage().toCompletableFuture().get();
143+
String result = httpClientResponse.body().toCompletionStage().toCompletableFuture().get().toString();
144+
String s = cases.get(key);
145+
System.out.println("请求地址: " + key + "\n实际结果: " + result + "\n预期结果: " + s);
146+
System.out.println(s.equals(result));
147+
System.out.println("===============");
148+
if (actual && !s.equals(result)) {
149+
actual = false;
150+
}
151+
}
152+
153+
Assert.assertTrue(actual);
154+
}
155+
61156
}

src/test/java/top/meethigher/proxy/tcp/ReverseTcpProxyTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ public class ReverseTcpProxyTest {
99

1010
@Test
1111
public void testVertxTCPReverseProxy() throws Exception {
12-
ReverseTcpProxy proxy = ReverseTcpProxy.create(Vertx.vertx(), "10.0.0.1", 8080);
13-
proxy.port(22).start();
12+
ReverseTcpProxy proxy = ReverseTcpProxy.create(Vertx.vertx(), "10.0.0.1", 888);
13+
proxy.port(8080).start();
1414
TimeUnit.MINUTES.sleep(10);
1515
proxy.stop();
1616
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<configuration>
2+
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
3+
<encoder>
4+
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
5+
</encoder>
6+
</appender>
7+
8+
<!-- 设置根日志级别为TRACE -->
9+
<root level="INFO">
10+
<appender-ref ref="CONSOLE"/>
11+
</root>
12+
13+
<!-- 可选:为特定包设置日志级别 -->
14+
<logger name="com.yourpackage" level="TRACE"/>
15+
</configuration>

0 commit comments

Comments
 (0)