You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2017/12/09 13:41:40 UTC

[sling-org-apache-sling-validation-core] 01/01: SLING-7298 get rid of pax-exam for the IT

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

kwin pushed a commit to branch feature/it-with-slingstart
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-validation-core.git

commit 5dbea744fcd6274ada76fb684c8fee514df310a7
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Sat Dec 9 14:41:31 2017 +0100

    SLING-7298 get rid of pax-exam for the IT
    
    instead rely on a slightly modified Sling Launchpad, built and started
    with slingstart-maven-plugin.
---
 pom.xml                                            | 196 +++++++++------------
 .../impl/it/tests/ValidationServiceIT.java         | 109 ++++++------
 .../impl/it/tests/ValidationTestSupport.java       | 118 -------------
 src/test/provisioning/model.txt                    |  42 +++++
 src/test/resources/exam.properties                 |  19 --
 src/test/resources/logback.xml                     |  32 ----
 6 files changed, 178 insertions(+), 338 deletions(-)

diff --git a/pom.xml b/pom.xml
index 91776ea..9770fad 100644
--- a/pom.xml
+++ b/pom.xml
@@ -32,7 +32,9 @@
 
     <properties>
         <sling.java.version>8</sling.java.version>
-        <org.ops4j.pax.exam.version>4.10.0</org.ops4j.pax.exam.version>
+        <http.host>localhost</http.host>
+        <!-- start with -DkeepITServerRunning=true to allow to rerun ITs or inspect the server after the ITs have been executed there -->
+        <keepITServerRunning>false</keepITServerRunning>
     </properties>
 
     <scm>
@@ -60,34 +62,91 @@
                 </configuration>
             </plugin>
             <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-failsafe-plugin</artifactId>
+                <!-- Find free ports to run our server -->
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
                 <executions>
                     <execution>
+                        <id>reserve-server-port</id>
                         <goals>
-                            <goal>integration-test</goal>
-                            <goal>verify</goal>
+                            <goal>reserve-network-port</goal>
+                        </goals>
+                        <phase>pre-integration-test</phase>
+                        <configuration>
+                            <portNames>
+                                <!-- reserved port must be stored in property because it must be passed to the slingstart-maven-plugin -->
+                                <portName>http.port</portName>
+                            </portNames>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <!-- the Sling instance is provisioned from the model in src/main/provisioning/model.txt -->
+                <groupId>org.apache.sling</groupId>
+                <artifactId>slingstart-maven-plugin</artifactId>
+                <extensions>true</extensions>
+                <executions>
+                    <execution>
+                        <id>prepare-launchpad-package</id>
+                        <goals>
+                            <goal>prepare-package</goal>
+                        </goals>
+                        <phase>pre-integration-test</phase>
+                    </execution>
+                    <execution>
+                        <id>build-launchpad-package</id>
+                        <goals>
+                            <goal>package</goal>
+                        </goals>
+                        <phase>pre-integration-test</phase>
+                    </execution>
+                    <execution>
+                        <id>start-container-before-IT</id>
+                        <goals>
+                            <goal>start</goal>
+                        </goals>
+                        <configuration>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>stop-container-after-IT</id>
+                        <goals>
+                            <goal>stop</goal>
                         </goals>
+                        <configuration>
+                            <shouldBlockUntilKeyIsPressed>${keepITServerRunning}</shouldBlockUntilKeyIsPressed>
+                        </configuration>
                     </execution>
                 </executions>
                 <configuration>
-                    <redirectTestOutputToFile>true</redirectTestOutputToFile>
-                    <systemProperties>
-                        <property>
-                            <name>bundle.filename</name>
-                            <value>${basedir}/target/${project.build.finalName}.jar</value>
-                        </property>
-                    </systemProperties>
+                    <servers>
+                        <!-- this configuration applies to both 'start' and 'stop' -->
+                        <server>
+                            <id>singleinstance</id>
+                            <port>${http.port}</port>
+                            <vmOpts>${sling.vm.options}</vmOpts>
+                            <stdOutFile>sling/logs/stdout.log</stdOutFile>
+                        </server>
+                    </servers>
+                    <!-- this configuration only applies to 'prepare-package' and 'package' -->
+                    <disableExtendingMavenClasspath>true</disableExtendingMavenClasspath>
                 </configuration>
             </plugin>
             <plugin>
-                <groupId>org.apache.servicemix.tooling</groupId>
-                <artifactId>depends-maven-plugin</artifactId>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-failsafe-plugin</artifactId>
                 <executions>
                     <execution>
                         <goals>
-                            <goal>generate-depends-file</goal>
+                            <goal>integration-test</goal>
+                            <goal>verify</goal>
                         </goals>
