package org.threadly.util.debug; import static org.junit.Assert.*; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.junit.Before; import org.junit.Test; import org.threadly.test.concurrent.TestUtils; import org.threadly.util.debug.Profiler.ThreadSample; @SuppressWarnings("javadoc") public class ControlledThreadProfilerTest extends ProfilerTest { private static final int POLL_INTERVAL = 1; private static final int WAIT_TIME_FOR_COLLECTION = 50; private ControlledThreadProfiler ctProfiler; @Before @Override public void setup() { ctProfiler = new ControlledThreadProfiler(POLL_INTERVAL); profiler = ctProfiler; } @Test @Override public void constructorTest() { int testPollInterval = Profiler.DEFAULT_POLL_INTERVAL_IN_MILLIS * 10; ControlledThreadProfiler p; p = new ControlledThreadProfiler(); assertNotNull(p.controledThreadStore.threadTraces); assertTrue(p.controledThreadStore.threadTraces.isEmpty()); assertEquals(Profiler.DEFAULT_POLL_INTERVAL_IN_MILLIS, p.controledThreadStore.pollIntervalInMs); assertNull(p.controledThreadStore.collectorThread.get()); assertNull(p.controledThreadStore.dumpingThread); assertNotNull(p.startStopLock); assertTrue(p.controledThreadStore.profiledThreads.isEmpty()); p = new ControlledThreadProfiler(testPollInterval); assertNotNull(p.controledThreadStore.threadTraces); assertTrue(p.controledThreadStore.threadTraces.isEmpty()); assertEquals(testPollInterval, p.controledThreadStore.pollIntervalInMs); assertNull(p.controledThreadStore.collectorThread.get()); assertNull(p.controledThreadStore.dumpingThread); assertNotNull(p.startStopLock); assertTrue(p.controledThreadStore.profiledThreads.isEmpty()); } @Test public void getProfileThreadsIteratorEmptyTest() { Iterator<?> it = profiler.pStore.getProfileThreadsIterator(); assertNotNull(it); assertFalse(it.hasNext()); } @Test @Override public void getProfileThreadsIteratorTest() { ctProfiler.addProfiledThread(Thread.currentThread()); Iterator<? extends ThreadSample> it = profiler.pStore.getProfileThreadsIterator(); assertNotNull(it); assertTrue(it.hasNext()); assertTrue(it.next().getThread() == Thread.currentThread()); // should only have the one added thread assertFalse(it.hasNext()); } @Test @Override public void profileThreadsIteratorRemoveFail() { // not relevant for this class } @Override @SuppressWarnings("unused") @Test (expected = IllegalArgumentException.class) public void constructorFail() { new ControlledThreadProfiler(-1); } @Test public void addProfiledThreadTest() { assertTrue(ctProfiler.controledThreadStore.profiledThreads.isEmpty()); Thread currentThread = Thread.currentThread(); ctProfiler.addProfiledThread(currentThread); assertEquals(1, ctProfiler.controledThreadStore.profiledThreads.size()); } @Test public void addProfiledThreadDuplicateThreadTest() { assertEquals(0, ctProfiler.controledThreadStore.profiledThreads.size()); Thread currentThread = Thread.currentThread(); ctProfiler.addProfiledThread(currentThread); assertEquals(1, ctProfiler.controledThreadStore.profiledThreads.size()); ctProfiler.addProfiledThread(currentThread); // nothing should have changed assertEquals(1, ctProfiler.controledThreadStore.profiledThreads.size()); } @Test public void addNullProfiledThreadTest() { assertTrue(ctProfiler.controledThreadStore.profiledThreads.isEmpty()); ctProfiler.addProfiledThread(null); assertTrue(ctProfiler.controledThreadStore.profiledThreads.isEmpty()); } @Test public void removeProfiledThreadTest() { assertTrue(ctProfiler.controledThreadStore.profiledThreads.isEmpty()); Thread thread1 = new Thread(); Thread thread2 = new Thread(); ctProfiler.addProfiledThread(thread1); ctProfiler.addProfiledThread(thread2); assertEquals(2, ctProfiler.controledThreadStore.profiledThreads.size()); assertTrue(ctProfiler.removedProfiledThread(thread1)); assertEquals(1, ctProfiler.controledThreadStore.profiledThreads.size()); } @Test public void getProfiledThreadCountTest() { int testThreadCount = 10; assertEquals(0, ctProfiler.getProfiledThreadCount()); List<Thread> addedThreads = new ArrayList<>(testThreadCount); for (int i = 0; i < testThreadCount; i++) { Thread t = new Thread(); addedThreads.add(t); ctProfiler.addProfiledThread(t); assertEquals(i + 1, ctProfiler.getProfiledThreadCount()); } Iterator<Thread> it = addedThreads.iterator(); int removedCount = 0; while (it.hasNext()) { Thread t = it.next(); ctProfiler.removedProfiledThread(t); removedCount++; assertEquals(testThreadCount - removedCount, ctProfiler.getProfiledThreadCount()); } } @Test @Override public void resetTest() { ctProfiler.addProfiledThread(Thread.currentThread()); super.resetTest(); } @Test public void dumpStoppedStringEmptyTest() { profiler.start(); TestUtils.sleep(WAIT_TIME_FOR_COLLECTION); profiler.stop(); String resultStr = profiler.dump(); // no dump since no threads set to track assertEquals(0, resultStr.length()); } @Test @Override public void dumpStoppedStringTest() { ctProfiler.addProfiledThread(Thread.currentThread()); super.dumpStoppedStringTest(); } @Test public void dumpStoppedOutputStreamEmptyTest() { profiler.start(); TestUtils.sleep(WAIT_TIME_FOR_COLLECTION); profiler.stop(); ByteArrayOutputStream out = new ByteArrayOutputStream(); profiler.dump(out); String resultStr = out.toString(); // no dump since no threads set to track assertEquals(0, resultStr.length()); } @Test @Override public void dumpStoppedOutputStreamTest() { ctProfiler.addProfiledThread(Thread.currentThread()); super.dumpStoppedOutputStreamTest(); } @Test public void dumpStringEmptyTest() { profiler.start(); TestUtils.sleep(WAIT_TIME_FOR_COLLECTION); String resultStr = profiler.dump(); // no dump since no threads set to track assertEquals(0, resultStr.length()); } @Test @Override public void dumpStringTest() { ctProfiler.addProfiledThread(Thread.currentThread()); super.dumpStringTest(); } @Test public void dumpOutputStreamEmptyTest() { profiler.start(); TestUtils.sleep(WAIT_TIME_FOR_COLLECTION); ByteArrayOutputStream out = new ByteArrayOutputStream(); profiler.dump(out); String resultStr = out.toString(); // no dump since no threads set to track assertEquals(0, resultStr.length()); } @Test @Override public void dumpOutputStreamTest() { ctProfiler.addProfiledThread(Thread.currentThread()); super.dumpOutputStreamTest(); } @Test @Override public void dumpStringOnlySummaryTest() { ctProfiler.addProfiledThread(Thread.currentThread()); super.dumpStringOnlySummaryTest(); } }