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 15:09:05 UTC
[sling-whiteboard] 05/07: Move classes and methods out of AgentIT
to make it simpler to understand
This is an automated email from the ASF dual-hosted git repository.
rombert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git
commit a7f5d7fbd307ed8d5d89329331bac4737aaedeb0
Author: Robert Munteanu <ro...@apache.org>
AuthorDate: Tue Jun 18 16:06:57 2019 +0200
Move classes and methods out of AgentIT to make it simpler to understand
---
.../java/org/apache/sling/uca/impl/AgentIT.java | 156 +--------------------
.../org/apache/sling/uca/impl/AgentLauncher.java | 107 ++++++++++++++
.../org/apache/sling/uca/impl/ErrorDescriptor.java | 37 +++++
.../apache/sling/uca/impl/HttpClientLauncher.java | 2 +-
.../apache/sling/uca/impl/RecordedThrowable.java | 40 ++++++
.../org/apache/sling/uca/impl/TestTimeouts.java | 64 +++++++++
6 files changed, 255 insertions(+), 151 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 f42dfb4..17638d7 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
@@ -26,9 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTimeout;
import static org.junit.jupiter.api.Assertions.assertTrue;
-import java.io.File;
import java.io.IOException;
-import java.lang.ProcessBuilder.Redirect;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.nio.file.Files;
@@ -36,13 +34,9 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Duration;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.EnumMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.apache.commons.httpclient.ConnectTimeoutException;
@@ -67,11 +61,11 @@ import org.slf4j.LoggerFactory;
@ExtendWith(MisbehavingServerExtension.class)
public class AgentIT {
- private static final int EXECUTION_TIMEOUT_SECONDS = 5;
- private static final int CONNECT_TIMEOUT_SECONDS = 3;
- private static final int READ_TIMEOUT_SECONDS = 3;
+ static final int EXECUTION_TIMEOUT_SECONDS = 5;
+ static final int CONNECT_TIMEOUT_SECONDS = 3;
+ static final int READ_TIMEOUT_SECONDS = 3;
- private static final String EXCEPTION_MARKER = "Exception in thread \"main\" ";
+ static final String EXCEPTION_MARKER = "Exception in thread \"main\" ";
private static final Path STDERR = Paths.get("target", "stderr.txt");
private static final Path STDOUT = Paths.get("target", "stdout.txt");
private static final Logger LOG = LoggerFactory.getLogger(AgentIT.class);
@@ -159,7 +153,7 @@ public class AgentIT {
private RecordedThrowable runTest(String urlSpec, ClientType clientType, TestTimeouts timeouts) throws IOException, InterruptedException {
- Process process = runForkedCommandWithAgent(new URL(urlSpec), timeouts, clientType);
+ Process process = new AgentLauncher(new URL(urlSpec), timeouts, clientType, STDOUT, STDERR).launch();
boolean done = process.waitFor(timeouts.executionTimeout.toMillis(), TimeUnit.MILLISECONDS);
LOG.info("Dump of stdout: ");
@@ -184,147 +178,9 @@ public class AgentIT {
} else {
return Files.lines(STDERR)
.filter( l -> l.startsWith(EXCEPTION_MARKER))
- .map( l -> newRecordedThrowable(l) )
+ .map( RecordedThrowable::fromLine )
.findFirst()
.orElseThrow(() -> new RuntimeException("Exit code was not zero ( " + exitCode + " ) but did not find any exception information in stderr.txt"));
}
}
-
- private Process runForkedCommandWithAgent(URL url, TestTimeouts timeouts, ClientType clientType) throws IOException {
-
- Path jar = Files.list(Paths.get("target"))
- .filter( p -> p.getFileName().toString().endsWith("-jar-with-dependencies.jar"))
- .findFirst()
- .orElseThrow( () -> new IllegalStateException("Did not find the agent jar. Did you run mvn package first?"));
-
- String classPath = buildClassPath();
-
- String javaHome = System.getProperty("java.home");
- Path javaExe = Paths.get(javaHome, "bin", "java");
- ProcessBuilder pb = new ProcessBuilder(
- javaExe.toString(),
- "-showversion",
- "-javaagent:" + jar +"=" + timeouts.agentConnectTimeout.toMillis() +"," + timeouts.agentReadTimeout.toMillis()+",v",
- "-cp",
- classPath,
- HttpClientLauncher.class.getName(),
- url.toString(),
- clientType.toString(),
- String.valueOf(timeouts.clientConnectTimeout.toMillis()),
- String.valueOf(timeouts.clientReadTimeout.toMillis())
- );
-
- pb.redirectInput(Redirect.INHERIT);
- pb.redirectOutput(STDOUT.toFile());
- pb.redirectError(STDERR.toFile());
-
- return pb.start();
- }
-
- private String buildClassPath() throws IOException {
-
- List<String> elements = new ArrayList<>();
- elements.add(Paths.get("target", "test-classes").toString());
-
- Set<String> dependencies = new HashSet<>(Arrays.asList(new String[] {
- "commons-httpclient.jar",
- "commons-codec.jar",
- "slf4j-simple.jar",
- "slf4j-api.jar",
- "jcl-over-slf4j.jar",
- "httpclient.jar",
- "httpcore.jar",
- "okhttp.jar",
- "okio.jar"
- }));
-
- Files.list(Paths.get("target", "it-dependencies"))
- .filter( p -> dependencies.contains(p.getFileName().toString()) )
- .forEach( p -> elements.add(p.toString()));
-
- return String.join(File.pathSeparator, elements);
- }
-
- private RecordedThrowable newRecordedThrowable(String line) {
-
- line = line.replace(EXCEPTION_MARKER, "");
-
- String className = line.substring(0, line.indexOf(':'));
- String message = line.substring(line.indexOf(':') + 2); // ignore ':' and leading ' '
-
- return new RecordedThrowable(className, message);
- }
-
- /**
- * Data class for defining specific error messages related to individual {@link ClientType client types}.
- */
- static class ErrorDescriptor {
- private Class<? extends IOException> connectTimeoutClass;
- private String connectTimeoutMessageRegex;
- private String readTimeoutMessage;
-
- public ErrorDescriptor(Class<? extends IOException> connectTimeoutClass, String connectTimeoutMessageRegex,
- String readTimeoutMessage) {
- this.connectTimeoutClass = connectTimeoutClass;
- this.connectTimeoutMessageRegex = connectTimeoutMessageRegex;
- this.readTimeoutMessage = readTimeoutMessage;
- }
- }
-
- /**
- * Basic information about a {@link Throwable} that was recorded in a file
- */
- static class RecordedThrowable {
- String className;
- String message;
-
- public RecordedThrowable(String className, String message) {
- this.className = className;
- this.message = message;
- }
- }
-
- /**
- * Data class for holding information about various timeouts set in the tests
- */
- static class TestTimeouts {
-
- private Duration executionTimeout = Duration.ofSeconds(EXECUTION_TIMEOUT_SECONDS);
- private Duration agentConnectTimeout = Duration.ofSeconds(CONNECT_TIMEOUT_SECONDS);
- private Duration agentReadTimeout = Duration.ofSeconds(READ_TIMEOUT_SECONDS);
- private Duration clientConnectTimeout = Duration.ZERO;
- private Duration clientReadTimeout = Duration.ZERO;
-
- public static TestTimeouts DEFAULT = new TestTimeouts();
-
- static class Builder {
- private TestTimeouts timeouts = new TestTimeouts();
-
- public Builder executionTimeout(Duration duration) {
- timeouts.executionTimeout = Objects.requireNonNull(duration);
- return this;
- }
-
- public Builder agentTimeouts(Duration connectTimeout, Duration readTimeout) {
- timeouts.agentConnectTimeout = Objects.requireNonNull(connectTimeout);
- timeouts.agentReadTimeout = Objects.requireNonNull(readTimeout);
- return this;
- }
-
- public Builder clientTimeouts(Duration connectTimeout, Duration readTimeout) {
- timeouts.clientConnectTimeout = Objects.requireNonNull(connectTimeout);
- timeouts.clientReadTimeout = Objects.requireNonNull(readTimeout);
- return this;
- }
-
- public TestTimeouts build() {
- return timeouts;
- }
- }
-
- @Override
- public String toString() {
- return getClass().getSimpleName() + ": execution " + executionTimeout + ", agent: " + agentConnectTimeout + "/" + agentReadTimeout + ", client : " + clientConnectTimeout + "/" + clientReadTimeout;
- }
- }
}
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/AgentLauncher.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/AgentLauncher.java
new file mode 100644
index 0000000..93a006b
--- /dev/null
+++ b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/AgentLauncher.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.uca.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.ProcessBuilder.Redirect;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.sling.uca.impl.HttpClientLauncher.ClientType;
+
+/**
+ * Launches the {@link HttpClientLauncher} as a separate process with the timeout agent enabled
+ *
+ */
+class AgentLauncher {
+ private final URL url;
+ private final TestTimeouts timeouts;
+ private final ClientType clientType;
+ private Path stdout;
+ private Path stderr;
+
+ public AgentLauncher(URL url, TestTimeouts timeouts, ClientType clientType, Path stdout, Path stderr) {
+ this.url = url;
+ this.timeouts = timeouts;
+ this.clientType = clientType;
+ this.stdout = stdout;
+ this.stderr = stderr;
+ }
+
+ public Process launch() throws IOException {
+
+ Path jar = Files.list(Paths.get("target"))
+ .filter( p -> p.getFileName().toString().endsWith("-jar-with-dependencies.jar"))
+ .findFirst()
+ .orElseThrow( () -> new IllegalStateException("Did not find the agent jar. Did you run mvn package first?"));
+
+ String classPath = buildClassPath();
+
+ String javaHome = System.getProperty("java.home");
+ Path javaExe = Paths.get(javaHome, "bin", "java");
+ ProcessBuilder pb = new ProcessBuilder(
+ javaExe.toString(),
+ "-showversion",
+ "-javaagent:" + jar +"=" + timeouts.agentConnectTimeout.toMillis() +"," + timeouts.agentReadTimeout.toMillis()+",v",
+ "-cp",
+ classPath,
+ HttpClientLauncher.class.getName(),
+ url.toString(),
+ clientType.toString(),
+ String.valueOf(timeouts.clientConnectTimeout.toMillis()),
+ String.valueOf(timeouts.clientReadTimeout.toMillis())
+ );
+
+ pb.redirectInput(Redirect.INHERIT);
+ pb.redirectOutput(stdout.toFile());
+ pb.redirectError(stderr.toFile());
+
+ return pb.start();
+ }
+
+ private String buildClassPath() throws IOException {
+
+ List<String> elements = new ArrayList<>();
+ elements.add(Paths.get("target", "test-classes").toString());
+
+ Set<String> dependencies = new HashSet<>(Arrays.asList(new String[] {
+ "commons-httpclient.jar",
+ "commons-codec.jar",
+ "slf4j-simple.jar",
+ "slf4j-api.jar",
+ "jcl-over-slf4j.jar",
+ "httpclient.jar",
+ "httpcore.jar",
+ "okhttp.jar",
+ "okio.jar"
+ }));
+
+ Files.list(Paths.get("target", "it-dependencies"))
+ .filter( p -> dependencies.contains(p.getFileName().toString()) )
+ .forEach( p -> elements.add(p.toString()));
+
+ return String.join(File.pathSeparator, elements);
+ }
+}
\ No newline at end of file
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/ErrorDescriptor.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/ErrorDescriptor.java
new file mode 100644
index 0000000..840ea05
--- /dev/null
+++ b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/ErrorDescriptor.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.uca.impl;
+
+import java.io.IOException;
+
+import org.apache.sling.uca.impl.HttpClientLauncher.ClientType;
+
+/**
+ * Data class for defining specific error messages related to individual {@link ClientType client types}.
+ */
+class ErrorDescriptor {
+ Class<? extends IOException> connectTimeoutClass;
+ String connectTimeoutMessageRegex;
+ String readTimeoutMessage;
+
+ public ErrorDescriptor(Class<? extends IOException> connectTimeoutClass, String connectTimeoutMessageRegex,
+ String readTimeoutMessage) {
+ this.connectTimeoutClass = connectTimeoutClass;
+ this.connectTimeoutMessageRegex = connectTimeoutMessageRegex;
+ this.readTimeoutMessage = readTimeoutMessage;
+ }
+}
\ No newline at end of file
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/HttpClientLauncher.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/HttpClientLauncher.java
index f24b5b5..d2408de 100644
--- a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/HttpClientLauncher.java
+++ b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/HttpClientLauncher.java
@@ -82,7 +82,7 @@ public class HttpClientLauncher {
}
/**
- * A <tt>Consumer</tt> that allows throwing checked exceptions.</p>
+ * Thin wrapper for various http client abstractions
*
*/
@FunctionalInterface
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/RecordedThrowable.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/RecordedThrowable.java
new file mode 100644
index 0000000..63ba806
--- /dev/null
+++ b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/RecordedThrowable.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.uca.impl;
+
+/**
+ * Basic information about a {@link Throwable} that was recorded in a file
+ */
+class RecordedThrowable {
+
+ static RecordedThrowable fromLine(String line) {
+ line = line.replace(AgentIT.EXCEPTION_MARKER, "");
+
+ String className = line.substring(0, line.indexOf(':'));
+ String message = line.substring(line.indexOf(':') + 2); // ignore ':' and leading ' '
+
+ return new RecordedThrowable(className, message);
+ }
+
+ String className;
+ String message;
+
+ public RecordedThrowable(String className, String message) {
+ this.className = className;
+ this.message = message;
+ }
+}
\ No newline at end of file
diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/TestTimeouts.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/TestTimeouts.java
new file mode 100644
index 0000000..0d5cb36
--- /dev/null
+++ b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/TestTimeouts.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.uca.impl;
+
+import java.time.Duration;
+import java.util.Objects;
+
+/**
+ * Data class for holding information about various timeouts set in the tests
+ */
+class TestTimeouts {
+
+ Duration executionTimeout = Duration.ofSeconds(AgentIT.EXECUTION_TIMEOUT_SECONDS);
+ Duration agentConnectTimeout = Duration.ofSeconds(AgentIT.CONNECT_TIMEOUT_SECONDS);
+ Duration agentReadTimeout = Duration.ofSeconds(AgentIT.READ_TIMEOUT_SECONDS);
+ Duration clientConnectTimeout = Duration.ZERO;
+ Duration clientReadTimeout = Duration.ZERO;
+
+ public static TestTimeouts DEFAULT = new TestTimeouts();
+
+ static class Builder {
+ private TestTimeouts timeouts = new TestTimeouts();
+
+ public TestTimeouts.Builder executionTimeout(Duration duration) {
+ timeouts.executionTimeout = Objects.requireNonNull(duration);
+ return this;
+ }
+
+ public TestTimeouts.Builder agentTimeouts(Duration connectTimeout, Duration readTimeout) {
+ timeouts.agentConnectTimeout = Objects.requireNonNull(connectTimeout);
+ timeouts.agentReadTimeout = Objects.requireNonNull(readTimeout);
+ return this;
+ }
+
+ public TestTimeouts.Builder clientTimeouts(Duration connectTimeout, Duration readTimeout) {
+ timeouts.clientConnectTimeout = Objects.requireNonNull(connectTimeout);
+ timeouts.clientReadTimeout = Objects.requireNonNull(readTimeout);
+ return this;
+ }
+
+ public TestTimeouts build() {
+ return timeouts;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + ": execution " + executionTimeout + ", agent: " + agentConnectTimeout + "/" + agentReadTimeout + ", client : " + clientConnectTimeout + "/" + clientReadTimeout;
+ }
+}
\ No newline at end of file