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