/*******************************************************************************
* 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.sightly.it;
import java.io.IOException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.EntityBuilder;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.InputStreamBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.sling.testing.clients.util.FormEntityBuilder;
import org.junit.BeforeClass;
import org.junit.Test;
import io.sightly.tck.html.HTMLExtractor;
import io.sightly.tck.http.Client;
import static org.junit.Assert.*;
public class SlingSpecificsSightlyIT {
private static Client client;
private static String launchpadURL;
private static final String SLING_USE = "/sightly/use.html";
private static final String SLING_JAVA_USE_NPE = "/sightly/use.javaerror.html";
private static final String SLING_RESOURCE = "/sightly/resource.html";
private static final String SLING_RESOURCE_ACTUAL = "/sightly/actualresource.html";
private static final String SLING_TEMPLATE = "/sightly/template.html";
private static final String SLING_TEMPLATE_BAD_IDENTIFIER = "/sightly/template.bad-id.html";
private static final String SLING_JS_USE = "/sightly/use.jsuse.html";
private static final String SLING_JS_DEPENDENCY_RESOLUTION = "/sightly/use-sibling-dependency-resolution.html";
private static final String SLING_USE_INHERITANCE_WITHOVERLAY = "/sightly/useinheritance.html";
private static final String SLING_USE_INHERITANCE_WITHOUTOVERLAY = "/sightly/useinheritance.notoverlaid.html";
private static final String SLING_JAVA_USE_POJO_UPDATE = "/sightly/use.repopojo.html";
private static final String SLING_ATTRIBUTE_QUOTES = "/sightly/attributequotes.html";
private static final String SLING_CRLF = "/sightly/crlf";
private static final String SLING_CRLF_NOPKG = SLING_CRLF + ".nopkg.html";
private static final String SLING_CRLF_PKG = SLING_CRLF + ".pkg.html";
private static final String SLING_CRLF_WRONGPKG = SLING_CRLF + ".wrongpkg.html";
private static final String SLING_SCRIPT_UPDATE = "/sightly/update.html";
private static final String SLING_REQUEST_ATTRIBUTES = "/sightly/requestattributes.html";
private static final String SLING_REQUEST_ATTRIBUTES_INCLUDE = "/sightly/requestattributes.include.html";
private static final String SLING_RESOURCE_USE = "/sightly/use.resource.html";
private static final String SLING_I18N = "/sightly/i18n";
private static final String TCK_XSS = "/sightlytck/exprlang/xss.html";
private static final String WHITESPACE = "/sightly/whitespace.html";
@BeforeClass
public static void init() {
client = new Client();
launchpadURL = System.getProperty("launchpad.http.server.url");
}
@Test
public void testSlingModelsUseAPI() {
String url = launchpadURL + SLING_USE;
String pageContent = client.getStringContent(url, 200);
assertEquals("SUCCESS", HTMLExtractor.innerHTML(url, pageContent, "#reqmodel"));
assertEquals("SUCCESS", HTMLExtractor.innerHTML(url, pageContent, "#reqmodel-reqarg"));
assertEquals("nt:unstructured", HTMLExtractor.innerHTML(url, pageContent, "#reqmodel-bindings"));
assertEquals("SUCCESS", HTMLExtractor.innerHTML(url, pageContent, "#resmodel"));
}
@Test
public void testAdaptablesUseAPI() {
String url = launchpadURL + SLING_USE;
String pageContent = client.getStringContent(url, 200);
assertEquals("SUCCESS", HTMLExtractor.innerHTML(url, pageContent, "#resadapt"));
assertEquals("SUCCESS", HTMLExtractor.innerHTML(url, pageContent, "#reqadapt"));
}
@Test
public void testUseAPIWithOSGIService() {
String url = launchpadURL + SLING_USE;
String pageContent = client.getStringContent(url, 200);
assertEquals("Hello World!", HTMLExtractor.innerHTML(url, pageContent, "#osgi"));
}
@Test
public void testEnumConstantAsString() {
String url = launchpadURL + SLING_USE;
String pageContent = client.getStringContent(url, 200);
assertEquals("ENUM_CONSTANT", HTMLExtractor.innerHTML(url, pageContent, "#test-enum"));
}
@Test
public void testErroneousUseObject() {
String url = launchpadURL + SLING_JAVA_USE_NPE;
String pageContent = client.getStringContent(url, 500);
assertTrue(pageContent.contains("java.lang.NullPointerException"));
}
@Test
public void testDataSlyResourceArraySelectors() {
String url = launchpadURL + SLING_RESOURCE;
String pageContent = client.getStringContent(url, 200);
assertEquals("selectors: a.b", HTMLExtractor.innerHTML(url, pageContent, "#selectors span.selectors"));
assertEquals("selectors: a.b", HTMLExtractor.innerHTML(url, pageContent, "#selectors-remove-c span.selectors"));
assertEquals("selectors: a.c", HTMLExtractor.innerHTML(url, pageContent, "#removeselectors-remove-b span.selectors"));
assertEquals("selectors: a.b.c", HTMLExtractor.innerHTML(url, pageContent, "#addselectors span.selectors"));
assertEquals("It works", HTMLExtractor.innerHTML(url, pageContent, "#dot"));
assertEquals("path: /sightly/text.txt", HTMLExtractor.innerHTML(url, pageContent, "#extension-selectors span.path"));
assertEquals("selectors: a.b", HTMLExtractor.innerHTML(url, pageContent, "#extension-selectors span.selectors"));
assertEquals("path: /sightly/text.txt", HTMLExtractor.innerHTML(url, pageContent, "#extension-replaceselectors span.path"));
assertEquals("selectors: c", HTMLExtractor.innerHTML(url, pageContent, "#extension-replaceselectors span.selectors"));
}
@Test
public void testDataSlyResourceResolution() {
String url = launchpadURL + SLING_RESOURCE;
String pageContent = client.getStringContent(url, 200);
assertEquals("resource.with.dots.in.path", HTMLExtractor.innerHTML(url, pageContent, "#_sightly_resource_with_dots_in_path span" +
".name"));
assertEquals("/sightly/resource.with.dots.in.path", HTMLExtractor.innerHTML(url, pageContent, "#_sightly_resource_with_dots_in_path span" +
".path"));
assertEquals("false", HTMLExtractor.innerHTML(url, pageContent, "#_sightly_resource_with_dots_in_path span" +
".synthetic"));
assertEquals("nonexistingresource", HTMLExtractor.innerHTML(url, pageContent, "#_sightly_nonexistingresource span" +
".name"));
assertEquals("/sightly/nonexistingresource", HTMLExtractor.innerHTML(url, pageContent, "#_sightly_nonexistingresource span" +
".path"));
assertEquals("true", HTMLExtractor.innerHTML(url, pageContent, "#_sightly_nonexistingresource span.synthetic"));
assertEquals("resource", HTMLExtractor.innerHTML(url, pageContent, "#_sightly_resource span" +
".name"));
assertEquals("/sightly/resource", HTMLExtractor.innerHTML(url, pageContent, "#_sightly_resource span" +
".path"));
assertEquals("false", HTMLExtractor.innerHTML(url, pageContent, "#_sightly_resource span.synthetic"));
}
@Test
public void testDataSlyTemplate() {
String url = launchpadURL + SLING_TEMPLATE;
String pageContent = client.getStringContent(url, 200);
assertEquals("SUCCESS", HTMLExtractor.innerHTML(url, pageContent, "#template"));
}
@Test
public void testBadTemplateIdentifier() {
String url = launchpadURL + SLING_TEMPLATE_BAD_IDENTIFIER;
String pageContent = client.getStringContent(url, 500);
assertTrue(pageContent.contains(
"org.apache.sling.scripting.sightly.java.compiler.SightlyJavaCompilerException: Unsupported identifier name: bad-template-id"));
}
@Test
public void testJSUseAPI() {
String url = launchpadURL + SLING_JS_USE;
String pageContent = client.getStringContent(url, 200);
assertEquals("use", HTMLExtractor.innerHTML(url, pageContent, "#resource-name"));
assertEquals("use", HTMLExtractor.innerHTML(url, pageContent, "#resource-getName"));
assertEquals("/apps/sightly/scripts/use", HTMLExtractor.innerHTML(url, pageContent, "#resource-resourceType"));
assertEquals("/apps/sightly/scripts/use", HTMLExtractor.innerHTML(url, pageContent, "#resource-getResourceType"));
}
@Test
public void testJSUseAPISiblingDependencies() {
String url = launchpadURL + SLING_JS_DEPENDENCY_RESOLUTION;
String pageContent = client.getStringContent(url, 200);
assertEquals("/apps/sightly/scripts/siblingdeps/dependency.js", HTMLExtractor.innerHTML(url, pageContent, "#js-rep-res"));
}
@Test
public void testUseAPIInheritanceOverlaying() {
String url = launchpadURL + SLING_USE_INHERITANCE_WITHOVERLAY;
String pageContent = client.getStringContent(url, 200);
assertEquals("child.javaobject", HTMLExtractor.innerHTML(url, pageContent, "#javaobj"));
assertEquals("child.javascriptobject", HTMLExtractor.innerHTML(url, pageContent, "#javascriptobj"));
assertEquals("child.ecmaobject", HTMLExtractor.innerHTML(url, pageContent, "#ecmaobj"));
assertEquals("child.template", HTMLExtractor.innerHTML(url, pageContent, "#templateobj"));
assertEquals("child.partials.javascript", HTMLExtractor.innerHTML(url, pageContent, "#partialsjs"));
assertEquals("child.partials.ecmaobject", HTMLExtractor.innerHTML(url, pageContent, "#partialsecma"));
assertEquals("child.partials.template", HTMLExtractor.innerHTML(url, pageContent, "#partialstemplate"));
assertEquals("child.partials.included", HTMLExtractor.innerHTML(url, pageContent, "#partialsincluded"));
assertEquals("child.partials.javaobject", HTMLExtractor.innerHTML(url, pageContent, "#partialsjava"));
}
@Test
public void testUseAPIInheritanceWithoutOverlay() {
String url = launchpadURL + SLING_USE_INHERITANCE_WITHOUTOVERLAY;
String pageContent = client.getStringContent(url, 200);
assertEquals("notoverlaid", HTMLExtractor.innerHTML(url, pageContent, "#notoverlaid"));
}
@Test
public void testRepositoryPojoUpdate() throws Exception {
String url = launchpadURL + SLING_JAVA_USE_POJO_UPDATE;
String pageContent = client.getStringContent(url, 200);
assertEquals("original", HTMLExtractor.innerHTML(url + System.currentTimeMillis(), pageContent, "#repopojo"));
uploadFile("RepoPojo.java.updated", "RepoPojo.java", "/apps/sightly/scripts/use");
Thread.sleep(1000);
pageContent = client.getStringContent(url, 200);
assertEquals("updated", HTMLExtractor.innerHTML(url + System.currentTimeMillis(), pageContent, "#repopojo"));
uploadFile("RepoPojo.java.original", "RepoPojo.java", "/apps/sightly/scripts/use");
Thread.sleep(1000);
pageContent = client.getStringContent(url, 200);
assertEquals("original", HTMLExtractor.innerHTML(url + System.currentTimeMillis(), pageContent, "#repopojo"));
}
@Test
public void testRepositoryPojoUpdateDirty() throws Exception {
String url = launchpadURL + SLING_JAVA_USE_POJO_UPDATE;
String pageContent = client.getStringContent(url, 200);
assertEquals("original", HTMLExtractor.innerHTML(url + System.currentTimeMillis(), pageContent, "#repopojo"));
uploadFile("RepoPojo.java.updated", "RepoPojo.java", "/apps/sightly/scripts/use");
Thread.sleep(1000);
restartSightlyEngineBundle();
pageContent = client.getStringContent(url, 200);
assertEquals("updated", HTMLExtractor.innerHTML(url + System.currentTimeMillis(), pageContent, "#repopojo"));
uploadFile("RepoPojo.java.original", "RepoPojo.java", "/apps/sightly/scripts/use");
Thread.sleep(1000);
restartSightlyEngineBundle();
pageContent = client.getStringContent(url, 200);
assertEquals("original", HTMLExtractor.innerHTML(url + System.currentTimeMillis(), pageContent, "#repopojo"));
}
@Test
public void testScriptUpdate() throws Exception {
String url = launchpadURL + SLING_SCRIPT_UPDATE;
String pageContent = client.getStringContent(url, 200);
assertEquals("Hello world!", HTMLExtractor.innerHTML(url + System.currentTimeMillis(), pageContent, "#update"));
uploadFile("update.v2.html", "update.html", "/apps/sightly/scripts/update");
Thread.sleep(1000);
pageContent = client.getStringContent(url, 200);
assertEquals("Hello, John Doe!", HTMLExtractor.innerHTML(url + System.currentTimeMillis(), pageContent, "#update"));
uploadFile("update.html", "update.html", "/apps/sightly/scripts/update");
Thread.sleep(1000);
pageContent = client.getStringContent(url, 200);
assertEquals("Hello world!", HTMLExtractor.innerHTML(url + System.currentTimeMillis(), pageContent, "#update"));
}
@Test
public void testRepositoryPojoNoPkg() {
String url = launchpadURL + SLING_USE;
String pageContent = client.getStringContent(url, 200);
assertEquals("nopkg", HTMLExtractor.innerHTML(url, pageContent, "#repopojo-nopkg"));
}
@Test
public void testAttributeQuotes() {
String url = launchpadURL + SLING_ATTRIBUTE_QUOTES;
String pageContent = client.getStringContent(url, 200);
// need to test against the raw content
assertTrue(pageContent.contains("<span data-resource='{\"resource\" : \"/sightly/attributequotes\"}'>/sightly/attributequotes</span>"));
assertTrue(pageContent.contains("<span data-resource=\"/sightly/attributequotes\">/sightly/attributequotes</span>"));
assertTrue(pageContent.contains("<span data-resource=\"/sightly/attributequotes\">/sightly/attributequotes</span>"));
}
@Test
public void testCRLFNoPkg() {
String url = launchpadURL + SLING_CRLF_NOPKG;
String pageContent = client.getStringContent(url, 200);
assertEquals("nopkg", HTMLExtractor.innerHTML(url, pageContent, "#repopojocrlf-nopkg"));
}
@Test
public void testCRLFPkg() {
String url = launchpadURL + SLING_CRLF_PKG;
String pageContent = client.getStringContent(url, 200);
assertEquals("pkg", HTMLExtractor.innerHTML(url, pageContent, "#repopojocrlf-pkg"));
}
@Test
public void testCRLFWrongPkg() {
String url = launchpadURL + SLING_CRLF_WRONGPKG;
String pageContent = client.getStringContent(url, 500);
assertTrue(pageContent.contains("Compilation errors in apps/sightly/scripts/crlf/RepoPojoWrongPkgCRLF.java"));
}
@Test
public void actualResource() {
String url = launchpadURL + SLING_RESOURCE_ACTUAL;
String pageContent = client.getStringContent(url, 200);
String hash = HTMLExtractor.innerHTML(url, pageContent, "#hash");
String actual = HTMLExtractor.innerHTML(url, pageContent, "#actual");
String path = HTMLExtractor.innerHTML(url, pageContent, "#path");
assertEquals(hash, actual);
assertNotEquals(hash, path);
}
@Test
public void testRequestAttributes() {
String url = launchpadURL + SLING_REQUEST_ATTRIBUTES;
String pageContent = client.getStringContent(url, 200);
assertEquals("testValue", HTMLExtractor.innerHTML(url, pageContent, "#attrs-set"));
assertEquals("", HTMLExtractor.innerHTML(url, pageContent, "#attrs-unset"));
}
@Test
public void testRequestAttributesInclude() {
String url = launchpadURL + SLING_REQUEST_ATTRIBUTES_INCLUDE;
String pageContent = client.getStringContent(url, 200);
assertEquals("testValue", HTMLExtractor.innerHTML(url, pageContent, "#attrs-set"));
assertEquals("", HTMLExtractor.innerHTML(url, pageContent, "#attrs-unset"));
}
@Test
public void testResourceUse() {
String url = launchpadURL + SLING_RESOURCE_USE;
String pageContent = client.getStringContent(url, 200);
assertEquals("foobar-someresource", HTMLExtractor.innerHTML(url, pageContent, "#someresource .data"));
assertEquals("foobar-somefolder", HTMLExtractor.innerHTML(url, pageContent, "#somefolder .data"));
assertEquals("foobar-sometemplate", HTMLExtractor.innerHTML(url, pageContent, "#sometemplate .data"));
assertEquals("foobar-somejava", HTMLExtractor.innerHTML(url, pageContent, "#somejava .data"));
assertEquals("foobar-somejs", HTMLExtractor.innerHTML(url, pageContent, "#somejs .data"));
assertEquals("foobar-someecma", HTMLExtractor.innerHTML(url, pageContent, "#someecma .data"));
}
@Test
public void testI18nBasename() {
String url = launchpadURL + SLING_I18N + ".basename.html";
String pageContent = client.getStringContent(url, 200);
assertEquals("die Bank", HTMLExtractor.innerHTML(url, pageContent, "#i18n-basename-finance"));
assertEquals("das Ufer", HTMLExtractor.innerHTML(url, pageContent, "#i18n-nobasename"));
}
@Test
public void testXSSAttributeEscaping() {
String url = launchpadURL + TCK_XSS;
String pageContent = client.getStringContent(url, 200);
assertTrue(pageContent.contains("<p id=\"req-context-8\" onclick=\"console.log('red')\">Paragraph</p>"));
}
@Test
public void testWhiteSpaceExpressions() {
String url = launchpadURL + WHITESPACE;
String pageContent = client.getStringContent(url, 200);
assertEquals("true", HTMLExtractor.innerHTML(url, pageContent, "#nbsp"));
assertEquals("true", HTMLExtractor.innerHTML(url, pageContent, "#tab"));
assertEquals("true", HTMLExtractor.innerHTML(url, pageContent, "#newline"));
}
private void restartSightlyEngineBundle() throws InterruptedException, IOException {
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(launchpadURL + "/system/console/bundles/org.apache.sling.scripting.sightly");
// Stop bundle
FormEntityBuilder formBuilder = FormEntityBuilder.create();
post.setHeader("Authorization", "Basic YWRtaW46YWRtaW4=");
formBuilder.addParameter("action", "stop");
post.setEntity(formBuilder.build());
httpClient.execute(post);
Thread.sleep(1000);
// Start bundle
formBuilder = FormEntityBuilder.create();
post.setHeader("Authorization", "Basic YWRtaW46YWRtaW4=");
formBuilder.addParameter("action", "start");
post.setEntity(formBuilder.build());
httpClient.execute(post);
Thread.sleep(1000);
}
private void uploadFile(String fileName, String serverFileName, String url) throws IOException {
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(launchpadURL + url);
post.setHeader("Authorization", "Basic YWRtaW46YWRtaW4=");
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
InputStreamBody inputStreamBody = new InputStreamBody(this.getClass().getClassLoader().getResourceAsStream(fileName),
ContentType.TEXT_PLAIN, fileName);
entityBuilder.addPart(serverFileName, inputStreamBody);
post.setEntity(entityBuilder.build());
httpClient.execute(post);
}
}