samples/gc/test/org/apidesign/gc/WeakListenersTest.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 30 Oct 2014 21:30:10 +0100
changeset 409 40cabcdcd2be
parent 263 7e8e995065c5
permissions -rw-r--r--
Updating to NBMs from NetBeans 8.0.1 as some of them are required to run on JDK8
     1 package org.apidesign.gc;
     2 
     3 import java.awt.Color;
     4 import java.beans.PropertyChangeEvent;
     5 import java.beans.PropertyChangeListener;
     6 import java.lang.ref.WeakReference;
     7 import javax.swing.JPanel;
     8 import junit.framework.AssertionFailedError;
     9 import org.junit.After;
    10 import org.junit.AfterClass;
    11 import org.junit.Before;
    12 import org.junit.BeforeClass;
    13 import org.junit.Test;
    14 import org.netbeans.junit.NbTestCase;
    15 import static org.junit.Assert.*;
    16 
    17 public class WeakListenersTest {
    18 
    19     private static JPanel longLivingBean;
    20     
    21     public WeakListenersTest() {
    22     }
    23 
    24     @BeforeClass
    25     public static void setUpClass() throws Exception {
    26         longLivingBean = new JPanel();
    27     }
    28     
    29     @Before
    30     public void setUp() {
    31         longLivingBean.setBackground(Color.BLACK);
    32     }
    33 
    34     @Test
    35     public void listenWithoutWeakReference() {
    36         PropL listener = new PropL();
    37         longLivingBean.addPropertyChangeListener(listener);
    38         longLivingBean.setBackground(Color.WHITE);
    39         assertEquals("background property change notified", "background", listener.propName);
    40         WeakReference<Object> ref = new WeakReference<Object>(listener);
    41         listener = null;
    42         try {
    43             NbTestCase.assertGC(
    44                 "Of course, this listener cannot disappear, because it is held from long living JavaBean", 
    45                 ref
    46             );
    47         } catch (AssertionFailedError ex) {
    48             ex.printStackTrace();
    49             // of course it cannot be garbage collected. That is OK.
    50             return;
    51         } catch (OutOfMemoryError ex) {
    52             ex.printStackTrace();
    53             // sometimes the test fails on OOME, let's catch it
    54             // of course it cannot be garbage collected. That is OK.
    55             return;
    56         }
    57         fail("The listener cannot be GCed as it is held from long living JavaBean");
    58     }
    59 
    60     @Test
    61     public void listenViaWeakListener() {
    62         PropL listener = new PropL();
    63         
    64         PropertyChangeListener weakL = WeakListeners.create(PropertyChangeListener.class, listener, longLivingBean);
    65         longLivingBean.addPropertyChangeListener(weakL);
    66         longLivingBean.setBackground(Color.WHITE);
    67         assertEquals("background property change notified", "background", listener.propName);
    68         // BEGIN: gc.assertGC
    69         WeakReference<Object> ref = new WeakReference<Object>(listener);
    70         listener = null;
    71         NbTestCase.assertGC("This listener can disappear", ref);
    72         // END: gc.assertGC
    73     }
    74 
    75     
    76     private static class PropL implements PropertyChangeListener {
    77         String propName;
    78         public void propertyChange(PropertyChangeEvent evt) {
    79             propName = evt.getPropertyName();
    80         }
    81     }
    82 }