package org.skywalking.apm.agent.core.plugin.assist;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.skywalking.apm.agent.core.plugin.interceptor.EnhancedClassInstanceContext;
import org.skywalking.apm.agent.core.plugin.interceptor.assist.NoConcurrencyAccessObject;
import org.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodInvokeContext;
/**
* @author wusheng
*/
@RunWith(MockitoJUnitRunner.class)
public class NoConcurrencyAccessObjectTest {
@Mock
private InstanceMethodInvokeContext invokeContext;
@Test
public void testEntraExitCounter() {
final EnhancedClassInstanceContext context = new EnhancedClassInstanceContext();
NoConcurrencyAccessObject first = new NoConcurrencyAccessObject() {
@Override
protected void enter(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) {
context.set("firstEntrance", true);
}
@Override
protected void exit() {
context.set("firstExit", true);
}
};
NoConcurrencyAccessObject second = new NoConcurrencyAccessObject() {
@Override
protected void enter(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) {
context.set("secondEntrance", true);
}
@Override
protected void exit() {
context.set("lastEntrance", true);
}
};
first.whenEnter(context, invokeContext);
second.whenEnter(context, invokeContext);
first.whenExist(context);
second.whenExist(context);
Assert.assertTrue(!context.isContain("secondEntrance"));
Assert.assertTrue(!context.isContain("firstExit"));
Assert.assertTrue(context.isContain("firstEntrance"));
Assert.assertTrue(context.isContain("lastEntrance"));
}
}