Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,8 @@ public static Optional<RedisOperation> buildMetaOperation(String name, Operation
return Optional.of(new RO_auth(state));
case "exec":
return Optional.of(new RO_exec(state));
case "config":
return Optional.of(new RO_config(state, params));
default:
return Optional.empty();
}
Expand Down
41 changes: 41 additions & 0 deletions src/main/java/com/github/fppt/jedismock/operations/RO_config.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.github.fppt.jedismock.operations;

import com.github.fppt.jedismock.server.Response;
import com.github.fppt.jedismock.server.Slice;
import com.github.fppt.jedismock.storage.OperationExecutorState;
import com.google.common.collect.Lists;
import java.util.List;

public class RO_config implements RedisOperation {

private final OperationExecutorState state;
private final List<Slice> params;

RO_config(OperationExecutorState state, List<Slice> params) {
this.state = state;
this.params = params;
}

@Override
public Slice execute() {
int parameterCount = params.size();
if (parameterCount == 2) {
return doGet();
} else if (parameterCount == 3) {
return doSet();
}
throw new IllegalArgumentException("Invalid number of arguments for config command, got " + parameterCount + " expected 2 or 3.");
}

private Slice doGet() {
Slice configKey = params.get(1);
return Response.array(Lists.newArrayList(Response.bulkString(configKey), Response.bulkString(state.base().getConfig(configKey))));
}

private Slice doSet() {
Slice configKey = params.get(1);
Slice configValue = params.get(2);
state.base().setConfig(configKey, configValue);
return Response.OK;
}
}
12 changes: 12 additions & 0 deletions src/main/java/com/github/fppt/jedismock/storage/RedisBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
public class RedisBase {
private final ExpiringKeyValueStorage keyValueStorage = ExpiringKeyValueStorage.create();
private final Map<Slice, Set<RedisClient>> subscribers = new ConcurrentHashMap<>();
private final Map<Slice, Slice> configs = new ConcurrentHashMap<>();

public RedisBase() {}

Expand Down Expand Up @@ -120,4 +121,15 @@ public List<Slice> getSubscriptions(RedisClient client){
public boolean exists(Slice slice) {
return keyValueStorage.exists(slice);
}

public Slice getConfig(Slice config) {
if (configs.containsKey(config)) {
return configs.get(config);
}
return Slice.create(new byte[] {});
}

public void setConfig(Slice config, Slice value) {
configs.put(config, value);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,25 @@ public void whenGettingInfo_EnsureSomeDateIsReturned(Jedis jedis) {
assertNotNull(jedis.info());
}

@TestTemplate
public void whenGetNonExistentConfig_EnsureEmptyResultIsReturned(Jedis jedis) {
List<String> results = jedis.configGet("requirepass");
assertEquals(2, results.size());
assertEquals("requirepass", results.get(0));
assertEquals("", results.get(1));
}

@TestTemplate
public void whenSetConfig_EnsureOkResponseIsReturned(Jedis jedis) {
String configKey = "notify-keyspace-events";

assertEquals("OK", jedis.configSet(configKey, "AKE"));

List<String> result = jedis.configGet(configKey);
assertEquals(configKey, result.get(0));
assertEquals("AKE", result.get(1));
}

@TestTemplate
public void whenCreatingKeys_existsValuesUpdated(Jedis jedis) {
jedis.set("foo", "bar");
Expand Down