package org.intracetest.agent;
import java.util.Map;
import org.intrace.agent.InstrCriteria;
import junit.framework.TestCase;
import org.intrace.agent.AgentSettings;
import org.intrace.shared.AgentConfigConstants;
public class AgentSettingsTest extends TestCase
{
private String M1 = "org.intracetest.agent.ArgumentTypes#boolArrayArrayArg({{Z)V";
private String M2 = "org.intracetest.agent.ArgumentTypes#objArrayArg({Ljava/lang/Object;)V";
private String M3 = "org.intracetest.agent.ArgumentTypes#doubleArg(D)V";
public void testAgentSettings()
{
AgentSettings as = new AgentSettings(
AgentConfigConstants.CLASS_REGEX
+ "foo|bar"
+ AgentConfigConstants.INSTRU_ENABLED
+ "true"
+ AgentConfigConstants.SAVE_TRACED_CLASSFILES
+ "true"
+ AgentConfigConstants.VERBOSE_MODE
+ "true");
assertNotNull(as.getClassRegex());
assertEquals(as.getClassRegex().length, 2);
assertTrue( "foo".equals(as.getClassRegex()[0]) || "foo".equals(as.getClassRegex()[1]) );
assertTrue( "bar".equals(as.getClassRegex()[0]) || "bar".equals(as.getClassRegex()[1]) );
assertTrue( as.getClassesToInclude().allMethodsSpecified("foo") );
assertFalse( as.getClassesToInclude().allMethodsSpecified("unknownClass"));
assertEquals(as.isInstrumentationEnabled(), true);
assertEquals(as.saveTracedClassfiles(), true);
assertEquals(as.isVerboseMode(), true);
as = new AgentSettings(as);
assertNotNull(as.getClassRegex());
assertEquals(as.getClassRegex().length, 2);
assertTrue( "foo".equals(as.getClassRegex()[0]) || "foo".equals(as.getClassRegex()[1]) );
assertTrue( "bar".equals(as.getClassRegex()[0]) || "bar".equals(as.getClassRegex()[1]) );
assertTrue( as.getClassesToInclude().allMethodsSpecified("foo") );
assertFalse( as.getClassesToInclude().allMethodsSpecified("unknownClass"));
assertEquals(as.isInstrumentationEnabled(), true);
assertEquals(as.saveTracedClassfiles(), true);
assertEquals(as.isVerboseMode(), true);
String toString = as.toString();
assertNotNull(toString);
Map<String, String> settingsMap = as.getSettingsMap();
assertTrue( settingsMap.get(AgentConfigConstants.CLASS_REGEX).equals("foo|bar") ||
settingsMap.get(AgentConfigConstants.CLASS_REGEX).equals("bar|foo") );
assertEquals(settingsMap.get(AgentConfigConstants.INSTRU_ENABLED), "true");
assertEquals(settingsMap.get(AgentConfigConstants.SAVE_TRACED_CLASSFILES),
"true");
assertEquals(settingsMap.get(AgentConfigConstants.VERBOSE_MODE), "true");
}
public void testInstrCriteria() {
InstrCriteria ic = new InstrCriteria("foo|bar");
assertTrue(ic.allMethodsSpecified("foo") ); //This is criteria for 'foo' class, no methods here. When no methods were specified, then instrument all methods.
assertTrue(ic.allMethodsSpecified("bar") ); //This is criteria for the 'bar' class; no methods here. When no methods were specified, then instrument all methods.
assertFalse(ic.allMethodsSpecified("doesnotexist") ); //If class name was never specified, then no methods should be instrumented.
assertTrue("foo".equals(ic.getClassRegex()[0]) || "foo".equals(ic.getClassRegex()[1]) );
assertTrue("bar".equals(ic.getClassRegex()[0]) || "bar".equals(ic.getClassRegex()[1]) );
assertEquals("Added one class with a single 'instrument all', but count isn't right",
1,
ic.methodCountPerClass("foo")
);
assertEquals("Added one class with a single 'instrument all', but count isn't right",
1,
ic.methodCountPerClass("bar")
);
assertTrue("toString in InstrCriteria is not working", ic.toString().equals("foo|bar") || ic.toString().equals("bar|foo") );
}
public void testIfWeCanParseMethodCriteria() {
InstrCriteria ic2 = new InstrCriteria("org.hsqldb.jdbc.JDBCConnection#onStartEscapeSequence(Ljava/lang/String;Ljava/lang/StringBuffer;I)I");
assertFalse( ic2.allMethodsSpecified("org.hsqldb.jdbc.JDBCConnection") );
assertTrue( ic2.thisMethodSpecified("org.hsqldb.jdbc.JDBCConnection", "onStartEscapeSequence", "(Ljava/lang/String;Ljava/lang/StringBuffer;I)I"));
assertFalse( ic2.thisMethodSpecified("Xorg.hsqldb.jdbc.JDBCConnection", "onStartEscapeSequence", "(Ljava/lang/String;Ljava/lang/StringBuffer;I)I"));
assertFalse( ic2.thisMethodSpecified("org.hsqldb.jdbc.JDBCConnection", "XonStartEscapeSequence", "(Ljava/lang/String;Ljava/lang/StringBuffer;I)I"));
assertFalse( ic2.thisMethodSpecified("org.hsqldb.jdbc.JDBCConnection", "onStartEscapeSequence", "X(Ljava/lang/String;Ljava/lang/StringBuffer;I)I"));
}
public void testIfWeCanParseMix() {
InstrCriteria ic2 = new InstrCriteria("org.hsqldb.jdbc.JDBCConnection#onStartEscapeSequence(Ljava/lang/String;Ljava/lang/StringBuffer;I)I|foo");
assertFalse( ic2.allMethodsSpecified("org.hsqldb.jdbc.JDBCConnection") );
assertTrue( ic2.thisMethodSpecified("org.hsqldb.jdbc.JDBCConnection", "onStartEscapeSequence", "(Ljava/lang/String;Ljava/lang/StringBuffer;I)I"));
assertFalse( ic2.thisMethodSpecified("Xorg.hsqldb.jdbc.JDBCConnection", "onStartEscapeSequence", "(Ljava/lang/String;Ljava/lang/StringBuffer;I)I"));
assertFalse( ic2.thisMethodSpecified("org.hsqldb.jdbc.JDBCConnection", "XonStartEscapeSequence", "(Ljava/lang/String;Ljava/lang/StringBuffer;I)I"));
assertFalse( ic2.thisMethodSpecified("org.hsqldb.jdbc.JDBCConnection", "onStartEscapeSequence", "X(Ljava/lang/String;Ljava/lang/StringBuffer;I)I"));
assertTrue(ic2.allMethodsSpecified("foo") ); //If not methods were specified, then instrument all methods.
assertFalse(ic2.allMethodsSpecified("doesnotexist") ); //If class name was never specified, then no methods should be instrumented.
//assertEquals(ic2.getClassRegex()[0], "foo");
assertTrue("foo".equals(ic2.getClassRegex()[0]) || "foo".equals(ic2.getClassRegex()[1]) );
assertTrue("org.hsqldb.jdbc.JDBCConnection".equals(ic2.getClassRegex()[0]) || "org.hsqldb.jdbc.JDBCConnection".equals(ic2.getClassRegex()[1]) );
}
public void testIfWeCanParseThreeComplicatedMethods() {
String myCriteria = M1+"|"+M2+"|"+M3;
//System.out.println("@@@@@@@Start of testIfWeCanParseThreeComplicatedMethods() ");
InstrCriteria ic = new InstrCriteria(myCriteria);
//System.out.println("@@@@@@@@@@@@@@Before assert for testIfWeCanParseThreeComplicatedMethods() ");
assertEquals("Added three methods for a single class, but didn't find the right count of methods",
3,
ic.methodCountPerClass("org.intracetest.agent.ArgumentTypes")
);
//System.out.println("@@@@@@@@@@@@@@ AFTER assert for testIfWeCanParseThreeComplicatedMethods() ");
}
public void testMethodsFromDifferentClasses() {
InstrCriteria ic = new InstrCriteria("ArgumentTypes#byteArrayArg({B)V|OtherTypes#byteArrayArg({B)V");
assertFalse( ic.allMethodsSpecified("ArgumentTypes") );
assertFalse( ic.allMethodsSpecified("OtherTypes") );
String[] myClasses = ic.getClassRegex();
assertTrue( "ArgumentTypes".equals(myClasses[0]) || "ArgumentTypes".equals(myClasses[1]) );
assertTrue( "OtherTypes".equals(myClasses[0]) || "OtherTypes".equals(myClasses[1]) );
assertTrue( ic.thisMethodSpecified("ArgumentTypes","byteArrayArg", "({B)V") );
assertTrue( ic.thisMethodSpecified("OtherTypes", "byteArrayArg", "({B)V") );
assertTrue( ic.toString().equals("ArgumentTypes#byteArrayArg({B)V|OtherTypes#byteArrayArg({B)V")
|| ic.toString().equals("OtherTypes#byteArrayArg({B)V|ArgumentTypes#byteArrayArg({B)V") );
}
public void testMethodsFromSameClasses() {
InstrCriteria ic = new InstrCriteria("MyTypes#bar({B)V|MyTypes#foo({B)V");
assertFalse( ic.allMethodsSpecified("MyTypes") );
assertTrue( ic.thisMethodSpecified("MyTypes","foo", "({B)V") );
assertTrue( ic.thisMethodSpecified("MyTypes", "bar", "({B)V") );
assertTrue( ic.toString().equals("MyTypes#bar({B)V|MyTypes#foo({B)V")
|| ic.toString().equals("MyTypes#foo({B)V|MyTypes#bar({B)V") );
}
}