Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorshuyangzhou2017-05-18 20:58:10 +0000
committerRaymond Auge2018-01-22 15:45:43 +0000
commit5951364be6642087127fd0ea77b39a70017223b9 (patch)
tree6104bd38c33617daca9933ce2c4394e41d8d5f31 /bundles/org.eclipse.equinox.http.servlet.tests
parentda22ae61807be63939ff24057ee2b609c2cc0226 (diff)
downloadrt.equinox.bundles-5951364be6642087127fd0ea77b39a70017223b9.tar.gz
rt.equinox.bundles-5951364be6642087127fd0ea77b39a70017223b9.tar.xz
rt.equinox.bundles-5951364be6642087127fd0ea77b39a70017223b9.zip
Bug 530063 - [http] CNFE when session replication is used with equinox.http.servlet in bridge mode
Signed-off-by: Raymond Auge <raymond.auge@liferay.com> Signed-off-by: shuyangzhou <shuyang.zhou@liferay.com> Change-Id: I43a34e344c77bfae15d80bbcdb8fc73dd5b56734
Diffstat (limited to 'bundles/org.eclipse.equinox.http.servlet.tests')
-rw-r--r--bundles/org.eclipse.equinox.http.servlet.tests/META-INF/MANIFEST.MF3
-rw-r--r--bundles/org.eclipse.equinox.http.servlet.tests/pom.xml2
-rw-r--r--bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ServletTest.java130
3 files changed, 131 insertions, 4 deletions
diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.http.servlet.tests/META-INF/MANIFEST.MF
index 2205f8b17..30d52b5d6 100644
--- a/bundles/org.eclipse.equinox.http.servlet.tests/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.http.servlet.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: org.eclipse.equinox.http.servlet.tests
Bundle-SymbolicName: org.eclipse.equinox.http.servlet.tests
-Bundle-Version: 1.4.100.qualifier
+Bundle-Version: 1.5.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Eclipse-BundleShape: dir
Bundle-Activator: org.eclipse.equinox.http.servlet.tests.bundle.Activator
@@ -14,6 +14,7 @@ Import-Package: javax.servlet;version="2.6.0",
org.apache.commons.fileupload.servlet;version="1.2.2",
org.eclipse.equinox.http.servlet;version="1.1.0",
org.eclipse.equinox.http.servlet.context;version="1.0.0",
+ org.eclipse.equinox.http.servlet.session;version="1.0.0",
org.eclipse.osgi.service.urlconversion;version="1.0.0",
org.osgi.framework;version="1.6.0",
org.osgi.framework.hooks.service;version="1.1.0",
diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/pom.xml b/bundles/org.eclipse.equinox.http.servlet.tests/pom.xml
index 9d8701621..7810450a7 100644
--- a/bundles/org.eclipse.equinox.http.servlet.tests/pom.xml
+++ b/bundles/org.eclipse.equinox.http.servlet.tests/pom.xml
@@ -19,7 +19,7 @@
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.http.servlet.tests</artifactId>
- <version>1.4.100-SNAPSHOT</version>
+ <version>1.5.0-SNAPSHOT</version>
<packaging>eclipse-test-plugin</packaging>
<build>
diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ServletTest.java b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ServletTest.java
index 11ee568b5..e1d3cef73 100644
--- a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ServletTest.java
+++ b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ServletTest.java
@@ -77,6 +77,7 @@ import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.eclipse.equinox.http.servlet.ExtendedHttpService;
import org.eclipse.equinox.http.servlet.context.ContextPathCustomizer;
+import org.eclipse.equinox.http.servlet.session.HttpSessionInvalidator;
import org.eclipse.equinox.http.servlet.testbase.BaseTest;
import org.eclipse.equinox.http.servlet.tests.util.BaseAsyncServlet;
import org.eclipse.equinox.http.servlet.tests.util.BaseChangeSessionIdServlet;
@@ -109,6 +110,7 @@ import org.osgi.service.http.runtime.dto.RuntimeDTO;
import org.osgi.service.http.runtime.dto.ServletContextDTO;
import org.osgi.service.http.runtime.dto.ServletDTO;
import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
+import org.osgi.util.tracker.ServiceTracker;
public class ServletTest extends BaseTest {
@Rule
@@ -1578,6 +1580,130 @@ public class ServletTest extends BaseTest {
}
@Test
+ public void test_Sessions03_HttpSessionInvalidator() throws Exception {
+ ServiceTracker<HttpSessionInvalidator, HttpSessionInvalidator> sessionInvalidatorTracker =
+ new ServiceTracker<>(getBundleContext(), HttpSessionInvalidator.class, null);
+ sessionInvalidatorTracker.open();
+ HttpSessionInvalidator invalidator = sessionInvalidatorTracker.waitForService(100);
+
+ final AtomicBoolean valueBound = new AtomicBoolean(false);
+ final AtomicBoolean valueUnbound = new AtomicBoolean(false);
+ final HttpSessionBindingListener bindingListener = new HttpSessionBindingListener() {
+
+ @Override
+ public void valueUnbound(HttpSessionBindingEvent event) {
+ valueUnbound.set(true);
+ }
+
+ @Override
+ public void valueBound(HttpSessionBindingEvent event) {
+ valueBound.set(true);
+ }
+ };
+ final AtomicBoolean sessionCreated = new AtomicBoolean(false);
+ final AtomicBoolean sessionDestroyed = new AtomicBoolean(false);
+ final AtomicReference<String> sessionId = new AtomicReference<String>();
+ HttpSessionListener sessionListener = new HttpSessionListener() {
+
+ @Override
+ public void sessionDestroyed(HttpSessionEvent se) {
+ sessionDestroyed.set(true);
+ }
+
+ @Override
+ public void sessionCreated(HttpSessionEvent se) {
+ sessionCreated.set(true);
+ }
+ };
+ HttpServlet sessionServlet = new HttpServlet() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException,
+ IOException {
+ HttpSession session = request.getSession();
+ if (session.getAttribute("test.attribute") == null) {
+ session.setAttribute("test.attribute", bindingListener);
+ sessionId.set(session.getId());
+ response.getWriter().print("created");
+ } else {
+ session.invalidate();
+ response.getWriter().print("invalidated");
+ }
+ }
+
+ };
+ ServiceRegistration<Servlet> servletReg = null;
+ ServiceRegistration<HttpSessionListener> sessionListenerReg = null;
+ Dictionary<String, Object> servletProps = new Hashtable<String, Object>();
+ servletProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/sessions");
+ String actual = null;
+ CookieHandler previous = CookieHandler.getDefault();
+ CookieHandler.setDefault(new CookieManager( null, CookiePolicy.ACCEPT_ALL ) );
+ try {
+ servletReg = getBundleContext().registerService(Servlet.class, sessionServlet, servletProps);
+ Dictionary<String, String> listenerProps = new Hashtable<String, String>();
+ listenerProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_LISTENER, "true");
+ sessionListenerReg = getBundleContext().registerService(HttpSessionListener.class, sessionListener, listenerProps);
+
+ sessionCreated.set(false);
+ valueBound.set(false);
+ sessionDestroyed.set(false);
+ valueUnbound.set(false);
+
+ // first call will create the session
+ actual = requestAdvisor.request("sessions");
+ assertEquals("Wrong result", "created", actual);
+ assertTrue("No sessionCreated called", sessionCreated.get());
+ assertTrue("No valueBound called", valueBound.get());
+ assertFalse("sessionDestroyed was called", sessionDestroyed.get());
+ assertFalse("valueUnbound was called", valueUnbound.get());
+
+ sessionCreated.set(false);
+ valueBound.set(false);
+ sessionDestroyed.set(false);
+ valueUnbound.set(false);
+
+ assertNotNull(sessionId.get());
+
+ // invalidate using the invalidator
+ invalidator.invalidate(sessionId.get(), true);
+
+ // second call should find the session invalidated, and create a new one
+ actual = requestAdvisor.request("sessions");
+ assertEquals("Wrong result", "created", actual);
+ assertTrue("No sessionCreated was called", sessionCreated.get());
+ assertTrue("No valueBound was called", valueBound.get());
+ assertTrue("No sessionDestroyed called", sessionDestroyed.get());
+ assertTrue("No valueUnbound called", valueUnbound.get());
+
+ sessionCreated.set(false);
+ sessionDestroyed.set(false);
+ valueBound.set(false);
+ valueUnbound.set(false);
+
+ // calling again should invalidate the session again
+ actual = requestAdvisor.request("sessions");
+ assertEquals("Wrong result", "invalidated", actual);
+ assertFalse("sessionCreated called", sessionCreated.get());
+ assertFalse("valueBound called", valueBound.get());
+ assertTrue("No sessionDestroyed called", sessionDestroyed.get());
+ assertTrue("No valueUnbound called", valueUnbound.get());
+ } catch (Exception e) {
+ fail("Unexpected exception: " + e);
+ } finally {
+ if (servletReg != null) {
+ servletReg.unregister();
+ }
+ if (sessionListenerReg != null) {
+ sessionListenerReg.unregister();
+ }
+ CookieHandler.setDefault(previous);
+ sessionInvalidatorTracker.close();
+ }
+ }
+
+ @Test
public void test_Resource1() throws Exception {
String expected = "a";
String actual;
@@ -3160,11 +3286,11 @@ public class ServletTest extends BaseTest {
final AtomicReference<HttpSession> sessionReference = new AtomicReference<HttpSession>();
ServletContextListener scl = new ServletContextListener() {
-
+
@Override
public void contextInitialized(ServletContextEvent arg0) {
}
-
+
@Override
public void contextDestroyed(ServletContextEvent arg0) {
listenerBalance.decrementAndGet();

Back to the top