Skip to content

Commit b9d1d51

Browse files
committed
feat: compatible fixed case
1 parent 3d52db7 commit b9d1d51

File tree

2 files changed

+44
-4
lines changed

2 files changed

+44
-4
lines changed

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/match/ReplayMatcher.java

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.arex.inst.runtime.match;
22

3+
import io.arex.agent.bootstrap.model.MockCategoryType;
34
import io.arex.agent.bootstrap.model.MockStrategyEnum;
45
import io.arex.agent.bootstrap.model.Mocker;
56
import io.arex.agent.bootstrap.util.CollectionUtil;
@@ -47,23 +48,46 @@ public static Mocker match(Mocker requestMocker, MockStrategyEnum mockStrategy)
4748
private static void doMatch(MatchStrategyContext context) {
4849
Mocker requestMocker = context.getRequestMocker();
4950
Map<Integer, List<Mocker>> cachedReplayResultMap = ContextManager.currentContext().getCachedReplayResultMap();
50-
// first fuzzy match, such as: category + operationName + requestType, ensure the same method
51-
requestMocker.setFuzzyMatchKey(MatchKeyFactory.INSTANCE.getFuzzyMatchKey(requestMocker));
52-
List<Mocker> recordList = cachedReplayResultMap.get(requestMocker.getFuzzyMatchKey());
51+
// pre match for all mocker category type
52+
List<Mocker> recordList = preMatch(context, requestMocker, cachedReplayResultMap);
5353
if (CollectionUtil.isEmpty(recordList)) {
54-
context.setReason("match no result, not exist this method signature, check if it has been recorded");
5554
return;
5655
}
5756
context.setRecordList(recordList);
5857
int fuzzyMatchResultCount = recordList.size();
5958
List<AbstractMatchStrategy> matchStrategyList = MatchStrategyRegister.getMatchStrategies(requestMocker, fuzzyMatchResultCount);
59+
// multi thread match safe
6060
synchronized (cachedReplayResultMap) {
6161
for (AbstractMatchStrategy matchStrategy : matchStrategyList) {
6262
matchStrategy.match(context);
6363
}
6464
}
6565
}
6666

67+
private static List<Mocker> preMatch(MatchStrategyContext context, Mocker requestMocker, Map<Integer, List<Mocker>> cachedReplayResultMap) {
68+
// first match, such as: category + operationName + requestType, ensure the same method
69+
requestMocker.setFuzzyMatchKey(MatchKeyFactory.INSTANCE.getFuzzyMatchKey(requestMocker));
70+
List<Mocker> recordList = cachedReplayResultMap.get(requestMocker.getFuzzyMatchKey());
71+
recordList = compatibleNoRequestType(recordList, cachedReplayResultMap, requestMocker);
72+
if (CollectionUtil.isEmpty(recordList)) {
73+
context.setReason("match no result, not exist this method signature, check if it has been recorded or request type is empty");
74+
}
75+
return recordList;
76+
}
77+
78+
private static List<Mocker> compatibleNoRequestType(List<Mocker> recordList, Map<Integer, List<Mocker>> cachedReplayResultMap, Mocker requestMocker) {
79+
if (CollectionUtil.isEmpty(recordList)) {
80+
String categoryType = requestMocker.getCategoryType().getName();
81+
if (MockCategoryType.DYNAMIC_CLASS.getName().equals(categoryType) || MockCategoryType.REDIS.getName().equals(categoryType)) {
82+
// dynamic class or redis may not record requestType on old version
83+
requestMocker.getTargetRequest().setType(null);
84+
requestMocker.setFuzzyMatchKey(MatchKeyFactory.INSTANCE.getFuzzyMatchKey(requestMocker));
85+
return cachedReplayResultMap.get(requestMocker.getFuzzyMatchKey());
86+
}
87+
}
88+
return recordList;
89+
}
90+
6791
private static void logMatchResult(MatchStrategyContext context) {
6892
Mocker matchedMocker = context.getMatchMocker();
6993
Mocker requestMocker = context.getRequestMocker();

arex-instrumentation-api/src/main/java/io/arex/inst/runtime/util/ReplayUtil.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,19 +160,35 @@ private static void buildReplayResultMap(List<Mocker> recordMockerList, Map<Inte
160160
if (recordMocker == null) {
161161
continue;
162162
}
163+
// compatible with fixed case, set operationName for database mocker
164+
compatibleFixedCase(recordMocker);
165+
163166
// replay match need methodRequestTypeHash and methodSignatureHash
164167
if (recordMocker.getFuzzyMatchKey() == 0) {
165168
recordMocker.setFuzzyMatchKey(MatchKeyFactory.INSTANCE.getFuzzyMatchKey(recordMocker));
166169
}
170+
// fuzzyMatchKey and accurateMatchKey maybe not 0 on old merge record(methodRequestTypeHash、methodSignatureHash)
167171
if (recordMocker.getAccurateMatchKey() == 0) {
168172
recordMocker.setAccurateMatchKey(MatchKeyFactory.INSTANCE.getAccurateMatchKey(recordMocker));
169173
}
174+
170175
// eigen will be calculated in agent
171176
recordMocker.setEigenMap(null);
172177
cachedReplayResultMap.computeIfAbsent(recordMocker.getFuzzyMatchKey(), k -> new ArrayList<>()).add(recordMocker);
173178
}
174179
}
175180

181+
private static void compatibleFixedCase(Mocker mocker) {
182+
String categoryType = mocker.getCategoryType().getName();
183+
if (MockCategoryType.DATABASE.getName().equals(categoryType)) {
184+
String dbName = mocker.getTargetRequest().attributeAsString(ArexConstants.DB_NAME);
185+
String sql = mocker.getTargetRequest().getBody();
186+
// if operationName contains '@' then not need to regenerate
187+
String operationName = DatabaseUtils.regenerateOperationName(StringUtil.defaultString(dbName), mocker.getOperationName(), sql);
188+
mocker.setOperationName(operationName);
189+
}
190+
}
191+
176192
private static void ascendingSortByCreationTime(Map<Integer, List<Mocker>> cachedReplayResultMap) {
177193
for (List<Mocker> mergeReplayList : cachedReplayResultMap.values()) {
178194
if (mergeReplayList.size() == 1) {

0 commit comments

Comments
 (0)