Merge pull request #34 from eostermueller/exitStackTrace

"exitStackTrace" and "gzip" enhancements together in a single pull request.
This commit is contained in:
mchr3k 2014-04-05 19:55:51 +01:00
commit 24db68904d
18 changed files with 2579 additions and 7 deletions

Binary file not shown.

View File

@ -23,6 +23,7 @@ public class AgentSettings
private int actualServerPort = -1;
// Dynamic settings
private boolean gzipEnabled = false;
private String[] classRegex = new String[0];
private String[] excludeClassRegex = new String[0];
private boolean instruEnabled = true;
@ -38,6 +39,7 @@ public class AgentSettings
{
// Copy all static state and dynamic settings
actualServerPort = oldInstance.getActualServerPort();
gzipEnabled = oldInstance.isGzipEnabled();
classRegex = oldInstance.getClassRegex();
excludeClassRegex = oldInstance.getExcludeClassRegex();
instruEnabled = oldInstance.isInstrumentationEnabled();
@ -45,7 +47,14 @@ public class AgentSettings
verboseMode = oldInstance.isVerboseMode();
}
public void parseArgs(String args)
public boolean isGzipEnabled() {
return gzipEnabled;
}
public void setGzipEnabled(boolean val) {
gzipEnabled = val;
}
public void parseArgs(String args)
{
String[] seperateArgs = args.split("\\[");
for (int ii = 0; ii < seperateArgs.length; ii++)
@ -107,6 +116,14 @@ public class AgentSettings
{
waitStart = false;
}
else if (arg.toLowerCase(Locale.ROOT).equals(AgentConfigConstants.GZIP + "true"))
{
gzipEnabled = true;
}
else if (arg.toLowerCase(Locale.ROOT).equals(AgentConfigConstants.GZIP + "false"))
{
gzipEnabled = false;
}
else if (arg.startsWith(AgentConfigConstants.CLASS_REGEX))
{
String classRegexStr = arg.replace(AgentConfigConstants.CLASS_REGEX, "");
@ -177,6 +194,7 @@ public class AgentSettings
{
// Output key settings
String currentSettings = "";
currentSettings += "GZip Enabled : " + gzipEnabled + "\n";
currentSettings += "Class Regex : " + Arrays.toString(classRegex) + "\n";
currentSettings += "Exclude Class Regex : " + Arrays.toString(excludeClassRegex) + "\n";
currentSettings += "Tracing Enabled : " + instruEnabled + "\n";
@ -190,6 +208,8 @@ public class AgentSettings
Map<String, String> settingsMap = new HashMap<String, String>();
settingsMap.put(AgentConfigConstants.INSTRU_ENABLED,
Boolean.toString(instruEnabled));
settingsMap.put(AgentConfigConstants.GZIP,
Boolean.toString(gzipEnabled));
settingsMap.put(AgentConfigConstants.CLASS_REGEX,
getPatternString(classRegex));
settingsMap.put(AgentConfigConstants.EXCLUDE_CLASS_REGEX,

View File

@ -27,6 +27,7 @@ import org.intrace.agent.server.AgentServer;
import org.intrace.output.AgentHelper;
import org.intrace.output.InstruRunnable;
import org.intrace.output.trace.TraceHandler;
import org.intrace.output.trace.TraceSettings;
import org.intrace.shared.AgentConfigConstants;
import org.objectweb.asm.ClassReader;
@ -482,6 +483,9 @@ public class ClassTransformer implements ClassFileTransformer
Integer.toString(modifiedClasses.size()));
return settingsMap;
}
public boolean isGzipEnabled() {
return settings.isGzipEnabled();
}
/**
* Handle a message and return a response.
@ -507,6 +511,12 @@ public class ClassTransformer implements ClassFileTransformer
// System.out.println("## Settings Changed");
setInstrumentationEnabled(settings.isInstrumentationEnabled());
}
else if (oldSettings.isGzipEnabled() != settings.isGzipEnabled())
{
//For coding simplicity and user clarity, the gzip parameter can only be set on agent side
//So, return to the old setting, which originated with the intrace agent command line parameter -- [gzip-true
settings.setGzipEnabled(oldSettings.isGzipEnabled());
}
else if (!Arrays.equals(oldSettings.getClassRegex(), settings.getClassRegex()))
{
// System.out.println("## Settings Changed");

View File

@ -25,7 +25,11 @@ public class AgentClientConnection extends InstruRunnable
{
private final Socket connectedClient;
private final ClassTransformer transformer;
private boolean traceConnEstablished = false;
public ClassTransformer getTransformer() {
return transformer;
}
private boolean traceConnEstablished = false;
private final Object traceConnLock = new Object();
/**

View File

@ -12,6 +12,7 @@ public class ClientStrings
public static final String ENABLE_BRANCH_TRACE = "Branch";
public static final String ENABLE_ARGS_TRACE = "Method Args, Return Values, Exceptions";
public static final String ENABLE_ARRAY_TRACE = "Truncate Array Args";
public static final String ENABLE_EXIT_STACK_TRACE = "Add Stacktrace to Exit";
public static final String BEGIN_CAPTURE_CALLERS = "New Callers Capture...";
public static final String END_CAPTURE_CALLERS = "End Callers Capture";

View File

@ -787,6 +787,7 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener
final Button branchTrace;
final Button argsTrace;
final Button arrayTrace;
final Button exitStackTrace;
final Composite composite;
@ -813,6 +814,11 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener
arrayTrace.setText(ClientStrings.ENABLE_ARRAY_TRACE);
arrayTrace.setAlignment(SWT.CENTER);
exitStackTrace = new Button(composite, SWT.CHECK);
exitStackTrace.setText(ClientStrings.ENABLE_EXIT_STACK_TRACE);
exitStackTrace.setAlignment(SWT.CENTER);
entryExitTrace
.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter()
{
@ -857,6 +863,17 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener
settingsData.truncArraysEnabled = !settingsData.truncArraysEnabled;
}
});
exitStackTrace
.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent arg0)
{
toggleSetting(settingsData.exitStackTrace, "[exit-stack-trace-true",
"[exit-stack-trace-false");
settingsData.exitStackTrace = !settingsData.exitStackTrace;
}
});
}
}
@ -2026,6 +2043,11 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener
{
return settingsData.netOutEnabled;
}
@Override
public boolean isGzipEnabled()
{
return settingsData.gzipEnabled;
}
};
networkTraceThread = new NetworkDataReceiverThread(remoteAddress,
networkTracePort, config, outputTabs.textOutputTab.filterThread);
@ -2204,6 +2226,7 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener
settingsTabs.traceTab.argsTrace.setEnabled(true);
settingsTabs.traceTab.branchTrace.setEnabled(true);
settingsTabs.traceTab.exitStackTrace.setEnabled(true);
settingsTabs.traceTab.entryExitTrace.setEnabled(true);
settingsTabs.traceTab.arrayTrace.setEnabled(true);
settingsTabs.agentOutputSettingsTab.fileOutput.setEnabled(true);
@ -2218,6 +2241,7 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener
// Update the button pressed/unpressed state
settingsTabs.traceTab.argsTrace.setSelection(settingsData.argsEnabled);
settingsTabs.traceTab.branchTrace.setSelection(settingsData.branchEnabled);
settingsTabs.traceTab.exitStackTrace.setSelection(settingsData.exitStackTrace);
settingsTabs.traceTab.entryExitTrace.setSelection(settingsData.entryExitEnabled);
settingsTabs.traceTab.arrayTrace.setSelection(settingsData.truncArraysEnabled);
settingsTabs.agentOutputSettingsTab.fileOutput.setSelection(settingsData.fileOutEnabled);
@ -2256,6 +2280,7 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener
settingsTabs.traceTab.argsTrace.setEnabled(false);
settingsTabs.traceTab.branchTrace.setEnabled(false);
settingsTabs.traceTab.exitStackTrace.setEnabled(false);
settingsTabs.traceTab.entryExitTrace.setEnabled(false);
settingsTabs.traceTab.arrayTrace.setEnabled(false);
settingsTabs.agentOutputSettingsTab.fileOutput.setEnabled(false);

View File

@ -6,11 +6,15 @@ import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import org.intrace.shared.Base64;
public class NetworkDataReceiverThread implements Runnable
{
public static interface INetworkOutputConfig
{
public boolean isNetOutputEnabled();
public boolean isGzipEnabled();
}
private final Socket traceSocket;
@ -53,6 +57,10 @@ public class NetworkDataReceiverThread implements Runnable
{
if (outputConfig.isNetOutputEnabled())
{
if (outputConfig.isGzipEnabled()) {
byte[] tmp = Base64.decode(traceLine);
traceLine = new String(tmp);
}
traceThread.addTraceLine(traceLine);
}
}

View File

@ -16,8 +16,11 @@ public class ParsedSettingsData
public boolean entryExitEnabled;
public boolean branchEnabled;
public boolean gzipEnabled = false;
public boolean truncArraysEnabled;
public boolean argsEnabled;
public boolean exitStackTrace = false;
public boolean stdOutEnabled;
public boolean fileOutEnabled;
public boolean netOutEnabled;
@ -35,6 +38,24 @@ public class ParsedSettingsData
{
this.settingsMap = settingsMap;
if ("true".equals(settingsMap.get(AgentConfigConstants.GZIP)))
{
gzipEnabled = true;
}
else
{
gzipEnabled = false;
}
if ("true".equals(settingsMap.get(AgentConfigConstants.EXIT_STACK_TRACE)))
{
exitStackTrace = true;
}
else
{
exitStackTrace = false;
}
classRegex = settingsMap.get(AgentConfigConstants.CLASS_REGEX);
classExcludeRegex = settingsMap
.get(AgentConfigConstants.EXCLUDE_CLASS_REGEX);
@ -86,6 +107,7 @@ public class ParsedSettingsData
branchEnabled = false;
}
if ("true".equals(settingsMap.get(TraceConfigConstants.ARG)))
{
argsEnabled = true;

View File

@ -11,6 +11,7 @@ import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import org.intrace.agent.server.AgentClientConnection;
import org.intrace.shared.Base64;
public class NetworkDataSenderThread extends InstruRunnable
{
@ -100,6 +101,10 @@ public class NetworkDataSenderThread extends InstruRunnable
Object traceLine = outgoingData.poll(5, TimeUnit.SECONDS);
if (traceLine != null)
{
if (traceLine instanceof String && connection.getTransformer().isGzipEnabled()) {
String tmp = (String)traceLine;
traceLine = Base64.encodeBytes(tmp.getBytes(), Base64.GZIP);
}
traceWriter.writeObject(traceLine);
}
else

View File

@ -4,8 +4,10 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Array;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.intrace.output.AgentHelper;
@ -16,6 +18,12 @@ import org.intrace.output.IInstrumentationHandler;
*/
public class TraceHandler implements IInstrumentationHandler
{
/**
* Including the period at the end enables code in "org.intracetest" to be included in the trace
*/
private static final String INTRACE_PACKAGE = "org.intrace.";
private static final String THREAD = "java.lang.Thread";
private static final String GET_STACK_TRACE = "getStackTrace";
public static final TraceHandler INSTANCE = new TraceHandler();
private TraceHandler()
{
@ -26,7 +34,8 @@ public class TraceHandler implements IInstrumentationHandler
private boolean branchTrace = false;
private boolean argTrace = true;
private boolean truncateArrays = true;
private boolean exitStackTrace = false;
private static final TraceSettings traceSettings = new TraceSettings("");
public String getResponse(String args)
@ -50,7 +59,8 @@ public class TraceHandler implements IInstrumentationHandler
branchTrace = traceSettings.isBranchTraceEnabled();
argTrace = traceSettings.isArgTraceEnabled();
truncateArrays = traceSettings.isTruncateArraysEnabled();
exitStackTrace = traceSettings.isExitStackTraceEnabled();
return null;
}
@ -251,6 +261,15 @@ public class TraceHandler implements IInstrumentationHandler
}
private static final char ESCAPE_REPLACEMENT = '\u25A1';
/**
* If user has requested to see a stack trace for each 'exit' event (with the parameter [exit-stack-trace-true) , then
* this delimiter will follow the regular event text, which will be followed by the text of the stack trace.
*/
private static final String STACK_TRACE_DELIM = "~";
/**
* Just like Arrays.toString(Object), place a comma between each element of the stack trace
*/
private static final Object STACK_ELE_DELIM = ",";
private String replaceChars(String xiArg)
{
@ -384,13 +403,38 @@ public class TraceHandler implements IInstrumentationHandler
}
}
/**
* Remove all "org.intrace" elements from the current stack trace and return it as string.
* @return
*/
public String getStackTrace() {
StringBuilder sb = new StringBuilder();
int counter = 0;
for(StackTraceElement ste : Thread.currentThread().getStackTrace() ) {
if ( ste.getClassName().indexOf(INTRACE_PACKAGE) <0
&& (ste.getClassName().indexOf(THREAD) < 0) && ste.getMethodName().indexOf(GET_STACK_TRACE)<0) {
if (counter++>0) sb.append(STACK_ELE_DELIM); //Just like Arrays.toString(), place a comma between each stack trace ele.
sb.append(ste.toString());
}
}
return sb.toString();
}
@Override
public void exit(String className, String methodName, int lineNo)
{
if (entryExitTrace)
{
writeTraceOutput(className + ":" + methodName + ": }" +
(lineNo >= 0 ? ":" + lineNo : ""));
if (exitStackTrace) {
writeTraceOutput(className + ":" + methodName + ": }" +
(lineNo >= 0 ? ":" + lineNo : "") +
STACK_TRACE_DELIM + getStackTrace() );
} else {
writeTraceOutput(className + ":" + methodName + ": }" +
(lineNo >= 0 ? ":" + lineNo : "") );
}
}
}

View File

@ -17,6 +17,16 @@ public class TraceSettings
private boolean branchTraceEnabled = false;
private boolean argTraceEnabled = true;
private boolean truncateArraysEnabled = true;
/**
* If true, append the 'current' stack trace to the text of the exit trace event.
* This is helpful for discovering who is invoking a particular line of code.
* Here is an example of the trace output:
* <PRE>
* [07:53:15.509]:[1]:example.FirstTraceExample:intArrayMethod: }:70~java.lang.Thread.getStackTrace(Thread.java:1567),example.FirstTraceExample.intArrayMethod(FirstTraceExample.java:70),example.FirstTraceExample.workMethod(FirstTraceExample.java:38),example.FirstTraceExample.otherMain(FirstTraceExample.java:29),example.FirstTraceExample.main(FirstTraceExample.java:16)
* </PRE>
*/
private boolean exitStackTrace = false;
public TraceSettings(TraceSettings oldSettings)
{
@ -24,6 +34,7 @@ public class TraceSettings
branchTraceEnabled = oldSettings.branchTraceEnabled;
argTraceEnabled = oldSettings.argTraceEnabled;
truncateArraysEnabled = oldSettings.truncateArraysEnabled;
exitStackTrace = oldSettings.exitStackTrace;
}
public TraceSettings(String args)
@ -74,6 +85,14 @@ public class TraceSettings
{
truncateArraysEnabled = false;
}
else if (arg.equals(TraceConfigConstants.EXIT_STACK_TRACE + "false"))
{
exitStackTrace = false;
}
else if (arg.equals(TraceConfigConstants.EXIT_STACK_TRACE + "true"))
{
exitStackTrace = true;
}
}
public boolean isEntryExitTraceEnabled()
@ -95,6 +114,9 @@ public class TraceSettings
{
return truncateArraysEnabled;
}
public boolean isExitStackTraceEnabled() {
return exitStackTrace;
}
public Map<String, String> getSettingsMap()
{
@ -107,6 +129,9 @@ public class TraceSettings
.put(TraceConfigConstants.ARG, Boolean.toString(argTraceEnabled));
settingsMap
.put(TraceConfigConstants.ARRAYS, Boolean.toString(truncateArraysEnabled));
settingsMap.put(TraceConfigConstants.EXIT_STACK_TRACE,
Boolean.toString(exitStackTrace));
return settingsMap;
}
}

