package org.stagemonitor.tracing.profiler; import org.junit.Test; import java.util.concurrent.TimeUnit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; public class ManualProfilerTest { private static class TestClass { static CallStackElement method0() { final CallStackElement callStackElement = Profiler.activateProfiling("method0()"); try { method1(); return callStackElement; } finally { final CallStackElement thisCallStackElement = Profiler.getMethodCallParent(); Profiler.stop(); thisCallStackElement.setExecutionTime(1000000000); } } static void method1() { Profiler.start("method1()"); try { method1_1(); method1_2(); } finally { final CallStackElement thisCallStackElement = Profiler.getMethodCallParent(); Profiler.stop(); thisCallStackElement.setExecutionTime(1000000000); } } static void method1_1() { Profiler.start("method1_1()"); try { method1_1_1(); method1_1_2(); } finally { final CallStackElement thisCallStackElement = Profiler.getMethodCallParent(); Profiler.stop(); thisCallStackElement.setExecutionTime(500000000); } } static void method1_1_1() { Profiler.start("method1_1_1()"); final CallStackElement thisCallStackElement = Profiler.getMethodCallParent(); Profiler.stop(); thisCallStackElement.setExecutionTime(200000000); } static void method1_1_2() { Profiler.start("method1_1_2()"); try { method1_1_2_1(); } finally { final CallStackElement thisCallStackElement = Profiler.getMethodCallParent(); Profiler.stop(); thisCallStackElement.setExecutionTime(250000000); } } static void method1_1_2_1() { Profiler.start("method1_1_2_1()"); final CallStackElement thisCallStackElement = Profiler.getMethodCallParent(); Profiler.stop(); thisCallStackElement.setExecutionTime(50000000); } static void method1_2() { Profiler.start("method1_2()"); Profiler.addIOCall("select * from user", 50000000); Profiler.addIOCall("select * from address", 50000000); method1_2_1(); final CallStackElement thisCallStackElement = Profiler.getMethodCallParent(); Profiler.stop(); thisCallStackElement.setExecutionTime(500000000); } static void method1_2_1() { Profiler.start("method1_2_1()"); final CallStackElement thisCallStackElement = Profiler.getMethodCallParent(); Profiler.stop(); thisCallStackElement.setExecutionTime(250000000); } } @Test public void testProfiler() { final CallStackElement callStackElement = TestClass.method0(); assertEquals( "----------------------------------------------------------------------\n" + "Selftime (ms) Total (ms) Method signature\n" + "----------------------------------------------------------------------\n" + "000000.00 000% ---------- 001000.00 100% |||||||||| method0()\n" + "000000.00 000% ---------- 001000.00 100% |||||||||| `-- method1()\n" + "000050.00 005% :--------- 000500.00 050% |||||----- |-- method1_1()\n" + "000200.00 020% ||-------- 000200.00 020% ||-------- | |-- method1_1_1()\n" + "000200.00 020% ||-------- 000250.00 025% ||:------- | `-- method1_1_2()\n" + "000050.00 005% :--------- 000050.00 005% :--------- | `-- method1_1_2_1()\n" + "000150.00 015% |:-------- 000500.00 050% |||||----- `-- method1_2()\n" + "000050.00 005% :--------- 000050.00 005% :--------- |-- select * from user \n" + "000050.00 005% :--------- 000050.00 005% :--------- |-- select * from address \n" + "000250.00 025% ||:------- 000250.00 025% ||:------- `-- method1_2_1()\n", callStackElement.toString()); callStackElement.recycle(); } @Test public void testRemoveCallsFasterThan() { final CallStackElement callStackElement = TestClass.method0(); callStackElement.removeCallsFasterThan(TimeUnit.MILLISECONDS.toNanos(51)); assertEquals( "----------------------------------------------------------------------\n" + "Selftime (ms) Total (ms) Method signature\n" + "----------------------------------------------------------------------\n" + "000000.00 000% ---------- 001000.00 100% |||||||||| method0()\n" + "000000.00 000% ---------- 001000.00 100% |||||||||| `-- method1()\n" + "000050.00 005% :--------- 000500.00 050% |||||----- |-- method1_1()\n" + "000200.00 020% ||-------- 000200.00 020% ||-------- | |-- method1_1_1()\n" + "000250.00 025% ||:------- 000250.00 025% ||:------- | `-- method1_1_2()\n" + // method1_1_2_1 is excluded, because execution time 50 < 51 "000150.00 015% |:-------- 000500.00 050% |||||----- `-- method1_2()\n" + // io queries are not excluded even though execution time 50 < 51 "000050.00 005% :--------- 000050.00 005% :--------- |-- select * from user \n" + "000050.00 005% :--------- 000050.00 005% :--------- |-- select * from address \n" + "000250.00 025% ||:------- 000250.00 025% ||:------- `-- method1_2_1()\n", callStackElement.toString()); callStackElement.recycle(); } @Test public void testRemoveCallsFasterThanNotIncluded() { final CallStackElement callStackElement = TestClass.method0(); callStackElement.removeCallsFasterThan(TimeUnit.MILLISECONDS.toNanos(50)); assertEquals( "----------------------------------------------------------------------\n" + "Selftime (ms) Total (ms) Method signature\n" + "----------------------------------------------------------------------\n" + "000000.00 000% ---------- 001000.00 100% |||||||||| method0()\n" + "000000.00 000% ---------- 001000.00 100% |||||||||| `-- method1()\n" + "000050.00 005% :--------- 000500.00 050% |||||----- |-- method1_1()\n" + "000200.00 020% ||-------- 000200.00 020% ||-------- | |-- method1_1_1()\n" + "000200.00 020% ||-------- 000250.00 025% ||:------- | `-- method1_1_2()\n" + "000050.00 005% :--------- 000050.00 005% :--------- | `-- method1_1_2_1()\n" + "000150.00 015% |:-------- 000500.00 050% |||||----- `-- method1_2()\n" + "000050.00 005% :--------- 000050.00 005% :--------- |-- select * from user \n" + "000050.00 005% :--------- 000050.00 005% :--------- |-- select * from address \n" + "000250.00 025% ||:------- 000250.00 025% ||:------- `-- method1_2_1()\n", callStackElement.toString()); callStackElement.recycle(); } @Test public void testProfilerActive() { assertFalse(Profiler.isProfilingActive()); Profiler.activateProfiling(""); assertTrue(Profiler.isProfilingActive()); Profiler.deactivateProfiling(); assertFalse(Profiler.isProfilingActive()); } @Test public void testNoProfilingIfNotActive() { assertFalse(Profiler.isProfilingActive()); Profiler.start("dummy"); assertNull(Profiler.getMethodCallParent()); Profiler.stop(); } }