+                        <configuration>
+                            <systemProperties>
+                                <http.port>${http.port}</http.port>
+                            </systemProperties>
+                        </configuration>
                     </execution>
                 </executions>
             </plugin>
@@ -141,12 +200,6 @@
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.resource.presence</artifactId>
-            <version>0.0.2</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.serviceusermapper</artifactId>
             <version>1.2.0</version>
             <scope>provided</scope>
@@ -171,51 +224,35 @@
             <version>2.2.0</version>
             <scope>provided</scope>
         </dependency>
+        
+        <!-- Testing dependencies -->
         <dependency>
-            <groupId>org.hamcrest</groupId>
-            <artifactId>hamcrest-library</artifactId>
-            <version>1.3</version>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
-         <dependency>
+        <dependency>
             <groupId>org.hamcrest</groupId>
-            <artifactId>hamcrest-core</artifactId>
+            <artifactId>hamcrest-library</artifactId>
             <version>1.3</version>
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.powermock</groupId>
-            <artifactId>powermock-api-mockito</artifactId>
-            <version>1.4.12</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
             <version>1.9.5</version>
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>javax.jcr</groupId>
-            <artifactId>jcr</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.auth.core</artifactId>
-            <version>1.3.24</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
             <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.engine</artifactId>
-            <version>2.6.6</version>
+            <artifactId>org.apache.sling.validation.test-services</artifactId>
+            <version>1.0.1-SNAPSHOT</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.validation.test-services</artifactId>
-            <version>1.0.1-SNAPSHOT</version>
+            <artifactId>org.apache.sling.testing.clients</artifactId>
+            <version>1.1.4</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -237,74 +274,11 @@
             <artifactId>slf4j-simple</artifactId>
              <scope>test</scope>
          </dependency>
-
-        <!-- Apache Felix -->
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.framework</artifactId>
-            <version>5.6.2</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.testing.paxexam</artifactId>
-            <version>0.0.4</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
+         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.commons.johnzon</artifactId>
             <version>1.0.0</version>
             <scope>provided</scope>
         </dependency>
