View Javadoc

1   package net.sf.ehcache.pool.sizeof;
2   
3   import net.sf.ehcache.pool.sizeof.ObjectGraphWalker;
4   import net.sf.ehcache.pool.sizeof.filter.PassThroughFilter;
5   
6   import org.junit.Test;
7   
8   import java.util.HashMap;
9   import java.util.Map;
10  import java.util.concurrent.locks.ReentrantReadWriteLock;
11  
12  import static org.hamcrest.CoreMatchers.is;
13  import static org.junit.Assert.assertThat;
14  
15  /***
16   * @author Alex Snaps
17   */
18  public class ObjectGraphWalkerTest {
19  
20    @Test
21    public void testWalksAGraph() {
22  
23      final Map<String, Long> map = new HashMap<String, Long>();
24  
25      ObjectGraphWalker walker = new ObjectGraphWalker(
26          new ObjectGraphWalker.Visitor() {
27            public long visit(final Object object) {
28              increment(object.getClass().getName());
29              return 1;
30            }
31  
32            public void increment(String value) {
33              if (value != null) {
34                Long previousValue = map.get(value);
35                if (previousValue == null) {
36                  previousValue = 0L;
37                }
38                map.put(value, ++previousValue);
39              }
40            }
41          }, new PassThroughFilter());
42  
43      String javaVersion = System.getProperty("java.version");
44      if (javaVersion.startsWith("1.5")) {
45        assertThat(walker.walk(new ReentrantReadWriteLock()), is(4L));
46      } else if (javaVersion.startsWith("1.6") || javaVersion.startsWith("1.7")) {
47        assertThat(walker.walk(new ReentrantReadWriteLock()), is(5L));
48        assertThat(map.remove("java.util.concurrent.locks.ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter"), is(1L));
49      } else {
50        throw new AssertionError("Unexpected Java Version : " + javaVersion);
51      }
52      assertThat(map.remove(ReentrantReadWriteLock.class.getName()), is(1L));
53      assertThat(map.remove("java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync"), is(1L));
54      assertThat(map.remove(ReentrantReadWriteLock.ReadLock.class.getName()), is(1L));
55      assertThat(map.remove(ReentrantReadWriteLock.WriteLock.class.getName()), is(1L));
56      assertThat(map.isEmpty(), is(true));
57  
58      if (javaVersion.startsWith("1.5")) {
59        assertThat(walker.walk(new SomeInnerClass()), is(14L));
60      } else if (javaVersion.startsWith("1.6") || javaVersion.startsWith("1.7")) {
61        assertThat(walker.walk(new SomeInnerClass()), is(15L));
62        assertThat(map.remove("java.util.concurrent.locks.ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter"), is(1L));
63      } else {
64        throw new AssertionError("Unexpected Java Version : " + javaVersion);
65      }
66      assertThat(map.remove(SomeInnerClass.class.getName()), is(1L));
67      assertThat(map.remove(this.getClass().getName()), is(1L));
68      assertThat(map.remove(Object.class.getName()), is(5L));
69      assertThat(map.remove(ReentrantReadWriteLock.class.getName()), is(1L));
70      assertThat(map.remove("java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync"), is(1L));
71      assertThat(map.remove(ReentrantReadWriteLock.ReadLock.class.getName()), is(1L));
72      assertThat(map.remove(ReentrantReadWriteLock.WriteLock.class.getName()), is(1L));
73      assertThat(map.remove(Object[].class.getName()), is(1L));
74      assertThat(map.remove(Integer.class.getName()), is(1L));
75      assertThat(map.remove(int[].class.getName()), is(1L));
76      assertThat(map.isEmpty(), is(true));
77  
78      assertThat(walker.walk((Object) null), is(0L));
79      assertThat(walker.walk(), is(0L));
80    }
81  
82    public class SomeInnerClass {
83  
84      private int      value;
85      private Object   one;
86      private final Object   two        = new Object();
87      private final Object   three      = new Object();
88      private final Object   four       = new ReentrantReadWriteLock();
89      private final Object[] anArray    = new Object[]{new Object(), new Object(), new Object(), one, two, two, three, four, value};
90      private final int[]    anIntArray = new int[]   {1, 2, 1300                                                                 };
91  
92    }
93  }