package org.intracetest.agent; import junit.framework.TestCase; import org.intrace.output.trace.TraceHandler; public class StackTraceTest extends TestCase { private String m_stackTrace; /** Here is the raw stack trace that we want to validate: * <PRE> org.intracetest.agent.StackTraceTest.c(StackTraceTest.java:57),org.intracetest.agent.StackTraceTest.b(StackTraceTest.java:54),org.intracetest.agent.StackTraceTest.a(StackTraceTest.java:51),org.intracetest.agent.StackTraceTest.testStackTrace(StackTraceTest.java:27),sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),java.lang.reflect.Method.invoke(Method.java:601),junit.framework.TestCase.runTest(TestCase.java:168),junit.framework.TestCase.runBare(TestCase.java:134),junit.framework.TestResult$1.protect(TestResult.java:110),junit.framework.TestResult.runProtected(TestResult.java:128),junit.framework.TestResult.run(TestResult.java:113),junit.framework.TestCase.run(TestCase.java:124),junit.framework.TestSuite.runTest(TestSuite.java:243),junit.framework.TestSuite.run(TestSuite.java:238),org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83),org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50),org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38),org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467),org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683),org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390),org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) * </PRE> * Among other things, this test validates that the following are removed from the stack trace: * <ul> * <li>java.lang.Thread.getStackTrace</li> * <li>all org.intrace. activity</li> * </ul> * */ public void testStackTrace() { a(); String[] parts = m_stackTrace.split(","); //System.out.println(m_stackTrace); //JUnit has a thick call stack -- when I checked, there were 23 stack trace elements. //Application developers only care about the ones on the very top. assertTrue("Didn't not find the right number of StackTraceElements", parts.length > 4); validateStackTraceElement("org.intracetest.agent.StackTraceTest.c", parts[0]); validateStackTraceElement("org.intracetest.agent.StackTraceTest.b", parts[1]); validateStackTraceElement("org.intracetest.agent.StackTraceTest.a", parts[2]); validateStackTraceElement("org.intracetest.agent.StackTraceTest.testStackTrace", parts[3]); //validateStackTraceElement("sun.reflect.NativeMethodAccessorImpl.invoke0", parts[4]); } private void validateStackTraceElement(String expectedPackageAndClassAndMethod, String actual) { String[] partsOfStackTraceElement = actual.split("[\\(:\\)]"); assertEquals("The package and class and method name were not found in the right place", expectedPackageAndClassAndMethod, partsOfStackTraceElement[0]); assertEquals("source file not found in the right place", "StackTraceTest.java", partsOfStackTraceElement[1]); } private void a() { b(); } private void b() { c(); } private void c() { m_stackTrace = TraceHandler.INSTANCE.getStackTrace(); } }