Skip to content

Commit d3f17ac

Browse files
authored
feat: filter cache mocks under non-application packages (#425)
feat: filter cache mock under non-application packages
1 parent 019054f commit d3f17ac

File tree

12 files changed

+101
-17
lines changed

12 files changed

+101
-17
lines changed

arex-agent-bootstrap/src/main/java/io/arex/agent/bootstrap/util/MapUtils.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,22 @@ public static <K> boolean getBoolean(final Map<? super K, ?> map, final K key, b
6161
}
6262
return defaultValue;
6363
}
64+
65+
public static <K> String getString(final Map<? super K, ?> map, final K key, final String defaultValue) {
66+
String answer = getString(map, key);
67+
if (answer == null) {
68+
answer = defaultValue;
69+
}
70+
return answer;
71+
}
72+
73+
public static <K> String getString(final Map<? super K, ?> map, final K key) {
74+
if (map != null) {
75+
final Object answer = map.get(key);
76+
if (answer != null) {
77+
return answer.toString();
78+
}
79+
}
80+
return null;
81+
}
6482
}

arex-agent-bootstrap/src/test/java/io/arex/agent/bootstrap/util/MapUtilsTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,19 @@ static Stream<Arguments> getBooleanCase() {
7171
arguments(map, "key", asserts1)
7272
);
7373
}
74+
75+
@Test
76+
void getString() {
77+
// null map
78+
assertNull(MapUtils.getString(null, "key"));
79+
Map<String, String> map = new HashMap<>();
80+
// empty map
81+
assertNull(MapUtils.getString(map, "key"));
82+
// key exist return value
83+
map.put("key", "value");
84+
assertEquals("value", MapUtils.getString(map, "key", "default"));
85+
// key not exist return default value
86+
assertEquals("default", MapUtils.getString(map, "key1", "default"));
87+
88+
}
7489
}

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/config/Config.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public static Config get() {
4444
private final int recordRate;
4545
private final String recordVersion;
4646
private final Set<String> includeServiceOperations;
47+
private final String[] coveragePackages;
4748

4849
Config(boolean enableDebug, String serviceName, List<DynamicClassEntity> dynamicClassList,
4950
Map<String, String> properties,
@@ -57,6 +58,7 @@ public static Config get() {
5758
this.recordRate = recordRate;
5859
this.recordVersion = properties.get("arex.agent.version");
5960
this.includeServiceOperations = StringUtil.splitToSet(properties.get("includeServiceOperations"), ',');
61+
this.coveragePackages = StringUtil.split(properties.get(ConfigConstants.COVERAGE_PACKAGES), ',');
6062
buildDynamicClassInfo();
6163
}
6264

@@ -88,6 +90,9 @@ private void buildDynamicClassInfo() {
8890
this.dynamicAbstractClassList = list.toArray(StringUtil.EMPTY_STRING_ARRAY);
8991
}
9092

93+
public String[] getCoveragePackages() {
94+
return coveragePackages;
95+
}
9196
public String getRecordVersion() {
9297
return recordVersion;
9398
}

arex-instrumentation-api/src/test/java/io/arex/inst/runtime/config/ConfigTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,11 @@ void testBuildExcludeOperation() {
105105
assertEquals(2, Config.get().excludeServiceOperations().size());
106106
assertTrue(Config.get().excludeServiceOperations() instanceof ConcurrentHashSet);
107107
}
108+
109+
@Test
110+
void buildCoveragePackages() {
111+
ConfigBuilder.create("mock").addProperty(ConfigConstants.COVERAGE_PACKAGES, "io.arex.inst").build();
112+
assertEquals(1, Config.get().getCoveragePackages().length);
113+
assertEquals("io.arex.inst", Config.get().getCoveragePackages()[0]);
114+
}
108115
}

arex-instrumentation-foundation/src/main/java/io/arex/foundation/config/ConfigManager.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -387,15 +387,7 @@ private void appendCoveragePackages(String collectCoveragePackages) {
387387
if (StringUtil.isEmpty(collectCoveragePackages)) {
388388
return;
389389
}
390-
String defaultPackages = System.getProperty(COVERAGE_PACKAGES);
391-
String finalPackages;
392-
if (StringUtil.isEmpty(defaultPackages)) {
393-
finalPackages = collectCoveragePackages;
394-
} else {
395-
finalPackages = StringUtil.join(",", defaultPackages, collectCoveragePackages);
396-
}
397-
398-
System.setProperty(COVERAGE_PACKAGES, finalPackages);
390+
System.setProperty(COVERAGE_PACKAGES, collectCoveragePackages);
399391
}
400392

401393
private void publish(Config config) {

arex-instrumentation-foundation/src/test/java/io/arex/foundation/config/ConfigManagerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,6 @@ void appendCoveragePackages() throws Exception {
314314
// defaultPackage is com.a.b
315315
System.setProperty(ConfigConstants.COVERAGE_PACKAGES, "com.a.c");
316316
appendCoveragePackages.invoke(configManager, "com.a.b");
317-
assertEquals("com.a.c,com.a.b", System.getProperty(ConfigConstants.COVERAGE_PACKAGES));
317+
assertEquals("com.a.b", System.getProperty(ConfigConstants.COVERAGE_PACKAGES));
318318
}
319319
}

arex-instrumentation/dynamic/arex-cache/src/main/java/io/arex/inst/cache/caffeine/CaffeineAsyncInstrumentation.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public static boolean onEnter(@Advice.Argument(0) Object key,
4444
if (ContextManager.needRecord()) {
4545
RepeatedCollectManager.enter();
4646
}
47-
if (ContextManager.needReplay()) {
47+
if (ContextManager.needReplay() && CacheLoaderUtil.needRecordOrReplay(cacheLoader)) {
4848
String className = CacheLoaderUtil.getLocatedClass(cacheLoader);
4949
DynamicClassExtractor extractor = new DynamicClassExtractor(className, methodName, new Object[]{key}, methodReturnType);
5050
mockResult = extractor.replay();
@@ -68,7 +68,7 @@ public static void onExit(@Advice.Origin("#m") String methodName,
6868
}
6969
return;
7070
}
71-
if (ContextManager.needRecord() && RepeatedCollectManager.exitAndValidate()) {
71+
if (ContextManager.needRecord() && RepeatedCollectManager.exitAndValidate() && CacheLoaderUtil.needRecordOrReplay(cacheLoader)) {
7272
String className = CacheLoaderUtil.getLocatedClass(cacheLoader);
7373
DynamicClassExtractor extractor = new DynamicClassExtractor(className, methodName, new Object[]{key}, methodReturnType);
7474
extractor.recordResponse(throwable != null ? throwable : result);

arex-instrumentation/dynamic/arex-cache/src/main/java/io/arex/inst/cache/caffeine/CaffeineSyncInstrumentation.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public static boolean onEnter(@Advice.Argument(0) Object key,
4343
if (ContextManager.needRecord()) {
4444
RepeatedCollectManager.enter();
4545
}
46-
if (ContextManager.needReplay()) {
46+
if (ContextManager.needReplay() && CacheLoaderUtil.needRecordOrReplay(cacheLoader)) {
4747
String className = CacheLoaderUtil.getLocatedClass(cacheLoader);
4848
DynamicClassExtractor extractor = new DynamicClassExtractor(className, methodName, new Object[]{key}, methodReturnType);
4949
mockResult = extractor.replay();
@@ -67,7 +67,7 @@ public static void onExit(@Advice.Origin("#m") String methodName,
6767
}
6868
return;
6969
}
70-
if (ContextManager.needRecord() && RepeatedCollectManager.exitAndValidate()) {
70+
if (ContextManager.needRecord() && RepeatedCollectManager.exitAndValidate() && CacheLoaderUtil.needRecordOrReplay(cacheLoader)) {
7171
String className = CacheLoaderUtil.getLocatedClass(cacheLoader);
7272
DynamicClassExtractor extractor = new DynamicClassExtractor(className, methodName, new Object[]{key}, methodReturnType);
7373
extractor.recordResponse(throwable != null ? throwable : result);

arex-instrumentation/dynamic/arex-cache/src/main/java/io/arex/inst/cache/guava/GuavaCacheInstrumentation.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import net.bytebuddy.implementation.bytecode.assign.Assigner;
1414
import net.bytebuddy.matcher.ElementMatcher;
1515

16-
import java.lang.reflect.Method;
1716
import java.util.Arrays;
1817
import java.util.List;
1918

@@ -46,7 +45,7 @@ public static boolean onEnter(@Advice.Origin("#m") String methodName,
4645
RepeatedCollectManager.enter();
4746
}
4847

49-
if (ContextManager.needReplay()) {
48+
if (ContextManager.needReplay() && CacheLoaderUtil.needRecordOrReplay(loader)) {
5049
String className = CacheLoaderUtil.getLocatedClass(loader);
5150
DynamicClassExtractor extractor = new DynamicClassExtractor(className, methodName, new Object[]{key}, methodReturnType);
5251
mockResult = extractor.replay();
@@ -72,7 +71,7 @@ public static void onExit(@Advice.Origin("#m") String methodName,
7271
}
7372
}
7473

75-
if (ContextManager.needRecord() && RepeatedCollectManager.exitAndValidate()) {
74+
if (ContextManager.needRecord() && RepeatedCollectManager.exitAndValidate() && CacheLoaderUtil.needRecordOrReplay(loader)) {
7675
String className = CacheLoaderUtil.getLocatedClass(loader);
7776
DynamicClassExtractor extractor = new DynamicClassExtractor(className, methodName, new Object[]{key}, methodReturnType);
7877
extractor.recordResponse(throwable != null ? throwable : result);

arex-instrumentation/dynamic/arex-cache/src/main/java/io/arex/inst/cache/util/CacheLoaderUtil.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package io.arex.inst.cache.util;
22

3+
import io.arex.agent.bootstrap.util.ArrayUtils;
4+
import io.arex.agent.bootstrap.util.MapUtils;
35
import io.arex.agent.bootstrap.util.StringUtil;
6+
import io.arex.inst.runtime.config.Config;
47
import io.arex.inst.runtime.log.LogManager;
58

69
import java.lang.reflect.Field;
@@ -74,4 +77,21 @@ private static String getReferenceClass(Object cacheLoader, Object referenceObje
7477
}
7578
return referenceObject.getClass().getName();
7679
}
80+
81+
public static boolean needRecordOrReplay(Object cacheLoader) {
82+
if (cacheLoader == null) {
83+
return false;
84+
}
85+
String[] coveragePackages = Config.get().getCoveragePackages();
86+
if (ArrayUtils.isEmpty(coveragePackages)){
87+
return false;
88+
}
89+
String loaderClassName = MapUtils.getString(NO_REFERENCE_MAP, System.identityHashCode(cacheLoader), cacheLoader.getClass().getName());
90+
for (String packageName : coveragePackages) {
91+
if (StringUtil.startWith(loaderClassName, packageName)) {
92+
return true;
93+
}
94+
}
95+
return false;
96+
}
7797
}

0 commit comments

Comments
 (0)