Change-Id: I1500b4b50d1f7ae9ee5fd2252a7b682b93cce720tags/7.2.0.beta1
@@ -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() { |
@@ -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(); | |||
} |
@@ -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()); | |||
} | |||
} |
@@ -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()); | |||
} | |||
} |