Browse Source

Always call close() method for session valueUnbound() method (#12843).

Change-Id: I1500b4b50d1f7ae9ee5fd2252a7b682b93cce720
tags/7.2.0.beta1
Denis Anisimov 10 years ago
parent
commit
880bdbd52b

+ 3
- 0
server/src/com/vaadin/server/VaadinService.java View File

@@ -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() {

+ 49
- 0
server/tests/src/com/vaadin/server/MockVaadinSession.java View File

@@ -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();
}

+ 53
- 0
server/tests/src/com/vaadin/server/VaadinServiceTest.java View File

@@ -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());
}
}

+ 19
- 0
server/tests/src/com/vaadin/server/VaadinSessionTest.java View File

@@ -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());
}
}

Loading…
Cancel
Save