aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--server/tests/src/com/vaadin/server/MockVaadinSession.java21
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();