diff options
-rw-r--r-- | server/tests/src/com/vaadin/server/MockVaadinSession.java | 21 |
1 files changed, 21 insertions, 0 deletions
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<MockVaadinSession> referenceKeeper = new ThreadLocal<MockVaadinSession>(); 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(); |