You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by kk...@apache.org on 2014/08/26 13:50:43 UTC

svn commit: r1620577 - in /tomcat/tc7.0.x/trunk: test/org/apache/tomcat/util/http/mapper/ webapps/docs/ webapps/examples/jsp/forward/ webapps/examples/jsp/include/

Author: kkolinko
Date: Tue Aug 26 11:50:42 2014
New Revision: 1620577

URL: http://svn.apache.org/r1620577
Log:
For https://issues.apache.org/bugzilla/show_bug.cgi?id=56882
Add testcase for processing of forwards and includes when Context have been reloaded. The bug is absent in Tomcat 7.

This is a backport of r1620326.

Modified:
    tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapper.java
    tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapperWebapps.java
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
    tomcat/tc7.0.x/trunk/webapps/examples/jsp/forward/one.jsp
    tomcat/tc7.0.x/trunk/webapps/examples/jsp/forward/two.html
    tomcat/tc7.0.x/trunk/webapps/examples/jsp/include/foo.jsp
    tomcat/tc7.0.x/trunk/webapps/examples/jsp/include/include.jsp

Modified: tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapper.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapper.java?rev=1620577&r1=1620576&r2=1620577&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapper.java (original)
+++ tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapper.java Tue Aug 26 11:50:42 2014
@@ -17,11 +17,13 @@
 package org.apache.tomcat.util.http.mapper;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
@@ -34,6 +36,8 @@ import org.apache.tomcat.util.buf.Messag
 public class TestMapper extends LoggingBaseTest {
 
     private Mapper mapper;
+    private Mapper mapperForContext1;
+    private Mapper mapperForContext2;
 
     @Before
     @Override
@@ -71,11 +75,11 @@ public class TestMapper extends LoggingB
         mapper.addContextVersion("iowejoiejfoiew", "blah7", "/foo/bar",
                 "0", "context2", welcomes, null, null);
 
-        mapper.addWrappers(
-                "iowejoiejfoiew",
-                "/foo/bar",
-                "0",
-                Arrays.asList(new WrapperMappingInfo[] {
+        Collection<WrapperMappingInfo> wrappersForContext1 = Arrays
+                .asList(new WrapperMappingInfo[] { new WrapperMappingInfo("/",
+                        "context1-defaultWrapper", false, false) });
+        Collection<WrapperMappingInfo> wrappersForContext2 = Arrays
+                .asList(new WrapperMappingInfo[] {
                         new WrapperMappingInfo("/fo/*", "wrapper0", false,
                                 false),
                         new WrapperMappingInfo("/", "wrapper1", false, false),
@@ -87,7 +91,26 @@ public class TestMapper extends LoggingB
                         new WrapperMappingInfo("/blah/bobou/*", "wrapper5",
                                 false, false),
                         new WrapperMappingInfo("*.htm", "wrapper6", false,
-                                false) }));
+                                false) });
+
+        mapper.addWrappers("iowejoiejfoiew", "/foo", "0", wrappersForContext1);
+        mapperForContext1 = new Mapper();
+        mapperForContext1.setContext("/foo", new String[0], null);
+        for (WrapperMappingInfo wrapper : wrappersForContext1) {
+            mapperForContext1.addWrapper(wrapper.getMapping(),
+                    wrapper.getWrapper(), wrapper.isJspWildCard(),
+                    wrapper.isResourceOnly());
+        }
+
+        mapper.addWrappers("iowejoiejfoiew", "/foo/bar", "0",
+                wrappersForContext2);
+        mapperForContext2 = new Mapper();
+        mapperForContext2.setContext("/foo/bar", new String[0], null);
+        for (WrapperMappingInfo wrapper : wrappersForContext2) {
+            mapperForContext2.addWrapper(wrapper.getMapping(),
+                    wrapper.getWrapper(), wrapper.isJspWildCard(),
+                    wrapper.isResourceOnly());
+        }
 
         mapper.addContextVersion(
                 "iowejoiejfoiew",
@@ -269,11 +292,20 @@ public class TestMapper extends LoggingB
         assertEquals(1, mappedContext.versions.length);
         assertEquals("0", mappedContext.versions[0].name);
         Object oldHost = mappedHost.object;
+        Object oldContext = mappedContext.versions[0].object;
+        assertEquals("context2", oldContext.toString());
+
+        Object oldContext1 = mappedHost.contextList.contexts[contextPos - 1].versions[0].object;
+        assertEquals("context1", oldContext1.toString());
 
         mappingData.recycle();
         mapper.map(hostMB, uriMB, null, mappingData);
         assertEquals("blah7", mappingData.host.toString());
         assertEquals("context2", mappingData.context.toString());
+        assertEquals("wrapper5", mappingData.wrapper.toString());
+        mappingData.recycle();
+        mapperForContext2.map(uriMB, mappingData);
+        assertEquals("wrapper5", mappingData.wrapper.toString());
 
         Object newContext = "newContext";
         mapper.addContextVersion(
@@ -285,7 +317,7 @@ public class TestMapper extends LoggingB
                 null,
                 null,
                 Arrays.asList(new WrapperMappingInfo[] { new WrapperMappingInfo(
-                        "/", "default", false, false) }));
+                        "/", "newContext-default", false, false) }));
 
         assertEquals(2, mappedContext.versions.length);
         assertEquals("0", mappedContext.versions[0].name);
