Skip to content

Commit 894547d

Browse files
author
Julia Boes
committed
8266897: com/sun/net/httpserver/FilterTest.java fails intermittently with AssertionError
Reviewed-by: chegar, dfuchs, michaelm
1 parent da7c846 commit 894547d

File tree

3 files changed

+27
-28
lines changed

3 files changed

+27
-28
lines changed

src/jdk.httpserver/share/classes/sun/net/httpserver/HttpContextImpl.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -24,11 +24,11 @@
2424
*/
2525

2626
package sun.net.httpserver;
27-
import java.io.*;
2827
import java.util.*;
2928
import java.lang.System.Logger;
29+
import java.util.concurrent.ConcurrentHashMap;
30+
import java.util.concurrent.CopyOnWriteArrayList;
3031
import com.sun.net.httpserver.*;
31-
import com.sun.net.httpserver.spi.*;
3232

3333
/**
3434
* HttpContext represents a mapping between a protocol (http or https) together with a root URI path
@@ -40,17 +40,17 @@
4040
*/
4141
class HttpContextImpl extends HttpContext {
4242

43-
private String path;
44-
private String protocol;
45-
private HttpHandler handler;
46-
private Map<String,Object> attributes = new HashMap<String,Object>();
47-
private ServerImpl server;
43+
private final String path;
44+
private final String protocol;
45+
private final ServerImpl server;
46+
private final AuthFilter authfilter;
47+
private final Map<String,Object> attributes = new ConcurrentHashMap<>();
4848
/* system filters, not visible to applications */
49-
private LinkedList<Filter> sfilters = new LinkedList<Filter>();
49+
private final List<Filter> sfilters = new CopyOnWriteArrayList<>();
5050
/* user filters, set by applications */
51-
private LinkedList<Filter> ufilters = new LinkedList<Filter>();
51+
private final List<Filter> ufilters = new CopyOnWriteArrayList<>();
5252
private Authenticator authenticator;
53-
private AuthFilter authfilter;
53+
private HttpHandler handler;
5454

5555
/**
5656
* constructor is package private.

src/jdk.httpserver/share/classes/sun/net/httpserver/ServerImpl.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -654,11 +654,11 @@ public void run () {
654654
* They are linked together by a LinkHandler
655655
* so that they can both be invoked in one call.
656656
*/
657-
List<Filter> sf = ctx.getSystemFilters();
658-
List<Filter> uf = ctx.getFilters();
657+
final List<Filter> sf = ctx.getSystemFilters();
658+
final List<Filter> uf = ctx.getFilters();
659659

660-
Filter.Chain sc = new Filter.Chain(sf, ctx.getHandler());
661-
Filter.Chain uc = new Filter.Chain(uf, new LinkHandler (sc));
660+
final Filter.Chain sc = new Filter.Chain(sf, ctx.getHandler());
661+
final Filter.Chain uc = new Filter.Chain(uf, new LinkHandler (sc));
662662

663663
/* set up the two stream references */
664664
tx.getRequestBody();

test/jdk/com/sun/net/httpserver/FilterTest.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@
3838
import java.net.http.HttpRequest;
3939
import java.net.http.HttpResponse;
4040
import java.nio.charset.StandardCharsets;
41-
import java.util.concurrent.atomic.AtomicInteger;
42-
import java.util.concurrent.atomic.AtomicReference;
41+
import java.util.concurrent.CompletableFuture;
4342
import java.util.logging.ConsoleHandler;
4443
import java.util.logging.Level;
4544
import java.util.logging.Logger;
@@ -165,9 +164,9 @@ public void testBeforeHandlerSendResponse() throws Exception {
165164
@Test
166165
public void testAfterHandler() throws Exception {
167166
var handler = new EchoHandler();
168-
var respCode = new AtomicInteger();
167+
var respCode = new CompletableFuture<Integer>();
169168
var filter = Filter.afterHandler("Log response code",
170-
e -> respCode.set(e.getResponseCode()));
169+
e -> respCode.complete(e.getResponseCode()));
171170
var server = HttpServer.create(new InetSocketAddress(LOOPBACK_ADDR, 0), 10);
172171
server.createContext("/", handler).getFilters().add(filter);
173172
server.start();
@@ -176,7 +175,7 @@ public void testAfterHandler() throws Exception {
176175
var request = HttpRequest.newBuilder(uri(server, "")).build();
177176
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
178177
assertEquals(response.statusCode(), 200);
179-
assertEquals(response.statusCode(), respCode.get());
178+
assertEquals(response.statusCode(), (int)respCode.get());
180179
} finally {
181180
server.stop(0);
182181
}
@@ -185,12 +184,12 @@ public void testAfterHandler() throws Exception {
185184
@Test
186185
public void testAfterHandlerRepeated() throws Exception {
187186
var handler = new EchoHandler();
188-
var attr = new AtomicReference<String>();
187+
var attr = new CompletableFuture<String>();
189188
final var value = "some value";
190189
var filter1 = Filter.afterHandler("Set attribute",
191190
e -> e.setAttribute("test-attr", value));
192191
var filter2 = Filter.afterHandler("Read attribute",
193-
e -> attr.set((String) e.getAttribute("test-attr")));
192+
e -> attr.complete((String) e.getAttribute("test-attr")));
194193
var server = HttpServer.create(new InetSocketAddress(LOOPBACK_ADDR, 0), 10);
195194
var context = server.createContext("/", handler);
196195
context.getFilters().add(filter2);
@@ -210,7 +209,7 @@ public void testAfterHandlerRepeated() throws Exception {
210209
@Test
211210
public void testAfterHandlerSendResponse() throws Exception {
212211
var handler = new NoResponseHandler();
213-
var respCode = new AtomicInteger();
212+
var respCode = new CompletableFuture<Integer>();
214213
var filter = Filter.afterHandler("Log response code and send response",
215214
e -> {
216215
try (InputStream is = e.getRequestBody();
@@ -219,7 +218,7 @@ public void testAfterHandlerSendResponse() throws Exception {
219218
var resp = "hello world".getBytes(StandardCharsets.UTF_8);
220219
e.sendResponseHeaders(200, resp.length);
221220
os.write(resp);
222-
respCode.set(e.getResponseCode());
221+
respCode.complete(e.getResponseCode());
223222
} catch (IOException ioe) {
224223
ioe.printStackTrace(System.out);
225224
throw new UncheckedIOException(ioe);
@@ -233,7 +232,7 @@ public void testAfterHandlerSendResponse() throws Exception {
233232
var request = HttpRequest.newBuilder(uri(server, "")).build();
234233
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
235234
assertEquals(response.statusCode(), 200);
236-
assertEquals(response.statusCode(), respCode.get());
235+
assertEquals(response.statusCode(), (int)respCode.get());
237236
} finally {
238237
server.stop(0);
239238
}
@@ -242,11 +241,11 @@ public void testAfterHandlerSendResponse() throws Exception {
242241
@Test
243242
public void testBeforeAndAfterHandler() throws Exception {
244243
var handler = new EchoHandler();
245-
var respCode = new AtomicInteger();
244+
var respCode = new CompletableFuture<Integer>();
246245
var beforeFilter = Filter.beforeHandler("Add x-foo response header",
247246
e -> e.getResponseHeaders().set("x-foo", "bar"));
248247
var afterFilter = Filter.afterHandler("Log response code",
249-
e -> respCode.set(e.getResponseCode()));
248+
e -> respCode.complete(e.getResponseCode()));
250249
var server = HttpServer.create(new InetSocketAddress(LOOPBACK_ADDR, 0), 10);
251250
var context = server.createContext("/", handler);
252251
context.getFilters().add(beforeFilter);
@@ -257,9 +256,9 @@ public void testBeforeAndAfterHandler() throws Exception {
257256
var request = HttpRequest.newBuilder(uri(server, "")).build();
258257
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
259258
assertEquals(response.statusCode(), 200);
260-
assertEquals(response.statusCode(), respCode.get());
261259
assertEquals(response.headers().map().size(), 3);
262260
assertEquals(response.headers().firstValue("x-foo").orElseThrow(), "bar");
261+
assertEquals(response.statusCode(), (int)respCode.get());
263262
} finally {
264263
server.stop(0);
265264
}

0 commit comments

Comments
 (0)