Skip to content
This repository was archived by the owner on May 10, 2024. It is now read-only.

Commit bc1fe42

Browse files
committed
additional tests
1 parent 156eceb commit bc1fe42

File tree

11 files changed

+462
-87
lines changed

11 files changed

+462
-87
lines changed

pom.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,6 @@
246246
<excludes>
247247
<exclude/>
248248
</excludes>
249-
<reuseForks>false</reuseForks> <!-- required to prevent server binding issues -->
250249
<trimStackTrace>false</trimStackTrace>
251250
</configuration>
252251
</plugin>

src/main/java/dev/katsute/simplehttpserver/SimpleHttpExchangeImpl.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.regex.Matcher;
2929
import java.util.regex.Pattern;
3030
import java.util.stream.Collectors;
31+
import java.util.stream.Stream;
3132
import java.util.zip.GZIPOutputStream;
3233

3334
final class SimpleHttpExchangeImpl extends SimpleHttpExchange {
@@ -78,9 +79,9 @@ private static Map<String,String> parseWwwFormEnc(final String s){
7879
getMap = rawGet == null ? new HashMap<>() : parseWwwFormEnc(rawGet);
7980

8081
String OUT;
81-
try(final BufferedReader IN = new BufferedReader(new InputStreamReader(exchange.getRequestBody(), StandardCharsets.UTF_8))){
82-
OUT = IN.lines().collect(Collectors.joining("\n"));
83-
}catch(final IOException | NoSuchElementException ignored){
82+
try(final Stream<String> lns = new BufferedReader(new InputStreamReader(exchange.getRequestBody(), StandardCharsets.UTF_8)).lines()){
83+
OUT = lns.collect(Collectors.joining("\n"));
84+
}catch(Throwable e){
8485
OUT = null;
8586
}
8687

@@ -391,7 +392,7 @@ public final void send(final File file) throws IOException {
391392

392393
@Override
393394
public final void send(final File file, final boolean gzip) throws IOException {
394-
send(file, HttpURLConnection.HTTP_OK, true);
395+
send(file, HttpURLConnection.HTTP_OK, gzip);
395396
}
396397

397398
@Override

src/main/java/dev/katsute/simplehttpserver/SimpleHttpServerImpl.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ public synchronized final void setExecutor(final Executor executor){
101101
server.setExecutor(executor);
102102
}
103103

104-
105104
//
106105

107106
@Override
@@ -134,16 +133,13 @@ public synchronized final HttpContext createContext(final String context, final
134133
if(!ct.equals("/") && Objects.requireNonNull(handler) instanceof RootHandler)
135134
throw new IllegalArgumentException("RootHandler can only be used at the root '/' context");
136135

137-
138136
final HttpContext hc = server.createContext(ct);
139137

140-
if(sessionHandler != null){
141-
final HttpHandler wrapper = exchange -> {
142-
handle(exchange);
143-
handler.handle(exchange);
144-
};
145-
hc.setHandler(wrapper);
146-
}
138+
final HttpHandler wrapper = exchange -> {
139+
handle(exchange);
140+
handler.handle(exchange);
141+
};
142+
hc.setHandler(wrapper);
147143

148144
contexts.put(hc, handler);
149145

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,44 @@
11
package dev.katsute.simplehttpserver;
22

3-
import org.junit.jupiter.api.Test;
3+
import org.junit.jupiter.api.Assertions;
4+
import org.junit.jupiter.params.ParameterizedTest;
5+
import org.junit.jupiter.params.provider.Arguments;
6+
import org.junit.jupiter.params.provider.MethodSource;
47

5-
import static dev.katsute.simplehttpserver.ContextUtility.*;
6-
import static org.junit.jupiter.api.Assertions.*;
8+
import java.util.stream.Stream;
79

810
final class ContextUtilityTests {
911

10-
@Test
11-
public final void testContexts(){
12-
assertEquals("", getContext("/", false, false));
13-
assertEquals("/", getContext("", true, false));
14-
assertEquals("/", getContext("", false, true ));
15-
assertEquals("/", getContext("", true, true ));
16-
assertEquals("a", getContext("a", false, false));
17-
assertEquals("/a", getContext("a", true, false));
18-
assertEquals("a/", getContext("a", false, true ));
19-
assertEquals("/a/", getContext("a", true, true ));
20-
assertEquals("testNone", getContext("/testNone/", false, false));
21-
assertEquals("/testLeading", getContext("testLeading", true, false));
22-
assertEquals("testTrailing/", getContext("testTrailing", false, true ));
23-
assertEquals("/testBoth/", getContext("testBoth", true, true ));
24-
assertEquals("testNoneBackSlash", getContext("\\testNoneBackSlash\\", false, false));
25-
assertEquals("/testBackSlash/", getContext("\\testBackSlash\\", true, true ));
26-
assertEquals("/testConsecutiveBackSlash/", getContext("\\\\testConsecutiveBackSlash\\\\", true, true ));
27-
assertEquals("/testConsecutiveForwardSlash/", getContext("//testConsecutiveForwardSlash//", true, true ));
28-
assertEquals("/testWhitespace/", getContext(" /testWhitespace/ ", true, true));
29-
assertEquals("/ testWhitespace /", getContext("/ testWhitespace /", true, true));
30-
assertEquals(" testWhitespace ", getContext("/ testWhitespace /", false, false));
31-
assertEquals("testWhitespace", getContext(" testWhitespace ", false, false));
32-
assertEquals("/testWhitespace/", getContext(" /testWhitespace/ ", true, true));
12+
@ParameterizedTest
13+
@MethodSource("contextArgs")
14+
final void testContexts(final String expected, final String input, final boolean leading, final boolean trailing){
15+
Assertions.assertEquals(expected, ContextUtility.getContext(input, leading, trailing));
16+
}
17+
18+
static Stream<Arguments> contextArgs(){
19+
return Stream.of(
20+
Arguments.of("", "/", false, false),
21+
Arguments.of("/", "", true, false),
22+
Arguments.of("/", "", false, true ),
23+
Arguments.of("/", "", true, true ),
24+
Arguments.of("a", "a", false, false),
25+
Arguments.of("/a", "a", true, false),
26+
Arguments.of("a/", "a", false, true ),
27+
Arguments.of("/a/", "a", true, true ),
28+
Arguments.of("testNone", "/testNone/", false, false),
29+
Arguments.of("/testLeading", "testLeading", true, false),
30+
Arguments.of("testTrailing/", "testTrailing", false, true ),
31+
Arguments.of("/testBoth/", "testBoth", true, true ),
32+
Arguments.of("testNoneBackSlash", "\\testNoneBackSlash\\", false, false),
33+
Arguments.of("/testBackSlash/", "\\testBackSlash\\", true, true ),
34+
Arguments.of("/testConsecutiveBackSlash/", "\\\\testConsecutiveBackSlash\\\\", true, true ),
35+
Arguments.of("/testConsecutiveForwardSlash/", "//testConsecutiveForwardSlash//", true, true ),
36+
Arguments.of("/testWhitespace/", " /testWhitespace/ ", true, true),
37+
Arguments.of("/ testWhitespace /", "/ testWhitespace /", true, true),
38+
Arguments.of(" testWhitespace ", "/ testWhitespace /", false, false),
39+
Arguments.of("testWhitespace", " testWhitespace ", false, false),
40+
Arguments.of("/testWhitespace/", " /testWhitespace/ ", true, true)
41+
);
3342
}
3443

3544
}

src/test/java/dev/katsute/simplehttpserver/Requests.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,44 @@
22

33
import java.io.*;
44
import java.net.HttpURLConnection;
5+
import java.net.URL;
56
import java.nio.charset.StandardCharsets;
67

78
public class Requests {
89

10+
public static HttpURLConnection openConn(final String URL){
11+
try{
12+
final HttpURLConnection conn = (HttpURLConnection) new URL(URL).openConnection();
13+
conn.setConnectTimeout(5000);
14+
conn.setReadTimeout(5000);
15+
return conn;
16+
}catch(final IOException e){
17+
throw new UncheckedIOException(e);
18+
}
19+
}
20+
21+
public static int getCode(final String URL){
22+
try{
23+
return openConn(URL).getResponseCode();
24+
}catch(final IOException e){
25+
throw new UncheckedIOException(e);
26+
}
27+
}
28+
29+
public static String getBody(final String URL){
30+
return getBody(openConn(URL));
31+
}
32+
933
public static String getBody(final HttpURLConnection conn){
1034
try(final BufferedReader IN = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))){
1135
String buffer;
1236
final StringBuilder OUT = new StringBuilder();
1337
while((buffer = IN.readLine()) != null)
1438
OUT.append(buffer);
1539
return OUT.toString();
16-
}catch(final IOException ignored){}
17-
return null;
40+
}catch(final IOException e){
41+
throw new UncheckedIOException(e);
42+
}
1843
}
1944

2045
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package dev.katsute.simplehttpserver.handler;
2+
3+
import dev.katsute.simplehttpserver.*;
4+
import org.junit.jupiter.api.*;
5+
6+
import java.io.IOException;
7+
8+
final class PredicateTests {
9+
10+
private static SimpleHttpServer server;
11+
12+
@BeforeAll
13+
static void beforeAll() throws IOException{
14+
server = SimpleHttpServer.create(8080);
15+
server.start();
16+
}
17+
18+
@AfterAll
19+
static void afterAll(){
20+
server.stop();
21+
}
22+
23+
@Test
24+
final void testPredicate(){
25+
server.createContext("predicate/true", new PredicateHandler(
26+
exchange -> true,
27+
(SimpleHttpHandler) exchange -> exchange.send("true"),
28+
(SimpleHttpHandler) exchange -> exchange.send("false"))
29+
);
30+
31+
Assertions.assertEquals("true", Requests.getBody("http://localhost:8080/predicate/true"));
32+
33+
server.createContext("predicate/false", new PredicateHandler(
34+
exchange -> false,
35+
(SimpleHttpHandler) exchange -> exchange.send("true"),
36+
(SimpleHttpHandler) exchange -> exchange.send("false"))
37+
);
38+
39+
Assertions.assertEquals("false", Requests.getBody("http://localhost:8080/predicate/false"));
40+
}
41+
42+
@Test
43+
final void testRoot(){
44+
server.createContext("/", new RootHandler(
45+
(SimpleHttpHandler) exchange -> exchange.send("root"),
46+
(SimpleHttpHandler) exchange -> exchange.send("else")
47+
));
48+
49+
Assertions.assertEquals("root", Requests.getBody("http://localhost:8080/"));
50+
Assertions.assertEquals("else", Requests.getBody("http://localhost:8080/else"));
51+
}
52+
53+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package dev.katsute.simplehttpserver.handler;
2+
3+
import dev.katsute.simplehttpserver.*;
4+
import org.junit.jupiter.api.*;
5+
6+
import java.io.IOException;
7+
import java.net.HttpURLConnection;
8+
import java.net.URL;
9+
10+
final class RedirectTests {
11+
12+
private static SimpleHttpServer server;
13+
14+
@BeforeAll
15+
static void beforeAll() throws IOException{
16+
server = SimpleHttpServer.create(8080);
17+
server.start();
18+
}
19+
20+
@AfterAll
21+
static void afterAll(){
22+
server.stop();
23+
}
24+
25+
@Test
26+
final void testRedirect() throws IOException{
27+
server.createContext("redirect", new RedirectHandler("https://github.com/KatsuteDev/simplehttpserver"));
28+
Assertions.assertEquals("https://github.com/KatsuteDev/simplehttpserver", getRedirectedURL("http://localhost:8080/redirect"));
29+
}
30+
31+
private static String getRedirectedURL(final String url) throws IOException {
32+
final HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
33+
conn.getInputStream();
34+
return conn.getHeaderField("Location") != null ? getRedirectedURL(conn.getHeaderField("Location")) : url;
35+
}
36+
37+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package dev.katsute.simplehttpserver.handler;
2+
3+
import dev.katsute.simplehttpserver.*;
4+
import org.junit.jupiter.api.*;
5+
6+
import java.io.IOException;
7+
8+
final class TemporaryTests {
9+
10+
private static SimpleHttpServer server;
11+
12+
@BeforeAll
13+
static void beforeAll() throws IOException{
14+
server = SimpleHttpServer.create(8080);
15+
server.start();
16+
}
17+
18+
@AfterAll
19+
static void afterAll(){
20+
server.stop();
21+
}
22+
23+
@Test
24+
final void testFirst(){
25+
server.createContext("temp", new TemporaryHandler((SimpleHttpHandler) e -> e.send(200)));
26+
Assertions.assertEquals(200, Requests.getCode("http://localhost:8080/temp"));
27+
Assertions.assertEquals(404, Requests.getCode("http://localhost:8080/temp"));
28+
}
29+
30+
@Test
31+
final void testTime() throws InterruptedException{
32+
server.createContext("temp", new TemporaryHandler((SimpleHttpHandler) e -> e.send(200), 1000));
33+
34+
Thread.sleep(1200);
35+
36+
Assertions.assertEquals(404, Requests.getCode("http://localhost:8080/temp"));
37+
}
38+
39+
@Test
40+
final void testTimeFirst(){
41+
server.createContext("temp", new TemporaryHandler((SimpleHttpHandler) e -> e.send(200), 1000));
42+
Assertions.assertEquals(200, Requests.getCode("http://localhost:8080/temp"));
43+
Assertions.assertEquals(404, Requests.getCode("http://localhost:8080/temp"));
44+
}
45+
46+
}

0 commit comments

Comments
 (0)