diff options
author | Leif Åstrand <leif@vaadin.com> | 2015-04-23 15:54:29 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2015-04-24 07:38:28 +0000 |
commit | 8be56ef580e4fab732060d7d99f560c9917ca502 (patch) | |
tree | 8057cf98330a16cf4b41af745e8f01e1bc789b4a /server/tests/src | |
parent | 7572ef713e218f29ca316652f13cf6eef88d1c0b (diff) | |
download | vaadin-framework-8be56ef580e4fab732060d7d99f560c9917ca502.tar.gz vaadin-framework-8be56ef580e4fab732060d7d99f560c9917ca502.zip |
Make restoreInstances clear value when previous value was gc:ed (#17603)
Change-Id: I61992c04cac578dc1158efd9c76484eacc8a6b6a
Diffstat (limited to 'server/tests/src')
-rw-r--r-- | server/tests/src/com/vaadin/util/CurrentInstanceTest.java | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/server/tests/src/com/vaadin/util/CurrentInstanceTest.java b/server/tests/src/com/vaadin/util/CurrentInstanceTest.java index 5f9c9638e6..458e8a2f6c 100644 --- a/server/tests/src/com/vaadin/util/CurrentInstanceTest.java +++ b/server/tests/src/com/vaadin/util/CurrentInstanceTest.java @@ -17,6 +17,7 @@ package com.vaadin.util; import static org.junit.Assert.assertNull; +import java.lang.ref.WeakReference; import java.lang.reflect.Field; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; @@ -200,4 +201,48 @@ public class CurrentInstanceTest { assertNull(CurrentInstance.get(VaadinSession.class)); assertNull(CurrentInstance.get(VaadinService.class)); } + + @Test + public void testRestoreWithGarbageCollectedValue() + throws InterruptedException { + VaadinSession session1 = new VaadinSession(null) { + @Override + public String toString() { + return "First session"; + } + }; + VaadinSession session2 = new VaadinSession(null) { + @Override + public String toString() { + return "Second session"; + } + }; + + VaadinSession.setCurrent(session1); + Map<Class<?>, CurrentInstance> previous = CurrentInstance + .setCurrent(session2); + + // Use weak ref to verify object is collected + WeakReference<VaadinSession> ref = new WeakReference<VaadinSession>( + session1); + + session1 = null; + waitUntilGarbageCollected(ref); + + CurrentInstance.restoreInstances(previous); + + Assert.assertNull(VaadinSession.getCurrent()); + } + + private static void waitUntilGarbageCollected(WeakReference<?> ref) + throws InterruptedException { + for (int i = 0; i < 50; i++) { + System.gc(); + if (ref.get() == null) { + return; + } + Thread.sleep(100); + } + Assert.fail("Value was not garbage collected."); + } } |