From cb2f385cd0082e6571c0cba1e6fe2969f855daab Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Tue, 9 Dec 2014 20:57:16 +0200 Subject: Prevent MockVaadinSession from becomming GCed This fixes the issue discussed in #14595 for the framework's internal tests (if they use MockVaadinSession). Change-Id: I1956680ac065428be41b2ad43fbb80503351b366 --- .../src/com/vaadin/server/MockVaadinSession.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'server/tests') diff --git a/server/tests/src/com/vaadin/server/MockVaadinSession.java b/server/tests/src/com/vaadin/server/MockVaadinSession.java index 660767e0d4..e1def5bcee 100644 --- a/server/tests/src/com/vaadin/server/MockVaadinSession.java +++ b/server/tests/src/com/vaadin/server/MockVaadinSession.java @@ -23,6 +23,15 @@ import java.util.concurrent.locks.ReentrantLock; * @author Vaadin Ltd */ public class MockVaadinSession extends VaadinSession { + /* + * Used to make sure there's at least one reference to the mock session + * while it's locked. This is used to prevent the session from being eaten + * by GC in tests where @Before creates a session and sets it as the current + * instance without keeping any direct reference to it. This pattern has a + * chance of leaking memory if the session is not unlocked in the right way, + * but it should be acceptable for testing use. + */ + private static final ThreadLocal referenceKeeper = new ThreadLocal(); public MockVaadinSession(VaadinService service) { super(service); @@ -43,6 +52,18 @@ public class MockVaadinSession extends VaadinSession { return lock; } + @Override + public void lock() { + super.lock(); + referenceKeeper.set(this); + } + + @Override + public void unlock() { + super.unlock(); + referenceKeeper.remove(); + } + private int closeCount; private ReentrantLock lock = new ReentrantLock(); -- cgit v1.2.3