@@ -293,6 +325,7 @@ public class TestMapper extends LoggingB
         mappingData.recycle();
         mapper.map(hostMB, uriMB, null, mappingData);
         assertEquals("newContext", mappingData.context.toString());
+        assertEquals("newContext-default", mappingData.wrapper.toString());
 
         mapper.removeContextVersion(hostName, contextPath, "0");
 
@@ -301,6 +334,7 @@ public class TestMapper extends LoggingB
         mappingData.recycle();
         mapper.map(hostMB, uriMB, null, mappingData);
         assertEquals("newContext", mappingData.context.toString());
+        assertEquals("newContext-default", mappingData.wrapper.toString());
 
         mapper.removeContextVersion(hostName, contextPath, "1");
 
@@ -309,6 +343,10 @@ public class TestMapper extends LoggingB
         mappingData.recycle();
         mapper.map(hostMB, uriMB, null, mappingData);
         assertEquals("context1", mappingData.context.toString());
+        assertEquals("context1-defaultWrapper", mappingData.wrapper.toString());
+        mappingData.recycle();
+        mapperForContext1.map(uriMB, mappingData);
+        assertEquals("context1-defaultWrapper", mappingData.wrapper.toString());
 
         mapper.addContextVersion(
                 hostName,
@@ -319,7 +357,7 @@ public class TestMapper extends LoggingB
                 null,
                 null,
                 Arrays.asList(new WrapperMappingInfo[] { new WrapperMappingInfo(
-                        "/", "default", false, false) }));
+                        "/", "newContext-defaultWrapper2", false, false) }));
         mappedContext = mappedHost.contextList.contexts[contextPos];
 
         assertEquals(contextPath, mappedContext.name);
@@ -328,6 +366,79 @@ public class TestMapper extends LoggingB
         mappingData.recycle();
         mapper.map(hostMB, uriMB, null, mappingData);
         assertEquals("newContext", mappingData.context.toString());
