blob: 84150977f194036720e119b5c3c319d52be3b51f [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 java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.sling.commons.testing.integration.HttpTest;
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.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
/** Test the {link ScriptHelper#forward) functionality */
public class JspForwardTest {
private String nodeUrlA;
private String testTextA;
private String nodeUrlB;
private String testTextB;
private String nodeUrlC;
private String nodeUrlD;
private String nodeUrlE;
private String nodeUrlF;
private String scriptPath;
private String forcedResourceType;
private Set<String> toDelete = new HashSet<String>();
/** HTTP tests helper */
private final HttpTest H = new HttpTest();
@Rule
public RetryRule retryRule = new RetryRule();
@Before
public void setUp() throws Exception {
H.setUp();
// Create the test nodes under a path that's specific to this class to
// allow collisions
final String url = HttpTest.HTTP_BASE_URL + "/" + getClass().getSimpleName() + "/" + System.currentTimeMillis() + SlingPostConstants.DEFAULT_CREATE_SUFFIX;
final Map<String,String> props = new HashMap<String,String>();
// Create two test nodes and store their paths
testTextA = "Text A " + System.currentTimeMillis();
props.put("text", testTextA);
nodeUrlA = H.getTestClient().createNode(url, props);
String pathToInclude = nodeUrlA.substring(HttpTest.HTTP_BASE_URL.length());
// Node B stores the path of A, so that the test script can
// forward A when rendering B
testTextB = "Text B " + System.currentTimeMillis();
props.put("text", testTextB);
props.put("pathToInclude", pathToInclude);
nodeUrlB = H.getTestClient().createNode(url, props);
// Node E is like B but with an extension on the forward path
props.put("pathToInclude", pathToInclude + ".html");
nodeUrlE = H.getTestClient().createNode(url, props);
// Node F is like E but uses jsp:include
props.put("pathToInclude", pathToInclude + ".html");
props.put("forwardStyle", "jsp");
nodeUrlF = H.getTestClient().createNode(url, props);
// Node C is used for the infinite loop detection test
props.remove("pathToInclude");
props.remove("forwardStyle");
props.put("testInfiniteLoop","true");
nodeUrlC = H.getTestClient().createNode(url, props);
// Node D is used for the "force resource type" test
forcedResourceType = getClass().getSimpleName() + "/" + System.currentTimeMillis();
props.remove("testInfiniteLoop");
props.put("forceResourceType", forcedResourceType);
props.put("pathToInclude", pathToInclude);
nodeUrlD = H.getTestClient().createNode(url, props);
// Script for forced resource type
scriptPath = "/apps/" + forcedResourceType;
H.getTestClient().mkdirs(HttpTest.WEBDAV_BASE_URL, scriptPath);
toDelete.add(H.uploadTestScript(scriptPath,"forward-forced.jsp","html.jsp"));
// The main rendering script goes under /apps in the repository
scriptPath = "/apps/nt/unstructured";
H.getTestClient().mkdirs(HttpTest.WEBDAV_BASE_URL, scriptPath);
toDelete.add(H.uploadTestScript(scriptPath,"forward-test.jsp","html.jsp"));
}
@After
public void tearDown() throws Exception {
H.tearDown();
for(String script : toDelete) {
H.getTestClient().delete(script);
}
}
@Test
@Retry
public void testWithoutForward() throws IOException {
final String content = H.getContent(nodeUrlA + ".html", HttpTest.CONTENT_TYPE_HTML);
assertTrue("Content includes JSP marker",content.contains("JSP template"));
assertTrue("Content contains formatted test text",content.contains("<p class=\"main\">" + testTextA + "</p>"));
}
@Test
@Retry
public void testWithForward() throws IOException {
final String content = H.getContent(nodeUrlB + ".html", HttpTest.CONTENT_TYPE_HTML);
assertTrue("Content includes JSP marker",content.contains("JSP template"));
assertTrue("Content contains formatted test text",content.contains("<p class=\"main\">" + testTextA + "</p>"));
assertTrue("Text of node A is not included (" + content + ")",!content.contains(testTextB));
}
@Test
@Retry
public void testWithForwardAndExtension() throws IOException {
final String content = H.getContent(nodeUrlE + ".html", HttpTest.CONTENT_TYPE_HTML);
assertTrue("Content includes JSP marker",content.contains("JSP template"));
assertTrue("Content contains formatted test text",content.contains("<p class=\"main\">" + testTextA + "</p>"));
assertTrue("Text of node A is not included (" + content + ")",!content.contains(testTextB));
}
@Test
@Retry
public void testWithJspForward() throws IOException {
final String content = H.getContent(nodeUrlF + ".html", HttpTest.CONTENT_TYPE_HTML);
assertTrue("Content includes JSP marker",content.contains("JSP template"));
assertTrue("Content contains formatted test text",content.contains("<p class=\"main\">" + testTextA + "</p>"));
assertTrue("Text of node A is not included (" + content + ")",!content.contains(testTextB));
}
@Test
@Retry
public void testInfiniteLoopDetection() throws IOException {
// Node C has a property that causes an infinite include loop,
// Sling must indicate the problem in its response
final GetMethod get = new GetMethod(nodeUrlC + ".html");
H.getHttpClient().executeMethod(get);
final String content = get.getResponseBodyAsString();
assertTrue(
"Response contains infinite loop error message",
content.contains("org.apache.sling.api.request.RecursionTooDeepException"));
// TODO: SLING-515, status is 500 when running the tests as part of the maven build
// but 200 if running tests against a separate instance started with mvn jetty:run
// final int status = get.getStatusCode();
// assertEquals("Status is 500 for infinite loop",HttpServletResponse.SC_INTERNAL_SERVER_ERROR, status);
}
@Test
@Retry
public void testForcedResourceType() throws IOException {
final String content = H.getContent(nodeUrlD + ".html", HttpTest.CONTENT_TYPE_HTML);
assertTrue("Content includes JSP marker",content.contains("JSP template"));
assertTrue("Content contains formatted test text",content.contains("<p class=\"main\">" + testTextA + "</p>"));
assertTrue("Text of node A is included (" + content + ")",!content.contains(testTextB));
assertTrue("Resource type has been forced (" + content + ")",content.contains("Forced resource type:" + forcedResourceType));
}
}