This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push:
new a8ee40428f TODO-351 B-restserver-4: standardize debug enablement vocab
on always/never/conditional (drop true/false aliases; 10.0 breaking-change
window); harden embedded-HttpServer client-classic coverage tests against -T1C
parallel starvation (explicit executor)
a8ee40428f is described below
commit a8ee40428f42e51de1d62cabe01b9d77261c2cc0
Author: James Bognar <[email protected]>
AuthorDate: Wed Aug 12 15:50:33 2026 -0400
TODO-351 B-restserver-4: standardize debug enablement vocab on
always/never/conditional (drop true/false aliases; 10.0 breaking-change
window); harden embedded-HttpServer client-classic coverage tests against -T1C
parallel starvation (explicit executor)
---
.../org/apache/juneau/marshall/Enablement.java | 2 --
.../rest/server/AbstractRestBuilder_Test.java | 2 +-
.../RestOpContext_OpLevelOverrides_Test.java | 4 ++--
.../rest/server/debug/DebugEnablement_Test.java | 27 ++++++++++++++++++++++
.../client/classic/RemoteProxyParity_Test.java | 8 +++++++
.../classic/RemoteProxyThrowOnError_Test.java | 8 +++++++
.../classic/ResponseContent_As_Coverage_Test.java | 8 +++++++
.../classic/ResponseContent_Coverage_Test.java | 8 +++++++
.../classic/ResponseContent_Cursor_Test.java | 8 +++++++
.../rest/client/classic/ResponseHeader_Test.java | 8 +++++++
.../client/classic/ResponseStatusLine_Test.java | 8 +++++++
.../classic/RestClient_Builder_Coverage_Test.java | 8 +++++++
.../client/classic/RestClient_Coverage2_Test.java | 8 +++++++
.../classic/RestClient_FormPost_Coverage_Test.java | 8 +++++++
.../RestClient_RedirectCredentials_Test.java | 11 +++++++++
.../RestRequest_ArgExpansion_Coverage_Test.java | 8 +++++++
.../classic/RestRequest_Rethrow_Coverage_Test.java | 8 +++++++
.../RestRequest_SessionOptions_Coverage_Test.java | 8 +++++++
...RestRequest_StreamBodyEntity_Coverage_Test.java | 8 +++++++
.../FluentResponseBodyAssertion_Test.java | 8 +++++++
.../java/org/apache/juneau/rest/server/Debug.java | 4 ++--
.../org/apache/juneau/rest/server/RestContext.java | 6 ++---
22 files changed, 166 insertions(+), 10 deletions(-)
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Enablement.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Enablement.java
index 147b54f90c..b230b90714 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Enablement.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/Enablement.java
@@ -45,9 +45,7 @@ public enum Enablement {
private static final Map<String,Enablement> MAP = m();
static {
- MAP.put("TRUE", ALWAYS);
MAP.put("ALWAYS", ALWAYS);
- MAP.put("FALSE", NEVER);
MAP.put("NEVER", NEVER);
MAP.put("CONDITIONAL", CONDITIONAL);
}
diff --git
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/AbstractRestBuilder_Test.java
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/AbstractRestBuilder_Test.java
index 1384aa6889..0f4a9139e5 100644
---
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/AbstractRestBuilder_Test.java
+++
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/AbstractRestBuilder_Test.java
@@ -276,7 +276,7 @@ class AbstractRestBuilder_Test extends TestBase {
}
@Test void f02_debug() {
- assertEquals("true",
b().debug("true").toRestAnnotation().debug().value());
+ assertEquals("always",
b().debug("always").toRestAnnotation().debug().value());
}
@Test void f03_observability() {
diff --git
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/RestOpContext_OpLevelOverrides_Test.java
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/RestOpContext_OpLevelOverrides_Test.java
index 2bc5ddede6..c076b5d3fe 100644
---
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/RestOpContext_OpLevelOverrides_Test.java
+++
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/RestOpContext_OpLevelOverrides_Test.java
@@ -32,7 +32,7 @@ import org.junit.jupiter.api.*;
* <li>{@link RestOpContext#getMaxInput()} — exercises the {@code
v.isPresent()} branch in
* {@code findMaxInput()}.
* <li>{@link RestOpContext#createSession} — exercises the explicit-debug
branch in
- * {@code findDebugEnablement()} via {@code @RestGet(debug="true")}.
+ * {@code findDebugEnablement()} via {@code @RestGet(debug="always")}.
* </ul>
*
* <p>These cases were not covered by {@code NoInherit_Test}, which only
exercises class-level
@@ -75,7 +75,7 @@ class RestOpContext_OpLevelOverrides_Test extends TestBase {
@Rest
public static class C {
- @RestGet(debug="true")
+ @RestGet(debug="always")
public void get() { /* intentionally empty */ }
}
diff --git
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/debug/DebugEnablement_Test.java
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/debug/DebugEnablement_Test.java
index 5572da1699..f78f3cf077 100644
---
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/debug/DebugEnablement_Test.java
+++
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/debug/DebugEnablement_Test.java
@@ -484,4 +484,31 @@ class DebugEnablement_Test extends TestBase {
var de = new TestEnablement(newBuilder());
assertNotNull(de.toString());
}
+
+
//-----------------------------------------------------------------------------------------------------------------
+ // h. Enablement.fromString — single-vocabulary pinning (TODO-351
B-restserver-4).
+
//-----------------------------------------------------------------------------------------------------------------
+
+ @Test void h01_fromString_canonicalValues_caseInsensitive() {
+ assertEquals(Enablement.ALWAYS,
Enablement.fromString("always"));
+ assertEquals(Enablement.ALWAYS,
Enablement.fromString("ALWAYS"));
+ assertEquals(Enablement.NEVER, Enablement.fromString("never"));
+ assertEquals(Enablement.NEVER, Enablement.fromString("NEVER"));
+ assertEquals(Enablement.CONDITIONAL,
Enablement.fromString("conditional"));
+ assertEquals(Enablement.CONDITIONAL,
Enablement.fromString("CONDITIONAL"));
+ }
+
+ @Test void h02_fromString_trueFalseAliases_noLongerAccepted() {
+ // The "true"/"false" aliases for ALWAYS/NEVER were removed;
only always/never/conditional remain.
+ assertNull(Enablement.fromString("true"));
+ assertNull(Enablement.fromString("TRUE"));
+ assertNull(Enablement.fromString("false"));
+ assertNull(Enablement.fromString("FALSE"));
+ }
+
+ @Test void h03_fromString_nullAndUnrecognized_returnNull() {
+ assertNull(Enablement.fromString(null));
+ assertNull(Enablement.fromString(""));
+ assertNull(Enablement.fromString("bogus"));
+ }
}
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RemoteProxyParity_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RemoteProxyParity_Test.java
index 70b54644c9..72789225bb 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RemoteProxyParity_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RemoteProxyParity_Test.java
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.net.*;
+import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import org.apache.juneau.http.*;
@@ -45,6 +46,7 @@ import com.sun.net.httpserver.*;
class RemoteProxyParity_Test {
private static HttpServer server;
+ private static ExecutorService executor;
private static int port;
// Captured request state (reset per test).
@@ -67,6 +69,10 @@ class RemoteProxyParity_Test {
static void startServer() throws IOException {
server = HttpServer.create(new InetSocketAddress(0), 0);
port = server.getAddress().getPort();
+ // Without an explicit executor, exchanges run on HttpServer's
single internal dispatch thread, which
+ // starves under -T1C reactor-level parallel test load and can
fail with "server failed to respond".
+ executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
server.createContext("/", exchange -> {
var n = ATTEMPTS.incrementAndGet();
lastMethod = exchange.getRequestMethod();
@@ -99,6 +105,8 @@ class RemoteProxyParity_Test {
static void stopServer() {
if (server != null)
server.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
@BeforeEach
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RemoteProxyThrowOnError_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RemoteProxyThrowOnError_Test.java
index 65f44fff45..dd67aaa63c 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RemoteProxyThrowOnError_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RemoteProxyThrowOnError_Test.java
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.net.*;
+import java.util.concurrent.*;
import org.apache.juneau.http.remote.*;
import org.apache.juneau.http.response.*;
@@ -48,6 +49,7 @@ import com.sun.net.httpserver.*;
class RemoteProxyThrowOnError_Test {
private static HttpServer server;
+ private static ExecutorService executor;
private static int port;
private static volatile int status = 404;
private static volatile String responseBody = "not found";
@@ -56,6 +58,10 @@ class RemoteProxyThrowOnError_Test {
static void startServer() throws IOException {
server = HttpServer.create(new InetSocketAddress(0), 0);
port = server.getAddress().getPort();
+ // Without an explicit executor, exchanges run on HttpServer's
single internal dispatch thread, which
+ // starves under -T1C reactor-level parallel test load and can
fail with "server failed to respond".
+ executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
server.createContext("/", exchange -> {
exchange.getRequestBody().readAllBytes();
var resp = responseBody.getBytes(UTF_8);
@@ -72,6 +78,8 @@ class RemoteProxyThrowOnError_Test {
static void stopServer() {
if (server != null)
server.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
@BeforeEach
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_As_Coverage_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_As_Coverage_Test.java
index de84589c73..eec873da07 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_As_Coverage_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_As_Coverage_Test.java
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.net.*;
import java.nio.charset.*;
+import java.util.concurrent.*;
import org.apache.juneau.http.classic.resource.*;
import org.apache.juneau.marshall.json.*;
@@ -40,12 +41,17 @@ import com.sun.net.httpserver.*;
class ResponseContent_As_Coverage_Test {
private static HttpServer server;
+ private static ExecutorService executor;
private static int port;
@BeforeAll
static void startServer() throws IOException {
server = HttpServer.create(new InetSocketAddress(0), 0);
port = server.getAddress().getPort();
+ // Without an explicit executor, exchanges run on HttpServer's
single internal dispatch thread, which
+ // starves under -T1C reactor-level parallel test load and can
fail with "server failed to respond".
+ executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
server.createContext("/echo", exchange -> {
exchange.getRequestBody().readAllBytes();
var body = "hello".getBytes(StandardCharsets.UTF_8);
@@ -77,6 +83,8 @@ class ResponseContent_As_Coverage_Test {
static void stopServer() {
if (server != null)
server.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
private static String url() {
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Coverage_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Coverage_Test.java
index 2c51044b21..b1406fbcb2 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Coverage_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Coverage_Test.java
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.net.*;
import java.nio.charset.*;
+import java.util.concurrent.*;
import org.apache.http.*;
import org.apache.juneau.http.classic.entity.*;
@@ -41,12 +42,17 @@ import com.sun.net.httpserver.*;
class ResponseContent_Coverage_Test {
private static HttpServer server;
+ private static ExecutorService executor;
private static int port;
@BeforeAll
static void startServer() throws IOException {
server = HttpServer.create(new InetSocketAddress(0), 0);
port = server.getAddress().getPort();
+ // Without an explicit executor, exchanges run on HttpServer's
single internal dispatch thread, which
+ // starves under -T1C reactor-level parallel test load and can
fail with "server failed to respond".
+ executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
server.createContext("/echo", exchange -> {
exchange.getRequestBody().readAllBytes();
var body = "hello".getBytes(StandardCharsets.UTF_8);
@@ -76,6 +82,8 @@ class ResponseContent_Coverage_Test {
static void stopServer() {
if (server != null)
server.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
private static String url() {
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Cursor_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Cursor_Test.java
index 23608691af..6d65cdfad1 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Cursor_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Cursor_Test.java
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.net.*;
import java.nio.charset.*;
+import java.util.concurrent.*;
import org.apache.http.*;
import org.apache.juneau.marshall.cbor.*;
@@ -48,6 +49,7 @@ class ResponseContent_Cursor_Test {
}
private static HttpServer server;
+ private static ExecutorService executor;
private static int port;
private static volatile byte[] responseBody = new byte[0];
private static volatile String responseContentType = "application/json";
@@ -57,6 +59,10 @@ class ResponseContent_Cursor_Test {
static void startServer() throws IOException {
server = HttpServer.create(new InetSocketAddress(0), 0);
port = server.getAddress().getPort();
+ // Without an explicit executor, exchanges run on HttpServer's
single internal dispatch thread, which
+ // starves under -T1C reactor-level parallel test load and can
fail with "server failed to respond".
+ executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
server.createContext("/echo", exchange -> {
exchange.getRequestBody().readAllBytes();
if (responseContentType != null)
@@ -76,6 +82,8 @@ class ResponseContent_Cursor_Test {
static void stopServer() {
if (server != null)
server.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
private static String url() {
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseHeader_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseHeader_Test.java
index 993b2fbc06..a2c41a832f 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseHeader_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseHeader_Test.java
@@ -20,6 +20,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.net.*;
+import java.util.concurrent.*;
import org.junit.jupiter.api.*;
@@ -32,12 +33,17 @@ import com.sun.net.httpserver.*;
class ResponseHeader_Test {
private static HttpServer server;
+ private static ExecutorService executor;
private static int port;
@BeforeAll
static void startServer() throws IOException {
server = HttpServer.create(new InetSocketAddress(0), 0);
port = server.getAddress().getPort();
+ // Without an explicit executor, exchanges run on HttpServer's
single internal dispatch thread, which
+ // starves under -T1C reactor-level parallel test load and can
fail with "server failed to respond".
+ executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
server.createContext("/headers", exchange -> {
var h = exchange.getResponseHeaders();
h.add("X-Bool", "true");
@@ -55,6 +61,8 @@ class ResponseHeader_Test {
static void stopServer() {
if (server != null)
server.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
@SuppressWarnings("resource") // Client/response instances are
short-lived test fixtures.
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseStatusLine_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseStatusLine_Test.java
index 2d15c8bc96..1bb496d0b7 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseStatusLine_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseStatusLine_Test.java
@@ -20,6 +20,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.net.*;
+import java.util.concurrent.*;
import org.junit.jupiter.api.*;
@@ -35,12 +36,17 @@ import com.sun.net.httpserver.*;
class ResponseStatusLine_Test {
private static HttpServer server;
+ private static ExecutorService executor;
private static int port;
@BeforeAll
static void startServer() throws IOException {
server = HttpServer.create(new InetSocketAddress(0), 0);
port = server.getAddress().getPort();
+ // Without an explicit executor, exchanges run on HttpServer's
single internal dispatch thread, which
+ // starves under -T1C reactor-level parallel test load and can
fail with "server failed to respond".
+ executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
server.createContext("/ok", exchange -> {
exchange.sendResponseHeaders(200, -1);
exchange.close();
@@ -52,6 +58,8 @@ class ResponseStatusLine_Test {
static void stopServer() {
if (server != null)
server.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
private static RestResponse response() throws Exception {
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Builder_Coverage_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Builder_Coverage_Test.java
index 7108706fcb..90eae155c9 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Builder_Coverage_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Builder_Coverage_Test.java
@@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.net.*;
import java.util.*;
+import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import org.apache.http.*;
@@ -47,6 +48,7 @@ import com.sun.net.httpserver.*;
class RestClient_Builder_Coverage_Test {
private static HttpServer server;
+ private static ExecutorService executor;
private static int port;
private static final AtomicReference<Headers> lastHeaders = new
AtomicReference<>();
private static final AtomicReference<String> lastQuery = new
AtomicReference<>();
@@ -55,6 +57,10 @@ class RestClient_Builder_Coverage_Test {
static void startServer() throws IOException {
server = HttpServer.create(new InetSocketAddress(0), 0);
port = server.getAddress().getPort();
+ // Without an explicit executor, exchanges run on HttpServer's
single internal dispatch thread, which
+ // starves under -T1C reactor-level parallel test load and can
fail with "server failed to respond".
+ executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
server.createContext("/echo", exchange -> {
lastHeaders.set(exchange.getRequestHeaders());
lastQuery.set(exchange.getRequestURI().getQuery());
@@ -69,6 +75,8 @@ class RestClient_Builder_Coverage_Test {
static void stopServer() {
if (server != null)
server.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
private static String url() {
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Coverage2_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Coverage2_Test.java
index 429213953d..0244d8a510 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Coverage2_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Coverage2_Test.java
@@ -20,6 +20,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.net.*;
+import java.util.concurrent.*;
import java.util.logging.*;
import org.apache.http.*;
@@ -48,12 +49,17 @@ import com.sun.net.httpserver.*;
class RestClient_Coverage2_Test {
private static HttpServer server;
+ private static ExecutorService executor;
private static int port;
@BeforeAll
static void startServer() throws IOException {
server = HttpServer.create(new InetSocketAddress(0), 0);
port = server.getAddress().getPort();
+ // Without an explicit executor, exchanges run on HttpServer's
single internal dispatch thread, which
+ // starves under -T1C reactor-level parallel test load and can
fail with "server failed to respond".
+ executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
server.createContext("/echo", exchange -> {
exchange.getRequestBody().readAllBytes();
exchange.sendResponseHeaders(200, -1);
@@ -66,6 +72,8 @@ class RestClient_Coverage2_Test {
static void stopServer() {
if (server != null)
server.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
private static String url() {
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_FormPost_Coverage_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_FormPost_Coverage_Test.java
index c51992e2ec..710f78c8a9 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_FormPost_Coverage_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_FormPost_Coverage_Test.java
@@ -23,6 +23,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.net.*;
import java.nio.charset.*;
+import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import java.util.function.*;
@@ -45,6 +46,7 @@ import com.sun.net.httpserver.*;
class RestClient_FormPost_Coverage_Test {
private static HttpServer server;
+ private static ExecutorService executor;
private static int port;
private static final AtomicReference<String> lastBody = new
AtomicReference<>();
private static final AtomicReference<String> lastContentType = new
AtomicReference<>();
@@ -53,6 +55,10 @@ class RestClient_FormPost_Coverage_Test {
static void startServer() throws IOException {
server = HttpServer.create(new InetSocketAddress(0), 0);
port = server.getAddress().getPort();
+ // Without an explicit executor, exchanges run on HttpServer's
single internal dispatch thread, which
+ // starves under -T1C reactor-level parallel test load and can
fail with "server failed to respond".
+ executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
server.createContext("/echo", exchange -> {
lastBody.set(new
String(exchange.getRequestBody().readAllBytes(), StandardCharsets.UTF_8));
lastContentType.set(exchange.getRequestHeaders().getFirst("Content-Type"));
@@ -66,6 +72,8 @@ class RestClient_FormPost_Coverage_Test {
static void stopServer() {
if (server != null)
server.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
private static String url() {
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_RedirectCredentials_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_RedirectCredentials_Test.java
index b9872ea88c..fb4cc6691c 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_RedirectCredentials_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_RedirectCredentials_Test.java
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.net.*;
import java.nio.charset.*;
+import java.util.concurrent.*;
import org.junit.jupiter.api.*;
@@ -38,18 +39,26 @@ class RestClient_RedirectCredentials_Test {
private static HttpServer serverA;
private static HttpServer serverB;
+ private static ExecutorService executor;
private static int portA;
private static int portB;
@BeforeAll
static void startServers() throws IOException {
+ // Without an explicit executor, exchanges run on each
HttpServer's single internal dispatch thread,
+ // which starves under -T1C reactor-level parallel test load
and can fail with "server failed to
+ // respond". One shared pool is enough since both servers only
ever field short-lived test requests.
+ executor = Executors.newCachedThreadPool();
+
serverB = HttpServer.create(new InetSocketAddress(0), 0);
portB = serverB.getAddress().getPort();
+ serverB.setExecutor(executor);
serverB.createContext("/echo-creds",
RestClient_RedirectCredentials_Test::echoCreds);
serverB.start();
serverA = HttpServer.create(new InetSocketAddress(0), 0);
portA = serverA.getAddress().getPort();
+ serverA.setExecutor(executor);
serverA.createContext("/echo-creds",
RestClient_RedirectCredentials_Test::echoCreds);
serverA.createContext("/redirect-cross", exchange ->
redirect(exchange, "http://localhost:" + portB + "/echo-creds"));
serverA.createContext("/redirect-same", exchange ->
redirect(exchange, "http://localhost:" + portA + "/echo-creds"));
@@ -62,6 +71,8 @@ class RestClient_RedirectCredentials_Test {
serverA.stop(0);
if (serverB != null)
serverB.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
private static void echoCreds(HttpExchange exchange) throws IOException
{
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_ArgExpansion_Coverage_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_ArgExpansion_Coverage_Test.java
index cc644db123..d43f8b0e76 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_ArgExpansion_Coverage_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_ArgExpansion_Coverage_Test.java
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.net.*;
import java.util.*;
+import java.util.concurrent.*;
import org.apache.http.*;
import org.apache.juneau.http.classic.header.*;
@@ -45,12 +46,17 @@ import com.sun.net.httpserver.*;
class RestRequest_ArgExpansion_Coverage_Test {
private static HttpServer server;
+ private static ExecutorService executor;
private static int port;
@BeforeAll
static void startServer() throws IOException {
server = HttpServer.create(new InetSocketAddress(0), 0);
port = server.getAddress().getPort();
+ // Without an explicit executor, exchanges run on HttpServer's
single internal dispatch thread, which
+ // starves under -T1C reactor-level parallel test load and can
fail with "server failed to respond".
+ executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
server.createContext("/echo", exchange -> {
exchange.getRequestBody().readAllBytes();
exchange.sendResponseHeaders(200, -1);
@@ -63,6 +69,8 @@ class RestRequest_ArgExpansion_Coverage_Test {
static void stopServer() {
if (server != null)
server.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
private static String url() {
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_Rethrow_Coverage_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_Rethrow_Coverage_Test.java
index 0131e88c6c..238df40486 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_Rethrow_Coverage_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_Rethrow_Coverage_Test.java
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.net.*;
import java.nio.charset.*;
+import java.util.concurrent.*;
import org.junit.jupiter.api.*;
@@ -76,12 +77,17 @@ class RestRequest_Rethrow_Coverage_Test {
}
private static HttpServer server;
+ private static ExecutorService executor;
private static int port;
@BeforeAll
static void startServer() throws IOException {
server = HttpServer.create(new InetSocketAddress(0), 0);
port = server.getAddress().getPort();
+ // Without an explicit executor, exchanges run on HttpServer's
single internal dispatch thread, which
+ // starves under -T1C reactor-level parallel test load and can
fail with "server failed to respond".
+ executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
server.createContext("/thrown", exchange -> {
var q = exchange.getRequestURI().getQuery();
exchange.getResponseHeaders().add("Thrown", q);
@@ -110,6 +116,8 @@ class RestRequest_Rethrow_Coverage_Test {
static void stopServer() {
if (server != null)
server.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
private static String url(String path) {
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_SessionOptions_Coverage_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_SessionOptions_Coverage_Test.java
index 2755a33b29..2a3b4ae915 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_SessionOptions_Coverage_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_SessionOptions_Coverage_Test.java
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.net.*;
import java.util.*;
+import java.util.concurrent.*;
import org.apache.juneau.marshall.json.*;
import org.junit.jupiter.api.*;
@@ -39,6 +40,7 @@ import com.sun.net.httpserver.*;
class RestRequest_SessionOptions_Coverage_Test {
private static HttpServer server;
+ private static ExecutorService executor;
private static int port;
private static volatile String lastHeader;
private static volatile String lastQuery;
@@ -47,6 +49,10 @@ class RestRequest_SessionOptions_Coverage_Test {
static void startServer() throws IOException {
server = HttpServer.create(new InetSocketAddress(0), 0);
port = server.getAddress().getPort();
+ // Without an explicit executor, exchanges run on HttpServer's
single internal dispatch thread, which
+ // starves under -T1C reactor-level parallel test load and can
fail with "server failed to respond".
+ executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
server.createContext("/x", exchange -> {
lastHeader =
exchange.getRequestHeaders().getFirst("x-juneau-serializer-options");
if (lastHeader == null)
@@ -62,6 +68,8 @@ class RestRequest_SessionOptions_Coverage_Test {
static void stopServer() {
if (server != null)
server.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
private static RestRequest req() throws RestCallException {
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_StreamBodyEntity_Coverage_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_StreamBodyEntity_Coverage_Test.java
index c9ec2bbafe..c9df3fe2b9 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_StreamBodyEntity_Coverage_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_StreamBodyEntity_Coverage_Test.java
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.net.*;
import java.nio.charset.*;
+import java.util.concurrent.*;
import org.apache.juneau.marshall.json.*;
import org.apache.juneau.marshall.serializer.*;
@@ -57,6 +58,7 @@ class RestRequest_StreamBodyEntity_Coverage_Test {
}
private static HttpServer server;
+ private static ExecutorService executor;
private static int port;
private static volatile byte[] lastRequestBody = new byte[0];
@@ -64,6 +66,10 @@ class RestRequest_StreamBodyEntity_Coverage_Test {
static void startServer() throws IOException {
server = HttpServer.create(new InetSocketAddress(0), 0);
port = server.getAddress().getPort();
+ // Without an explicit executor, exchanges run on HttpServer's
single internal dispatch thread, which
+ // starves under -T1C reactor-level parallel test load and can
fail with "server failed to respond".
+ executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
server.createContext("/echo", exchange -> {
lastRequestBody =
exchange.getRequestBody().readAllBytes();
exchange.sendResponseHeaders(200, -1);
@@ -76,6 +82,8 @@ class RestRequest_StreamBodyEntity_Coverage_Test {
static void stopServer() {
if (server != null)
server.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
private static String url() {
diff --git
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseBodyAssertion_Test.java
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseBodyAssertion_Test.java
index 3b06b647bc..e6e55cb022 100644
---
a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseBodyAssertion_Test.java
+++
b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseBodyAssertion_Test.java
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.lang.reflect.*;
import java.net.*;
+import java.util.concurrent.*;
import java.nio.charset.*;
import org.apache.juneau.http.classic.response.*;
@@ -45,12 +46,17 @@ import com.sun.net.httpserver.*;
class FluentResponseBodyAssertion_Test {
private static HttpServer server;
+ private static ExecutorService executor;
private static int port;
@BeforeAll
static void startServer() throws IOException {
server = HttpServer.create(new InetSocketAddress(0), 0);
port = server.getAddress().getPort();
+ // Without an explicit executor, exchanges run on HttpServer's
single internal dispatch thread, which
+ // starves under -T1C reactor-level parallel test load and can
fail with "server failed to respond".
+ executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
server.createContext("/ok", exchange -> {
var body = "hello".getBytes(StandardCharsets.UTF_8);
exchange.getResponseHeaders().add("Content-Type",
"text/plain");
@@ -77,6 +83,8 @@ class FluentResponseBodyAssertion_Test {
static void stopServer() {
if (server != null)
server.stop(0);
+ if (executor != null)
+ executor.shutdownNow();
}
private static RestResponse okResponse() throws Exception {
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/Debug.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/Debug.java
index 92418a88b3..00f1f8788a 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/Debug.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/Debug.java
@@ -35,8 +35,8 @@ public @interface Debug {
* Debug enablement policy.
*
* <ul class='values'>
- * <li><js>"always"</js> (or <js>"true"</js>)
- * <li><js>"never"</js> (or <js>"false"</js>)
+ * <li><js>"always"</js>
+ * <li><js>"never"</js>
* <li><js>"conditional"</js>
* <li><js>""</js> (inherit)
* </ul>
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestContext.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestContext.java
index 28ac7a3943..a3a74d4d52 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestContext.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestContext.java
@@ -1526,7 +1526,7 @@ public class RestContext extends Context {
public DebugResult resolve(RestContext context,
HttpServletRequest req) {
var enabled = isTrue(cast(Boolean.class,
req.getAttribute("Debug")));
if (!enabled) {
- if ("always".equalsIgnoreCase(mode2) ||
"true".equalsIgnoreCase(mode2))
+ if ("always".equalsIgnoreCase(mode2))
enabled = true;
else if
("conditional".equalsIgnoreCase(mode2))
enabled =
"true".equalsIgnoreCase(req.getHeader("Debug"));
@@ -1541,9 +1541,9 @@ public class RestContext extends Context {
if (opDebug.isPresent()) {
var v =
RestContext.this.resolve(opDebug.get().inner().debug().value());
if (StringUtils.isNotBlank(v)) {
- if
("always".equalsIgnoreCase(v) || "true".equalsIgnoreCase(v))
+ if
("always".equalsIgnoreCase(v))
return new
DebugResult(true, format, level, true);
- if ("never".equalsIgnoreCase(v)
|| "false".equalsIgnoreCase(v))
+ if ("never".equalsIgnoreCase(v))
return new
DebugResult(false, format, level, false);
if
("conditional".equalsIgnoreCase(v))
return new
DebugResult("true".equalsIgnoreCase(req.getHeader("Debug")), format, level,
true);