|
|
@@ -0,0 +1,89 @@
|
|
|
+/*
|
|
|
+ * @author Ranides Atterwim <ranides@gmail.com>
|
|
|
+ * @copyright Ranides Atterwim
|
|
|
+ * @license WTFPL
|
|
|
+ * @url http://ranides.net/projects/assira
|
|
|
+ */
|
|
|
+package net.ranides.assira.trace;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+import java.util.concurrent.locks.ReentrantLock;
|
|
|
+import net.ranides.assira.text.Wildcard;
|
|
|
+import org.junit.Test;
|
|
|
+import static org.junit.Assert.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ * @author Ranides Atterwim <ranides@gmail.com>
|
|
|
+ */
|
|
|
+@SuppressWarnings({
|
|
|
+ "PMD",
|
|
|
+ "NestedSynchronizedStatement"
|
|
|
+})
|
|
|
+public class ThreadInspectorTest {
|
|
|
+
|
|
|
+ List<String> DUMP = Arrays.asList(
|
|
|
+ "THREAD: main 0x00000001 (monitors=3, locks=1)",
|
|
|
+ " - MONITOR : net.ranides.assira.trace.ThreadInspectorTest$Lock3 * @ net.ranides.assira.trace.ThreadInspectorTest.itestDump(ThreadInspectorTest.java:*)",
|
|
|
+ " - MONITOR : net.ranides.assira.trace.ThreadInspectorTest$Lock2 * @ net.ranides.assira.trace.ThreadInspectorTest.testDump(ThreadInspectorTest.java:*)",
|
|
|
+ " - MONITOR : net.ranides.assira.trace.ThreadInspectorTest$Lock1 * @ net.ranides.assira.trace.ThreadInspectorTest.testDump(ThreadInspectorTest.java:*)",
|
|
|
+ " - LOCK : java.util.concurrent.locks.ReentrantLock$NonfairSync *"
|
|
|
+ );
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testLocks() {
|
|
|
+ ReentrantLock a = new ReentrantLock();
|
|
|
+ a.lock();
|
|
|
+ synchronized(new Lock1()) {
|
|
|
+ synchronized(new Lock2()) {
|
|
|
+ assertEquals(4,itestLocks());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ a.unlock();
|
|
|
+ }
|
|
|
+
|
|
|
+ private int itestLocks() {
|
|
|
+ synchronized(new Lock3()) {
|
|
|
+ return ThreadInspector.get().locks();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testDump() {
|
|
|
+ ReentrantLock a = new ReentrantLock();
|
|
|
+ a.lock();
|
|
|
+ synchronized(new Lock1()) {
|
|
|
+ synchronized(new Lock2()) {
|
|
|
+ itestDump();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ a.unlock();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void itestDump() {
|
|
|
+ synchronized(new Lock3()) {
|
|
|
+ List<String> out = new ArrayList<>();
|
|
|
+ ThreadInspector.get().dump(out::add);
|
|
|
+ assertMatch(DUMP, out);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static class Lock1 { }
|
|
|
+ private static class Lock2 { }
|
|
|
+ private static class Lock3 { }
|
|
|
+
|
|
|
+ private static boolean match(String pattern, String value) {
|
|
|
+ return Wildcard.compile(pattern).test(value);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void assertMatch(List<String> patterns, List<String> values) {
|
|
|
+ assertEquals("size of list", patterns.size(), values.size());
|
|
|
+ for(int i=0, n=patterns.size(); i<n; i++) {
|
|
|
+ if(!match(patterns.get(i), values.get(i))) {
|
|
|
+ fail("invalid output line " + i);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|