Skip to content

Commit ce54afb

Browse files
zeitlingerlaurit
andauthored
convert cache provider test to java (#14918)
Co-authored-by: Lauri Tulmin <[email protected]>
1 parent e5b5f50 commit ce54afb

File tree

3 files changed

+180
-178
lines changed

3 files changed

+180
-178
lines changed

javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/CacheProviderTest.groovy

Lines changed: 0 additions & 176 deletions
This file was deleted.

muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentCachingPoolStrategy.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ public AgentTypePool typePool(
146146
return typePool(classFileLocator, classLoader);
147147
}
148148

149-
private TypePool.CacheProvider getCacheProvider(ClassLoader classLoader) {
149+
// visible for testing
150+
TypePool.CacheProvider getCacheProvider(ClassLoader classLoader) {
150151
if (classLoader == null) {
151152
return bootstrapCacheProvider;
152153
}
@@ -167,7 +168,8 @@ private TypePool.CacheProvider getCacheProvider(ClassLoader classLoader) {
167168
*
168169
* <p>The loaderHash exists to avoid calling get & strengthening the Reference.
169170
*/
170-
private static final class TypeCacheKey {
171+
// visible for testing
172+
static final class TypeCacheKey {
171173
private final int loaderHash;
172174
@Nullable private final WeakReference<ClassLoader> loaderRef;
173175
private final String className;
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.tooling.muzzle;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
import java.lang.ref.WeakReference;
11+
import java.net.URL;
12+
import java.net.URLClassLoader;
13+
import net.bytebuddy.description.type.TypeDescription;
14+
import net.bytebuddy.pool.TypePool;
15+
import org.junit.jupiter.api.Test;
16+
17+
class CacheProviderTest {
18+
19+
@Test
20+
void keyBootstrapEquivalence() {
21+
int loaderHash = AgentCachingPoolStrategy.BOOTSTRAP_HASH;
22+
WeakReference<ClassLoader> loaderRef = null;
23+
24+
AgentCachingPoolStrategy.TypeCacheKey key1 =
25+
new AgentCachingPoolStrategy.TypeCacheKey(loaderHash, loaderRef, "foo");
26+
AgentCachingPoolStrategy.TypeCacheKey key2 =
27+
new AgentCachingPoolStrategy.TypeCacheKey(loaderHash, loaderRef, "foo");
28+
29+
assertThat(key1).hasSameHashCodeAs(key2).isEqualTo(key2);
30+
}
31+
32+
@Test
33+
void keySameRefEquivalence() {
34+
ClassLoader loader = newClassLoader();
35+
int loaderHash = loader.hashCode();
36+
WeakReference<ClassLoader> loaderRef = new WeakReference<>(loader);
37+
38+
AgentCachingPoolStrategy.TypeCacheKey key1 =
39+
new AgentCachingPoolStrategy.TypeCacheKey(loaderHash, loaderRef, "foo");
40+
AgentCachingPoolStrategy.TypeCacheKey key2 =
41+
new AgentCachingPoolStrategy.TypeCacheKey(loaderHash, loaderRef, "foo");
42+
43+
assertThat(key1).hasSameHashCodeAs(key2).isEqualTo(key2);
44+
// use loader to ensures that it isn't collected before the test completes
45+
assertThat(loader).isNotNull();
46+
}
47+
48+
@Test
49+
void keyDifferentRefEquivalence() {
50+
ClassLoader loader = newClassLoader();
51+
int loaderHash = loader.hashCode();
52+
WeakReference<ClassLoader> loaderRef1 = new WeakReference<>(loader);
53+
WeakReference<ClassLoader> loaderRef2 = new WeakReference<>(loader);
54+
55+
AgentCachingPoolStrategy.TypeCacheKey key1 =
56+
new AgentCachingPoolStrategy.TypeCacheKey(loaderHash, loaderRef1, "foo");
57+
AgentCachingPoolStrategy.TypeCacheKey key2 =
58+
new AgentCachingPoolStrategy.TypeCacheKey(loaderHash, loaderRef2, "foo");
59+
60+
assertThat(loaderRef1).isNotSameAs(loaderRef2);
61+
62+
assertThat(key1).hasSameHashCodeAs(key2).isEqualTo(key2);
63+
// use loader to ensures that it isn't collected before the test completes
64+
assertThat(loader).isNotNull();
65+
}
66+
67+
@Test
68+
void keyMismatchSameLoaderDifferentName() {
69+
ClassLoader loader = newClassLoader();
70+
int loaderHash = loader.hashCode();
71+
WeakReference<ClassLoader> loaderRef = new WeakReference<>(loader);
72+
AgentCachingPoolStrategy.TypeCacheKey fooKey =
73+
new AgentCachingPoolStrategy.TypeCacheKey(loaderHash, loaderRef, "foo");
74+
AgentCachingPoolStrategy.TypeCacheKey barKey =
75+
new AgentCachingPoolStrategy.TypeCacheKey(loaderHash, loaderRef, "bar");
76+
77+
// not strictly guaranteed -- but important for performance
78+
assertThat(fooKey.hashCode()).isNotEqualTo(barKey.hashCode());
79+
assertThat(fooKey).isNotEqualTo(barKey);
80+
// use loader to ensures that it isn't collected before the test completes
81+
assertThat(loader).isNotNull();
82+
}
83+
84+
@Test
85+
void keyMismatchSameNameDifferentLoader() {
86+
ClassLoader loader1 = newClassLoader();
87+
int loader1Hash = loader1.hashCode();
88+
WeakReference<ClassLoader> loaderRef1 = new WeakReference<>(loader1);
89+
90+
ClassLoader loader2 = newClassLoader();
91+
int loader2Hash = loader2.hashCode();
92+
WeakReference<ClassLoader> loaderRef2 = new WeakReference<>(loader2);
93+
94+
AgentCachingPoolStrategy.TypeCacheKey fooKey1 =
95+
new AgentCachingPoolStrategy.TypeCacheKey(loader1Hash, loaderRef1, "foo");
96+
AgentCachingPoolStrategy.TypeCacheKey fooKey2 =
97+
new AgentCachingPoolStrategy.TypeCacheKey(loader2Hash, loaderRef2, "foo");
98+
99+
// not strictly guaranteed -- but important for performance
100+
assertThat(fooKey1.hashCode()).isNotEqualTo(fooKey2.hashCode());
101+
assertThat(fooKey1).isNotEqualTo(fooKey2);
102+
// use loader to ensures that it isn't collected before the test completes
103+
assertThat(loader1).isNotNull();
104+
assertThat(loader2).isNotNull();
105+
}
106+
107+
@Test
108+
void testBasicCaching() {
109+
AgentCachingPoolStrategy poolStrat = new AgentCachingPoolStrategy(null);
110+
111+
ClassLoader loader = newClassLoader();
112+
113+
TypePool.CacheProvider cacheProvider = poolStrat.getCacheProvider(loader);
114+
115+
cacheProvider.register(
116+
"foo", new TypePool.Resolution.Simple(TypeDescription.ForLoadedType.of(void.class)));
117+
118+
// not strictly guaranteed, but fine for this test
119+
assertThat(cacheProvider.find("foo")).isNotNull();
120+
// use loader to ensures that it isn't collected before the test completes
121+
assertThat(loader).isNotNull();
122+
}
123+
124+
@Test
125+
void testLoaderEquivalence() {
126+
AgentCachingPoolStrategy poolStrat = new AgentCachingPoolStrategy(null);
127+
128+
ClassLoader loader1 = newClassLoader();
129+
130+
TypePool.CacheProvider cacheProvider1A = poolStrat.getCacheProvider(loader1);
131+
TypePool.CacheProvider cacheProvider1B = poolStrat.getCacheProvider(loader1);
132+
133+
cacheProvider1A.register("foo", newVoid());
134+
135+
// not strictly guaranteed, but fine for this test
136+
assertThat(cacheProvider1A.find("foo")).isNotNull();
137+
assertThat(cacheProvider1B.find("foo")).isNotNull();
138+
139+
assertThat(cacheProvider1A.find("foo")).isSameAs(cacheProvider1B.find("foo"));
140+
141+
// use loader to ensures that it isn't collected before the test completes
142+
assertThat(loader1).isNotNull();
143+
}
144+
145+
@Test
146+
void testLoaderSeparation() {
147+
AgentCachingPoolStrategy poolStrat = new AgentCachingPoolStrategy(null);
148+
149+
ClassLoader loader1 = newClassLoader();
150+
ClassLoader loader2 = newClassLoader();
151+
152+
TypePool.CacheProvider cacheProvider1 = poolStrat.getCacheProvider(loader1);
153+
TypePool.CacheProvider cacheProvider2 = poolStrat.getCacheProvider(loader2);
154+
155+
cacheProvider1.register("foo", newVoid());
156+
cacheProvider2.register("foo", newVoid());
157+
158+
// not strictly guaranteed, but fine for this test
159+
assertThat(cacheProvider1.find("foo")).isNotNull();
160+
assertThat(cacheProvider2.find("foo")).isNotNull();
161+
162+
assertThat(cacheProvider1.find("foo")).isNotSameAs(cacheProvider2.find("foo"));
163+
164+
// use loader to ensures that it isn't collected before the test completes
165+
assertThat(loader1).isNotNull();
166+
assertThat(loader2).isNotNull();
167+
}
168+
169+
private static TypePool.Resolution newVoid() {
170+
return new TypePool.Resolution.Simple(TypeDescription.ForLoadedType.of(void.class));
171+
}
172+
173+
private static ClassLoader newClassLoader() {
174+
return new URLClassLoader(new URL[0], null);
175+
}
176+
}

0 commit comments

Comments
 (0)