From 880bdbd52b1f92057a680928f2ca8898b6fc5145 Mon Sep 17 00:00:00 2001 From: Denis Anisimov Date: Thu, 13 Mar 2014 22:49:43 +0200 Subject: Always call close() method for session valueUnbound() method (#12843). Change-Id: I1500b4b50d1f7ae9ee5fd2252a7b682b93cce720 --- server/src/com/vaadin/server/VaadinService.java | 3 ++ .../src/com/vaadin/server/MockVaadinSession.java | 49 ++++++++++++++++++++ .../src/com/vaadin/server/VaadinServiceTest.java | 53 ++++++++++++++++++++++ .../src/com/vaadin/server/VaadinSessionTest.java | 19 ++++++++ 4 files changed, 124 insertions(+) create mode 100644 server/tests/src/com/vaadin/server/MockVaadinSession.java create mode 100644 server/tests/src/com/vaadin/server/VaadinServiceTest.java (limited to 'server') diff --git a/server/src/com/vaadin/server/VaadinService.java b/server/src/com/vaadin/server/VaadinService.java index 86cd9701c0..6fd0b23f7b 100644 --- a/server/src/com/vaadin/server/VaadinService.java +++ b/server/src/com/vaadin/server/VaadinService.java @@ -446,6 +446,9 @@ public abstract class VaadinService implements Serializable { session.accessSynchronously(new Runnable() { @Override public void run() { + if (!session.isClosing()) { + closeSession(session); + } ArrayList uis = new ArrayList(session.getUIs()); for (final UI ui : uis) { ui.accessSynchronously(new Runnable() { diff --git a/server/tests/src/com/vaadin/server/MockVaadinSession.java b/server/tests/src/com/vaadin/server/MockVaadinSession.java new file mode 100644 index 0000000000..1fb53cd368 --- /dev/null +++ b/server/tests/src/com/vaadin/server/MockVaadinSession.java @@ -0,0 +1,49 @@ +/* + * Copyright 2000-2013 Vaadin Ltd. + * + * Licensed 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 com.vaadin.server; + +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * + * @author Vaadin Ltd + */ +public class MockVaadinSession extends VaadinSession { + + public MockVaadinSession(VaadinService service) { + super(service); + } + + @Override + public void close() { + super.close(); + closeCount++; + } + + public int getCloseCount() { + return closeCount; + } + + @Override + public Lock getLockInstance() { + return lock; + } + + private int closeCount; + + private ReentrantLock lock = new ReentrantLock(); +} diff --git a/server/tests/src/com/vaadin/server/VaadinServiceTest.java b/server/tests/src/com/vaadin/server/VaadinServiceTest.java new file mode 100644 index 0000000000..cead5df79c --- /dev/null +++ b/server/tests/src/com/vaadin/server/VaadinServiceTest.java @@ -0,0 +1,53 @@ +/* + * Copyright 2000-2013 Vaadin Ltd. + * + * Licensed 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 com.vaadin.server; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpSessionBindingEvent; + +import org.easymock.EasyMock; +import org.junit.Assert; +import org.junit.Test; + +/** + * + * @author Vaadin Ltd + */ +public class VaadinServiceTest { + + @Test + public void testFireSessionDestroy() throws ServletException { + ServletConfig servletConfig = new MockServletConfig(); + VaadinServlet servlet = new VaadinServlet(); + servlet.init(servletConfig); + VaadinService service = servlet.getService(); + + MockVaadinSession vaadinSession = new MockVaadinSession(service); + service.fireSessionDestroy(vaadinSession); + Assert.assertEquals( + "'fireSessionDestroy' method doesn't call 'close' for the session", + 1, vaadinSession.getCloseCount()); + + vaadinSession.valueUnbound(EasyMock + .createMock(HttpSessionBindingEvent.class)); + + org.junit.Assert.assertEquals( + "'fireSessionDestroy' method may not call 'close' " + + "method for closing session", 1, + vaadinSession.getCloseCount()); + } +} diff --git a/server/tests/src/com/vaadin/server/VaadinSessionTest.java b/server/tests/src/com/vaadin/server/VaadinSessionTest.java index 51ae2a2d13..edc78ba8d7 100644 --- a/server/tests/src/com/vaadin/server/VaadinSessionTest.java +++ b/server/tests/src/com/vaadin/server/VaadinSessionTest.java @@ -146,4 +146,23 @@ public class VaadinSessionTest { mockService.cleanupSession(session); Assert.assertTrue(detachCalled.get()); } + + @Test + public void testValueUnbound() { + MockVaadinSession vaadinSession = new MockVaadinSession(mockService); + + vaadinSession.valueUnbound(EasyMock + .createMock(HttpSessionBindingEvent.class)); + org.junit.Assert.assertEquals( + "'valueUnbound' method doesn't call 'close' for the session", + 1, vaadinSession.getCloseCount()); + + vaadinSession.valueUnbound(EasyMock + .createMock(HttpSessionBindingEvent.class)); + + org.junit.Assert.assertEquals( + "'valueUnbound' method may not call 'close' " + + "method for closing session", 1, + vaadinSession.getCloseCount()); + } } -- cgit v1.2.3