blob: 17f201e51d6f3819de2de22bf8c767a491c6fb68 [file] [log] [blame]
/*
* 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.launchpad.webapp.integrationtest;
import static org.junit.Assert.assertTrue;
import org.apache.sling.commons.testing.integration.HttpTest;
import org.apache.sling.commons.testing.integration.HttpTestNode;
import org.apache.sling.commons.testing.junit.Retry;
import org.apache.sling.commons.testing.junit.RetryRule;
import org.apache.sling.servlets.post.SlingPostConstants;
import org.apache.sling.testing.tools.retry.RetryLoop;
import org.apache.sling.testing.tools.retry.RetryLoop.Condition;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
/** Test JSP scripting
* TODO this class can be generalized to be used for any scripting language,
* that would help in testing all scripting engines.
*/
public class JspScriptingTest {
private String testRootUrl;
private HttpTestNode rtNode;
private HttpTestNode unstructuredNode;
public static final int CHECK_CONTENT_TIMEOUT_SECONDS = 5;
public static final int CHECK_CONTENT_INTERVAL_MSEC = 500;
/** HTTP tests helper */
private final HttpTest H = new HttpTest();
@Rule
public RetryRule retryRule = new RetryRule();
@Before
public void setUp() throws Exception {
H.setUp();
final String testRootPath = HttpTest.HTTP_BASE_URL + "/" + getClass().getSimpleName() + "/" + System.currentTimeMillis();
testRootUrl = H.getTestClient().createNode(testRootPath + SlingPostConstants.DEFAULT_CREATE_SUFFIX, null);
rtNode = new HttpTestNode(H.getTestClient(), testRootPath + "/rt", null);
unstructuredNode = new HttpTestNode(H.getTestClient(), testRootPath + "/unstructured", null);
}
@Before
public void tearDown() throws Exception {
H.getTestClient().delete(testRootUrl);
H.tearDown();
}
@Test
@Retry
public void testRtNoScript() throws Exception {
final String content = H.getContent(rtNode.nodeUrl + ".txt", HttpTest.CONTENT_TYPE_PLAIN);
assertTrue(content.contains("PlainTextRenderer"));
assertTrue("Content contains " + rtNode.testText + " (" + content + ")", content.contains(rtNode.testText));
}
@Test
@Retry
public void testUnstructuredNoScript() throws Exception {
final String content = H.getContent(unstructuredNode.nodeUrl + ".txt", HttpTest.CONTENT_TYPE_PLAIN);
assertTrue(content.contains("PlainTextRenderer"));
assertTrue("Content contains " + unstructuredNode.testText + " (" + content + ")", content.contains(unstructuredNode.testText));
}
@Test
@Retry
public void testRtJsp() throws Exception {
final String toDelete = H.uploadTestScript(rtNode.scriptPath, "rendering-test.jsp", "html.jsp");
try {
checkContent(rtNode);
} finally {
if(toDelete != null) {
H.getTestClient().delete(toDelete);
}
}
}
@Test
@Retry
public void testUnstructuredJsp() throws Exception {
final String toDelete = H.uploadTestScript(unstructuredNode.scriptPath, "rendering-test.jsp", "html.jsp");
try {
checkContent(unstructuredNode);
} finally {
if(toDelete != null) {
H.getTestClient().delete(toDelete);
}
}
}
@Test
@Retry
public void testTagFile() throws Exception {
String tagFile = null;
String tagUsingScript = null;
try {
H.getTestClient().mkdirs(HttpTest.WEBDAV_BASE_URL, "/apps/testing/tags");
tagFile = H.uploadTestScript("/apps/testing/tags", "example.tag", "example.tag");
tagUsingScript = H.uploadTestScript(unstructuredNode.scriptPath, "withtag.jsp", "html.jsp");
final String content = H.getContent(unstructuredNode.nodeUrl + ".html", HttpTest.CONTENT_TYPE_HTML);
assertTrue("JSP script executed as expected (" + content + ")", content.contains("<h1>Hello, Sling User</h1>"));
} finally {
if (tagFile != null) {
H.getTestClient().delete(tagFile);
}
if (tagUsingScript != null) {
H.getTestClient().delete(tagUsingScript);
}
}
}
/* Verify that overwriting a JSP script changes the output within a reasonable time
* (might not be immediate as there's some observation and caching involved) */
@Test
public void testChangingJsp() throws Exception {
String toDelete = null;
try {
final String [] scripts = { "jsp1.jsp", "jsp2.jsp" };
for(String script : scripts) {
toDelete = H.uploadTestScript(unstructuredNode.scriptPath, script, "html.jsp");
final String expected = "text from " + script + ":" + unstructuredNode.testText;
final Condition c = new Condition() {
public String getDescription() {
return "Expecting " + expected;
}
public boolean isTrue() throws Exception {
final String content = H.getContent(unstructuredNode.nodeUrl + ".html", HttpTest.CONTENT_TYPE_HTML);
return content.contains(expected);
}
};
new RetryLoop(c, CHECK_CONTENT_TIMEOUT_SECONDS, CHECK_CONTENT_INTERVAL_MSEC);
}
} finally {
if(toDelete != null) {
H.getTestClient().delete(toDelete);
}
}
}
@Test
@Retry
public void testEnum() throws Exception {
String toDelete = null;
try {
toDelete = H.uploadTestScript(unstructuredNode.scriptPath, "enum-test.jsp", "txt.jsp");
final String content = H.getContent(unstructuredNode.nodeUrl + ".txt", HttpTest.CONTENT_TYPE_PLAIN);
for(String expected : new String[] { "FOO=FOO", "BAR=BAR"}) {
assertTrue("Content contains '" + expected + "'(" + content + ")", content.contains(expected));
}
} finally {
if(toDelete != null) {
H.getTestClient().delete(toDelete);
}
}
}
private void checkContent(final HttpTestNode tn) throws Exception {
final String content = H.getContent(tn.nodeUrl + ".html", HttpTest.CONTENT_TYPE_HTML);
assertTrue("JSP script executed as expected (" + content + ")", content.contains("<h1>JSP rendering result</h1>"));
final String [] expected = {
"using resource.adaptTo:" + tn.testText,
"using currentNode:" + tn.testText,
};
for(String exp : expected) {
assertTrue("Content contains " + exp + "(" + content + ")", content.contains(exp));
}
}
}