SLING-8787 - Add OSGi smoke test
diff --git a/pom.xml b/pom.xml
index 22ad48a..0a9d90e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -121,6 +121,12 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.junit.vintage</groupId>
+            <artifactId>junit-vintage-engine</artifactId>
+            <version>5.4.2</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>commons-httpclient</groupId>
             <artifactId>commons-httpclient</artifactId>
             <version>3.1</version>
@@ -144,5 +150,34 @@
           <version>3.14.2</version>
           <scope>test</scope>
         </dependency>
+        <!-- Pax Exam Dependencies -->
+        <dependency>
+            <groupId>org.ops4j.pax.exam</groupId>
+            <artifactId>pax-exam-container-forked</artifactId>
+            <version>${pax-exam.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.exam</groupId>
+            <artifactId>pax-exam-junit4</artifactId>
+            <version>${pax-exam.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.exam</groupId>
+            <artifactId>pax-exam-link-mvn</artifactId>
+            <version>${pax-exam.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <!-- Felix framework for Pax-Exam -->
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.framework</artifactId>
+            <version>6.0.3</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
+    <properties>
+        <pax-exam.version>4.13.0</pax-exam.version>
+    </properties>
 </project>
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/cta/impl/OsgiIT.java b/src/test/java/org/apache/sling/cta/impl/OsgiIT.java
new file mode 100644
index 0000000..56264db
--- /dev/null
+++ b/src/test/java/org/apache/sling/cta/impl/OsgiIT.java
@@ -0,0 +1,90 @@
+/*
+ * 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.cta.impl;
+
+import static org.junit.Assert.fail;
+import static org.ops4j.pax.exam.CoreOptions.junitBundles;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.vmOption;
+
+import java.io.IOException;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.PathMatcher;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.conn.ConnectTimeoutException;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.PaxExam;
+
+/**
+ * Smoke test to ensure that the agent works as expected inside an OSGi container
+ * 
+ * <p>It only validates one scenario, and it's not terribly important which one, just that it uses
+ * a library, and not the built-in HttpClient, as the class loading requirements are more strict.</p>
+ *
+ */
+@RunWith(PaxExam.class)
+public class OsgiIT {
+    
+    @Configuration
+    public Option[] config() throws IOException {
+        
+        FileSystem fs = FileSystems.getDefault();
+        PathMatcher matcher = fs.getPathMatcher("glob:org.apache.sling.connection-timeout-agent-*-jar-with-dependencies.jar");
+        
+        List<Path> agentCandidates = Files.list(Paths.get("target"))
+            .filter(Files::isRegularFile)
+            .filter(p -> matcher.matches(p.getFileName()))
+            .collect(Collectors.toList());
+                
+        if ( agentCandidates.size() != 1 )
+            throw new RuntimeException("Expected exactly one agent jar, but found " + agentCandidates);
+        
+        return options(
+            junitBundles(),
+            mavenBundle("org.apache.httpcomponents", "httpcore-osgi", "4.4.12"),
+            mavenBundle("org.apache.httpcomponents", "httpclient-osgi", "4.5.10"),
+            vmOption("-javaagent:" + agentCandidates.get(0) +"=1,1,v")
+        );
+    }
+
+    @Test(expected = ConnectTimeoutException.class)
+    public void callTimesOut() throws IOException {
+        try ( CloseableHttpClient httpclient = HttpClients.createDefault() ) {
+            // the used host does not really matter, the connect timeout of 1 ms
+            // should kick in almost instantly
+            HttpGet get = new HttpGet("https://repo1.maven.org/");
+            try ( CloseableHttpResponse response = httpclient.execute(get)) {
+                fail("Request should have failed");
+            } 
+        }
+    }
+    
+}