diff options
author | Denis Anisimov <denis@vaadin.com> | 2014-03-13 22:49:43 +0200 |
---|---|---|
committer | Leif Åstrand <leif@vaadin.com> | 2014-03-27 09:48:24 +0000 |
commit | 880bdbd52b1f92057a680928f2ca8898b6fc5145 (patch) | |
tree | 40f9f14d59f592163f7903de63aade0341b95a47 /server | |
parent | cb8c7f91a603b1a347762f246b66b9575b9c622f (diff) | |
download | vaadin-framework-880bdbd52b1f92057a680928f2ca8898b6fc5145.tar.gz vaadin-framework-880bdbd52b1f92057a680928f2ca8898b6fc5145.zip |
Always call close() method for session valueUnbound() method (#12843).
Change-Id: I1500b4b50d1f7ae9ee5fd2252a7b682b93cce720
Diffstat (limited to 'server')
4 files changed, 124 insertions, 0 deletions
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<UI> uis = new ArrayList<UI>(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()); + } } |