Skip to content

Commit 08cc321

Browse files
Merge pull request #21 from janweinschenker/feature/jdk9
Feature/jdk9
2 parents 3faa2bc + c92edcc commit 08cc321

File tree

9 files changed

+196
-59
lines changed

9 files changed

+196
-59
lines changed

CONTRIBUTING.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Contributing
2+
3+
One of the great things about open source projects is that anyone can contribute code.
4+
servlet4-demo is a small project and I want to encourage everyone to submit their
5+
patches freely. To help you in that process, there are several things that you should keep in mind.
6+
7+
## Use Pull Requests
8+
9+
If you want to submit code, please use a GitHub pull request.
10+
This is the fastest way for us to evaluate your code and to merge it into the code base.
11+
Please don't file an issue with snippets of code. Doing so means that we need to manually
12+
merge the changes in and update any appropriate tests. That decreases the likelihood that
13+
your code is going to get included in a timely manner. Please use pull requests.
14+
15+
## Unit Tests
16+
17+
Regardless of the changes you are making, please make sure that your pull request includes
18+
appropriate unit tests.
19+
20+
## Testing
21+
22+
Along with submitting unit tests, please make sure that you have used the built-in
23+
testing capabilities of [coveralls](https://coveralls.io/github/janweinschenker/servlet4-demo). At a minimum, you should
24+
run `mvn clean test` and make sure, that all tests succeed.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package de.holisticon.servlet4demo.jettyclient.jetty;
2+
3+
import org.apache.log4j.Logger;
4+
import org.eclipse.jetty.client.api.Response;
5+
import org.eclipse.jetty.client.api.Result;
6+
7+
public class CompleteListener implements Response.CompleteListener {
8+
9+
public static final Logger LOG = Logger.getLogger(CompleteListener.class);
10+
11+
@Override
12+
public void onComplete(Result result) {
13+
LOG.info("http version: " + result
14+
.getResponse()
15+
.getVersion());
16+
}
17+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package de.holisticon.servlet4demo.jettyclient.jetty;
2+
3+
import java.nio.ByteBuffer;
4+
5+
import org.apache.log4j.Logger;
6+
import org.eclipse.jetty.client.api.Response;
7+
import org.eclipse.jetty.util.BufferUtil;
8+
9+
public class ContentListener implements Response.ContentListener {
10+
11+
public static final Logger LOG = Logger.getLogger(ContentListener.class);
12+
13+
@Override
14+
public void onContent(Response response, ByteBuffer byteBuffer) {
15+
LOG.info("content: " + BufferUtil.toString(byteBuffer));
16+
LOG.info("");
17+
}
18+
}

client-jetty/src/main/java/de/holisticon/servlet4demo/jettyclient/jetty/JettyClientDemo.java

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import org.apache.log4j.Logger;
88
import org.eclipse.jetty.client.HttpClient;
99
import org.eclipse.jetty.client.api.ContentResponse;
10-
import org.eclipse.jetty.client.api.Request;
1110
import org.eclipse.jetty.http.HttpFields;
1211
import org.eclipse.jetty.http.HttpURI;
1312
import org.eclipse.jetty.http.HttpVersion;
@@ -16,7 +15,6 @@
1615
import org.eclipse.jetty.http2.api.server.ServerSessionListener;
1716
import org.eclipse.jetty.http2.client.HTTP2Client;
1817
import org.eclipse.jetty.http2.frames.HeadersFrame;
19-
import org.eclipse.jetty.util.BufferUtil;
2018
import org.eclipse.jetty.util.FuturePromise;
2119
import org.eclipse.jetty.util.Jetty;
2220
import org.eclipse.jetty.util.Promise;
@@ -42,7 +40,8 @@ public class JettyClientDemo {
4240
* @param sslContextFactory the ssl context factory
4341
*/
4442
@Autowired
45-
public JettyClientDemo(HttpClient httpClient, HTTP2Client http2Client,
43+
public JettyClientDemo(
44+
HttpClient httpClient, HTTP2Client http2Client,
4645
SslContextFactory sslContextFactory) {
4746
this.httpClient = httpClient;
4847
this.http2Client = http2Client;
@@ -59,23 +58,10 @@ public JettyClientDemo(HttpClient httpClient, HTTP2Client http2Client,
5958
public void performAsyncHttpRequest(String host, int port, String path) {
6059
LOG.info("============================================= Asynchronous example ===");
6160
try {
62-
String uri = getFormatedUri(host, port, path);
63-
64-
Request request =
65-
httpClient
66-
.newRequest(uri)
67-
.onResponseContent((response, byteBuffer) -> {
68-
LOG.info("content: " + BufferUtil.toString(byteBuffer));
69-
LOG.info("");
70-
});
71-
request.send(result -> {
72-
LOG.info("http version: " + result
73-
.getResponse()
74-
.getVersion());
75-
});
76-
77-
// watch the console log: the following message will be printed
78-
// before the request has finished.
61+
httpClient
62+
.newRequest(getFormatedUri(host, port, path))
63+
.onResponseContent(new ContentListener())
64+
.send(new CompleteListener());
7965
LOG.info("request created!!!");
8066
Thread.sleep(5000);
8167

@@ -87,6 +73,7 @@ public void performAsyncHttpRequest(String host, int port, String path) {
8773

8874
/**
8975
* Perform a synchronous http request.
76+
*
9077
* @param host the hostname
9178
* @param port the port
9279
* @param path the request path
@@ -109,22 +96,24 @@ public void performDefaultHttpRequest(String host, int port, String path) {
10996

11097
/**
11198
* Perform an http request and wait for a possibly incoming push promise.
112-
* @param host the hostname
113-
* @param port the port
114-
* @param path the request path
99+
*
100+
* @param host the hostname
101+
* @param port the port
102+
* @param path the request path
115103
* @param sessionPromise the session promise object
116-
* @param phaser the phaser
104+
* @param phaser the phaser
117105
* @throws Exception may occur when client is started or stopped
118106
*/
119-
public void performHttpRequestReceivePush(String host, int port, String path,
107+
public void performHttpRequestReceivePush(
108+
String host, int port, String path,
120109
FuturePromise<Session> sessionPromise, Phaser phaser)
121110
throws Exception {
122111

123112
http2Client.addBean(sslContextFactory);
124113
http2Client.start();
125114

126115
http2Client.connect(sslContextFactory, new InetSocketAddress(host, port),
127-
new ServerSessionListener.Adapter(), sessionPromise);
116+
new ServerSessionListener.Adapter(), sessionPromise);
128117
Session session = sessionPromise.get(5, TimeUnit.SECONDS);
129118

130119
HttpFields requestFields = new HttpFields();
@@ -133,7 +122,7 @@ public void performHttpRequestReceivePush(String host, int port, String path,
133122
.getName() + "/" + Jetty.VERSION);
134123
MetaData.Request metaData =
135124
new MetaData.Request("GET", new HttpURI("https://" + host + ":" + port + path),
136-
HttpVersion.HTTP_2, requestFields);
125+
HttpVersion.HTTP_2, requestFields);
137126
HeadersFrame headersFrame = new HeadersFrame(metaData, null, true);
138127
session.newStream(headersFrame, new Promise.Adapter<>(), new StreamListener(phaser));
139128

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package de.holisticon.servlet4demo.jettyclient.jetty;
2+
3+
import static org.mockito.Mockito.mock;
4+
import static org.mockito.Mockito.times;
5+
import static org.mockito.Mockito.verify;
6+
import static org.mockito.Mockito.when;
7+
8+
import org.eclipse.jetty.client.api.Response;
9+
import org.eclipse.jetty.client.api.Result;
10+
import org.eclipse.jetty.http.HttpVersion;
11+
import org.junit.Test;
12+
13+
public class CompleteListenerTest {
14+
15+
@Test
16+
public void testOnComplete() {
17+
CompleteListener sut = new CompleteListener();
18+
Result result = mock(Result.class);
19+
Response response = mock(Response.class);
20+
21+
when(response.getVersion()).thenReturn(HttpVersion.HTTP_2);
22+
when(result.getResponse()).thenReturn(response);
23+
24+
sut.onComplete(result);
25+
26+
verify(result, times(1)).getResponse();
27+
verify(response, times(1)).getVersion();
28+
}
29+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package de.holisticon.servlet4demo.jettyclient.jetty;
2+
3+
import static org.mockito.Mockito.mock;
4+
import static org.mockito.Mockito.spy;
5+
import static org.mockito.Mockito.times;
6+
import static org.mockito.Mockito.verify;
7+
8+
import java.nio.ByteBuffer;
9+
10+
import org.eclipse.jetty.client.api.Response;
11+
import org.junit.Test;
12+
13+
public class ContentListenerTest {
14+
15+
@Test
16+
public void testOnContent() {
17+
ContentListener sut = new ContentListener();
18+
19+
Response response = mock(Response.class);
20+
ByteBuffer buffer = ByteBuffer.allocate(10);
21+
ByteBuffer spy = spy(buffer);
22+
23+
sut.onContent(response, spy);
24+
25+
verify(spy, times(1)).hasArray();
26+
}
27+
}

client-jetty/src/test/java/de/holisticon/servlet4demo/jettyclient/jetty/JettyClientDemoTest.java

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
package de.holisticon.servlet4demo.jettyclient.jetty;
22

3+
import static org.junit.Assert.fail;
4+
import static org.mockito.ArgumentMatchers.any;
5+
import static org.mockito.ArgumentMatchers.anyString;
6+
import static org.mockito.Mockito.anyLong;
7+
import static org.mockito.Mockito.mock;
8+
import static org.mockito.Mockito.times;
9+
import static org.mockito.Mockito.verify;
10+
import static org.mockito.Mockito.when;
11+
12+
import java.util.concurrent.ExecutionException;
13+
import java.util.concurrent.Phaser;
14+
import java.util.concurrent.TimeUnit;
15+
import java.util.concurrent.TimeoutException;
16+
317
import org.eclipse.jetty.client.HttpClient;
418
import org.eclipse.jetty.client.api.ContentResponse;
519
import org.eclipse.jetty.client.api.Request;
@@ -11,16 +25,6 @@
1125
import org.junit.Before;
1226
import org.junit.Test;
1327

14-
import java.util.concurrent.ExecutionException;
15-
import java.util.concurrent.Phaser;
16-
import java.util.concurrent.TimeUnit;
17-
import java.util.concurrent.TimeoutException;
18-
19-
import static org.junit.Assert.fail;
20-
import static org.mockito.ArgumentMatchers.any;
21-
import static org.mockito.ArgumentMatchers.anyString;
22-
import static org.mockito.Mockito.*;
23-
2428
public class JettyClientDemoTest {
2529

2630
private JettyClientDemo sut;
@@ -57,6 +61,18 @@ public void testPerformAsyncHttpRequest() {
5761
verify(httpClient, times(1)).newRequest("https://localhost:8443/some/path");
5862
}
5963

64+
@Test
65+
public void testPerformAsyncHttpRequestWithException() {
66+
67+
68+
when(request.onResponseContent(any(Response.ContentListener.class))).thenThrow(Exception.class);
69+
when(httpClient.newRequest(anyString())).thenReturn(request);
70+
71+
sut.performAsyncHttpRequest("localhost", 8443, "/some/path");
72+
verify(request, times(1)).onResponseContent(any(ContentListener.class));
73+
74+
}
75+
6076
@Test
6177
public void testPerformDefaultHttpRequest() {
6278
try {
@@ -74,6 +90,21 @@ public void testPerformDefaultHttpRequest() {
7490
}
7591
}
7692

93+
@Test
94+
public void testPerformDefaultHttpRequestWithException() {
95+
try {
96+
when(httpClient.GET(anyString())).thenThrow(Exception.class);
97+
} catch (InterruptedException | ExecutionException | TimeoutException e) {
98+
fail();
99+
}
100+
sut.performDefaultHttpRequest("localhost", 8443, "/some/path");
101+
try {
102+
verify(httpClient, times(1)).GET(anyString());
103+
} catch (InterruptedException | ExecutionException | TimeoutException e) {
104+
fail();
105+
}
106+
}
107+
77108
@Test
78109
public void testPerformHttpRequestReceivePush() {
79110
try {

server-glassfish/src/test/java/de/holisticon/servlet4demo/serverglassfish/Http2JsonServletTest.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,7 @@ public void testDoGet() {
4545
verify(response, times(1)).getWriter();
4646
assertEquals("{\"id\":39,\"content\":\"Hello, push!\"}", stringWriter.toString());
4747

48-
} catch (ServletException e) {
49-
fail();
50-
} catch (IOException e) {
48+
} catch (ServletException | IOException e) {
5149
fail();
5250
}
5351
}

server-glassfish/src/test/java/de/holisticon/servlet4demo/serverglassfish/Http2ServletTest.java

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
11
package de.holisticon.servlet4demo.serverglassfish;
22

3-
import org.junit.Before;
4-
import org.junit.Test;
3+
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.fail;
5+
import static org.mockito.Mockito.anyString;
6+
import static org.mockito.Mockito.mock;
7+
import static org.mockito.Mockito.times;
8+
import static org.mockito.Mockito.verify;
9+
import static org.mockito.Mockito.when;
10+
11+
import java.io.IOException;
12+
import java.io.PrintWriter;
13+
import java.io.StringWriter;
514

615
import javax.servlet.ServletException;
716
import javax.servlet.http.HttpServletRequest;
817
import javax.servlet.http.HttpServletResponse;
918
import javax.servlet.http.PushBuilder;
10-
import java.io.IOException;
11-
import java.io.PrintWriter;
12-
import java.io.StringWriter;
1319

14-
import static org.junit.Assert.assertEquals;
15-
import static org.junit.Assert.fail;
16-
import static org.mockito.Mockito.*;
20+
import org.junit.Before;
21+
import org.junit.Test;
1722

1823
public class Http2ServletTest {
1924

@@ -51,19 +56,18 @@ public void testDoGet() {
5156
verify(response, times(1)).setContentType("text/html;charset=UTF-8");
5257
verify(response, times(1)).getWriter();
5358
assertEquals("<html>" +
54-
"<img src='images/cat.jpg'>" +
55-
"<p>Image by <a href=\"https://flic.kr/p/HPf9R1\">" +
56-
"Andy Miccone</a></p>" +
57-
"<p>License: <a href=\"https://creativecommons.org/" +
58-
"publicdomain/zero/1.0/\">" +
59-
"CC0 1.0 Universal (CC0 1.0) \n" +
60-
"Public Domain Dedication</a></p>" +
61-
"</html>", stringWriter.toString());
59+
"<img src='images/cat.jpg'>" +
60+
"<p>Image by <a href=\"https://flic.kr/p/HPf9R1\">" +
61+
"Andy Miccone</a></p>" +
62+
"<p>License: <a href=\"https://creativecommons.org/" +
63+
"publicdomain/zero/1.0/\">" +
64+
"CC0 1.0 Universal (CC0 1.0) \n" +
65+
"Public Domain Dedication</a></p>" +
66+
"</html>", stringWriter.toString());
6267
verify(pushBuilder, times(2)).push();
63-
} catch (ServletException e) {
64-
fail();
65-
} catch (IOException e) {
68+
} catch (ServletException | IOException e) {
6669
fail();
70+
6771
}
6872
}
6973
}

0 commit comments

Comments
 (0)