-        <dependency>
-            <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.testing.tools</artifactId>
-            <!-- we need the latest snapshot due to switch to commons-johnzon in https://github.com/apache/sling-old-svn-mirror/commit/862cf2c34e306ac52e8b27fc62a0a5a5458e94c1#diff-80bdb2d8d02d199be853b4a26d559391 -->
-            <version>1.0.17-SNAPSHOT</version>
-            <scope>test</scope>
-        </dependency>
-        <!-- testing -->
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.bundles</groupId>
-            <artifactId>org.apache.servicemix.bundles.hamcrest</artifactId>
-            <version>1.3_1</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam</artifactId>
-            <version>${org.ops4j.pax.exam.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-cm</artifactId>
-            <version>${org.ops4j.pax.exam.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-container-forked</artifactId>
-            <version>${org.ops4j.pax.exam.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-junit4</artifactId>
-            <version>${org.ops4j.pax.exam.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-link-mvn</artifactId>
-            <version>${org.ops4j.pax.exam.version}</version>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 </project>
diff --git a/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationServiceIT.java b/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationServiceIT.java
index 42c98b6..5f3bd42 100644
--- a/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationServiceIT.java
+++ b/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationServiceIT.java
@@ -18,77 +18,75 @@
  */
 package org.apache.sling.validation.impl.it.tests;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 import java.io.IOException;
 import java.io.StringReader;
+import java.net.URI;
+import java.util.Collections;
+import java.util.concurrent.TimeoutException;
 
 import javax.json.Json;
 import javax.json.JsonException;
 import javax.json.JsonObject;
 
-import org.apache.http.entity.mime.MultipartEntity;
+import org.apache.http.Header;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
 import org.apache.http.entity.mime.content.StringBody;
-import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.message.BasicHeader;
 import org.apache.sling.servlets.post.SlingPostConstants;
-import org.apache.sling.testing.tools.http.RequestBuilder;
-import org.apache.sling.testing.tools.http.RequestExecutor;
-import org.junit.Before;
+import org.apache.sling.testing.clients.ClientException;
+import org.apache.sling.testing.clients.SlingHttpResponse;
+import org.apache.sling.testing.clients.osgi.OsgiConsoleClient;
+import org.apache.sling.validation.testservices.internal.ValidationPostOperation;
+import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.junit.PaxExam;
-import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
-import org.ops4j.pax.exam.spi.reactors.PerClass;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 /**
  * These tests leverage the {@link ValidationPostOperation} to validate the given request parameters.
  * The according validation model enforces the properties "field1" matching regex=^\\\p{Upper}+$ and "field2" (having an arbitrary value).
  *
  */
-@RunWith(PaxExam.class)
-@ExamReactorStrategy(PerClass.class)
-public class ValidationServiceIT extends ValidationTestSupport {
-
-    protected DefaultHttpClient defaultHttpClient;
+public class ValidationServiceIT {
 
-    protected RequestExecutor requestExecutor;
+    private static OsgiConsoleClient slingClient;
 
-    @Before
-    public void setup() throws IOException {
-        defaultHttpClient = new DefaultHttpClient();
-        requestExecutor = new RequestExecutor(defaultHttpClient);
+    @BeforeClass
+    public static void setupOnce() throws IOException, ClientException, TimeoutException, InterruptedException {
+        URI uri = URI.create(String.format("http://localhost:%s", Integer.getInteger("http.port")));
+        slingClient = new OsgiConsoleClient(uri, "admin", "admin");
+        // wait until the model from the validation.test-services bundle has been deployed
+        slingClient.waitExists("/apps/sling/validation/models/model1", 20000, 200);
+        
+        // also wait for the test-services to be active, see https://issues.apache.org/jira/browse/SLING-7297
+        // we cannot explicitly wait for that, but waiting until the bundle has been started should be enough here
+        slingClient.waitStartBundle("org.apache.sling.validation.test-services", 10000, 100);
     }
 
     @Test
-    public void testValidRequestModel1() throws IOException, JsonException {
-        final String url = String.format("http://localhost:%s", httpPort());
-        final RequestBuilder requestBuilder = new RequestBuilder(url);
-        MultipartEntity entity = new MultipartEntity();
-        entity.addPart("sling:resourceType", new StringBody("validation/test/resourceType1"));
-        entity.addPart("field1", new StringBody("HELLOWORLD"));
-        entity.addPart("field2", new StringBody("30.01.1988"));
-        entity.addPart(SlingPostConstants.RP_OPERATION, new StringBody("validation"));
-        RequestExecutor re = requestExecutor.execute(requestBuilder.buildPostRequest
-                ("/validation/testing/fakeFolder1/resource").withEntity(entity)).assertStatus(200);
-        String content = re.getContent();
-        JsonObject jsonResponse = Json.createReader(new StringReader(content)).readObject();
+    public void testValidRequestModel1() throws IOException, JsonException, ClientException {
+        MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
+        entityBuilder.addPart("sling:resourceType", new StringBody("validation/test/resourceType1", ContentType.DEFAULT_TEXT));
+        entityBuilder.addPart("field1", new StringBody("HELLOWORLD", ContentType.DEFAULT_TEXT));
+        entityBuilder.addPart("field2", new StringBody("30.01.1988", ContentType.DEFAULT_TEXT));
+        entityBuilder.addPart(SlingPostConstants.RP_OPERATION, new StringBody("validation", ContentType.DEFAULT_TEXT));
+        SlingHttpResponse response = slingClient.doPost("/validation/testing/fakeFolder1/resource", entityBuilder.build(), null, 200);
+        JsonObject jsonResponse = Json.createReader(new StringReader(response.getContent())).readObject();
         assertTrue(jsonResponse.getBoolean("valid"));
     }
 
     @Test
-    public void testInvalidRequestModel1() throws IOException, JsonException {
-        MultipartEntity entity = new MultipartEntity();
-        entity.addPart("sling:resourceType", new StringBody("validation/test/resourceType1"));
-        entity.addPart("field1", new StringBody("Hello World"));
-        entity.addPart(SlingPostConstants.RP_OPERATION, new StringBody("validation"));
-        final String url = String.format("http://localhost:%s", httpPort());
-        RequestBuilder requestBuilder = new RequestBuilder(url);
-        RequestExecutor re = requestExecutor.execute(requestBuilder.buildPostRequest
-                ("/validation/testing/fakeFolder1/resource").withEntity(entity)).assertStatus(200);
-        String content = re.getContent();
-        JsonObject jsonResponse = Json.createReader(new StringReader(content)).readObject();
+    public void testInvalidRequestModel1() throws IOException, JsonException, ClientException {
+        MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
+        entityBuilder.addPart("sling:resourceType", new StringBody("validation/test/resourceType1", ContentType.DEFAULT_TEXT));
+        entityBuilder.addPart("field1", new StringBody("Hello World", ContentType.DEFAULT_TEXT));
+        entityBuilder.addPart(SlingPostConstants.RP_OPERATION, new StringBody("validation", ContentType.DEFAULT_TEXT));
+        SlingHttpResponse response = slingClient.doPost("/validation/testing/fakeFolder1/resource", entityBuilder.build(), null, 200);
+        JsonObject jsonResponse = Json.createReader(new StringReader(response.getContent())).readObject();
         assertFalse(jsonResponse.getBoolean("valid"));
         JsonObject failure = jsonResponse.getJsonArray("failures").getJsonObject(0);
         assertEquals("Property does not match the pattern \"^\\p{Upper}+$\".", failure.getString("message"));
@@ -99,20 +97,15 @@ public class ValidationServiceIT extends ValidationTestSupport {
         assertEquals("", failure.getString("location")); // location is empty as the property is not found (property name is part of the message rather)
         assertEquals(0, failure.getInt("severity"));
     }
-    
+
     @Test
-    public void testPostProcessorWithInvalidModel() throws IOException, JsonException {
-        MultipartEntity entity = new MultipartEntity();
-        entity.addPart("sling:resourceType", new StringBody("validation/test/resourceType1"));
-        entity.addPart("field1", new StringBody("Hello World"));
-        final String url = String.format("http://localhost:%s", httpPort());
-        RequestBuilder requestBuilder = new RequestBuilder(url);
-        // test JSON response, because the HTML response overwrites the original exception (https://issues.apache.org/jira/browse/SLING-6703)
-        RequestExecutor re = requestExecutor.execute(requestBuilder.buildPostRequest
-                ("/content/validated/invalidresource").withEntity(entity).withHeader("Accept", "application/json").withCredentials("admin", "admin")).assertStatus(500);
-        String content = re.getContent();
-        JsonObject jsonResponse = Json.createReader(new StringReader(content)).readObject();
-        
+    public void testPostProcessorWithInvalidModel() throws IOException, JsonException, ClientException {
+        MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
+        entityBuilder.addPart("sling:resourceType", new StringBody("validation/test/resourceType1", ContentType.DEFAULT_TEXT));
+        entityBuilder.addPart("field1", new StringBody("Hello World", ContentType.DEFAULT_TEXT));
+        Header header = new BasicHeader("Accept", "application/json");
+        SlingHttpResponse response = slingClient.doPost("/content/validated/invalidresource", entityBuilder.build(), Collections.singletonList(header), 500);
+        JsonObject jsonResponse = Json.createReader(new StringReader(response.getContent())).readObject();
         JsonObject error = jsonResponse.getJsonObject("error");
         assertEquals("org.apache.sling.validation.impl.postprocessor.InvalidResourcePostProcessorException", error.getString("class"));
         assertEquals("Validation errors: field1 : Property does not match the pattern \"^\\p{Upper}+$\"., Missing required property with name \"field2\".", error.getString("message"));
diff --git a/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationTestSupport.java b/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationTestSupport.java
deleted file mode 100644
index ced5b92..0000000
--- a/src/test/java/org/apache/sling/validation/impl/it/tests/ValidationTestSupport.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * 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.validation.impl.it.tests;
-
-import javax.inject.Inject;
-
-import org.apache.sling.api.servlets.ServletResolver;
-import org.apache.sling.auth.core.AuthenticationSupport;
-import org.apache.sling.engine.SlingRequestProcessor;
-import org.apache.sling.resource.presence.ResourcePresence;
-import org.apache.sling.testing.paxexam.TestSupport;
-import org.apache.sling.validation.ValidationService;
-import org.ops4j.pax.exam.Configuration;
-import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.util.Filter;
-import org.ops4j.pax.exam.util.PathUtils;
-
-import static org.apache.sling.testing.paxexam.SlingOptions.slingExtensionI18n;
-import static org.apache.sling.testing.paxexam.SlingOptions.slingExtensionResourcePresence;
-import static org.apache.sling.testing.paxexam.SlingOptions.slingInstallerProviderJcr;
-import static org.apache.sling.testing.paxexam.SlingOptions.slingLaunchpadOakTar;
-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.systemProperty;
-import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfiguration;
-import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration;
-
-public class ValidationTestSupport extends TestSupport {
-
-    @Inject
-    protected ServletResolver servletResolver;
-
-    @Inject
-    protected SlingRequestProcessor slingRequestProcessor;
-
-    @Inject
-    protected AuthenticationSupport authenticationSupport;
-
-    @Inject
-    protected ValidationService validationService;
-
-    @Inject
-    @Filter(value = "(path=/apps/sling/validation/models/model1)")
-    protected ResourcePresence models;
-
-    @Configuration
-    public Option[] configuration() {
-        return new Option[]{
-            baseConfiguration(),
-            launchpad(),
-            // Sling Validation
-            testBundle("bundle.filename"),
-            mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.validation.api").versionAsInProject(),
-            mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.validation.test-services").versionAsInProject(),
-            factoryConfiguration("org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended")
-                .put("user.mapping", new String[]{
-                    "org.apache.sling.validation.core=sling-validation",
-                    "org.apache.sling.validation.test-services=sling-validation"
-                })
-                .asOption(),
-            // configure post processor
-            newConfiguration("org.apache.sling.validation.impl.postprocessor.ValidationPostProcessor")
-                .put("enabledForPathPrefix", new String[] {"/content/validated"})
-                .put("failForMissingValidationModels", Boolean.TRUE)
-                .asOption(),
-            // testing
-            mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.testing.tools").versionAsInProject(),
-            mavenBundle().groupId("org.apache.servicemix.bundles").artifactId("org.apache.servicemix.bundles.hamcrest").versionAsInProject(),
-            factoryConfiguration("org.apache.sling.resource.presence.internal.ResourcePresenter")
-                .put("path", "/apps/sling/validation/models/model1")
-                .asOption(),
-            junitBundles(),
-            logging()
-        };
-    }
-
-    protected Option launchpad() {
-        final int httpPort = findFreePort();
-        final String workingDirectory = workingDirectory();
-        return composite(
-            slingLaunchpadOakTar(workingDirectory, httpPort),
-            slingExtensionI18n(),
-            slingExtensionResourcePresence(),
-            slingInstallerProviderJcr(),
-            mavenBundle().groupId("org.apache.commons").artifactId("commons-collections4").versionAsInProject(),
-            mavenBundle().groupId("org.apache.sling").artifactId("org.apache.sling.commons.johnzon").versionAsInProject()
-        );
-    }
-
-    protected Option logging() {
-        final String filename = String.format("file:%s/src/test/resources/logback.xml", PathUtils.getBaseDir());
-        return composite(
-            systemProperty("logback.configurationFile").value(filename),
-            mavenBundle().groupId("org.slf4j").artifactId("slf4j-api").version("1.7.21"),
-            mavenBundle().groupId("org.slf4j").artifactId("jcl-over-slf4j").version("1.7.21"),
-            mavenBundle().groupId("ch.qos.logback").artifactId("logback-core").version("1.1.7"),
-            mavenBundle().groupId("ch.qos.logback").artifactId("logback-classic").version("1.1.7")
-        );
-    }
-
-}
diff --git a/src/test/provisioning/model.txt b/src/test/provisioning/model.txt
new file mode 100644
index 0000000..2fad2bd
--- /dev/null
+++ b/src/test/provisioning/model.txt
@@ -0,0 +1,42 @@
+#
+#  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.
+#
+[feature name=validation.core.it]
+# Dependencies
+[artifacts]
+  org.apache.sling/org.apache.sling.launchpad/9/slingstart
+  # deploy the to-be-tested bundle as well
+  org.apache.sling/org.apache.sling.validation.core/1.0.1-SNAPSHOT
+  # deploy an additional bundle which contains some server-side test classes and content
+  org.apache.sling/org.apache.sling.validation.test-services/1.0.1-SNAPSHOT
+
+[configurations]
+  # configure service user mapping for validation framework
+  org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended-validation
+    user.mapping=[ \
+    "org.apache.sling.validation.core\=sling-validation", \
+    "org.apache.sling.validation.test-services\=sling-validation" \
+    ]
+
+  # configure post processor
+  org.apache.sling.validation.impl.postprocessor.ValidationPostProcessor
+    enabledForPathPrefix=["/content/validated"]
+    failForMissingValidationModel=B"true"
+
+[settings]
+  org.apache.sling.commons.log.julenabled=true
diff --git a/src/test/resources/exam.properties b/src/test/resources/exam.properties
deleted file mode 100644
index c98a668..0000000
--- a/src/test/resources/exam.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-#  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.
-#
-pax.exam.logging=none
diff --git a/src/test/resources/logback.xml b/src/test/resources/logback.xml
deleted file mode 100644
index 699879a..0000000
--- a/src/test/resources/logback.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    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.
--->
-<configuration>
-  <appender name="file" class="ch.qos.logback.core.FileAppender">
-    <file>target/testing.log</file>
-    <encoder>
-      <pattern>%date %level [%thread] %logger{10} [%file : %line] %msg%n</pattern>
-    </encoder>
-  </appender>
-  <logger name="org.apache.sling.validation" level="DEBUG"/>
-  
-  <root level="INFO">
-    <appender-ref ref="file"/>
-  </root>
-</configuration>

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.