/**
* Copyright 2014 SAP AG
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.aim.mainagent;
import java.lang.reflect.Modifier;
import java.util.Properties;
import junit.framework.Assert;
import org.aim.api.exceptions.InstrumentationException;
import org.aim.api.exceptions.MeasurementException;
import org.aim.api.measurement.MeasurementData;
import org.aim.api.measurement.collector.AbstractDataSource;
import org.aim.api.measurement.collector.CollectorFactory;
import org.aim.artifacts.measurement.collector.MemoryDataSource;
import org.aim.artifacts.probes.NanoResponsetimeProbe;
import org.aim.artifacts.probes.ResponsetimeProbe;
import org.aim.artifacts.records.NanoResponseTimeRecord;
import org.aim.artifacts.records.ResponseTimeRecord;
import org.aim.description.InstrumentationDescription;
import org.aim.description.builder.InstrumentationDescriptionBuilder;
import org.aim.mainagent.instrumentor.JInstrumentation;
import org.junit.After;
import org.junit.Assume;
import org.junit.BeforeClass;
import org.junit.Test;
import org.lpe.common.config.GlobalConfiguration;
import org.lpe.common.extension.ExtensionRegistry;
import org.test.sut.ClassA;
import org.test.sut.ClassB;
import org.test.sut.ClassC;
import org.test.sut.ClassD;
import org.test.sut.ClassE;
import org.test.sut.ClassF;
import org.test.sut.ClassG;
import org.test.sut.ClassH;
import org.test.sut.ClassI;
public class MethodInstrumentationTest {
public static void enableMeasurement() throws MeasurementException {
AbstractDataSource dataSource = AbstractDataSource.getDefaultDataSource();
dataSource.enable();
}
public static void disableMeasurement() throws MeasurementException {
AbstractDataSource dataSource = AbstractDataSource.getDefaultDataSource();
dataSource.disable();
}
public static MeasurementData getData() throws MeasurementException {
AbstractDataSource dataSource = AbstractDataSource.getDefaultDataSource();
return dataSource.read();
}
@BeforeClass
public static void prepareCollector() {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
ClassA a = new ClassA();
ClassB b = new ClassB();
ClassC c = new ClassC();
ClassD d = new ClassD();
ClassE e = new ClassE();
ClassF f = new ClassF();
ClassG g = new ClassG();
AbstractDataSource dataSource = CollectorFactory.createDataSource(MemoryDataSource.class.getName(), null);
AbstractDataSource.setDefaultDataSource(dataSource);
Properties globalProperties = new Properties();
String currentDir = System.getProperty("user.dir");
globalProperties.setProperty(ExtensionRegistry.APP_ROOT_DIR_PROPERTY_KEY, currentDir);
globalProperties.setProperty(ExtensionRegistry.PLUGINS_FOLDER_PROPERTY_KEY, "plugins");
GlobalConfiguration.initialize(globalProperties);
}
@After
public void revertInstrumentation() throws InstrumentationException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
AdaptiveInstrumentationFacade.getInstance().undoInstrumentation();
}
@Test
public void testMethodScopeInstrumentation() throws InstrumentationException, MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder
.newMethodScopeEntity(ClassA.class.getName() + ".methodA1()",
ClassA.class.getName() + ".methodA2(java.lang.Integer)",
ClassA.class.getName() + ".methodA3(java.lang.Integer)")
.addProbe(ResponsetimeProbe.MODEL_PROBE).addProbe(NanoResponsetimeProbe.MODEL_PROBE).entityDone()
.build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
enableMeasurement();
ClassA a = new ClassA();
a.methodA1();
a.methodA2(1);
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(3, data.getRecords(ResponseTimeRecord.class).size());
Assert.assertEquals(3, data.getRecords(NanoResponseTimeRecord.class).size());
}
@Test
public void testMethodScopeInstrumentationWithByteArrayParameter() throws InstrumentationException,
MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder.newMethodScopeEntity(ClassH.class.getName() + "*")
.addProbe(ResponsetimeProbe.MODEL_PROBE).entityDone().build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
enableMeasurement();
ClassH h = new ClassH();
h.test(null);
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(1, data.getRecords(ResponseTimeRecord.class).size());
}
@Test
public void testConstructorScopeInstrumentation() throws InstrumentationException, MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder.newConstructorScopeEntity(ClassA.class.getName())
.addProbe(ResponsetimeProbe.MODEL_PROBE).entityDone().newConstructorScopeEntity(ClassC.class.getName())
.addProbe(NanoResponsetimeProbe.MODEL_PROBE).entityDone().build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
enableMeasurement();
ClassA a = new ClassA();
ClassC c = new ClassC();
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(1, data.getRecords(ResponseTimeRecord.class).size());
Assert.assertEquals(1, data.getRecords(NanoResponseTimeRecord.class).size());
}
@Test
public void testAPIScopeInstrumentation() throws InstrumentationException, MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder.newAPIScopeEntity(TestAPIScope.class.getName())
.addProbe(ResponsetimeProbe.MODEL_PROBE).entityDone().build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
enableMeasurement();
ClassC c = new ClassC();
c.methodC1();
c.ifMethodA();
c.ifMethodB();
ClassD d = new ClassD();
d.ifMethodA();
d.ifMethodB();
ClassE e = new ClassE();
e.ifMethodA();
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(4, data.getRecords(ResponseTimeRecord.class).size());
}
@Test
public void testFullTraceScopeInstrumentation() throws InstrumentationException, MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder.newTraceScopeEntity()
.setMethodSubScope(ClassF.class.getName() + ".methodF1()").addProbe(ResponsetimeProbe.MODEL_PROBE)
.entityDone().build();
ClassF f = new ClassF();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
f.methodF1();
enableMeasurement();
f = new ClassF();
f.methodF1();
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(6, data.getRecords(ResponseTimeRecord.class).size());
AdaptiveInstrumentationFacade.getInstance().undoInstrumentation();
f = new ClassF();
f.methodF1();
enableMeasurement();
f = new ClassF();
f.methodF1();
disableMeasurement();
data = getData();
Assert.assertTrue(data.getRecords().isEmpty());
}
@Test
public void testFullTraceScopeWithStaticMethodsInstrumentation() throws InstrumentationException, MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder.newTraceScopeEntity()
.setMethodSubScope(ClassI.class.getName() + ".methodI1()").addProbe(ResponsetimeProbe.MODEL_PROBE)
.entityDone().build();
ClassI i = new ClassI();
i.methodI1();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
enableMeasurement();
i = new ClassI();
i.methodI1();
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(2, data.getRecords(ResponseTimeRecord.class).size());
AdaptiveInstrumentationFacade.getInstance().undoInstrumentation();
enableMeasurement();
i.methodI1();
disableMeasurement();
data = getData();
Assert.assertTrue(data.getRecords().isEmpty());
}
@Test
public void testIntersectingFullTraceInstrumentationAtOnce() throws InstrumentationException, MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
ClassF f = new ClassF();
ClassG g = new ClassG();
g.methodG1();
f.methodF1();
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder.newTraceScopeEntity()
.setMethodSubScope(ClassG.class.getName() + ".methodG1()").addProbe(NanoResponsetimeProbe.MODEL_PROBE)
.entityDone().newTraceScopeEntity().setMethodSubScope(ClassF.class.getName() + ".methodF1()")
.addProbe(ResponsetimeProbe.MODEL_PROBE).entityDone().build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
f.methodF1();
g.methodG1();
enableMeasurement();
f.methodF1();
g.methodG1();
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(9, data.getRecords(ResponseTimeRecord.class).size());
Assert.assertEquals(7, data.getRecords(NanoResponseTimeRecord.class).size());
AdaptiveInstrumentationFacade.getInstance().undoInstrumentation();
enableMeasurement();
f.methodF1();
g.methodG1();
disableMeasurement();
data = getData();
Assert.assertTrue(data.getRecords().isEmpty());
}
@Test
public void testIntersectingFullTraceInstrumentationStepwise() throws InstrumentationException,
MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder.newTraceScopeEntity()
.setMethodSubScope(ClassF.class.getName() + ".methodF1()").addProbe(ResponsetimeProbe.MODEL_PROBE)
.entityDone().build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
ClassF f = new ClassF();
ClassG g = new ClassG();
g.methodG1();
f.methodF1();
enableMeasurement();
f.methodF1();
g.methodG1();
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(9, data.getRecords(ResponseTimeRecord.class).size());
idBuilder = new InstrumentationDescriptionBuilder();
descr = idBuilder.newTraceScopeEntity().setMethodSubScope(ClassG.class.getName() + ".methodG1()")
.addProbe(NanoResponsetimeProbe.MODEL_PROBE).entityDone().build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
f.methodF1();
g.methodG1();
enableMeasurement();
f.methodF1();
g.methodG1();
disableMeasurement();
data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(9, data.getRecords(ResponseTimeRecord.class).size());
Assert.assertEquals(7, data.getRecords(NanoResponseTimeRecord.class).size());
AdaptiveInstrumentationFacade.getInstance().undoInstrumentation();
enableMeasurement();
f.methodF1();
g.methodG1();
disableMeasurement();
data = getData();
Assert.assertTrue(data.getRecords().isEmpty());
}
@Test
public void testFullTraceWithMethodScopeInstrumentation() throws InstrumentationException, MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder.newMethodScopeEntity(ClassD.class.getName() + ".ifMethodB()")
.addProbe(NanoResponsetimeProbe.MODEL_PROBE).entityDone().build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
enableMeasurement();
ClassF f = new ClassF();
f.methodF1();
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(1, data.getRecords(NanoResponseTimeRecord.class).size());
idBuilder = new InstrumentationDescriptionBuilder();
descr = idBuilder.newTraceScopeEntity().setMethodSubScope(ClassF.class.getName() + ".methodF1()")
.addProbe(ResponsetimeProbe.MODEL_PROBE).entityDone().build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
f = new ClassF();
f.methodF1();
enableMeasurement();
f = new ClassF();
f.methodF1();
disableMeasurement();
data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(6, data.getRecords(ResponseTimeRecord.class).size());
Assert.assertEquals(1, data.getRecords(NanoResponseTimeRecord.class).size());
}
@Test
public void testUndoInstrumentation() throws InstrumentationException, MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder
.newMethodScopeEntity(ClassA.class.getName() + ".methodA1()",
ClassA.class.getName() + ".methodA2(java.lang.Integer)",
ClassA.class.getName() + ".methodA3(java.lang.Integer)")
.addProbe(ResponsetimeProbe.MODEL_PROBE).addProbe(NanoResponsetimeProbe.MODEL_PROBE).entityDone()
.build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
enableMeasurement();
ClassA a = new ClassA();
a.methodA1();
a.methodA2(1);
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(3, data.getRecords(ResponseTimeRecord.class).size());
Assert.assertEquals(3, data.getRecords(NanoResponseTimeRecord.class).size());
AdaptiveInstrumentationFacade.getInstance().undoInstrumentation();
enableMeasurement();
a = new ClassA();
a.methodA1();
a.methodA2(1);
disableMeasurement();
data = getData();
Assert.assertTrue(data.getRecords().isEmpty());
}
@Test
public void testGlobalExclusions() throws InstrumentationException, MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder
.newGlobalRestriction()
.excludePackage(ClassA.class.getName() + "")
.restrictionDone()
.newMethodScopeEntity(ClassA.class.getName() + ".methodA1()",
ClassA.class.getName() + ".methodA2(java.lang.Integer)",
ClassA.class.getName() + ".methodA3(java.lang.Integer)",
ClassB.class.getName() + ".methodB1()",
ClassB.class.getName() + ".methodB2(java.lang.Integer)",
ClassB.class.getName() + ".methodB3(java.lang.Integer)")
.addProbe(ResponsetimeProbe.MODEL_PROBE).addProbe(NanoResponsetimeProbe.MODEL_PROBE).entityDone()
.build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
enableMeasurement();
ClassA a = new ClassA();
a.methodA1();
a.methodA2(1);
ClassB b = new ClassB();
b.methodB1();
b.methodB2(1);
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(3, data.getRecords(ResponseTimeRecord.class).size());
Assert.assertEquals(3, data.getRecords(NanoResponseTimeRecord.class).size());
}
@Test
public void testGlobalInclusions() throws InstrumentationException, MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder
.newGlobalRestriction()
.includePackage(ClassA.class.getName() + "")
.restrictionDone()
.newMethodScopeEntity(ClassA.class.getName() + ".methodA1()",
ClassA.class.getName() + ".methodA2(java.lang.Integer)",
ClassA.class.getName() + ".methodA3(java.lang.Integer)",
ClassB.class.getName() + ".methodB1()",
ClassB.class.getName() + ".methodB2(java.lang.Integer)",
ClassB.class.getName() + ".methodB3(java.lang.Integer)")
.addProbe(ResponsetimeProbe.MODEL_PROBE).addProbe(NanoResponsetimeProbe.MODEL_PROBE).entityDone()
.build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
enableMeasurement();
ClassA a = new ClassA();
a.methodA1();
a.methodA2(1);
ClassB b = new ClassB();
b.methodB1();
b.methodB2(1);
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(3, data.getRecords(ResponseTimeRecord.class).size());
Assert.assertEquals(3, data.getRecords(NanoResponseTimeRecord.class).size());
}
@Test
public void testGlobalModifierInclusion() throws InstrumentationException, MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder
.newGlobalRestriction()
.includeModifier(Modifier.PRIVATE)
.restrictionDone()
.newMethodScopeEntity(ClassA.class.getName() + ".methodA1()",
ClassA.class.getName() + ".methodA2(java.lang.Integer)",
ClassA.class.getName() + ".methodA3(java.lang.Integer)",
ClassB.class.getName() + ".methodB1()",
ClassB.class.getName() + ".methodB2(java.lang.Integer)",
ClassB.class.getName() + ".methodB3(java.lang.Integer)")
.addProbe(ResponsetimeProbe.MODEL_PROBE).addProbe(NanoResponsetimeProbe.MODEL_PROBE).entityDone()
.build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
enableMeasurement();
ClassA a = new ClassA();
a.methodA1();
a.methodA2(1);
ClassB b = new ClassB();
b.methodB1();
b.methodB2(1);
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(2, data.getRecords(ResponseTimeRecord.class).size());
Assert.assertEquals(2, data.getRecords(NanoResponseTimeRecord.class).size());
}
@Test
public void testLocalExclusions() throws InstrumentationException, MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder
.newMethodScopeEntity(ClassA.class.getName() + ".methodA1()",
ClassA.class.getName() + ".methodA2(java.lang.Integer)",
ClassA.class.getName() + ".methodA3(java.lang.Integer)",
ClassB.class.getName() + ".methodB1()",
ClassB.class.getName() + ".methodB2(java.lang.Integer)",
ClassB.class.getName() + ".methodB3(java.lang.Integer)")
.addProbe(ResponsetimeProbe.MODEL_PROBE)
.addProbe(NanoResponsetimeProbe.MODEL_PROBE)
.newLocalRestriction()
.excludePackage(ClassA.class.getName() + "")
.restrictionDone()
.addProbe(ResponsetimeProbe.MODEL_PROBE)
.entityDone()
.newMethodScopeEntity(ClassA.class.getName() + ".methodA1()",
ClassA.class.getName() + ".methodA2(java.lang.Integer)",
ClassA.class.getName() + ".methodA3(java.lang.Integer)",
ClassB.class.getName() + ".methodB1()",
ClassB.class.getName() + ".methodB2(java.lang.Integer)",
ClassB.class.getName() + ".methodB3(java.lang.Integer)")
.addProbe(NanoResponsetimeProbe.MODEL_PROBE).entityDone().build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
enableMeasurement();
ClassA a = new ClassA();
a.methodA1();
a.methodA2(1);
ClassB b = new ClassB();
b.methodB1();
b.methodB2(1);
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(3, data.getRecords(ResponseTimeRecord.class).size());
Assert.assertEquals(6, data.getRecords(NanoResponseTimeRecord.class).size());
}
@Test
public void testLocalInclusions() throws InstrumentationException, MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder
.newMethodScopeEntity(ClassA.class.getName() + ".methodA1()",
ClassA.class.getName() + ".methodA2(java.lang.Integer)",
ClassA.class.getName() + ".methodA3(java.lang.Integer)",
ClassB.class.getName() + ".methodB1()",
ClassB.class.getName() + ".methodB2(java.lang.Integer)",
ClassB.class.getName() + ".methodB3(java.lang.Integer)")
.addProbe(ResponsetimeProbe.MODEL_PROBE)
.addProbe(NanoResponsetimeProbe.MODEL_PROBE)
.newLocalRestriction()
.includePackage(ClassA.class.getName() + "")
.restrictionDone()
.addProbe(ResponsetimeProbe.MODEL_PROBE)
.entityDone()
.newMethodScopeEntity(ClassA.class.getName() + ".methodA1()",
ClassA.class.getName() + ".methodA2(java.lang.Integer)",
ClassA.class.getName() + ".methodA3(java.lang.Integer)",
ClassB.class.getName() + ".methodB1()",
ClassB.class.getName() + ".methodB2(java.lang.Integer)",
ClassB.class.getName() + ".methodB3(java.lang.Integer)")
.addProbe(NanoResponsetimeProbe.MODEL_PROBE).entityDone().build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
enableMeasurement();
ClassA a = new ClassA();
a.methodA1();
a.methodA2(1);
ClassB b = new ClassB();
b.methodB1();
b.methodB2(1);
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(3, data.getRecords(ResponseTimeRecord.class).size());
Assert.assertEquals(6, data.getRecords(NanoResponseTimeRecord.class).size());
}
@Test
public void testLocalModifierInclusions() throws InstrumentationException, MeasurementException {
Assume.assumeNotNull(System.getProperties().get(JInstrumentation.J_INSTRUMENTATION_KEY));
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
InstrumentationDescription descr = idBuilder
.newMethodScopeEntity(ClassA.class.getName() + ".methodA1()",
ClassA.class.getName() + ".methodA2(java.lang.Integer)",
ClassA.class.getName() + ".methodA3(java.lang.Integer)",
ClassB.class.getName() + ".methodB1()",
ClassB.class.getName() + ".methodB2(java.lang.Integer)",
ClassB.class.getName() + ".methodB3(java.lang.Integer)")
.addProbe(ResponsetimeProbe.MODEL_PROBE)
.newLocalRestriction()
.includeModifier(Modifier.PUBLIC)
.restrictionDone()
.entityDone()
.newMethodScopeEntity(ClassA.class.getName() + ".methodA1()",
ClassA.class.getName() + ".methodA2(java.lang.Integer)",
ClassA.class.getName() + ".methodA3(java.lang.Integer)",
ClassB.class.getName() + ".methodB1()",
ClassB.class.getName() + ".methodB2(java.lang.Integer)",
ClassB.class.getName() + ".methodB3(java.lang.Integer)").newLocalRestriction()
.includeModifier(Modifier.PRIVATE).restrictionDone().addProbe(NanoResponsetimeProbe.MODEL_PROBE)
.entityDone().build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
enableMeasurement();
ClassA a = new ClassA();
a.methodA1();
a.methodA2(1);
ClassB b = new ClassB();
b.methodB1();
b.methodB2(1);
disableMeasurement();
MeasurementData data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(4, data.getRecords(ResponseTimeRecord.class).size());
Assert.assertEquals(2, data.getRecords(NanoResponseTimeRecord.class).size());
AdaptiveInstrumentationFacade.getInstance().undoInstrumentation();
idBuilder = new InstrumentationDescriptionBuilder();
descr = idBuilder
.newMethodScopeEntity(ClassA.class.getName() + ".methodA1()",
ClassA.class.getName() + ".methodA2(java.lang.Integer)",
ClassA.class.getName() + ".methodA3(java.lang.Integer)",
ClassB.class.getName() + ".methodB1()",
ClassB.class.getName() + ".methodB2(java.lang.Integer)",
ClassB.class.getName() + ".methodB3(java.lang.Integer)")
.addProbe(ResponsetimeProbe.MODEL_PROBE)
.newLocalRestriction()
.includeModifier(Modifier.PUBLIC)
.includeModifier(Modifier.SYNCHRONIZED)
.restrictionDone()
.addProbe(ResponsetimeProbe.MODEL_PROBE)
.entityDone()
.newMethodScopeEntity(ClassA.class.getName() + ".methodA1()",
ClassA.class.getName() + ".methodA2(java.lang.Integer)",
ClassA.class.getName() + ".methodA3(java.lang.Integer)",
ClassB.class.getName() + ".methodB1()",
ClassB.class.getName() + ".methodB2(java.lang.Integer)",
ClassB.class.getName() + ".methodB3(java.lang.Integer)").newLocalRestriction()
.includeModifier(Modifier.PRIVATE).restrictionDone().addProbe(NanoResponsetimeProbe.MODEL_PROBE)
.entityDone().build();
AdaptiveInstrumentationFacade.getInstance().instrument(descr);
enableMeasurement();
a = new ClassA();
a.methodA1();
a.methodA2(1);
b = new ClassB();
b.methodB1();
b.methodB2(1);
disableMeasurement();
data = getData();
Assert.assertFalse(data.getRecords().isEmpty());
Assert.assertEquals(1, data.getRecords(ResponseTimeRecord.class).size());
Assert.assertEquals(2, data.getRecords(NanoResponseTimeRecord.class).size());
}
}