You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ra...@apache.org on 2018/12/10 15:37:54 UTC
[sling-org-apache-sling-scripting-bundle-tracker-it] 01/07: refactor
This is an automated email from the ASF dual-hosted git repository.
radu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-bundle-tracker-it.git
commit 84e289c2dde3b7837126066aeadb620984ca09b0
Author: Radu Cotescu <ra...@apache.org>
AuthorDate: Fri Sep 28 16:29:08 2018 +0200
refactor
* extracted IT in separate module (need to re-add jacoco)
* made sure BRU dependencies are obtained with the correct bundle context
---
README.md | 18 ++
pom.xml | 295 +++++++++++++++++++++
.../junit/teleporter/customizers/ITCustomizer.java | 35 +++
.../resolver/internal/AbstractEndpointIT.java | 148 +++++++++++
.../resolver/internal/BundledScriptTrackerIT.java | 64 +++++
.../scripting/resolver/internal/EndpointIT.java | 90 +++++++
.../scripting/resolver/internal/ScriptMatchIT.java | 153 +++++++++++
src/test/provisioning/it-model.txt | 35 +++
8 files changed, 838 insertions(+)
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..91fd661
--- /dev/null
+++ b/README.md
@@ -0,0 +1,18 @@
+Apache Sling Scripting Resolver (WIP, name not final)
+====
+
+## Integration Tests
+
+To run the integration tests do:
+
+```
+mvn clean verify -Pit
+```
+
+## Example
+
+To play around with a sling instance on localhost port 8080 (override with -Dhttp.port=<port>) that has the [examples](../examples) installed run:
+
+```
+mvn clean verify -Pexample
+```
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..6e36856
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,295 @@
+<?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.
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.scripting.resolver.reactor</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>org.apache.sling.scripting.resolver.it</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <packaging>slingstart</packaging>
+
+ <properties>
+ <sling.java.version>8</sling.java.version>
+ <jacoco.maven.plugin.version>0.8.1</jacoco.maven.plugin.version>
+ </properties>
+
+ <build>
+ <plugins>
+ <plugin>
+ <!-- the Sling instance is provisioned from the model in src/test/provisioning/it-model.txt -->
+ <groupId>org.apache.sling</groupId>
+ <artifactId>slingstart-maven-plugin</artifactId>
+ <version>1.7.16</version>
+ <extensions>true</extensions>
+ <configuration>
+ <usePomDependencies>true</usePomDependencies>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.scripting.resolver</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.scripting.sightly</artifactId>
+ <version>1.0.55-1.4.0-exp-SNAPSHOT</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.scripting.examplebundle</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.scripting.examplebundle.precompiled</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.scripting.examplebundle.classic</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.scripting.examplebundle.hi</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <scope>provided</scope>
+ </dependency>
+ <!-- TESTING -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.junit.teleporter</artifactId>
+ <version>1.0.16</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.testing.clients</artifactId>
+ <version>1.1.12</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jsoup</groupId>
+ <artifactId>jsoup</artifactId>
+ <version>1.7.3</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.testing.rules</artifactId>
+ <version>1.0.6</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <profiles>
+ <profile>
+ <id>it</id>
+ <properties>
+ <http.host>localhost</http.host>
+ <sling.vm.options>-Xmx1024m -XX:MaxPermSize=256m -Djava.awt.headless=true</sling.vm.options>
+ </properties>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>reserve-network-port</id>
+ <goals>
+ <!-- pre-integration-test is too late -->
+ <goal>reserve-network-port</goal>
+ </goals>
+ <phase>process-resources</phase>
+ <configuration>
+ <portNames>
+ <portName>http.port.testing</portName>
+ </portNames>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <argLine>@{argLine}</argLine>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>integration-test</id>
+ <phase>integration-test</phase>
+ <goals>
+ <goal>integration-test</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>verify</id>
+ <phase>integration-test</phase>
+ <goals>
+ <goal>verify</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <systemPropertyVariables>
+ <launchpad.http.server.url>http://${http.host}:${http.port.testing}/</launchpad.http.server.url>
+ </systemPropertyVariables>
+ </configuration>
+ </plugin>
+ <plugin>
+ <!-- the Sling instance is provisioned from the model in src/test/provisioning/it-model.txt -->
+ <groupId>org.apache.sling</groupId>
+ <artifactId>slingstart-maven-plugin</artifactId>
+ <extensions>true</extensions>
+ <executions>
+ <execution>
+ <id>prepare-launchpad-package</id>
+ <phase>pre-integration-test</phase>
+ <goals>
+ <goal>prepare-package</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>build-launchpad-package</id>
+ <phase>pre-integration-test</phase>
+ <goals>
+ <goal>package</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>start-container-before-IT</id>
+ <goals>
+ <goal>start</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>stop-container-after-IT</id>
+ <goals>
+ <goal>stop</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <usePomDependencies>true</usePomDependencies>
+ <attachArtifact>false</attachArtifact>
+ <!-- <shouldBlockUntilKeyIsPressed>true</shouldBlockUntilKeyIsPressed> -->
+ <servers>
+ <server>
+ <id>testinstance</id>
+ <port>${http.port.testing}</port>
+ <vmOpts>${sling.vm.options}</vmOpts>
+ <debug>${jacoco.agent}</debug>
+ </server>
+ </servers>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ <profile>
+ <id>example</id>
+ <properties>
+ <http.host>localhost</http.host>
+ <http.port>8080</http.port>
+ <sling.vm.options>-Xmx1024m -XX:MaxPermSize=256m -Djava.awt.headless=true -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000</sling.vm.options>
+ </properties>
+ <build>
+ <plugins>
+ <plugin>
+ <!-- the Sling instance is provisioned from the model in src/test/provisioning/it-model.txt -->
+ <groupId>org.apache.sling</groupId>
+ <artifactId>slingstart-maven-plugin</artifactId>
+ <version>1.7.16</version>
+ <extensions>true</extensions>
+ <executions>
+ <execution>
+ <id>prepare-launchpad-package</id>
+ <phase>pre-integration-test</phase>
+ <goals>
+ <goal>prepare-package</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>build-launchpad-package</id>
+ <phase>pre-integration-test</phase>
+ <goals>
+ <goal>package</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>start-container-before-IT</id>
+ <goals>
+ <goal>start</goal>
+ </goals>
+ </execution>
+ <execution>
+ <goals>
+ <goal>stop</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <usePomDependencies>true</usePomDependencies>
+ <attachArtifact>false</attachArtifact>
+ <shouldBlockUntilKeyIsPressed>true</shouldBlockUntilKeyIsPressed>
+ <servers>
+ <server>
+ <id>exampleinstance</id>
+ <port>${http.port}</port>
+ <vmOpts>${sling.vm.options}</vmOpts>
+ </server>
+ </servers>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+</project>
diff --git a/src/test/java/org/apache/sling/junit/teleporter/customizers/ITCustomizer.java b/src/test/java/org/apache/sling/junit/teleporter/customizers/ITCustomizer.java
new file mode 100644
index 0000000..e14e36f
--- /dev/null
+++ b/src/test/java/org/apache/sling/junit/teleporter/customizers/ITCustomizer.java
@@ -0,0 +1,35 @@
+/*
+ * 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.junit.teleporter.customizers;
+
+import org.apache.sling.junit.rules.TeleporterRule;
+import org.apache.sling.testing.teleporter.client.ClientSideTeleporter;
+
+public class ITCustomizer implements TeleporterRule.Customizer {
+
+ public static final String BASE_URL_PROP = "launchpad.http.server.url";
+
+ @Override
+ public void customize(TeleporterRule t, String options) {
+ final ClientSideTeleporter cst = (ClientSideTeleporter)t;
+ cst.setBaseUrl(System.getProperty(BASE_URL_PROP, BASE_URL_PROP + "_IS_NOT_SET"));
+ cst.setServerCredentials("admin", "admin");
+ cst.includeDependencyPrefix("org.apache.sling.scripting.resolver.internal");
+ cst.includeDependencyPrefix("org.apache.sling.testing");
+ cst.setTestReadyTimeoutSeconds(20);
+ }
+}
diff --git a/src/test/java/org/apache/sling/scripting/resolver/internal/AbstractEndpointIT.java b/src/test/java/org/apache/sling/scripting/resolver/internal/AbstractEndpointIT.java
new file mode 100644
index 0000000..aad08f4
--- /dev/null
+++ b/src/test/java/org/apache/sling/scripting/resolver/internal/AbstractEndpointIT.java
@@ -0,0 +1,148 @@
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ~ 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.scripting.resolver.internal;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpHead;
+import org.apache.http.client.methods.HttpOptions;
+import org.apache.http.client.methods.HttpPatch;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.methods.HttpTrace;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.sling.junit.teleporter.customizers.ITCustomizer;
+import org.apache.sling.testing.junit.rules.SlingInstanceRule;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+
+
+public abstract class AbstractEndpointIT {
+
+ protected int contentFindTimeout = 20000;
+ protected int contentFindRetryDelay = 1000;
+ private static CloseableHttpClient httpClient;
+
+ @ClassRule
+ public static final SlingInstanceRule SLING_INSTANCE_RULE = new SlingInstanceRule();
+
+ private Map<String, Document> documentMap = new ConcurrentHashMap<>();
+
+ @BeforeClass
+ public static void setUp() {
+ httpClient = HttpClientBuilder.create().build();
+ }
+
+ @AfterClass
+ public static void tearDown() throws IOException {
+ httpClient.close();
+ }
+
+ /**
+ * Retrieves a jsoup Document from the passed {@code url}. The URL can contain selectors and extensions, but it has to identify a Sling
+ * content {@link org.apache.sling.api.resource.Resource}.
+ *
+ * @param url the URL from which to retrieve the {@link Document}
+ * @return the Document
+ * @throws Exception if the resource was not found before the timeout elapsed
+ */
+ protected Document getDocument(String url) throws Exception {
+ return getDocument(url, HttpGet.METHOD_NAME);
+ }
+
+ protected Document getDocument(String url, String httpMethod, NameValuePair... parameters) throws Exception {
+ URIBuilder uriBuilder = new URIBuilder(url);
+ uriBuilder.setParameters(parameters);
+ URI uri = uriBuilder.build();
+ Document document = documentMap.get(httpMethod + ":" + uri.toString());
+ if (document == null) {
+ HttpResponse response = getResponse(httpMethod, url, 200);
+ document = Jsoup.parse(response.getEntity().getContent(), StandardCharsets.UTF_8.name(),
+ System.getProperty(ITCustomizer.BASE_URL_PROP, ITCustomizer.BASE_URL_PROP +
+ "_IS_NOT_SET"));
+ documentMap.put(httpMethod + ":" + uri, document);
+ }
+ return document;
+ }
+
+ protected HttpResponse getResponse(String method, String url, int statusCode, NameValuePair... parameters) throws Exception {
+ String resourcePath = url.substring(0, url.indexOf('.'));
+ SLING_INSTANCE_RULE.getAdminClient().waitExists(resourcePath, contentFindTimeout, contentFindRetryDelay);
+ HttpUriRequest request = prepareRequest(method, url, parameters);
+ HttpResponse response = httpClient.execute(request);
+ Assert.assertNotNull(response);
+ Assert.assertEquals("URL " + url + " did not return a " + statusCode + " status code.", statusCode,
+ response.getStatusLine().getStatusCode
+ ());
+ return response;
+ }
+
+ protected HttpUriRequest prepareRequest(String method, String url, NameValuePair... parameters) throws URISyntaxException {
+ HttpRequestBase request = null;
+ URIBuilder uriBuilder =
+ new URIBuilder(System.getProperty(ITCustomizer.BASE_URL_PROP, ITCustomizer.BASE_URL_PROP + "_IS_NOT_SET") + url);
+ uriBuilder.setParameters(parameters);
+ switch (method) {
+ case HttpGet.METHOD_NAME:
+ request = new HttpGet(uriBuilder.build());
+ break;
+ case HttpHead.METHOD_NAME:
+ request = new HttpHead(uriBuilder.build());
+ break;
+ case HttpOptions.METHOD_NAME:
+ request = new HttpOptions(uriBuilder.build());
+ break;
+ case HttpPost.METHOD_NAME:
+ request = new HttpPost(uriBuilder.build());
+ break;
+ case HttpPut.METHOD_NAME:
+ request = new HttpPut(uriBuilder.build());
+ break;
+ case HttpPatch.METHOD_NAME:
+ request = new HttpPatch(uriBuilder.build());
+ break;
+ case HttpTrace.METHOD_NAME:
+ request = new HttpTrace(uriBuilder.build());
+ break;
+ case HttpDelete.METHOD_NAME:
+ request = new HttpDelete(uriBuilder.build());
+ break;
+ }
+ return request;
+ }
+
+}
diff --git a/src/test/java/org/apache/sling/scripting/resolver/internal/BundledScriptTrackerIT.java b/src/test/java/org/apache/sling/scripting/resolver/internal/BundledScriptTrackerIT.java
new file mode 100644
index 0000000..0ca3578
--- /dev/null
+++ b/src/test/java/org/apache/sling/scripting/resolver/internal/BundledScriptTrackerIT.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.scripting.resolver.internal;
+
+import javax.servlet.Servlet;
+
+import org.apache.sling.junit.rules.TeleporterRule;
+import org.apache.sling.testing.clients.util.poller.Polling;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class BundledScriptTrackerIT {
+
+ @Rule
+ public TeleporterRule teleporter = TeleporterRule.forClass(getClass(), "IT");
+
+ @Test
+ public void testSlingServletForResourceTypeProvided() throws Exception {
+ waitForService(Servlet.class, String.format("(%s=%s)", "sling.servlet.resourceTypes", "org.apache.sling.scripting" +
+ ".examplebundle.hello/1.0.0"), 20000, 1000);
+ waitForService(Servlet.class, String.format("(%s=%s)", "sling.servlet.resourceTypes", "org.apache.sling.scripting" +
+ ".examplebundle.hello/2.0.0"), 20000, 1000);
+ waitForService(Servlet.class, String.format("(%s=%s)", "sling.servlet.resourceTypes", "org.apache.sling.scripting" +
+ ".examplebundle.hello"), 20000, 1000);
+ waitForService(Servlet.class, String.format("(%s=%s)", "sling.servlet.resourceTypes", "org.apache.sling.scripting" +
+ ".examplebundle.hi/1.0.0"), 20000, 1000);
+ waitForService(Servlet.class, String.format("(%s=%s)", "sling.servlet.resourceTypes", "org.apache.sling.scripting" +
+ ".examplebundle.hi"), 20000, 1000);
+ waitForService(Servlet.class, String.format("(%s=%s)", "sling.servlet.resourceTypes", "org.apache.sling.scripting" +
+ ".examplebundle.scriptmatching/1.0.0"), 20000, 1000);
+ waitForService(Servlet.class, String.format("(%s=%s)", "sling.servlet.resourceTypes", "org.apache.sling.scripting" +
+ ".examplebundle.scriptmatching"), 20000, 1000);
+ }
+
+ private void waitForService(Class serviceClass, String filter, long waitTime, long retryAfter)
+ throws Exception {
+ Polling p = new Polling() {
+ @Override
+ public Boolean call() {
+ return teleporter.getService(serviceClass, filter) != null;
+ }
+
+ @Override
+ protected String message() {
+ return "Cannot obtain a reference to service " + serviceClass.getName() + " with filter " + filter + " after %1$d ms";
+ }
+ };
+ p.poll(waitTime, retryAfter);
+ }
+}
diff --git a/src/test/java/org/apache/sling/scripting/resolver/internal/EndpointIT.java b/src/test/java/org/apache/sling/scripting/resolver/internal/EndpointIT.java
new file mode 100644
index 0000000..f4f93d0
--- /dev/null
+++ b/src/test/java/org/apache/sling/scripting/resolver/internal/EndpointIT.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.scripting.resolver.internal;
+
+import org.jsoup.nodes.Document;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class EndpointIT extends AbstractEndpointIT {
+
+ @Test
+ public void testHelloEndpoint() throws Exception {
+ Document document = getDocument("/content/srr/examples/hello.html");
+ Assert.assertEquals("We're testing some serious scripting here in Version 2", document.select("h2").html());
+ Assert.assertTrue(document.body().html().contains("World2"));
+ Assert.assertTrue(document.body().html().contains("Hello2"));
+ }
+
+ @Test
+ public void testPrecompiledHelloEndpoint() throws Exception {
+ Document document = getDocument("/content/srr/examples/precompiled-hello.html");
+ Assert.assertEquals("We're testing some serious scripting here in Version 2", document.select("h2").html());
+ Assert.assertTrue(document.body().html().contains("World2"));
+ Assert.assertTrue(document.body().html().contains("Hello2"));
+ }
+
+ @Test
+ public void testHelloEndpointV1() throws Exception {
+ Document document = getDocument("content/srr/examples/hello-v1.html");
+ Assert.assertEquals("We're testing some serious scripting here", document.select("h2").html());
+ Assert.assertTrue(document.body().html().contains("World"));
+ Assert.assertTrue(document.body().html().contains("Hello"));
+ }
+
+ @Test
+ public void testPrecompiledHelloEndpointV1() throws Exception {
+ Document document = getDocument("content/srr/examples/precompiled-hello-v1.html");
+ Assert.assertEquals("We're testing some serious scripting here", document.select("h2").html());
+ Assert.assertTrue(document.body().html().contains("World"));
+ Assert.assertTrue(document.body().html().contains("Hello"));
+ }
+
+ @Test
+ public void testHelloEndpointV2() throws Exception {
+ Document document = getDocument("content/srr/examples/hello-v2.html");
+ Assert.assertEquals("We're testing some serious scripting here in Version 2", document.select("h2").html());
+ Assert.assertTrue(document.body().html().contains("World2"));
+ Assert.assertTrue(document.body().html().contains("Hello2"));
+ }
+
+ @Test
+ public void testPrecompiledHelloEndpointV2() throws Exception {
+ Document document = getDocument("content/srr/examples/precompiled-hello-v2.html");
+ Assert.assertEquals("We're testing some serious scripting here in Version 2", document.select("h2").html());
+ Assert.assertTrue(document.body().html().contains("World2"));
+ Assert.assertTrue(document.body().html().contains("Hello2"));
+ }
+
+ @Test
+ public void testHiEndpoint() throws Exception {
+ Document document = getDocument("content/srr/examples/hi.html");
+ Assert.assertEquals("We're testing some serious scripting here", document.select("h2").html());
+ Assert.assertTrue(document.body().html().contains("World"));
+ Assert.assertTrue(document.body().html().contains("Hallo"));
+ Assert.assertFalse(document.body().html().contains("Hello"));
+ }
+
+ @Test
+ public void testHiEndpointV1() throws Exception {
+ Document document = getDocument("content/srr/examples/hi-v1.html");
+ Assert.assertEquals("We're testing some serious scripting here", document.select("h2").html());
+ Assert.assertTrue(document.body().html().contains("World"));
+ Assert.assertTrue(document.body().html().contains("Hallo"));
+ Assert.assertFalse(document.body().html().contains("Hello"));
+ }
+}
diff --git a/src/test/java/org/apache/sling/scripting/resolver/internal/ScriptMatchIT.java b/src/test/java/org/apache/sling/scripting/resolver/internal/ScriptMatchIT.java
new file mode 100644
index 0000000..4dfc6d5
--- /dev/null
+++ b/src/test/java/org/apache/sling/scripting/resolver/internal/ScriptMatchIT.java
@@ -0,0 +1,153 @@
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ~ 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.scripting.resolver.internal;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.Header;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpHead;
+import org.apache.http.client.methods.HttpOptions;
+import org.apache.http.client.methods.HttpPatch;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpTrace;
+import org.jsoup.nodes.Document;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ScriptMatchIT extends AbstractEndpointIT {
+
+ @Test
+ public void testGETMethodMatching() throws Exception {
+ testHttpMethodScriptMatching("/content/srr/examples/script-matching.html", HttpGet.METHOD_NAME);
+ }
+
+ @Test
+ public void testGETMethodSelectorMatching() throws Exception {
+ testHttpMethodScriptMatching("/content/srr/examples/script-matching.selector-1.html", HttpGet.METHOD_NAME);
+ }
+
+ @Test
+ public void testHEADMethodMatching() throws Exception {
+ HttpResponse response = getResponse(HttpHead.METHOD_NAME, "/content/srr/examples/script-matching.html", 200);
+ Header[] header = response.getHeaders("X-Script-Name");
+ assertEquals("Expected to find one X-Script-Name header.", 1, header.length);
+ assertEquals("/javax.script/org.apache.sling.scripting.examplebundle.scriptmatching/1.0.0/HEAD.html", header[0].getValue());
+ }
+
+ @Test
+ public void testHEADMethodSelectorMatching() throws Exception {
+ HttpResponse response = getResponse(HttpHead.METHOD_NAME, "/content/srr/examples/script-matching.selector-1.html", 200);
+ Header[] header = response.getHeaders("X-Script-Name");
+ assertEquals("Expected to find one X-Script-Name header.", 1, header.length);
+ assertEquals("/javax.script/org.apache.sling.scripting.examplebundle.scriptmatching/1.0.0/HEAD.selector-1.html",
+ header[0].getValue());
+ }
+
+ @Test
+ public void testOPTIONSMethodMatching() throws Exception {
+ testHttpMethodScriptMatching("/content/srr/examples/script-matching.html", HttpOptions.METHOD_NAME);
+ }
+
+ @Test
+ public void testOPTIONSMethodSelectorMatching() throws Exception {
+ testHttpMethodScriptMatching("/content/srr/examples/script-matching.selector-1.html", HttpOptions.METHOD_NAME);
+ }
+
+ @Test
+ public void testPOSTMethodMatching() throws Exception {
+ testHttpMethodScriptMatching("/content/srr/examples/script-matching.html", HttpPost.METHOD_NAME);
+ }
+
+ @Test
+ public void testPOSTMethodSelectorMatching() throws Exception {
+ testHttpMethodScriptMatching("/content/srr/examples/script-matching.selector-1.html", HttpPost.METHOD_NAME);
+ }
+
+ @Test
+ public void testPATCHMethodMatching() throws Exception {
+ testHttpMethodScriptMatching("/content/srr/examples/script-matching.html", HttpPatch.METHOD_NAME);
+ }
+
+ @Test
+ public void testPATCHMethodSelectorMatching() throws Exception {
+ testHttpMethodScriptMatching("/content/srr/examples/script-matching.selector-1.html", HttpPatch.METHOD_NAME);
+ }
+
+ @Test
+ public void testPUTMethodMatching() throws Exception {
+ testHttpMethodScriptMatching("/content/srr/examples/script-matching.html", HttpPut.METHOD_NAME);
+ }
+
+ @Test
+ public void testPUTMethodSelectorMatching() throws Exception {
+ testHttpMethodScriptMatching("/content/srr/examples/script-matching.selector-1.html", HttpPut.METHOD_NAME);
+ }
+
+ @Test
+ public void testDELETEMethodMatching() throws Exception {
+ testHttpMethodScriptMatching("/content/srr/examples/script-matching.html", HttpDelete.METHOD_NAME);
+ }
+
+ @Test
+ public void testDELETEMethodSelectorMatching() throws Exception {
+ testHttpMethodScriptMatching("/content/srr/examples/script-matching.selector-1.html", HttpDelete.METHOD_NAME);
+ }
+
+ @Test
+ public void testTRACEMethodMatching() throws Exception {
+ testHttpMethodScriptMatching("/content/srr/examples/script-matching.html", HttpTrace.METHOD_NAME);
+ }
+
+ @Test
+ public void testTRACEMethodSelectorMatching() throws Exception {
+ testHttpMethodScriptMatching("/content/srr/examples/script-matching.selector-1.html", HttpTrace.METHOD_NAME);
+ }
+
+ @Test
+ public void testSelectorMatching() throws Exception {
+ Document document = getDocument("/content/srr/examples/script-matching.selector-2.html");
+ assertTrue(document.select("div").html().contains("/javax.script/org.apache.sling.scripting.examplebundle" +
+ ".scriptmatching/1.0.0/selector-2.html"));
+ }
+
+ private void testHttpMethodScriptMatching(String url, String httpMethod) throws Exception {
+ Document document = getDocument(url, httpMethod);
+ String path = url.substring(url.lastIndexOf('/'));
+ String[] parts = path.split("\\.");
+ String selectorString = null;
+ String extension = null;
+ if (parts.length == 3) {
+ selectorString = parts[1];
+ extension = parts[2];
+ } else if (parts.length == 2) {
+ extension = parts[1];
+ } else {
+ throw new IllegalArgumentException("The following URL doesn't seem to be correctly handled: " + url);
+ }
+ String expectedScriptName = "/javax.script/org.apache.sling.scripting.examplebundle.scriptmatching/1.0.0/" + httpMethod +
+ (StringUtils.isNotEmpty(selectorString) ? "." + selectorString : "") + "." + extension;
+ assertTrue(document.select("div").html().contains(expectedScriptName));
+ }
+
+}
diff --git a/src/test/provisioning/it-model.txt b/src/test/provisioning/it-model.txt
new file mode 100644
index 0000000..9cef862
--- /dev/null
+++ b/src/test/provisioning/it-model.txt
@@ -0,0 +1,35 @@
+#
+# 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=scripting-resolver-it]
+
+# Dependencies
+[artifacts]
+ org.apache.sling/org.apache.sling.starter/11-SNAPSHOT/slingstart
+ org.apache.sling/org.apache.sling.scripting.sightly
+ org.apache.sling/org.apache.sling.scripting.resolver
+ org.apache.sling/org.apache.sling.scripting.examplebundle
+ org.apache.sling/org.apache.sling.scripting.examplebundle.precompiled
+ org.apache.sling/org.apache.sling.scripting.examplebundle.classic
+ org.apache.sling/org.apache.sling.scripting.examplebundle.hi
+ org.apache.sling/org.apache.sling.junit.core/1.0.26
+
+[configurations]
+ org.apache.sling.engine.impl.SlingMainServlet
+ sling.trace.allow=B"true"