-
Notifications
You must be signed in to change notification settings - Fork 130
Expand file tree
/
Copy pathMockUtils.java
More file actions
163 lines (128 loc) · 5.7 KB
/
MockUtils.java
File metadata and controls
163 lines (128 loc) · 5.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
package io.arex.inst.runtime.util;
import io.arex.agent.bootstrap.model.ArexMocker;
import io.arex.agent.bootstrap.model.MockCategoryType;
import io.arex.agent.bootstrap.model.MockStrategyEnum;
import io.arex.agent.bootstrap.model.Mocker;
import io.arex.agent.bootstrap.model.Mocker.Target;
import io.arex.agent.bootstrap.util.StringUtil;
import io.arex.inst.runtime.config.Config;
import io.arex.inst.runtime.context.ArexContext;
import io.arex.inst.runtime.context.ContextManager;
import io.arex.inst.runtime.serializer.Serializer;
import io.arex.inst.runtime.service.DataService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class MockUtils {
private static final String EMPTY_JSON = "{}";
private MockUtils() {
}
private static final Logger LOGGER = LoggerFactory.getLogger(MockUtils.class);
public static ArexMocker createMessageProducer(String subject) {
return create(MockCategoryType.MESSAGE_PRODUCER, subject);
}
public static ArexMocker createMessageConsumer(String subject) {
return create(MockCategoryType.MESSAGE_CONSUMER, subject);
}
public static ArexMocker createConfigFile(String configKey) {
return create(MockCategoryType.CONFIG_FILE, configKey);
}
public static ArexMocker createHttpClient(String path) {
return create(MockCategoryType.HTTP_CLIENT, path);
}
public static ArexMocker createDynamicClass(String clazzName, String method) {
return create(MockCategoryType.DYNAMIC_CLASS, clazzName + "." + method);
}
public static ArexMocker createDatabase(String method) {
return create(MockCategoryType.DATABASE, method);
}
public static ArexMocker createRedis(String method) {
return create(MockCategoryType.REDIS, method);
}
public static ArexMocker createServlet(String pattern) {
return create(MockCategoryType.SERVLET, pattern);
}
public static ArexMocker createDubboConsumer(String operationName) {
return create(MockCategoryType.DUBBO_CONSUMER, operationName);
}
public static ArexMocker createDubboProvider(String operationName) {
return create(MockCategoryType.DUBBO_PROVIDER, operationName);
}
public static ArexMocker createDubboStreamProvider(String operationName) {
return create(MockCategoryType.DUBBO_STREAM_PROVIDER, operationName);
}
public static ArexMocker createMqttConsumer(String operationName){
return create(MockCategoryType.MQTT_MESSAGE_CONSUMER,operationName);
}
public static ArexMocker create(MockCategoryType categoryType, String operationName) {
ArexMocker mocker = new ArexMocker();
long createTime = System.currentTimeMillis();
ArexContext context = ContextManager.currentContext();
if (context != null) {
mocker.setRecordId(context.getCaseId());
mocker.setReplayId(context.getReplayId());
createTime += context.calculateSequence(context.getCaseId());
}
mocker.setCreationTime(createTime);
mocker.setAppId(System.getProperty("arex.service.name"));
mocker.setCategoryType(categoryType);
mocker.setOperationName(operationName);
mocker.setTargetRequest(new Target());
mocker.setTargetResponse(new Target());
mocker.setRecordVersion(Config.get().getRecordVersion());
return mocker;
}
public static void recordMocker(Mocker requestMocker) {
String postJson = Serializer.serialize(requestMocker);
if (Config.get().isEnableDebug()) {
LOGGER.info("{}\nrequest: {}", requestMocker.logBuilder(), postJson);
}
DataService.INSTANCE.save(postJson);
}
public static Mocker replayMocker(Mocker requestMocker) {
return replayMocker(requestMocker, MockStrategyEnum.FIND_LAST);
}
public static Mocker replayMocker(Mocker requestMocker, MockStrategyEnum mockStrategy) {
String postJson = Serializer.serialize(requestMocker);
String data = DataService.INSTANCE.query(postJson, mockStrategy);
if (Config.get().isEnableDebug()) {
LOGGER.info("{}\nrequest: {}\nresponse: {}", requestMocker.logBuilder(), postJson, data);
}
if (StringUtil.isEmpty(data) || EMPTY_JSON.equals(data)) {
LOGGER.warn("[arex] response body is null. request: {}", postJson);
return null;
}
return Serializer.deserialize(data, ArexMocker.class);
}
public static Object replayBody(Mocker requestMocker) {
return replayBody(requestMocker, MockStrategyEnum.FIND_LAST);
}
public static Object replayBody(Mocker requestMocker, MockStrategyEnum mockStrategy) {
Mocker responseMocker = replayMocker(requestMocker, mockStrategy);
if (!checkResponseMocker(responseMocker)) {
return null;
}
return Serializer.deserialize(responseMocker.getTargetResponse().getBody(),
responseMocker.getTargetResponse().getType());
}
public static boolean checkResponseMocker(Mocker responseMocker) {
if (responseMocker == null) {
return false;
}
Target targetResponse = responseMocker.getTargetResponse();
if (targetResponse == null) {
LOGGER.warn("targetResponse is null");
return false;
}
final String body = targetResponse.getBody();
if (StringUtil.isEmpty(body)) {
LOGGER.warn("The body of targetResponse is empty");
return false;
}
final String clazzType = targetResponse.getType();
if (StringUtil.isEmpty(clazzType)) {
LOGGER.warn("The type of targetResponse is empty");
return false;
}
return true;
}
}