View File

@ -16,6 +16,7 @@ public class AgentConfigConstants
public static final String SERVER_PORT = "SERVER_PORT";
public static final String GZIP = "[gzip-"; //Default is not enabled (false).
public static final String CLASS_REGEX = "[regex-";
public static final String EXCLUDE_CLASS_REGEX = "[exclude-regex-";
public static final String INSTRU_ENABLED = "[instru-";
@ -23,6 +24,7 @@ public class AgentConfigConstants
public static final String VERBOSE_MODE = "[verbose-";
public static final String OPT_SERVER_PORT = "[serverport-";
public static final String CALLBACK_PORT = "[callbackport-";
public static final String EXIT_STACK_TRACE = "[exit-stack-trace-";
public static final String START_WAIT = "[startwait";
public static final String START_ACTIVATE = "[startactivate";
@ -37,5 +39,7 @@ public class AgentConfigConstants
COMMANDS.add(VERBOSE_MODE + "<true/false>");
COMMANDS.add(OPT_SERVER_PORT + "<int>");
COMMANDS.add(CALLBACK_PORT + "<int>");
COMMANDS.add(GZIP + "<true/false>");
COMMANDS.add(EXIT_STACK_TRACE + "<true/false>");
}
}

File diff suppressed because it is too large Load Diff

