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 }