You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2019/06/18 14:50:12 UTC
[sling-whiteboard] 06/06: Add a set of positive tests
This is an automated email from the ASF dual-hosted git repository.
rombert pushed a commit to branch feature/test-improvements
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git
commit 6d639af5e0c98a66c84b2eb95f3a3a2911ec0528
Author: Robert Munteanu <ro...@apache.org>
AuthorDate: Tue Jun 18 16:48:00 2019 +0200
Add a set of positive tests
Validate that requests go through as expected if the server-side delay is small.
---
.../java/org/apache/sling/uca/impl/AgentIT.java | 30 ++++++++++++++---
.../sling/uca/impl/MisbehavingServerControl.java | 14 ++++++++
.../sling/uca/impl/MisbehavingServerExtension.java | 39 ++++++++++++----------
3 files changed, 61 insertions(+), 22 deletions(-)
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/AgentIT.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/AgentIT.java
index 17638d7..d67a67d 100644
--- a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/AgentIT.java
+++ b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/AgentIT.java
@@ -44,6 +44,7 @@ import org.apache.sling.uca.impl.HttpClientLauncher.ClientType;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.EnumSource;
import org.junit.jupiter.params.provider.MethodSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -127,7 +128,7 @@ public class AgentIT {
ErrorDescriptor ed = requireNonNull(errorDescriptors.get(clientType), "Unhandled clientType " + clientType);
RecordedThrowable error = assertTimeout(ofSeconds(EXECUTION_TIMEOUT_SECONDS),
- () -> runTest("http://repo1.maven.org:81", clientType, timeouts));
+ () -> runTest("http://repo1.maven.org:81", clientType, timeouts, false));
assertEquals(ed.connectTimeoutClass.getName(), error.className);
assertTrue(error.message.matches(ed.connectTimeoutMessageRegex),
@@ -138,20 +139,32 @@ public class AgentIT {
* Validates that connecting to a host that delays the response fails with a read timeout
*
* @throws IOException various I/O problems
+ * @throws InterruptedException
*/
@ParameterizedTest
@MethodSource("argumentsMatrix")
- public void readTimeout(ClientType clientType, TestTimeouts timeouts, MisbehavingServerControl server) throws IOException {
+ public void readTimeout(ClientType clientType, TestTimeouts timeouts, MisbehavingServerControl server) throws IOException, InterruptedException {
ErrorDescriptor ed = requireNonNull(errorDescriptors.get(clientType), "Unhandled clientType " + clientType);
RecordedThrowable error = assertTimeout(ofSeconds(EXECUTION_TIMEOUT_SECONDS),
- () -> runTest("http://localhost:" + server.getLocalPort(), clientType, timeouts));
-
+ () -> runTest("http://localhost:" + server.getLocalPort(), clientType, timeouts, false));
+
assertEquals(SocketTimeoutException.class.getName(), error.className);
assertEquals(ed.readTimeoutMessage, error.message);
}
+
+ @ParameterizedTest
+ @EnumSource(HttpClientLauncher.ClientType.class)
+ public void connectAndReadSuccess(ClientType clientType, MisbehavingServerControl server) throws IOException, InterruptedException {
+
+ // set a small accept delay for the server so the requests have time to complete
+ server.setHandleDelay(Duration.ofMillis(100));
+
+ assertTimeout(ofSeconds(EXECUTION_TIMEOUT_SECONDS),
+ () ->runTest("http://localhost:" + server.getLocalPort(), clientType, TestTimeouts.DEFAULT, true));
+ }
- private RecordedThrowable runTest(String urlSpec, ClientType clientType, TestTimeouts timeouts) throws IOException, InterruptedException {
+ private RecordedThrowable runTest(String urlSpec, ClientType clientType, TestTimeouts timeouts, boolean expectSuccess) throws IOException, InterruptedException {
Process process = new AgentLauncher(new URL(urlSpec), timeouts, clientType, STDOUT, STDERR).launch();
boolean done = process.waitFor(timeouts.executionTimeout.toMillis(), TimeUnit.MILLISECONDS);
@@ -173,6 +186,13 @@ public class AgentIT {
int exitCode = process.exitValue();
LOG.info("Exited with code {}", exitCode);
+ if ( expectSuccess ) {
+ if ( exitCode != 0 )
+ throw new RuntimeException("Expected success, but command exited with code " + exitCode);
+
+ return null;
+ }
+
if ( exitCode == 0 ) {
throw new RuntimeException("Command terminated successfully. That is unexpected.");
} else {
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/MisbehavingServerControl.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/MisbehavingServerControl.java
index 9b0bf93..0161006 100644
--- a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/MisbehavingServerControl.java
+++ b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/MisbehavingServerControl.java
@@ -16,6 +16,8 @@
*/
package org.apache.sling.uca.impl;
+import java.time.Duration;
+
/**
* Allows control of a local server
*
@@ -28,4 +30,16 @@ public interface MisbehavingServerControl {
* @return the port
*/
int getLocalPort();
+
+ /**
+ * Sets a new value for the handleDelay parameter
+ *
+ * <p>This value reflects how long the HTTP handler will wait before handling the client request.</p>
+ *
+ * <p>The value only takes effect for the current test method invocation and will be reset
+ * for the next one.</p>
+ *
+ * @param handleDelay the new duration
+ */
+ void setHandleDelay(Duration handleDelay);
}
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/MisbehavingServerExtension.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/MisbehavingServerExtension.java
index b659451..f5bfe1f 100644
--- a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/MisbehavingServerExtension.java
+++ b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/MisbehavingServerExtension.java
@@ -17,13 +17,12 @@
package org.apache.sling.uca.impl;
import java.io.IOException;
-import java.util.concurrent.TimeUnit;
+import java.time.Duration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
@@ -46,6 +45,8 @@ import org.slf4j.LoggerFactory;
*/
class MisbehavingServerExtension implements BeforeEachCallback, AfterEachCallback, ParameterResolver, MisbehavingServerControl {
+ private static final Duration DEFAULT_HANDLE_DELAY = Duration.ofSeconds(10);
+
private final Logger logger = LoggerFactory.getLogger(getClass());
public int getLocalPort() {
@@ -54,6 +55,8 @@ class MisbehavingServerExtension implements BeforeEachCallback, AfterEachCallbac
private Server server;
+ private Duration handleDelay = DEFAULT_HANDLE_DELAY;
+
@Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
throws ParameterResolutionException {
@@ -72,31 +75,28 @@ class MisbehavingServerExtension implements BeforeEachCallback, AfterEachCallbac
@Override
public void beforeEach(ExtensionContext context) throws Exception {
- server = new Server();
- ServerConnector connector = new ServerConnector(server) {
+ // reset the delay before each execution to make test logic simpler
+ handleDelay = DEFAULT_HANDLE_DELAY;
+
+ server = new Server(0);
+ server.setHandler(new AbstractHandler() {
+
@Override
- public void accept(int acceptorID) throws IOException {
- LOG.info("Waiting before accepting");
+ public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
+ throws IOException, ServletException {
+ logger.info("Waiting for " + handleDelay + " before handling");
try {
- Thread.sleep(TimeUnit.SECONDS.toMillis(10));
+ Thread.sleep(handleDelay.toMillis());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
- super.accept(acceptorID);
- LOG.info("Accepted");
- }
- };
- server.setConnectors(new Connector[] { connector });
- server.setHandler(new AbstractHandler() {
-
- @Override
- public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
+
response.setStatus(HttpServletResponse.SC_NO_CONTENT);
if ( baseRequest.getHeader("User-Agent") != null )
response.addHeader("Original-User-Agent", baseRequest.getHeader("User-Agent"));
baseRequest.setHandled(true);
+ logger.info("Handled");
}
});
@@ -113,4 +113,9 @@ class MisbehavingServerExtension implements BeforeEachCallback, AfterEachCallbac
logger.info("Failed shutting down server", e);
}
}
+
+ @Override
+ public void setHandleDelay(Duration handleDelay) {
+ this.handleDelay = handleDelay;
+ }
}
\ No newline at end of file