Author: kkolinko
Date: Mon Jun 23 16:16:47 2014
New Revision: 1604846
URL: http://svn.apache.org/r1604846
Log:
Test for https://issues.apache.org/bugzilla/show_bug.cgi?id=56653
Test concurrency issue with Mapper$ContextList.nesting field.
It is backport of r1604309.
Modified:
tomcat/tc7.0.x/trunk/test/org/apache/tomcat/util/http/mapper/TestMapper.java
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=1604846&r1=1604845&r2=1604846&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
Mon Jun 23 16:16:47 2014
@@ -19,6 +19,8 @@ package org.apache.tomcat.util.http.mapp
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import java.util.concurrent.atomic.AtomicBoolean;
+
import org.junit.Before;
import org.junit.Test;
@@ -174,6 +176,63 @@ public class TestMapper extends LoggingB
}
@Test
+ public void testContextListConcurrencyBug56653() throws Exception {
+ final Object host = new Object(); // "localhost";
+ final Object contextRoot = new Object(); // "ROOT";
+ final Object context1 = new Object(); // "foo";
+ final Object context2 = new Object(); // "foo#bar";
+ final Object context3 = new Object(); // "foo#bar#bla";
+ final Object context4 = new Object(); // "foo#bar#bla#baz";
+
+ mapper.addHost("localhost", new String[0], host);
+ mapper.setDefaultHostName("localhost");
+
+ mapper.addContextVersion("localhost", host, "", "0", contextRoot,
+ new String[0], null);
+ mapper.addContextVersion("localhost", host, "/foo", "0", context1,
+ new String[0], null);
+ mapper.addContextVersion("localhost", host, "/foo/bar", "0", context2,
+ new String[0], null);
+ mapper.addContextVersion("localhost", host, "/foo/bar/bla", "0",
+ context3, new String[0], null);
+ mapper.addContextVersion("localhost", host, "/foo/bar/bla/baz", "0",
+ context4, new String[0], null);
+
+ final AtomicBoolean running = new AtomicBoolean(true);
+ Thread t = new Thread() {
+ @Override
+ public void run() {
+ for (int i = 0; i < 100000; i++) {
+ mapper.removeContextVersion("localhost",
+ "/foo/bar/bla/baz", "0");
+ mapper.addContextVersion("localhost", host,
+ "/foo/bar/bla/baz", "0", context4, new String[0],
+ null);
+ }
+ running.set(false);
+ }
+ };
+
+ MappingData mappingData = new MappingData();
+ MessageBytes hostMB = MessageBytes.newInstance();
+ hostMB.setString("localhost");
+ MessageBytes uriMB = MessageBytes.newInstance();
+ char[] uri = "/foo/bar/bla/bobou/foo".toCharArray();
+ uriMB.setChars(uri, 0, uri.length);
+
+ mapper.map(hostMB, uriMB, null, mappingData);
+ assertEquals("/foo/bar/bla", mappingData.contextPath.toString());
+
+ t.start();
+ while (running.get()) {
+ mappingData.recycle();
+ uriMB.setChars(uri, 0, uri.length);
+ mapper.map(hostMB, uriMB, null, mappingData);
+ assertEquals("/foo/bar/bla", mappingData.contextPath.toString());
+ }
+ }
+
+ @Test
public void testPerformance() throws Exception {
// Takes ~1s on markt's laptop. If this takes more than 5s something
// probably needs looking at. If this fails repeatedly then we may need
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]