Skip to content

Commit 99cc98a

Browse files
committed
add test for reflection method filtering
1 parent 37e1823 commit 99cc98a

File tree

4 files changed

+76
-2
lines changed

4 files changed

+76
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package instrumentation;
7+
8+
/**
9+
* Class that will be injected in target classloader with inline instrumentation and proxied with
10+
* indy instrumentation
11+
*/
12+
public class TestHelperClass {
13+
14+
public TestHelperClass() {}
15+
}

instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,15 @@
1010
import com.google.auto.service.AutoService;
1111
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1212
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
13+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
14+
import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.ClassInjector;
15+
import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.InjectionMode;
16+
import java.util.Arrays;
1317
import java.util.List;
1418

1519
@AutoService(InstrumentationModule.class)
16-
public class TestInstrumentationModule extends InstrumentationModule {
20+
public class TestInstrumentationModule extends InstrumentationModule
21+
implements ExperimentalInstrumentationModule {
1722
public TestInstrumentationModule() {
1823
super("test-instrumentation");
1924
}
@@ -22,4 +27,17 @@ public TestInstrumentationModule() {
2227
public List<TypeInstrumentation> typeInstrumentations() {
2328
return singletonList(new TestTypeInstrumentation());
2429
}
30+
31+
@Override
32+
public List<String> getAdditionalHelperClassNames() {
33+
// makes the class from instrumentation from the instrumented class with inlined advice
34+
return Arrays.asList("instrumentation.TestHelperClass");
35+
}
36+
37+
@Override
38+
public void injectClasses(ClassInjector injector) {
39+
injector
40+
.proxyBuilder("instrumentation.TestHelperClass")
41+
.inject(InjectionMode.CLASS_AND_RESOURCE);
42+
}
2543
}

instrumentation/internal/internal-reflection/javaagent-integration-tests/src/test/java/ReflectionTest.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
import static org.assertj.core.api.Assertions.assertThat;
77

8+
import instrumentation.TestHelperClass;
9+
import io.opentelemetry.javaagent.bootstrap.IndyProxy;
810
import io.opentelemetry.javaagent.bootstrap.VirtualFieldAccessorMarker;
911
import io.opentelemetry.javaagent.bootstrap.VirtualFieldInstalledMarker;
1012
import java.io.ObjectStreamClass;
@@ -42,7 +44,37 @@ void testOurFieldsAndMethodsAreNotVisibleWithReflection() {
4244
void testGeneratedSerialVersionUid() {
4345
// expected value is computed with serialver utility that comes with jdk
4446
assertThat(ObjectStreamClass.lookup(TestClass.class).getSerialVersionUID())
45-
.isEqualTo(-1508684692096503670L);
47+
.isEqualTo(-4292813100633930936L);
4648
assertThat(TestClass.class.getDeclaredFields().length).isEqualTo(0);
4749
}
50+
51+
@Test
52+
void testInjectedClassProxyUnwrap() throws Exception {
53+
TestClass testClass = new TestClass();
54+
Class<?> helperType = testClass.testHelperClass();
55+
assertThat(helperType)
56+
.describedAs("unable to resolve injected class from instrumented class")
57+
.isNotNull();
58+
59+
Object instance = helperType.getConstructor().newInstance();
60+
if (IndyProxy.class.isAssignableFrom(helperType)) {
61+
// indy advice: must be an indy proxy
62+
63+
for (Method method : helperType.getMethods()) {
64+
assertThat(method.getName())
65+
.describedAs("proxy method must be hidden from reflection")
66+
.isNotEqualTo("__getIndyProxyDelegate");
67+
}
68+
69+
assertThat(instance).isInstanceOf(IndyProxy.class);
70+
71+
Object proxyDelegate = ((IndyProxy) instance).__getIndyProxyDelegate();
72+
assertThat(proxyDelegate).isNotInstanceOf(IndyProxy.class);
73+
74+
} else {
75+
// inline advice: must be of the expected type
76+
assertThat(helperType).isEqualTo(TestHelperClass.class);
77+
assertThat(instance).isInstanceOf(TestHelperClass.class).isNotInstanceOf(IndyProxy.class);
78+
}
79+
}
4880
}

instrumentation/internal/internal-reflection/javaagent-integration-tests/src/test/java/TestClass.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,13 @@ public String testMethod() {
1717
public String testMethod2() {
1818
return "not instrumented";
1919
}
20+
21+
public Class<?> testHelperClass() {
22+
try {
23+
return Class.forName(
24+
"instrumentation.TestHelperClass", false, TestClass.class.getClassLoader());
25+
} catch (ClassNotFoundException e) {
26+
return null;
27+
}
28+
}
2029
}

0 commit comments

Comments
 (0)