You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ol...@apache.org on 2019/08/17 07:49:10 UTC

[sling-org-apache-sling-clam] 04/12: improve integration tests

This is an automated email from the ASF dual-hosted git repository.

olli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-clam.git

commit 4af6d2a82e3deceaea295b5caca24b47dcbfc6fb
Author: Oliver Lietz <ol...@apache.org>
AuthorDate: Sun Jul 28 11:13:47 2019 +0200

    improve integration tests
---
 pom.xml                                            | 44 ++++++++++--
 .../clam/it/support/ClamContainerFactory.java      | 37 ++++++++++
 .../RecordingJcrPropertyScanResultHandler.java     | 50 +++++++++++++
 .../sling/clam/it/tests/ClamTestSupport.java       | 82 ++++++++++++++++++++--
 .../it/tests/JcrPropertyScanJobConsumerIT.java     |  4 +-
 .../ResourcePersistingScanResultHandlerIT.java     | 67 ++++++++++++++++--
 6 files changed, 266 insertions(+), 18 deletions(-)

diff --git a/pom.xml b/pom.xml
index fdf19c2..57d8275 100644
--- a/pom.xml
+++ b/pom.xml
@@ -206,6 +206,18 @@
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.jcr.api</artifactId>
+      <version>2.4.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.resource.presence</artifactId>
+      <version>0.0.2</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.serviceusermapper</artifactId>
       <version>1.3.0</version>
       <scope>provided</scope>
@@ -213,7 +225,7 @@
     <dependency>
       <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.testing.paxexam</artifactId>
-      <version>3.0.0</version>
+      <version>3.1.0-SNAPSHOT</version>
       <scope>test</scope>
     </dependency>
     <!-- nullability -->
@@ -235,9 +247,27 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.servicemix.bundles</groupId>
-      <artifactId>org.apache.servicemix.bundles.hamcrest</artifactId>
-      <version>1.3_1</version>
+      <groupId>io.rest-assured</groupId>
+      <artifactId>rest-assured</artifactId>
+      <version>4.0.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.awaitility</groupId>
+      <artifactId>awaitility</artifactId>
+      <version>4.0.0-rc1</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.google.truth</groupId>
+      <artifactId>truth</artifactId>
+      <version>1.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.testcontainers</groupId>
+      <artifactId>testcontainers</artifactId>
+      <version>1.11.3</version>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -270,6 +300,12 @@
       <version>${org.ops4j.pax.exam.version}</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.ops4j.pax.url</groupId>
+      <artifactId>pax-url-wrap</artifactId>
+      <version>2.6.1</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
 </project>
diff --git a/src/test/java/org/apache/sling/clam/it/support/ClamContainerFactory.java b/src/test/java/org/apache/sling/clam/it/support/ClamContainerFactory.java
new file mode 100644
index 0000000..fb259d2
--- /dev/null
+++ b/src/test/java/org/apache/sling/clam/it/support/ClamContainerFactory.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.clam.it.support;
+
+import java.time.Duration;
+
+import org.testcontainers.containers.GenericContainer;
+
+public class ClamContainerFactory {
+
+    private static final String CLAM_CONTAINER_IMAGE_NAME = "mk0x/docker-clamav:alpine";
+
+    public static GenericContainer container = new GenericContainer<>(CLAM_CONTAINER_IMAGE_NAME)
+        .withExposedPorts(3310)
+        .withStartupTimeout(Duration.ofMinutes(3));
+
+    static {
+        container.start();
+    }
+
+}
diff --git a/src/test/java/org/apache/sling/clam/it/support/RecordingJcrPropertyScanResultHandler.java b/src/test/java/org/apache/sling/clam/it/support/RecordingJcrPropertyScanResultHandler.java
new file mode 100644
index 0000000..16e0200
--- /dev/null
+++ b/src/test/java/org/apache/sling/clam/it/support/RecordingJcrPropertyScanResultHandler.java
@@ -0,0 +1,50 @@
+/*
+ * 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.clam.it.support;
+
+import java.util.HashMap;
+
+import org.apache.sling.clam.result.JcrPropertyScanResultHandler;
+import org.apache.sling.commons.clam.ScanResult;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class RecordingJcrPropertyScanResultHandler implements JcrPropertyScanResultHandler {
+
+    private final HashMap<String, ScanResult> results = new HashMap<>();
+
+    public RecordingJcrPropertyScanResultHandler() {
+    }
+
+    public HashMap<String, ScanResult> getResults() {
+        return results;
+    }
+
+    @Override
+    public void handleJcrPropertyScanResult(@NotNull ScanResult scanResult, @NotNull String path, int propertyType, @Nullable String userId) {
+        results.put(path, scanResult);
+    }
+
+    @Override
+    public void handleJcrPropertyScanResult(@NotNull ScanResult scanResult, @NotNull String path, int index, int propertyType, @Nullable String userId) {
+        final String key = String.format("%s[%s]", path, index);
+        results.put(key, scanResult);
+    }
+
+}
diff --git a/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java b/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java
index 100edc0..bcc855f 100644
--- a/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java
+++ b/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java
@@ -18,22 +18,51 @@
  */
 package org.apache.sling.clam.it.tests;
 