+        assertEquals("newContext-defaultWrapper2", mappingData.wrapper.toString());
+    }
+
+    @Test
+    public void testReloadContextVersion() throws Exception {
+        final String hostName = "iowejoiejfoiew";
+        final int iowPos = 3;
+        final String contextPath = "/foo/bar";
+        final int contextPos = 2;
+
+        MappingData mappingData = new MappingData();
+        MessageBytes hostMB = MessageBytes.newInstance();
+        MessageBytes uriMB = MessageBytes.newInstance();
+        hostMB.setString(hostName);
+        uriMB.setString("/foo/bar/blah/bobou/foo");
+
+        // Verifying configuration created by setUp()
+        Mapper.Host mappedHost = mapper.hosts[iowPos];
+        assertEquals(hostName, mappedHost.name);
+        Mapper.Context mappedContext = mappedHost.contextList.contexts[contextPos];
+        assertEquals(contextPath, mappedContext.name);
+        assertEquals(1, mappedContext.versions.length);
+        assertEquals("0", mappedContext.versions[0].name);
+        Object oldHost = mappedHost.object;
+        Object oldContext = mappedContext.versions[0].object;
+        assertEquals("context2", oldContext.toString());
+
+        Object oldContext1 = mappedHost.contextList.contexts[contextPos - 1].versions[0].object;
+        assertEquals("context1", oldContext1.toString());
+
+        mappingData.recycle();
+        mapper.map(hostMB, uriMB, null, mappingData);
+        assertEquals("blah7", mappingData.host.toString());
+        assertEquals("context2", mappingData.context.toString());
+        assertEquals("wrapper5", mappingData.wrapper.toString());
+        mappingData.recycle();
+        mapperForContext2.map(uriMB, mappingData);
+        assertEquals("wrapper5", mappingData.wrapper.toString());
+
+        // Mark context as paused
+        // This is what happens when context reload starts
+        mapper.pauseContextVersion(oldContext, hostName, contextPath, "0");
+
+        mappingData.recycle();
+        mapper.map(hostMB, uriMB, null, mappingData);
+        assertEquals("blah7", mappingData.host.toString());
+        assertEquals("context2", mappingData.context.toString());
+        // Wrapper is not mapped for incoming requests if context is paused
+        assertNull(mappingData.wrapper);
+
+        // Re-add the same context, but different list of wrappers
+        // This is what happens when context reload completes
+        mapper.addContextVersion(
+                hostName,
+                oldHost,
+                contextPath,
+                "0",
+                oldContext,
+                null,
+                null,
+                Arrays.asList(new WrapperMappingInfo[] { new WrapperMappingInfo(
+                        "/", "newDefaultWrapper", false, false) }));
+
+        mappedContext = mappedHost.contextList.contexts[contextPos];
+        assertEquals(contextPath, mappedContext.name);
+        assertEquals(1, mappedContext.versions.length);
+        assertEquals("0", mappedContext.versions[0].name);
+
+        mappingData.recycle();
+        mapper.map(hostMB, uriMB, null, mappingData);
+        assertEquals("blah7", mappingData.host.toString());
+        assertEquals("context2", mappingData.context.toString());
+        assertEquals("newDefaultWrapper", mappingData.wrapper.toString());
     }
 
     @Test

Modified: tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapperWebapps.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapperWebapps.java?rev=1620577&r1=1620576&r2=1620577&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapperWebapps.java (original)
+++ tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapperWebapps.java Tue Aug 26 11:50:42 2014
@@ -85,7 +85,7 @@ public class TestMapperWebapps extends T
     }
 
     @Test
-    public void testContextReload_Bug56658() throws Exception {
+    public void testContextReload_Bug56658_Bug56882() throws Exception {
         Tomcat tomcat = getTomcatInstance();
 
         File appDir = new File(getBuildDirectory(), "webapps/examples");
@@ -113,6 +113,24 @@ public class TestMapperWebapps extends T
         text = res.toString();
         Assert.assertTrue(text, text.contains("<title>Apache Tomcat Examples</title>"));
 
+        long timeA = System.currentTimeMillis();
+        res = getUrl("http://localhost:" + getPort()
+                + "/examples/jsp/include/include.jsp");
+        String timestamp = findCommonPrefix(timeA, System.currentTimeMillis());
+        text = res.toString();
+        Assert.assertTrue(text, text.contains(
+                "In place evaluation of another JSP which gives you the current time: " + timestamp));
+        Assert.assertTrue(text, text.contains(
+                "To get the current time in ms"));
+        Assert.assertTrue(text, text.contains(
+                "by including the output of another JSP: " + timestamp));
+        Assert.assertTrue(text, text.contains(":-)"));
+
+        res = getUrl("http://localhost:" + getPort()
+                + "/examples/jsp/forward/forward.jsp");
+        text = res.toString();
+        Assert.assertTrue(text, text.contains("VM Memory usage"));
+
         ctxt.reload();
 
         res = getUrl("http://localhost:" + getPort()
@@ -128,6 +146,24 @@ public class TestMapperWebapps extends T
         res = getUrl("http://localhost:" + getPort() + "/examples/index.html");
         text = res.toString();
         Assert.assertTrue(text, text.contains("<title>Apache Tomcat Examples</title>"));
+
+        timeA = System.currentTimeMillis();
+        res = getUrl("http://localhost:" + getPort()
+                + "/examples/jsp/include/include.jsp");
+        timestamp = findCommonPrefix(timeA, System.currentTimeMillis());
+        text = res.toString();
+        Assert.assertTrue(text, text.contains(
+                "In place evaluation of another JSP which gives you the current time: " + timestamp));
+        Assert.assertTrue(text, text.contains(
+                "To get the current time in ms"));
+        Assert.assertTrue(text, text.contains(
+                "by including the output of another JSP: " + timestamp));
+        Assert.assertTrue(text, text.contains(":-)"));
+
+        res = getUrl("http://localhost:" + getPort()
+                + "/examples/jsp/forward/forward.jsp");
+        text = res.toString();
+        Assert.assertTrue(text, text.contains("VM Memory usage"));
     }
 
     @Test
@@ -187,4 +223,17 @@ public class TestMapperWebapps extends T
                 new HashMap<String,List<String>>());
         Assert.assertEquals(HttpServletResponse.SC_NOT_FOUND, rc);
     }