View File

@ -12,6 +12,7 @@ public class TraceConfigConstants
public static final String STD_OUT = "[out-stdout-";
public static final String FILE_OUT = "[out-file-";
public static final String NET_OUT = "[out-network-";
public static final String EXIT_STACK_TRACE = "[exit-stack-trace-";
public static final Set<String> COMMANDS = new HashSet<String>();
static
{
@ -22,5 +23,6 @@ public class TraceConfigConstants
COMMANDS.add(STD_OUT + "<true/false>");
COMMANDS.add(FILE_OUT + "<true/false>");
COMMANDS.add(NET_OUT + "<true/false>");
COMMANDS.add(EXIT_STACK_TRACE + "<true/false>");
}
}

View File

@ -109,9 +109,28 @@ public class AgentTest extends TestCase
assertEquals(helpResponse, expectedHelpResponse);
}
/**
Intentionally, testSetting(AgentConfigConstants.GZIP, "true") does not work.
For simplicity's sake, this setting can only be configured as an intrace agent command line parameter -- [gzip-true
Note that there is no GUI checkbox to enabled Gzip.
To instead enable the client to change this, just change how ClassTransformer#getResponse() deals with a new gzip parameter.
The following simply confirms that
<ul>
<li> getsettings works for gzip parm </li>
<li> b) by default, GZIP is turned off. </li>
</ul>
*
* @throws Exception
*/
public void testRetrievalOfGzipSetting() throws Exception {
testGetSetting(AgentConfigConstants.GZIP, "false");
}
public void testSettings() throws Exception
{
// Boolean settings
testSetting(AgentConfigConstants.INSTRU_ENABLED, "true");
testSetting(AgentConfigConstants.INSTRU_ENABLED, "false");
testSetting(AgentConfigConstants.SAVE_TRACED_CLASSFILES, "true");
@ -124,8 +143,12 @@ public class AgentTest extends TestCase
testSetting(AgentConfigConstants.INSTRU_ENABLED, "true");
testSetting(AgentConfigConstants.VERBOSE_MODE, "true");
testSetting(AgentConfigConstants.CLASS_REGEX, ".*");
//Need to learn more about why these don't work here. --ETO 12/1/2013
//testSetting(TraceConfigConstants.BRANCH, "true");
//testSetting(TraceConfigConstants.BRANCH, "false");
}
public void testBranchPatterns() throws Throwable
{
// Create and init the mock
@ -205,6 +228,7 @@ public class AgentTest extends TestCase
// Setup agent
testSetting(AgentConfigConstants.INSTRU_ENABLED, "false");
testSetting(AgentConfigConstants.GZIP, "false");
testSetting(AgentConfigConstants.CLASS_REGEX, "BranchPatterns");
testSetting(AgentConfigConstants.VERBOSE_MODE, "false");
testSetting(AgentConfigConstants.SAVE_TRACED_CLASSFILES, "true");
@ -320,6 +344,7 @@ public class AgentTest extends TestCase
// Setup agent
testSetting(AgentConfigConstants.INSTRU_ENABLED, "false");
testSetting(AgentConfigConstants.GZIP, "false");
testSetting(AgentConfigConstants.CLASS_REGEX, "ArgumentTypes");
testSetting(AgentConfigConstants.VERBOSE_MODE, "false");
testSetting(AgentConfigConstants.SAVE_TRACED_CLASSFILES, "true");
@ -552,6 +577,18 @@ public class AgentTest extends TestCase
Map<String, String> settingsResponseMap = (Map<String, String>) settingsResponse;
assertEquals(configValue, settingsResponseMap.get(configConstant));
}
@SuppressWarnings("unchecked")
private void testGetSetting(String configConstant, String configValue)
throws Exception
{
// Get settings
sender.sendMessage("getsettings");
Object settingsResponse = receiver.incomingMessages.take();
assertNotNull(settingsResponse);
assertTrue(settingsResponse instanceof Map<?, ?>);
Map<String, String> settingsResponseMap = (Map<String, String>) settingsResponse;
assertEquals(configValue, settingsResponseMap.get(configConstant));
}
@Override
protected void tearDown() throws Exception

