-
Notifications
You must be signed in to change notification settings - Fork 333
Expand file tree
/
Copy pathClassLoaderMatchersTest.groovy
More file actions
93 lines (79 loc) · 2.7 KB
/
ClassLoaderMatchersTest.groovy
File metadata and controls
93 lines (79 loc) · 2.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package datadog.trace.agent.test
import datadog.trace.agent.tooling.bytebuddy.matcher.ClassLoaderMatchers
import datadog.trace.bootstrap.instrumentation.log.LogContextScopeListener
import datadog.trace.bootstrap.DatadogClassLoader
import datadog.trace.test.util.DDSpecification
import groovy.transform.CompileStatic
import net.bytebuddy.ByteBuddy
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy
import spock.lang.Unroll
class ClassLoaderMatchersTest extends DDSpecification {
def "skip non-delegating classloader"() {
setup:
final ClassLoader badLoader = new NonDelegatingClassLoader()
expect:
ClassLoaderMatchers.incompatibleClassLoader(badLoader)
}
def "skips agent classloader"() {
setup:
final ClassLoader agentLoader = new DatadogClassLoader()
expect:
ClassLoaderMatchers.incompatibleClassLoader(agentLoader)
}
def "does not skip empty classloader"() {
setup:
final ClassLoader emptyLoader = new ClassLoader() {}
expect:
!ClassLoaderMatchers.incompatibleClassLoader(emptyLoader)
}
def "does not skip bootstrap classloader"() {
expect:
!ClassLoaderMatchers.incompatibleClassLoader(null)
}
def "DatadogClassLoader class name is hardcoded in ClassLoaderMatcher"() {
expect:
DatadogClassLoader.name == "datadog.trace.bootstrap.DatadogClassLoader"
}
def "helper class names are hardcoded in Log Instrumentations"() {
expect:
LogContextScopeListener.name == "datadog.trace.bootstrap.instrumentation.log.LogContextScopeListener"
}
@Unroll
def "skips drools classloader: #loaderName"() {
given:
ClassLoader loader = new ByteBuddy()
.subclass(ClassLoader)
.name(loaderName)
.make()
.load(ClassLoader.getSystemClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded()
.getDeclaredConstructor(ClassLoader)
.newInstance(ClassLoader.getSystemClassLoader())
expect:
ClassLoaderMatchers.canSkipClassLoaderByName(loader)
where:
loaderName << [
"org.drools.core.rule.PackageClassLoader",
"org.drools.wiring.dynamic.PackageClassLoader",
"org.drools.core.rule.JavaDialectRuntimeData\$PackageClassLoader"
]
}
/*
* A URLClassloader which only delegates java.* classes
*/
// use compile static to avoid the constant pool
// having references to java.lang.Module
@CompileStatic
private static class NonDelegatingClassLoader extends URLClassLoader {
NonDelegatingClassLoader() {
super(new URL[0], (ClassLoader) null)
}
@Override
Class<?> loadClass(String className) {
if (className.startsWith("java.")) {
return super.loadClass(className)
}
throw new ClassNotFoundException(className)
}
}
}