blob: 5f3775aa193162c26a69869df78d46c9e4df756a [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.jasper.compiler;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.beans.PropertyEditorSupport;
import java.io.File;
import java.io.IOException;
import java.nio.charset.CodingErrorAction;
import java.util.Date;
import java.util.Scanner;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.jsp.JspException;
import jakarta.servlet.jsp.PageContext;
import jakarta.servlet.jsp.tagext.BodyTagSupport;
import jakarta.servlet.jsp.tagext.DynamicAttributes;
import jakarta.servlet.jsp.tagext.JspIdConsumer;
import jakarta.servlet.jsp.tagext.Tag;
import jakarta.servlet.jsp.tagext.TagData;
import jakarta.servlet.jsp.tagext.TagExtraInfo;
import jakarta.servlet.jsp.tagext.TagSupport;
import jakarta.servlet.jsp.tagext.TryCatchFinally;
import jakarta.servlet.jsp.tagext.VariableInfo;
import org.junit.Assert;
import org.junit.Test;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.Wrapper;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.startup.TomcatBaseTest;
import org.apache.jasper.servlet.JasperInitializer;
import org.apache.tomcat.util.buf.ByteChunk;
public class TestGenerator extends TomcatBaseTest {
private static final String NEW_LINE = System.lineSeparator();
@Test
public void testBug45015a() throws Exception {
getTomcatInstanceTestWebapp(false, true);
ByteChunk res = getUrl("http://localhost:" + getPort() + "/test/bug45nnn/bug45015a.jsp");
String result = res.toString();
// Beware of the differences between escaping in JSP attributes and
// in Java Strings
assertEcho(result, "00-hello 'world'");
assertEcho(result, "01-hello 'world");
assertEcho(result, "02-hello world'");
assertEcho(result, "03-hello world'");
assertEcho(result, "04-hello world\"");
assertEcho(result, "05-hello \"world\"");
assertEcho(result, "06-hello \"world");
assertEcho(result, "07-hello world\"");
assertEcho(result, "08-hello world'");
assertEcho(result, "09-hello world\"");
}
@Test
public void testBug45015b() throws Exception {
getTomcatInstanceTestWebapp(false, true);
int rc = getUrl("http://localhost:" + getPort() + "/test/bug45nnn/bug45015b.jsp", new ByteChunk(), null);
Assert.assertEquals(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, rc);
}
@Test
public void testBug45015c() throws Exception {
getTomcatInstanceTestWebapp(false, true);
int rc = getUrl("http://localhost:" + getPort() + "/test/bug45nnn/bug45015c.jsp", new ByteChunk(), null);
Assert.assertEquals(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, rc);
}
@Test
public void testBug48701Fail() throws Exception {
getTomcatInstanceTestWebapp(true, true);
int rc = getUrl("http://localhost:" + getPort() + "/test/bug48nnn/bug48701-fail.jsp", new ByteChunk(), null);
Assert.assertEquals(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, rc);
}
@Test
public void testBug48701UseBean() throws Exception {
testBug48701("bug48nnn/bug48701-UseBean.jsp");
}
@Test
public void testBug48701VariableInfo() throws Exception {
testBug48701("bug48nnn/bug48701-VI.jsp");
}
@Test
public void testBug48701TagVariableInfoNameGiven() throws Exception {
testBug48701("bug48nnn/bug48701-TVI-NG.jsp");
}
@Test
public void testBug48701TagVariableInfoNameFromAttribute() throws Exception {
testBug48701("bug48nnn/bug48701-TVI-NFA.jsp");
}
private void testBug48701(String jsp) throws Exception {
getTomcatInstanceTestWebapp(false, true);
ByteChunk res = getUrl("http://localhost:" + getPort() + "/test/" + jsp);
String result = res.toString();
assertEcho(result, "00-PASS");
}
public static class Bug48701 extends TagSupport {
private static final long serialVersionUID = 1L;
private String beanName = null;
public void setBeanName(String beanName) {
this.beanName = beanName;
}
public String getBeanName() {
return beanName;
}
@Override
public int doStartTag() throws JspException {
Bean bean = new Bean();
bean.setTime((new Date()).toString());
pageContext.setAttribute("now", bean);
return super.doStartTag();
}
}
public static class Bug48701TEI extends TagExtraInfo {
@Override
public VariableInfo[] getVariableInfo(TagData data) {
return new VariableInfo[] {
new VariableInfo("now", Bean.class.getCanonicalName(), true, VariableInfo.AT_END) };
}
}
public static class Bean {
private String time;
public void setTime(String time) {
this.time = time;
}
public String getTime() {
return time;
}
}
@Test
public void testBug49799() throws Exception {
String[] expected =
{ "<p style=\"color:red\">00-Red</p>", "<p>01-Not Red</p>", "<p style=\"color:red\">02-Red</p>",
"<p>03-Not Red</p>", "<p style=\"color:red\">04-Red</p>", "<p>05-Not Red</p>" };
getTomcatInstanceTestWebapp(false, true);
ByteChunk res = new ByteChunk();
getUrl("http://localhost:" + getPort() + "/test/bug49nnn/bug49799.jsp", res, null);
// Check request completed
String result = res.toString();
String[] lines = result.split("\n|\r|\r\n");
int i = 0;
for (String line : lines) {
if (line.length() > 0) {
Assert.assertEquals(expected[i], line);
i++;
}
}
}
/** Assertion for text printed by tags:echo */
private static void assertEcho(String result, String expected) {
Assert.assertTrue(result.indexOf("<p>" + expected + "</p>") > 0);
}
@Test
public void testBug56529() throws Exception {
getTomcatInstanceTestWebapp(false, true);
ByteChunk bc = new ByteChunk();
int rc = getUrl("http://localhost:" + getPort() + "/test/bug5nnnn/bug56529.jsp", bc, null);
Assert.assertEquals(HttpServletResponse.SC_OK, rc);
String response = bc.toStringInternal(CodingErrorAction.REPORT, CodingErrorAction.REPORT);
Assert.assertTrue(response, response.contains("[1:attribute1: '', attribute2: '']"));
Assert.assertTrue(response, response.contains("[2:attribute1: '', attribute2: '']"));
}
public static class Bug56529 extends TagSupport {
private static final long serialVersionUID = 1L;
private String attribute1 = null;
private String attribute2 = null;
public void setAttribute1(String attribute1) {
this.attribute1 = attribute1;
}
public String getAttribute1() {
return attribute1;
}
public void setAttribute2(String attribute2) {
this.attribute2 = attribute2;
}
public String getAttribute2() {
return attribute2;
}
@Override
public int doEndTag() throws JspException {
try {
pageContext.getOut().print("attribute1: '" + attribute1 + "', " + "attribute2: '" + attribute2 + "'");
} catch (IOException ioe) {
throw new JspException(ioe);
}
return EVAL_PAGE;
}
}
@Test
public void testBug56581() throws LifecycleException {
getTomcatInstanceTestWebapp(false, true);
ByteChunk res = new ByteChunk();
try {
getUrl("http://localhost:" + getPort() + "/test/bug5nnnn/bug56581.jsp", res, null);
Assert.fail("An IOException was expected.");
} catch (IOException ignore) {
/*
* ErrorReportValve flushes and aborts the connection when an unexpected error is encountered and response
* has already been committed. It results in an exception here: java.io.IOException: Premature EOF
*/
}
String result = res.toString();
Assert.assertTrue(result.startsWith("0 Hello world!\n"));
Assert.assertTrue(result.endsWith("999 Hello world!\n"));
}
// https://bz.apache.org/bugzilla/show_bug.cgi?id=43400
@Test
public void testTagsWithEnums() throws Exception {
getTomcatInstanceTestWebapp(false, true);
ByteChunk res = getUrl("http://localhost:" + getPort() + "/test/bug43nnn/bug43400.jsp");
String result = res.toString();
System.out.println(result);
assertEcho(result, "ASYNC");
}
@Test
public void testTrimSpacesExtended01() throws Exception {
doTestTrimSpacesExtended(false);
}
@Test
public void testTrimSpacesExtended02() throws Exception {
doTestTrimSpacesExtended(true);
}
private void doTestTrimSpacesExtended(boolean removeBlankLines) throws Exception {
Tomcat tomcat = getTomcatInstance();
File appDir = new File("test/webapp");
Context ctxt = tomcat.addContext("", appDir.getAbsolutePath());
ctxt.addServletContainerInitializer(new JasperInitializer(), null);
Tomcat.initWebappDefaults(ctxt);
Wrapper w = (Wrapper) ctxt.findChild("jsp");
if (removeBlankLines) {
w.addInitParameter("trimSpaces", "extended");
}
tomcat.start();
ByteChunk res = getUrl("http://localhost:" + getPort() + "/jsp/trim-spaces-extended.jsp");
String result = res.toString();
Scanner scanner = new Scanner(result);
int blankLineCount = 0;
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.length() == 0) {
blankLineCount++;
}
}
if (!removeBlankLines && blankLineCount == 0) {
Assert.fail("TrimSpaceOptions.EXTENDED not configured but blank lines have been removed");
} else if (removeBlankLines && blankLineCount > 0) {
Assert.fail("TrimSpaceOptions.EXTENDED does not allow the line to be just a new line character");
}
scanner.close();
}
@Test
public void testEscape01() {
String result = Generator.escape("\"\\\n\r");
Assert.assertEquals("\\\"\\\\\\n\\r", result);
}
@Test
public void testEscape02() {
String result = Generator.escape("\\");
Assert.assertEquals("\\\\", result);
}
@Test
public void testEscape03() {
String result = Generator.escape("xxx\\");
Assert.assertEquals("xxx\\\\", result);
}
@Test
public void testEscape04() {
String result = Generator.escape("\\xxx");
Assert.assertEquals("\\\\xxx", result);
}
@Test
public void testQuote01() {
String result = Generator.quote('\'');
Assert.assertEquals("\'\\\'\'", result);
}
@Test
public void testQuote02() {
String result = Generator.quote('\\');
Assert.assertEquals("\'\\\\\'", result);
}
@Test
public void testQuote03() {
String result = Generator.quote('\n');
Assert.assertEquals("\'\\n\'", result);
}
@Test
public void testQuote04() {
String result = Generator.quote('\r');
Assert.assertEquals("\'\\r\'", result);
}
@Test
public void testQuote05() {
String result = Generator.quote('x');
Assert.assertEquals("\'x\'", result);
}
@Test
public void testJspId() throws Exception {
doTestJspId(false);
}
@Test
public void testJspIdDocument() throws Exception {
doTestJspId(true);
}
@Test
public void testNonstandardSets() throws Exception {
getTomcatInstanceTestWebapp(true, true);
// This should break all subsequent requests
ByteChunk body = new ByteChunk();
getUrl("http://localhost:" + getPort() + "/test/jsp/generator/nonstandard/set-01.jsp", body, null);
Assert.assertEquals(NEW_LINE + NEW_LINE + NEW_LINE
+ "pageContext value=testValue" + NEW_LINE
+ "request value=null" + NEW_LINE
+ "session value=null" + NEW_LINE
+ "application value=null", body.toString());
body.recycle();
getUrl("http://localhost:" + getPort() + "/test/jsp/generator/nonstandard/set-02.jsp", body, null);
Assert.assertEquals(NEW_LINE + NEW_LINE + NEW_LINE
+ "pageContext value=testValue" + NEW_LINE
+ "request value=null" + NEW_LINE
+ "session value=null" + NEW_LINE
+ "application value=null", body.toString());
body.recycle();
getUrl("http://localhost:" + getPort() + "/test/jsp/generator/nonstandard/set-03.jsp", body, null);
Assert.assertEquals(NEW_LINE + NEW_LINE + NEW_LINE
+ "pageContext value=null" + NEW_LINE
+ "request value=testValue" + NEW_LINE
+ "session value=null" + NEW_LINE
+ "application value=null", body.toString());
body.recycle();
getUrl("http://localhost:" + getPort() + "/test/jsp/generator/nonstandard/set-04.jsp", body, null);
Assert.assertEquals(NEW_LINE + NEW_LINE + NEW_LINE
+ "pageContext value=null" + NEW_LINE
+ "request value=null" + NEW_LINE
+ "session value=testValue" + NEW_LINE
+ "application value=null", body.toString());
body.recycle();
getUrl("http://localhost:" + getPort() + "/test/jsp/generator/nonstandard/set-05.jsp", body, null);
Assert.assertEquals(NEW_LINE + NEW_LINE + NEW_LINE
+ "pageContext value=null" + NEW_LINE
+ "request value=null" + NEW_LINE
+ "session value=null" + NEW_LINE
+ "application value=testValue", body.toString());
body.recycle();
}
private void doTestJspId(boolean document) throws Exception {
getTomcatInstanceTestWebapp(false, true);
String uri = "http://localhost:" + getPort() + "/test/jsp/generator/jsp-id.jsp";
if (document) {
uri += "x";
}
ByteChunk res = getUrl(uri);
String result = res.toString();
// Two tags should have different IDs
String[] ids = new String[2];
int start = 0;
int end = 0;
for (int i = 0; i < ids.length; i++) {
start = result.indexOf("Jsp ID is [", start) + 11;
end = result.indexOf("]", start);
ids[i] = result.substring(start, end);
}
// Confirm the IDs are not the same
Assert.assertNotEquals(ids[0], ids[1]);
}
@Test
public void testTryCatchFinally02() throws Exception {
doTestJsp("try-catch-finally-02.jsp");
}
public static class JspIdTag extends TagSupport implements JspIdConsumer {
private static final long serialVersionUID = 1L;
private volatile String jspId;
@Override
public int doStartTag() throws JspException {
try {
pageContext.getOut().print("<p>Jsp ID is [" + jspId + "]</p>");
} catch (IOException ioe) {
throw new JspException(ioe);
}
return super.doStartTag();
}
@Override
public void setJspId(String jspId) {
this.jspId = jspId;
}
}
public static class TryCatchFinallyBodyTag extends BodyTagSupport implements TryCatchFinally {
private static final long serialVersionUID = 1L;
@Override
public int doStartTag() throws JspException {
try {
pageContext.getOut().print("<p>OK</p>");
} catch (IOException ioe) {
throw new JspException(ioe);
}
return super.doStartTag();
}
@Override
public void doCatch(Throwable t) throws Throwable {
// NO-OP
}
@Override
public void doFinally() {
// NO-OP
}
}
public static class TryCatchFinallyTag extends TagSupport implements TryCatchFinally {
private static final long serialVersionUID = 1L;
@Override
public void doCatch(Throwable t) throws Throwable {
// NO-OP
}
@Override
public void doFinally() {
// NO-OP
}
}
public static class TesterBodyTag extends BodyTagSupport {
private static final long serialVersionUID = 1L;
@Override
public int doStartTag() throws JspException {
try {
pageContext.getOut().print("<p>OK</p>");
} catch (IOException ioe) {
throw new JspException(ioe);
}
return super.doStartTag();
}
}
public static class TesterTag implements Tag {
private Tag parent;
@Override
public void setPageContext(PageContext pc) {
}
@Override
public void setParent(Tag t) {
parent = t;
}
@Override
public Tag getParent() {
return parent;
}
@Override
public int doStartTag() throws JspException {
return 0;
}
@Override
public int doEndTag() throws JspException {
return 0;
}
@Override
public void release() {
}
}
public static class TesterTagA extends TesterTag {
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
private static boolean tagTesterTagReleaseReleased = false;
public static class TesterTagRelease extends TesterTag {
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
@Override
public void release() {
tagTesterTagReleaseReleased = true;
}
}
public static class DataPropertyEditor extends PropertyEditorSupport {
}
public static class TesterScriptingTag extends TagSupport {
private static final long serialVersionUID = 1L;
private String attribute02;
private String attribute03;
public String getAttribute02() {
return attribute02;
}
public void setAttribute02(String attribute02) {
this.attribute02 = attribute02;
}
public String getAttribute03() {
return attribute03;
}
public void setAttribute03(String attribute03) {
this.attribute03 = attribute03;
}
}
public static class TesterScriptingTagB extends TagSupport {
private static final long serialVersionUID = 1L;
private String attribute02;
public String getAttribute02() {
return attribute02;
}
public void setAttribute02(String attribute02) {
this.attribute02 = attribute02;
}
}
public static class TesterScriptingTagBTEI extends TagExtraInfo {
@Override
public VariableInfo[] getVariableInfo(TagData data) {
return new VariableInfo[] { new VariableInfo("variable01", "java.lang.String", true, VariableInfo.NESTED),
new VariableInfo(data.getAttribute("attribute02").toString(), "java.lang.String", true,
VariableInfo.NESTED),
new VariableInfo("variable03", "java.lang.String", false, VariableInfo.NESTED) };
}
}
public static class TesterDynamicTag extends TagSupport implements DynamicAttributes {
private static final long serialVersionUID = 1L;
@Override
public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {
// NO-OP
}
}
public static class TesterAttributeTag extends TagSupport {
private static final long serialVersionUID = 1L;
private Object attribute01;
private Object attribute02;
private Object attribute03;
private Object attribute04;
private Object attribute05;
private Object attribute06;
public Object getAttribute01() {
return attribute01;
}
public void setAttribute01(Object attribute01) {
this.attribute01 = attribute01;
}
public Object getAttribute02() {
return attribute02;
}
public void setAttribute02(Object attribute02) {
this.attribute02 = attribute02;
}
public Object getAttribute03() {
return attribute03;
}
public void setAttribute03(Object attribute03) {
this.attribute03 = attribute03;
}
public Object getAttribute04() {
return attribute04;
}
public void setAttribute04(Object attribute04) {
this.attribute04 = attribute04;
}
public Object getAttribute05() {
return attribute05;
}
public void setAttribute05(Object attribute05) {
this.attribute05 = attribute05;
}
public Object getAttribute06() {
return attribute06;
}
public void setAttribute06(Object attribute06) {
this.attribute06 = attribute06;
}
}
@Test
public void testLambdaScriptlets() throws Exception {
doTestJsp("lambda.jsp");
}
@Test
public void testInfoConflictNone() throws Exception {
doTestJsp("info-conflict-none.jsp");
}
@Test
public void testInfoConflict() throws Exception {
doTestJsp("info-conflict.jsp", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
@Test
public void testTagWithVariable() throws Exception {
doTestJsp("variable-tei-nested.jsp");
}
@Test
public void testTagWithVariableFromAttr() throws Exception {
doTestJsp("variable-from-attr-nested.jsp");
}
@Test
public void testTagFileWithVariable() throws Exception {
doTestJsp("variable-tagfile-nested.jsp");
}
@Test
public void testTagFileWithVariableFromAttr() throws Exception {
doTestJsp("variable-tagfile-from-attr-nested.jsp");
}
@Test
public void testXpoweredBy() throws Exception {
doTestJsp("x-powered-by.jsp");
}
@Test
public void testXmlProlog01() throws Exception {
doTestJsp("xml-prolog-01.jspx");
}
@Test
public void testXmlProlog02() throws Exception {
doTestJsp("xml-prolog-02.jspx");
}
@Test
public void testXmlPrologTag() throws Exception {
doTestJsp("xml-prolog-tag.jspx");
}
@Test
public void testXmlDoctype01() throws Exception {
doTestJsp("xml-doctype-01.jspx");
}
@Test
public void testXmlDoctype02() throws Exception {
doTestJsp("xml-doctype-02.jspx");
}
@Test
public void testForward01() throws Exception {
doTestJsp("forward-01.jsp");
}
@Test
public void testForward02() throws Exception {
doTestJsp("forward-02.jsp");
}
@Test
public void testForward03() throws Exception {
doTestJsp("forward-03.jsp");
}
@Test
public void testForward04() throws Exception {
doTestJsp("forward-04.jsp");
}
@Test
public void testElement01() throws Exception {
doTestJsp("element-01.jsp");
}
@Test
public void testInclude01() throws Exception {
doTestJsp("include-01.jsp");
}
@Test
public void testSetProperty01() throws Exception {
doTestJsp("setproperty-01.jsp");
}
@Test
public void testUseBean01() throws Exception {
doTestJsp("usebean-01.jsp", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
@Test
public void testUseBean02() throws Exception {
doTestJsp("usebean-02.jsp", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
@Test
public void testUseBean03() throws Exception {
doTestJsp("usebean-03.jsp");
}
@Test
public void testUseBean04() throws Exception {
doTestJsp("usebean-04.jsp", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
@Test
public void testUseBean05() throws Exception {
// Whether this test passes or fails depends on the Java version used
// and the JRE settings.
// For the test to pass use --illegal-access=deny
// This is the default setting for Java 16 onwards
doTestJsp("usebean-05.jsp", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
@Test
public void testUseBean06() throws Exception {
doTestJsp("usebean-06.jsp", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
@Test
public void testUseBean07() throws Exception {
doTestJsp("usebean-07.jsp", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
@Test
public void testUseBean08() throws Exception {
doTestJsp("usebean-08.jsp", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
@Test
public void testCustomTag01() throws Exception {
doTestJsp("try-catch-finally-01.jsp");
}
@Test
public void testCustomTag02() throws Exception {
doTestJsp("customtag-02.jsp");
}
@Test
public void testCustomTag03() throws Exception {
doTestJsp("customtag-03.jsp");
}
@Test
public void testCustomTag04() throws Exception {
doTestJsp("customtag-04.jsp", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
@Test
public void testTemplateText01() throws Exception {
doTestJsp("templatetext-01.jsp");
}
@Test
public void testTemplateText02() throws Exception {
doTestJsp("templatetext-02.jsp");
}
@Test
public void testInvoke01() throws Exception {
doTestJsp("invoke-01.jsp");
}
@Test
public void testDoBody01() throws Exception {
doTestJsp("dobody-01.jsp");
}
@Test
public void testScriptingVariables01() throws Exception {
doTestJsp("scriptingvariables-01.jsp");
}
@Test
public void testScriptingVariables02() throws Exception {
doTestJsp("scriptingvariables-02.jsp");
}
@Test
public void testAttribute01() throws Exception {
doTestJsp("attribute-01.jsp");
}
@Test
public void testAttribute02() throws Exception {
doTestJsp("attribute-02.jsp");
}
@Test
public void testAttribute03() throws Exception {
doTestJsp("attribute-03.jsp");
}
@Test
public void testAttribute04() throws Exception {
doTestJsp("attribute-04.jsp");
}
@Test
public void testSetters01() throws Exception {
doTestJsp("setters-01.jsp");
}
@Test
public void testCircular01() throws Exception {
doTestJsp("circular-01.jsp");
}
@Test
public void testDeferredMethod01() throws Exception {
doTestJsp("deferred-method-01.jsp");
}
@Test
public void testDeferredMethod02() throws Exception {
doTestJsp("deferred-method-02.jsp");
}
@Test
public void testBeanInfo01() throws Exception {
BeanInfo bi = Introspector.getBeanInfo(TesterTagA.class);
for (PropertyDescriptor pd : bi.getPropertyDescriptors()) {
if (pd.getName().equals("data")) {
pd.setPropertyEditorClass(DataPropertyEditor.class);
}
}
doTestJsp("beaninfo-01.jsp");
}
@Test
public void testBreakELInterpreter() throws Exception {
getTomcatInstanceTestWebapp(false, true);
// This should break all subsequent requests
ByteChunk body = new ByteChunk();
int rc = getUrl("http://localhost:" + getPort() + "/test/jsp/generator/break-el-interpreter.jsp", body, null);
Assert.assertEquals(body.toString(), HttpServletResponse.SC_OK, rc);
body.recycle();
rc = getUrl("http://localhost:" + getPort() + "/test/jsp/generator/info.jsp", body, null);
Assert.assertEquals(body.toString(), HttpServletResponse.SC_INTERNAL_SERVER_ERROR, rc);
}
@Test
public void testBreakStringInterpreter() throws Exception {
getTomcatInstanceTestWebapp(false, true);
// This should break all subsequent requests
ByteChunk body = new ByteChunk();
int rc = getUrl("http://localhost:" + getPort() + "/test/jsp/generator/break-string-interpreter.jsp", body,
null);
Assert.assertEquals(body.toString(), HttpServletResponse.SC_OK, rc);
body.recycle();
rc = getUrl("http://localhost:" + getPort() + "/test/jsp/generator/info.jsp", body, null);
Assert.assertEquals(body.toString(), HttpServletResponse.SC_INTERNAL_SERVER_ERROR, rc);
}
@Test
public void testBug65390() throws Exception {
getTomcatInstanceTestWebapp(false, true);
ByteChunk body = new ByteChunk();
int rc = getUrl("http://localhost:" + getPort() + "/test/bug6nnnn/bug65390.jsp", body, null);
Assert.assertEquals(body.toString(), HttpServletResponse.SC_OK, rc);
}
@Test
public void testBug69508() throws Exception {
getTomcatInstanceTestWebapp(false, true);
ByteChunk body = new ByteChunk();
int rc = getUrl("http://localhost:" + getPort() + "/test/bug6nnnn/bug69508.jsp?init=InitCommand", body, null);
String text = body.toString();
Assert.assertEquals(text, HttpServletResponse.SC_OK, rc);
// include page URL with param cmd
Assert.assertTrue(text, text.contains("<p>cmd - someCommand</p>"));
Assert.assertTrue(text, text.contains("<p>param1 - value1</p>"));
Assert.assertTrue(text, text.contains("<p>cmd - someCommandAbs</p>"));
Assert.assertTrue(text, text.contains("<p>param1 - value1Abs</p>"));
// include page URL without param
Assert.assertTrue(text, text.contains("<p>param2 - value2</p>"));
Assert.assertTrue(text, text.contains("<p>param2 - value2Abs</p>"));
Assert.assertTrue(text, text.contains("<p>param3 - InitCommand</p>"));
Assert.assertTrue(text, text.contains("<p>param3 - InitCommandAbs</p>"));
Assert.assertTrue(text, text.contains("<p>param4 - value4</p>"));
Assert.assertTrue(text, text.contains("<p>param4 - value4Abs</p>"));
Assert.assertTrue(text, text.contains("<p>param5 - InitCommand</p>"));
Assert.assertTrue(text, text.contains("<p>param5 - InitCommandAbs</p>"));
Assert.assertTrue(text, text.contains("<p>param6 - value6</p>"));
Assert.assertTrue(text, text.contains("<p>param6 - value6Abs</p>"));
}
@Test
public void testTagReleaseWithPooling() throws Exception {
doTestTagRelease(true);
}
@Test
public void testTagReleaseWithoutPooling() throws Exception {
doTestTagRelease(false);
}
public void doTestTagRelease(boolean enablePooling) throws Exception {
tagTesterTagReleaseReleased = false;
Tomcat tomcat = getTomcatInstance();
File appDir = new File("test/webapp");
Context ctxt = tomcat.addContext("", appDir.getAbsolutePath());
ctxt.addServletContainerInitializer(new JasperInitializer(), null);
Tomcat.initWebappDefaults(ctxt);
Wrapper w = (Wrapper) ctxt.findChild("jsp");
w.addInitParameter("enablePooling", String.valueOf(enablePooling));
tomcat.start();
getUrl("http://localhost:" + getPort() + "/jsp/generator/release.jsp");
if (enablePooling) {
Assert.assertFalse(tagTesterTagReleaseReleased);
} else {
Assert.assertTrue(tagTesterTagReleaseReleased);
}
}
private void doTestJsp(String jspName) throws Exception {
doTestJsp(jspName, HttpServletResponse.SC_OK);
}
private void doTestJsp(String jspName, int expectedResponseCode) throws Exception {
getTomcatInstanceTestWebapp(false, true);
ByteChunk body = new ByteChunk();
int rc = getUrl("http://localhost:" + getPort() + "/test/jsp/generator/" + jspName, body, null);
Assert.assertEquals(body.toString(), expectedResponseCode, rc);
}
@Test
public void testNonstandardRemoves() throws Exception {
getTomcatInstanceTestWebapp(true, true);
// This should break all subsequent requests
ByteChunk body = new ByteChunk();
getUrl("http://localhost:" + getPort() + "/test/jsp/generator/nonstandard/remove-01.jsp", body, null);
Assert.assertEquals(NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE
+ "pageContext value=null" + NEW_LINE
+ "request value=testValue" + NEW_LINE
+ "session value=testValue" + NEW_LINE
+ "application value=testValue", body.toString());
body.recycle();
getUrl("http://localhost:" + getPort() + "/test/jsp/generator/nonstandard/remove-02.jsp", body, null);
Assert.assertEquals(NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE
+ "pageContext value=testValue" + NEW_LINE
+ "request value=null" + NEW_LINE
+ "session value=testValue" + NEW_LINE
+ "application value=testValue", body.toString());
body.recycle();
getUrl("http://localhost:" + getPort() + "/test/jsp/generator/nonstandard/remove-03.jsp", body, null);
Assert.assertEquals(NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE
+ "pageContext value=testValue" + NEW_LINE
+ "request value=testValue" + NEW_LINE
+ "session value=null" + NEW_LINE
+ "application value=testValue", body.toString());
body.recycle();
getUrl("http://localhost:" + getPort() + "/test/jsp/generator/nonstandard/remove-04.jsp", body, null);
Assert.assertEquals(NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE
+ "pageContext value=testValue" + NEW_LINE
+ "request value=testValue" + NEW_LINE
+ "session value=testValue" + NEW_LINE
+ "application value=null", body.toString());
body.recycle();
getUrl("http://localhost:" + getPort() + "/test/jsp/generator/nonstandard/remove-05.jsp", body, null);
Assert.assertEquals(NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE + NEW_LINE
+ "pageContext value=null" + NEW_LINE
+ "request value=null" + NEW_LINE
+ "session value=null" + NEW_LINE
+ "application value=null", body.toString());
body.recycle();
}
}