View File

@ -0,0 +1,185 @@
package org.intracetest.agent;
import java.io.IOException;
import junit.framework.TestCase;
import org.intrace.shared.Base64;
/**
This test proves out the following API using text data from an intrace Event
* <code>String encoded = Base64.encode( myByteArray );</code>
* <br />
* <code>byte[] myByteArray = Base64.decode( encoded );</code>
<pre>
Plain ASCII Base64 Base64+GZIP
-----------------------------------------
Tiny | 70 96 116
|
Small | 248 332 256
|
Big | 2306 3076 904
|
Huge | 12591 16788 1036
</pre>
How small can we compress the InTrace event text for various sized InTrace events?
<ul>
<li>Base64 without GZIP was detrimental to small compression size in all cases</li>
<li>The 70 and 248 byte events were slightly larger with both Base64 and Base64+GZIP -- bad but a not horrible show stopper.</li>
<li>The Big event was more than 2x as small with Base64+GZIP -- good.</li>
<li>The Huge event was more than 10x as small with Base64+GZIP -- great.</li>
<li> </li>
</ul>
Conclusions:
Will not use Base64 alone -- doesn't provide any compression with these samples.
Base64+GZIP doesn't hurt much with smaller event
*/
public class CompressionTest extends TestCase
{
private static final String ORIGINAL_TINY_INTRACE_EVENT = "[18:07:53.683]:[67]:org.hsqldb.jdbc.jdbcConnection:prepareStatement: {";
private static final String ORIGINAL_SMALL_INTRACE_EVENT = "[18:07:53.683]:[67]:org.hsqldb.jdbc.jdbcConnection:prepareStatement" +
": Return: org.hsqldb.jdbc.jdbcPreparedStatement@4b8efa2f[sql=" +
"[INSERT INTO Event (name, description, date, location) VALUES(?, ?, ?, ?)]" +
", parameters=[[null], [null], [null], [null]]]";
/**
* This isn't a real event (yet)...just adding some text to assess compression for larger messages.
*/
private static final String ORIGINAL_LARGE_STACK_TRACE = "[18:07:53.683]:[67]:org.hsqldb.jdbc.jdbcConnection:prepareStatement" +
": Return: org.hsqldb.jdbc.jdbcPreparedStatement@4b8efa2f[sql=" +
"[INSERT INTO Event (name, description, date, location) VALUES(?, ?, ?, ?)]" +
", parameters=[[null], [null], [null], [null]]]" +
"~java.lang.Thread.getStackTrace(Thread.java:1567) example.webapp.servlet.HelloWorld.doGet(HelloWorld.java:38) javax.servlet.http.HttpServlet.service(HttpServlet.java:668) javax.servlet.http.HttpServlet.service(HttpServlet.java:770) org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669) org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455) org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:560) org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072) org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382) org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006) org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) org.eclipse.jetty.server.Server.handle(Server.java:365) org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485) org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53) org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926) org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988) org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635) org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72) org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264) org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) java.lang.Thread.run(Thread.java:722) ";
/**
* This isn't a real event at all...just adding some text to assess compression for msg with more bytes.
*/
private static final String ORIGINAL_HUGE_STACK_TRACE = "[18:07:53.683]:[67]:org.hsqldb.jdbc.jdbcConnection:prepareStatement" +
": Return: org.hsqldb.jdbc.jdbcPreparedStatement@4b8efa2f[sql=" +
"[INSERT INTO Event (name, description, date, location) VALUES(?, ?, ?, ?)]" +
", parameters=[[null], [null], [null], [null]]]" +
"~java.lang.Thread.getStackTrace(Thread.java:1567) example.webapp.servlet.HelloWorld.doGet(HelloWorld.java:38) javax.servlet.http.HttpServlet.service(HttpServlet.java:668) javax.servlet.http.HttpServlet.service(HttpServlet.java:770) org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669) org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455) org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:560) org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072) org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382) org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006) org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) org.eclipse.jetty.server.Server.handle(Server.java:365) org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485) org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53) org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926) org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988) org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635) org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72) org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264) org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) java.lang.Thread.run(Thread.java:722) "+
"java.lang.Thread.getStackTrace(Thread.java:1567) example.webapp.servlet.HelloWorld.doGet(HelloWorld.java:38) javax.servlet.http.HttpServlet.service(HttpServlet.java:668) javax.servlet.http.HttpServlet.service(HttpServlet.java:770) org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669) org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455) org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:560) org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072) org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382) org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006) org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) org.eclipse.jetty.server.Server.handle(Server.java:365) org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485) org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53) org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926) org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988) org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635) org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72) org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264) org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) java.lang.Thread.run(Thread.java:722) "+
"java.lang.Thread.getStackTrace(Thread.java:1567) example.webapp.servlet.HelloWorld.doGet(HelloWorld.java:38) javax.servlet.http.HttpServlet.service(HttpServlet.java:668) javax.servlet.http.HttpServlet.service(HttpServlet.java:770) org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669) org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455) org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:560) org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072) org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382) org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006) org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) org.eclipse.jetty.server.Server.handle(Server.java:365) org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485) org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53) org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926) org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988) org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635) org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72) org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264) org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) java.lang.Thread.run(Thread.java:722) "+
"java.lang.Thread.getStackTrace(Thread.java:1567) example.webapp.servlet.HelloWorld.doGet(HelloWorld.java:38) javax.servlet.http.HttpServlet.service(HttpServlet.java:668) javax.servlet.http.HttpServlet.service(HttpServlet.java:770) org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669) org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455) org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:560) org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072) org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382) org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006) org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) org.eclipse.jetty.server.Server.handle(Server.java:365) org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485) org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53) org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926) org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988) org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635) org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72) org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264) org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) java.lang.Thread.run(Thread.java:722) "+
"java.lang.Thread.getStackTrace(Thread.java:1567) example.webapp.servlet.HelloWorld.doGet(HelloWorld.java:38) javax.servlet.http.HttpServlet.service(HttpServlet.java:668) javax.servlet.http.HttpServlet.service(HttpServlet.java:770) org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669) org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455) org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:560) org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072) org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382) org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006) org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) org.eclipse.jetty.server.Server.handle(Server.java:365) org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485) org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53) org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926) org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988) org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635) org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72) org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264) org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) java.lang.Thread.run(Thread.java:722) "+
"java.lang.Thread.getStackTrace(Thread.java:1567) example.webapp.servlet.HelloWorld.doGet(HelloWorld.java:38) javax.servlet.http.HttpServlet.service(HttpServlet.java:668) javax.servlet.http.HttpServlet.service(HttpServlet.java:770) org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669) org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455) org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:560) org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072) org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382) org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006) org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) org.eclipse.jetty.server.Server.handle(Server.java:365) org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485) org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53) org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926) org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988) org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635) org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72) org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264) org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) java.lang.Thread.run(Thread.java:722) ";
public void testBasicCompressionAndDecompression_smallerWithGZip() throws IOException
{
// System.out.println("Original length of short data [" + ORIGINAL_SMALL_INTRACE_EVENT.length() + "]");
// System.out.println("Original length of long data [" + ORIGINAL_LARGE_STACK_TRACE.length() + "]");
byte[] eventData = ORIGINAL_SMALL_INTRACE_EVENT.getBytes();
String compressedString = Base64.encodeBytes(eventData, Base64.GZIP);
byte[] reconstitutedData = Base64.decode(compressedString, Base64.GZIP);
String reconstitutedString = new String(reconstitutedData);
assertEquals("Size of original text", 248, ORIGINAL_SMALL_INTRACE_EVENT.length() );
assertEquals("Size of compressed text", 256, compressedString.length() );
// System.out.println("Compressed data [" + compressedString + "]");
// System.out.println("Compressed with GZIP length - small data [" + compressedString.length() + "]");
assertEquals("Unable to compress and decompress intrace event data", ORIGINAL_SMALL_INTRACE_EVENT, reconstitutedString);
}
public void testBasicCompressionAndDecompression_largerWithGZip() throws IOException
{
byte[] eventData = ORIGINAL_LARGE_STACK_TRACE.getBytes();
String compressedData = Base64.encodeBytes(eventData, Base64.GZIP);
//String compressedData = Base64.encodeBytes(eventData, Base64.NO_OPTIONS);
byte[] reconstitutedData = Base64.decode(compressedData, Base64.GZIP);
String reconstitutedString = new String(reconstitutedData);
assertEquals("Size of original text", 2306, ORIGINAL_LARGE_STACK_TRACE.length() );
assertEquals("Size of compressed text", 904, compressedData.length() );
// System.out.println("Compressed data [" + compressedData + "]");
// System.out.println("Compressed with GZIP data - long data [" + compressedData.length() + "]");
assertEquals("Unable to compress and decompress intrace event data", ORIGINAL_LARGE_STACK_TRACE, reconstitutedString);
}
public void testBasicCompressionAndDecompression_smallerWithoutGZip() throws IOException
{
byte[] eventData = ORIGINAL_SMALL_INTRACE_EVENT.getBytes();
String compressedString = Base64.encodeBytes(eventData, Base64.NO_OPTIONS);
byte[] reconstitutedData = Base64.decode(compressedString, Base64.NO_OPTIONS);
String reconstitutedString = new String(reconstitutedData);
assertEquals("Size of original text", 248, ORIGINAL_SMALL_INTRACE_EVENT.length() );
assertEquals("Size of compressed text", 332, compressedString.length() );
// System.out.println("Compressed data [" + compressedString + "]");
// System.out.println("Compressed without gzip data - small data [" + compressedString.length() + "]");
assertEquals("Unable to compress and decompress intrace event data", ORIGINAL_SMALL_INTRACE_EVENT, reconstitutedString);
}
public void testBasicCompressionAndDecompression_largerWithoutGZip() throws IOException
{
byte[] eventData = ORIGINAL_LARGE_STACK_TRACE.getBytes();
String compressedData = Base64.encodeBytes(eventData, Base64.NO_OPTIONS);
//String compressedData = Base64.encodeBytes(eventData, Base64.NO_OPTIONS);
byte[] reconstitutedData = Base64.decode(compressedData, Base64.NO_OPTIONS);
String reconstitutedString = new String(reconstitutedData);
assertEquals("Size of original text", 2306, ORIGINAL_LARGE_STACK_TRACE.length() );
assertEquals("Size of compressed text", 3076, compressedData.length() );
// System.out.println("Compressed data [" + compressedData + "]");
// System.out.println("Compressed without gzip - large data [" + compressedData.length() + "]");
assertEquals("Unable to compress and decompress intrace event data", ORIGINAL_LARGE_STACK_TRACE, reconstitutedString);
}
public void testBasicCompressionAndDecompression_tinyWithGZip() throws IOException
{
byte[] eventData = ORIGINAL_TINY_INTRACE_EVENT.getBytes();
String compressedString = Base64.encodeBytes(eventData, Base64.GZIP);
byte[] reconstitutedData = Base64.decode(compressedString, Base64.GZIP);
String reconstitutedString = new String(reconstitutedData);
assertEquals("Size of original text", 70, ORIGINAL_TINY_INTRACE_EVENT.length() );
assertEquals("Size of compressed text", 116, compressedString.length() );
assertEquals("Unable to compress and decompress intrace event data", ORIGINAL_TINY_INTRACE_EVENT, reconstitutedString);
}
public void testBasicCompressionAndDecompression_tinyWithoutGZip() throws IOException
{
byte[] eventData = ORIGINAL_TINY_INTRACE_EVENT.getBytes();
String compressedString = Base64.encodeBytes(eventData, Base64.NO_OPTIONS);
byte[] reconstitutedData = Base64.decode(compressedString, Base64.NO_OPTIONS);
String reconstitutedString = new String(reconstitutedData);
assertEquals("Size of original text", 70, ORIGINAL_TINY_INTRACE_EVENT.length() );
assertEquals("Size of compressed text", 96, compressedString.length() );
assertEquals("Unable to compress and decompress intrace event data", ORIGINAL_TINY_INTRACE_EVENT, reconstitutedString);
}
public void testBasicCompressionAndDecompression_hugeWithGZip() throws IOException
{
byte[] eventData = ORIGINAL_HUGE_STACK_TRACE.getBytes();
String compressedString = Base64.encodeBytes(eventData, Base64.GZIP);
byte[] reconstitutedData = Base64.decode(compressedString, Base64.GZIP);
String reconstitutedString = new String(reconstitutedData);
assertEquals("Size of original text", 12591, ORIGINAL_HUGE_STACK_TRACE.length() );
assertEquals("Size of compressed text", 1036, compressedString.length() );
assertEquals("Unable to compress and decompress intrace event data", ORIGINAL_HUGE_STACK_TRACE, reconstitutedString);
}
public void testBasicCompressionAndDecompression_hugeWithoutGZip() throws IOException
{
byte[] eventData = ORIGINAL_HUGE_STACK_TRACE.getBytes();
String compressedString = Base64.encodeBytes(eventData, Base64.NO_OPTIONS);
byte[] reconstitutedData = Base64.decode(compressedString, Base64.NO_OPTIONS);
String reconstitutedString = new String(reconstitutedData);
assertEquals("Size of original text", 12591, ORIGINAL_HUGE_STACK_TRACE.length() );
assertEquals("Size of compressed text", 16788, compressedString.length() );
assertEquals("Unable to compress and decompress intrace event data", ORIGINAL_HUGE_STACK_TRACE, reconstitutedString);
}
}

