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);

Reply via email to