Skip to content

Commit 7235a54

Browse files
authored
Merge pull request #1451 from WebFuzzing/redis-e2e-extension
Redis e2e tests extension
2 parents 159fb51 + 114b23a commit 7235a54

28 files changed

Lines changed: 806 additions & 216 deletions

client-java/controller/src/main/java/org/evomaster/client/java/controller/internal/db/redis/RedisHandler.java

Lines changed: 44 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package org.evomaster.client.java.controller.internal.db.redis;
22

33
import org.evomaster.client.java.controller.internal.TaintHandlerExecutionTracer;
4+
import org.evomaster.client.java.controller.redis.RedisKeyValueStore;
45
import org.evomaster.client.java.controller.redis.ReflectionBasedRedisClient;
56
import org.evomaster.client.java.controller.redis.RedisHeuristicsCalculator;
6-
import org.evomaster.client.java.controller.redis.RedisInfo;
7+
import org.evomaster.client.java.controller.redis.RedisValueData;
78
import org.evomaster.client.java.instrumentation.RedisCommand;
89
import org.evomaster.client.java.utils.SimpleLogger;
910

@@ -82,35 +83,34 @@ private RedisDistanceWithMetrics computeDistance(RedisCommand redisCommand, Refl
8283
switch (type) {
8384
case KEYS:
8485
case EXISTS: {
85-
List<RedisInfo> redisInfo = createRedisInfoForAllKeys(redisClient);
86-
return calculator.computeDistance(redisCommand, redisInfo);
86+
RedisKeyValueStore redisKeyValueStore = createRedisInfoForAllKeys(redisClient);
87+
return calculator.computeDistance(redisCommand, redisKeyValueStore);
8788
}
8889

8990
case GET: {
90-
List<RedisInfo> redisInfo = createRedisInfoForKeysByType(REDIS_STRING_TYPE, redisClient);
91-
return calculator.computeDistance(redisCommand, redisInfo);
91+
RedisKeyValueStore redisKeyValueStore = createRedisInfoForKeysByType(REDIS_STRING_TYPE, redisClient);
92+
return calculator.computeDistance(redisCommand, redisKeyValueStore);
9293
}
9394

9495
case HGET: {
95-
String field = redisCommand.extractArgs().get(1);
96-
List<RedisInfo> redisInfo = createRedisInfoForKeysByField(field, redisClient);
97-
return calculator.computeDistance(redisCommand, redisInfo);
96+
RedisKeyValueStore redisKeyValueStore = createRedisInfoForKeysByField(redisClient);
97+
return calculator.computeDistance(redisCommand, redisKeyValueStore);
9898
}
9999

100100
case HGETALL: {
101-
List<RedisInfo> redisInfo = createRedisInfoForKeysByType(REDIS_HASH_TYPE, redisClient);
102-
return calculator.computeDistance(redisCommand, redisInfo);
101+
RedisKeyValueStore redisKeyValueStore = createRedisInfoForKeysByType(REDIS_HASH_TYPE, redisClient);
102+
return calculator.computeDistance(redisCommand, redisKeyValueStore);
103103
}
104104

105105
case SMEMBERS: {
106-
List<RedisInfo> redisInfo = createRedisInfoForKeysByType(REDIS_SET_TYPE, redisClient);
107-
return calculator.computeDistance(redisCommand, redisInfo);
106+
RedisKeyValueStore redisKeyValueStore = createRedisInfoForKeysByType(REDIS_SET_TYPE, redisClient);
107+
return calculator.computeDistance(redisCommand, redisKeyValueStore);
108108
}
109109

110110
case SINTER: {
111111
List<String> keys = redisCommand.extractArgs();
112-
List<RedisInfo> redisInfo = createRedisInfoForIntersection(keys, redisClient);
113-
return calculator.computeDistance(redisCommand, redisInfo);
112+
RedisKeyValueStore redisKeyValueStore = createRedisInfoForIntersection(keys, redisClient);
113+
return calculator.computeDistance(redisCommand, redisKeyValueStore);
114114
}
115115

116116
default:
@@ -122,35 +122,48 @@ private RedisDistanceWithMetrics computeDistance(RedisCommand redisCommand, Refl
122122
}
123123
}
124124

125-
private List<RedisInfo> createRedisInfoForIntersection(List<String> keys, ReflectionBasedRedisClient redisClient) {
126-
List<RedisInfo> redisData = new ArrayList<>();
127-
keys.forEach(
128-
key -> redisData.add(new RedisInfo(key, redisClient.getType(key), redisClient.getSetMembers(key))
125+
private RedisKeyValueStore createRedisInfoForIntersection(List<String> commandKeys, ReflectionBasedRedisClient redisClient) {
126+
Set<String> keySet = redisClient.getKeysByType(REDIS_SET_TYPE);
127+
128+
//A Map structure is introduced here using the same keys that are stored in REDIS.
129+
//The value for each one, since each key represents a SET, correspond to the members of that given set.
130+
Map<String, RedisValueData> redisData = new HashMap<>();
131+
keySet.forEach(
132+
key -> redisData.put(key, new RedisValueData(redisClient.getSetMembers(key))
129133
));
130-
return redisData;
134+
return new RedisKeyValueStore(redisData);
131135
}
132136

133-
private List<RedisInfo> createRedisInfoForAllKeys(ReflectionBasedRedisClient redisClient) {
137+
private RedisKeyValueStore createRedisInfoForAllKeys(ReflectionBasedRedisClient redisClient) {
134138
Set<String> keys = redisClient.getAllKeys();
135-
List<RedisInfo> redisData = new ArrayList<>();
139+
140+
//A Map structure is introduced here using the same keys that are stored in REDIS.
141+
//No value is needed in this case.
142+
Map<String, RedisValueData> redisData = new HashMap<>();
136143
keys.forEach(
137-
key -> redisData.add(new RedisInfo(key))
144+
key -> redisData.put(key, null)
138145
);
139-
return redisData;
146+
return new RedisKeyValueStore(redisData);
140147
}
141148

142-
private List<RedisInfo> createRedisInfoForKeysByType(String type, ReflectionBasedRedisClient redisClient) {
149+
private RedisKeyValueStore createRedisInfoForKeysByType(String type, ReflectionBasedRedisClient redisClient) {
143150
Set<String> keys = redisClient.getKeysByType(type);
144-
List<RedisInfo> redisData = new ArrayList<>();
145-
keys.forEach(key -> redisData.add(new RedisInfo(key)));
146-
return redisData;
151+
152+
//A Map structure is introduced here using the same keys that are stored in REDIS.
153+
//No value is needed in this case.
154+
Map<String, RedisValueData> redisData = new HashMap<>();
155+
keys.forEach(key -> redisData.put(key, null));
156+
return new RedisKeyValueStore(redisData);
147157
}
148158

149-
private List<RedisInfo> createRedisInfoForKeysByField(String field, ReflectionBasedRedisClient redisClient) {
159+
private RedisKeyValueStore createRedisInfoForKeysByField(ReflectionBasedRedisClient redisClient) {
150160
Set<String> keys = redisClient.getKeysByType(REDIS_HASH_TYPE);
151-
List<RedisInfo> redisData = new ArrayList<>();
152-
keys.forEach(key -> redisData.add(new RedisInfo(key, redisClient.getHashFields(key))));
153-
return redisData;
161+
162+
//A Map structure is introduced here using the same keys that are stored in REDIS.
163+
//The value for each one, since each key is of type HASH, correspond to the fields stored for that given key.
164+
Map<String, RedisValueData> redisData = new HashMap<>();
165+
keys.forEach(key -> redisData.put(key, new RedisValueData(redisClient.getHashFields(key))));
166+
return new RedisKeyValueStore(redisData);
154167
}
155168

156169
public void setRedisClient(ReflectionBasedRedisClient redisClient) {

0 commit comments

Comments
 (0)