+
+    /**
+     * Prepare a string to search in messages that contain a timestamp, when it
+     * is known that the timestamp was printed between {@code timeA} and
+     * {@code timeB}.
+     */
+    private static String findCommonPrefix(long timeA, long timeB) {
+        while ((timeA != timeB) && timeA > 0) {
+            timeA /= 10;
+            timeB /= 10;
+        }
+        return String.valueOf(timeA);
+    }
 }

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1620577&r1=1620576&r2=1620577&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Tue Aug 26 11:50:42 2014
@@ -98,6 +98,10 @@
         <bug>56825</bug>: Enable pre-emptive authentication to work with the
         SSL authenticator. Based on a patch by jlmonteiro. (markt)
       </fix>
+      <scode>
+        <bug>56882</bug>: Add testcase for processing of forwards and includes
+        when Context have been reloaded. (kkolinko)
+      </scode>
     </changelog>
   </subsection>
   <subsection name="Coyote">

Modified: tomcat/tc7.0.x/trunk/webapps/examples/jsp/forward/one.jsp
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/examples/jsp/forward/one.jsp?rev=1620577&r1=1620576&r2=1620577&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/examples/jsp/forward/one.jsp (original)
+++ tomcat/tc7.0.x/trunk/webapps/examples/jsp/forward/one.jsp Tue Aug 26 11:50:42 2014
@@ -19,5 +19,5 @@
 <body bgcolor="white">
 <font color="red">
 
-VM Memory usage < 50%.
+VM Memory usage &lt; 50%.
 </html>
\ No newline at end of file

Modified: tomcat/tc7.0.x/trunk/webapps/examples/jsp/forward/two.html
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/examples/jsp/forward/two.html?rev=1620577&r1=1620576&r2=1620577&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/examples/jsp/forward/two.html (original)
+++ tomcat/tc7.0.x/trunk/webapps/examples/jsp/forward/two.html Tue Aug 26 11:50:42 2014
@@ -19,5 +19,5 @@
 <body bgcolor="white">
 <font color="red">
 
-VM Memory usage > 50%.
+VM Memory usage &gt; 50%.
 </html>
\ No newline at end of file

Modified: tomcat/tc7.0.x/trunk/webapps/examples/jsp/include/foo.jsp
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/examples/jsp/include/foo.jsp?rev=1620577&r1=1620576&r2=1620577&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/examples/jsp/include/foo.jsp (original)
+++ tomcat/tc7.0.x/trunk/webapps/examples/jsp/include/foo.jsp Tue Aug 26 11:50:42 2014
@@ -13,9 +13,5 @@
   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.
---%>
 
-<body bgcolor="white">
-<font color="red">
-
-<%= System.currentTimeMillis() %>
+--%><%= System.currentTimeMillis() %>

Modified: tomcat/tc7.0.x/trunk/webapps/examples/jsp/include/include.jsp
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/examples/jsp/include/include.jsp?rev=1620577&r1=1620576&r2=1620577&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/examples/jsp/include/include.jsp (original)
+++ tomcat/tc7.0.x/trunk/webapps/examples/jsp/include/include.jsp Tue Aug 26 11:50:42 2014
@@ -22,14 +22,9 @@
 
 <%@ page buffer="5kb" autoFlush="false" %>
 
-<p>In place evaluation of another JSP which gives you the current time:
-
-<%@ include file="foo.jsp" %>
-
-<p> <jsp:include page="foo.html" flush="true"/> by including the output of another JSP:
-
-<jsp:include page="foo.jsp" flush="true"/>
+<p>In place evaluation of another JSP which gives you the current time: <%@ include file="foo.jsp" %>
 
+<p> <jsp:include page="foo.html" flush="true"/> by including the output of another JSP: <jsp:include page="foo.jsp" flush="true"/>
 :-)
 
 </html>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org