+import java.util.Collections;
+import java.util.regex.Pattern;
+
+import javax.inject.Inject;
+import javax.jcr.Node;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.apache.sling.clam.it.support.ClamContainerFactory;
+import org.apache.sling.clam.jcr.NodeDescendingJcrPropertyDigger;
+import org.apache.sling.event.jobs.JobManager;
+import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.testing.paxexam.TestSupport;
 import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.options.ModifiableCompositeOption;
+import org.osgi.framework.BundleContext;
 
+import static org.apache.sling.testing.paxexam.SlingOptions.awaitility;
+import static org.apache.sling.testing.paxexam.SlingOptions.restassured;
 import static org.apache.sling.testing.paxexam.SlingOptions.slingEvent;
 import static org.apache.sling.testing.paxexam.SlingOptions.slingQuickstartOakTar;
+import static org.apache.sling.testing.paxexam.SlingOptions.testcontainers;
 import static org.apache.sling.testing.paxexam.SlingVersionResolver.SLING_GROUP_ID;
 import static org.ops4j.pax.exam.CoreOptions.composite;
 import static org.ops4j.pax.exam.CoreOptions.junitBundles;
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.wrappedBundle;
 import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfiguration;
+import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration;
 
 public abstract class ClamTestSupport extends TestSupport {
 
-    public Option[] configuration() {
-        return new Option[]{
-            baseConfiguration(),
+    @Inject
+    protected BundleContext bundleContext;
+
+    @Inject
+    protected SlingRepository slingRepository;
+
+    @Inject
+    protected JobManager jobManager;
+
+    protected ModifiableCompositeOption baseConfiguration() {
+        return composite(
+            super.baseConfiguration(),
             quickstart(),
             // Sling Clam
             testBundle("bundle.filename"),
@@ -46,9 +75,15 @@ public abstract class ClamTestSupport extends TestSupport {
             // Sling Commons Clam
             mavenBundle().groupId(SLING_GROUP_ID).artifactId("org.apache.sling.commons.clam").versionAsInProject(),
             // testing
-            mavenBundle().groupId("org.apache.servicemix.bundles").artifactId("org.apache.servicemix.bundles.hamcrest").versionAsInProject(),
-            junitBundles()
-        };
+            newConfiguration("org.apache.sling.jcr.base.internal.LoginAdminWhitelist")
+                .put("whitelist.bundles.regexp", "PAXEXAM-PROBE-.*")
+                .asOption(),
+            junitBundles(),
+            awaitility(),
+            restassured(),
+            testcontainers(),
+            wrappedBundle(mavenBundle().groupId("com.google.truth").artifactId("truth").versionAsInProject())
+        );
     }
 
     protected Option quickstart() {
@@ -60,4 +95,39 @@ public abstract class ClamTestSupport extends TestSupport {
         );
     }
 
+    protected Option clamdConfiguration() {
+        final boolean testcontainer = Boolean.parseBoolean(System.getProperty("clamd.testcontainer", "true"));
+        final String host;
+        final Integer port;
+        if (testcontainer) {
+            host = ClamContainerFactory.container.getContainerIpAddress();
+            port = ClamContainerFactory.container.getFirstMappedPort();
+        } else {
+            host = System.getProperty("clamd.host", "localhost");
+            port = Integer.parseInt(System.getProperty("clamd.port", "3310"));
+        }
+        return newConfiguration("org.apache.sling.commons.clam.internal.ClamdService")
+            .put("clamd.host", host)
+            .put("clamd.port", port)
+            .asOption();
+    }
+
+    protected Session session() throws RepositoryException {
+        return slingRepository.loginAdministrative(null);
+    }
+
+    protected void digBinaries(final NodeDescendingJcrPropertyDigger digger, final String path) throws Exception {
+        Session session = null;
+        try {
+            session = session();
+            final Node starter = session.getNode(path);
+            final Pattern pattern = Pattern.compile("^/.*$");
+            digger.dig(starter, pattern, Collections.singleton(PropertyType.BINARY), -1, -1);
+        } finally {
+            if (session != null) {
+                session.logout();
+            }
+        }
+    }
+
 }
diff --git a/src/test/java/org/apache/sling/clam/it/tests/JcrPropertyScanJobConsumerIT.java b/src/test/java/org/apache/sling/clam/it/tests/JcrPropertyScanJobConsumerIT.java
index 53890b0..9028683 100644
--- a/src/test/java/org/apache/sling/clam/it/tests/JcrPropertyScanJobConsumerIT.java
+++ b/src/test/java/org/apache/sling/clam/it/tests/JcrPropertyScanJobConsumerIT.java
@@ -30,7 +30,7 @@ import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerClass;
 import org.ops4j.pax.exam.util.Filter;
 
-import static org.junit.Assert.assertNotNull;
+import static com.google.common.truth.Truth.assertThat;
 import static org.ops4j.pax.exam.CoreOptions.options;
 
 @RunWith(PaxExam.class)
@@ -50,7 +50,7 @@ public class JcrPropertyScanJobConsumerIT extends ClamTestSupport {
 
     @Test
     public void testJobConsumer() {
-        assertNotNull(jobConsumer);
+        assertThat(jobConsumer).isNotNull();
     }
 
 }
diff --git a/src/test/java/org/apache/sling/clam/it/tests/ResourcePersistingScanResultHandlerIT.java b/src/test/java/org/apache/sling/clam/it/tests/ResourcePersistingScanResultHandlerIT.java
index ae87309..7346925 100644
--- a/src/test/java/org/apache/sling/clam/it/tests/ResourcePersistingScanResultHandlerIT.java
+++ b/src/test/java/org/apache/sling/clam/it/tests/ResourcePersistingScanResultHandlerIT.java
@@ -19,8 +19,14 @@
 package org.apache.sling.clam.it.tests;
 
 import javax.inject.Inject;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryResult;
 
+import org.apache.sling.clam.jcr.NodeDescendingJcrPropertyDigger;
 import org.apache.sling.clam.result.JcrPropertyScanResultHandler;
+import org.apache.sling.resource.presence.ResourcePresence;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.Configuration;
@@ -30,8 +36,14 @@ import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerClass;
 import org.ops4j.pax.exam.util.Filter;
 
-import static org.junit.Assert.assertNotNull;
-import static org.ops4j.pax.exam.OptionUtils.combine;
+import static com.google.common.truth.Truth.assertThat;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingResourcePresence;
+import static org.apache.sling.testing.paxexam.SlingOptions.slingStarterContent;
+import static org.awaitility.Awaitility.with;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfiguration;
 import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration;
 
 @RunWith(PaxExam.class)
@@ -42,20 +54,63 @@ public class ResourcePersistingScanResultHandlerIT extends ClamTestSupport {
     @Filter("(service.pid=org.apache.sling.clam.result.internal.ResourcePersistingScanResultHandler)")
     private JcrPropertyScanResultHandler jcrPropertyScanResultHandler;
 
+    @Inject
+    @Filter(value = "(path=/content/starter)")
+    private ResourcePresence resourcePresence;
+
+    @Inject
+    private NodeDescendingJcrPropertyDigger nodeDescendingJcrPropertyDigger;
+
     @Configuration
     public Option[] configuration() {
-        return combine(
-            super.configuration(),
+        return options(
+            baseConfiguration(),
+            clamdConfiguration(),
+            slingResourcePresence(),
+            factoryConfiguration("org.apache.sling.resource.presence.internal.ResourcePresenter")
+                .put("path", "/content/starter")
+                .asOption(),
             newConfiguration("org.apache.sling.clam.result.internal.ResourcePersistingScanResultHandler")
                 .put("result.status.ok.persist", true)
                 .put("result.root.path", "/var/clam/results")
-                .asOption()
+                .asOption(),
+            slingStarterContent()
         );
     }
 
     @Test
     public void testJcrPropertyScanResultHandler() {
-        assertNotNull(jcrPropertyScanResultHandler);
+        assertThat(jcrPropertyScanResultHandler).isNotNull();
+    }
+
+    @Test
+    public void testPersistedResults() throws Exception {
+        digBinaries(nodeDescendingJcrPropertyDigger, "/content/starter");
+        with().
+            pollInterval(10, SECONDS).
+            then().
+            await().
+            alias("counting results").
+            atMost(1, MINUTES).
+            until(() -> countResult() == 12);
+    }
+
+    protected QueryResult queryJcrResults(final Session session) throws RepositoryException {
+        final String query = "SELECT * FROM [nt:unstructured] AS result WHERE ISDESCENDANTNODE(result, \"/var/clam/results\") AND [sling:resourceType] = \"sling/clam/jcr/result\"";
+        return session.getWorkspace().getQueryManager().createQuery(query, Query.JCR_SQL2).execute();
+    }
+
+    private long countResult() throws RepositoryException {
+        Session session = null;
+        try {
+            session = session();
+            final QueryResult result = queryJcrResults(session);
+            return result.getNodes().getSize();
+        } finally {
+            if (session != null) {
+                session.logout();
+            }
+        }
     }
 
 }