View File

@ -0,0 +1,63 @@
package org.intracetest.agent;
import java.util.Map;
import junit.framework.TestCase;
import org.intrace.agent.AgentSettings;
import org.intrace.output.trace.TraceHandler;
import org.intrace.output.trace.TraceSettings;
import org.intrace.shared.AgentConfigConstants;
import org.intrace.shared.TraceConfigConstants;
public class StackTraceTest extends TestCase
{
private static final String MY_PACKAGE_AND_CLASS = "org.intracetest.agent.StackTraceTest";
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();
}
}

View File

@ -0,0 +1,53 @@
package org.intracetest.agent;
import java.util.Map;
import junit.framework.TestCase;
import org.intrace.agent.AgentSettings;
import org.intrace.output.trace.TraceSettings;
import org.intrace.shared.AgentConfigConstants;
import org.intrace.shared.TraceConfigConstants;
public class TraceSettingsTest extends TestCase
{
public void testAgentSettings()
{
TraceSettings ts = new TraceSettings(
TraceConfigConstants.ARG
+ "true"
+ TraceConfigConstants.ARRAYS
+ "true"
+ TraceConfigConstants.ENTRY_EXIT
+ "true"
+ TraceConfigConstants.BRANCH
+ "true"
+ TraceConfigConstants.EXIT_STACK_TRACE
+ "true"
);
assertTrue(ts.isArgTraceEnabled());
assertTrue(ts.isEntryExitTraceEnabled());
assertTrue(ts.isBranchTraceEnabled());
assertTrue(ts.isExitStackTraceEnabled());
assertTrue(ts.isTruncateArraysEnabled());
ts = new TraceSettings(ts);
assertTrue(ts.isArgTraceEnabled());
assertTrue(ts.isEntryExitTraceEnabled());
assertTrue(ts.isBranchTraceEnabled());
assertTrue(ts.isExitStackTraceEnabled());
assertTrue(ts.isTruncateArraysEnabled());
String toString = ts.toString();
assertNotNull(toString);
Map<String, String> settingsMap = ts.getSettingsMap();
assertEquals(settingsMap.get(TraceConfigConstants.ARG), "true");
assertEquals(settingsMap.get(TraceConfigConstants.ARRAYS), "true");
assertEquals(settingsMap.get(TraceConfigConstants.BRANCH), "true");
assertEquals(settingsMap.get(TraceConfigConstants.EXIT_STACK_TRACE),"true");
assertEquals(settingsMap.get(TraceConfigConstants.ENTRY_EXIT), "true");
}
}