Skip to content

Commit

Permalink
Add ECHO() command. (redis-rs#1143)
Browse files Browse the repository at this point in the history
* Add `ECHO` command. (redis-rs#141)

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

* Update echo command to provide cluster impl

Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>

---------

Signed-off-by: Yury-Fridlyand <yury.fridlyand@improving.com>
Signed-off-by: Andrew Carbonetto <andrew.carbonetto@improving.com>
Co-authored-by: Yury-Fridlyand <yury.fridlyand@improving.com>
Co-authored-by: SanHalacogluImproving <san.halacoglu@improving.com>
  • Loading branch information
3 people committed Mar 28, 2024
1 parent 5eb484e commit 078a4cd
Show file tree
Hide file tree
Showing 11 changed files with 199 additions and 2 deletions.
7 changes: 7 additions & 0 deletions java/client/src/main/java/glide/api/RedisClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import static redis_request.RedisRequestOuterClass.RequestType.ConfigRewrite;
import static redis_request.RedisRequestOuterClass.RequestType.ConfigSet;
import static redis_request.RedisRequestOuterClass.RequestType.CustomCommand;
import static redis_request.RedisRequestOuterClass.RequestType.Echo;
import static redis_request.RedisRequestOuterClass.RequestType.Info;
import static redis_request.RedisRequestOuterClass.RequestType.Ping;
import static redis_request.RedisRequestOuterClass.RequestType.Select;
Expand Down Expand Up @@ -117,4 +118,10 @@ public CompletableFuture<String> configSet(@NonNull Map<String, String> paramete
return commandManager.submitNewCommand(
ConfigSet, convertMapToKeyValueStringArray(parameters), this::handleStringResponse);
}

@Override
public CompletableFuture<String> echo(@NonNull String message) {
return commandManager.submitNewCommand(
Echo, new String[] {message}, this::handleStringResponse);
}
}
20 changes: 20 additions & 0 deletions java/client/src/main/java/glide/api/RedisClusterClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import static redis_request.RedisRequestOuterClass.RequestType.ConfigRewrite;
import static redis_request.RedisRequestOuterClass.RequestType.ConfigSet;
import static redis_request.RedisRequestOuterClass.RequestType.CustomCommand;
import static redis_request.RedisRequestOuterClass.RequestType.Echo;
import static redis_request.RedisRequestOuterClass.RequestType.Info;
import static redis_request.RedisRequestOuterClass.RequestType.Ping;

Expand Down Expand Up @@ -242,4 +243,23 @@ public CompletableFuture<String> configSet(
return commandManager.submitNewCommand(
ConfigSet, convertMapToKeyValueStringArray(parameters), route, this::handleStringResponse);
}

@Override
public CompletableFuture<String> echo(@NonNull String message) {
return commandManager.submitNewCommand(
Echo, new String[] {message}, this::handleStringResponse);
}

@Override
public CompletableFuture<ClusterValue<String>> echo(
@NonNull String message, @NonNull Route route) {
return commandManager.submitNewCommand(
Echo,
new String[] {message},
route,
response ->
route.isSingleNodeRoute()
? ClusterValue.ofSingleValue(handleStringResponse(response))
: ClusterValue.ofMultiValue(handleMapResponse(response)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -139,4 +139,42 @@ public interface ConnectionManagementClusterCommands {
* }</pre>
*/
CompletableFuture<ClusterValue<String>> clientGetName(Route route);

/**
* Echoes the provided <code>message</code> back.<br>
* The command will be routed a random node.
*
* @see <a href="https://redis.io/commands/echo/">redis.io</a> for details.
* @param message The message to be echoed back.
* @return The provided <code>message</code>.
* @example
* <pre>{@code
* String payload = client.echo("GLIDE").get();
* assert payload.equals("GLIDE");
* }</pre>
*/
CompletableFuture<String> echo(String message);

/**
* Echoes the provided <code>message</code> back.
*
* @see <a href="https://redis.io/commands/echo/">redis.io</a> for details.
* @param message The message to be echoed back.
* @param route Specifies the routing configuration for the command. The client will route the
* command to the nodes defined by <code>route</code>.
* @return The provided <code>message</code>.
* @examples
* <pre>{@code
* // Command sent to a single random node via RANDOM route, expecting a SingleValue result.
* String message = client.echo("GLIDE", RANDOM).get().getSingleValue();
* assert message.equals("GLIDE");
*
* // Command sent to all nodes via ALL_NODES route, expecting a MultiValue result.
* Map<String, String> msgForAllNodes = client.echo("GLIDE", ALL_NODES).get().getMultiValue();
* for(var msgPerNode : msgForAllNodes.entrySet()) {
* assert msgPerNode.equals("GLIDE");
* }
* }</pre>
*/
CompletableFuture<ClusterValue<String>> echo(String message, Route route);
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,18 @@ public interface ConnectionManagementCommands {
* }</pre>
*/
CompletableFuture<String> clientGetName();

/**
* Echoes the provided <code>message</code> back.
*
* @see <a href="https://redis.io/commands/echo/>redis.io</a> for details.
* @param message The message to be echoed back.
* @return The provided <code>message</code>.
* @example
* <pre>{@code
* String payload = client.echo("GLIDE").get();
* assert payload.equals("GLIDE");
* }</pre>
*/
CompletableFuture<String> echo(String message);
}
14 changes: 14 additions & 0 deletions java/client/src/main/java/glide/api/models/BaseTransaction.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import static redis_request.RedisRequestOuterClass.RequestType.Decr;
import static redis_request.RedisRequestOuterClass.RequestType.DecrBy;
import static redis_request.RedisRequestOuterClass.RequestType.Del;
import static redis_request.RedisRequestOuterClass.RequestType.Echo;
import static redis_request.RedisRequestOuterClass.RequestType.Exists;
import static redis_request.RedisRequestOuterClass.RequestType.Expire;
import static redis_request.RedisRequestOuterClass.RequestType.ExpireAt;
Expand Down Expand Up @@ -114,6 +115,19 @@ public T customCommand(String[] args) {
return getThis();
}

/**
* Echoes the provided <code>message</code> back.
*
* @see <a href="https://redis.io/commands/echo>redis.io</a> for details.
* @param message The message to be echoed back.
* @return Command Response - The provided <code>message</code>.
*/
public T echo(@NonNull String message) {
ArgsArray commandArgs = buildArgs(message);
protobufTransaction.addCommands(buildCommand(Echo, commandArgs));
return getThis();
}

/**
* Ping the Redis server.
*
Expand Down
25 changes: 24 additions & 1 deletion java/client/src/test/java/glide/api/RedisClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import static redis_request.RedisRequestOuterClass.RequestType.Decr;
import static redis_request.RedisRequestOuterClass.RequestType.DecrBy;
import static redis_request.RedisRequestOuterClass.RequestType.Del;
import static redis_request.RedisRequestOuterClass.RequestType.Echo;
import static redis_request.RedisRequestOuterClass.RequestType.Exists;
import static redis_request.RedisRequestOuterClass.RequestType.Expire;
import static redis_request.RedisRequestOuterClass.RequestType.ExpireAt;
Expand Down Expand Up @@ -123,6 +124,28 @@ public void customCommand_returns_success() {
assertEquals(value, payload);
}

@SneakyThrows
@Test
public void echo_returns_success() {
// setup
String message = "GLIDE FOR REDIS";
String[] arguments = new String[] {message};
CompletableFuture<String> testResponse = new CompletableFuture<>();
testResponse.complete(message);

// match on protobuf request
when(commandManager.<String>submitNewCommand(eq(Echo), eq(arguments), any()))
.thenReturn(testResponse);

// exercise
CompletableFuture<String> response = service.echo(message);
String echo = response.get();

// verify
assertEquals(testResponse, response);
assertEquals(message, echo);
}

@SneakyThrows
@Test
public void ping_returns_success() {
Expand All @@ -149,7 +172,7 @@ public void ping_with_message_returns_success() {
// setup
String message = "RETURN OF THE PONG";
String[] arguments = new String[] {message};
CompletableFuture<String> testResponse = new CompletableFuture();
CompletableFuture<String> testResponse = new CompletableFuture<>();
testResponse.complete(message);

// match on protobuf request
Expand Down
46 changes: 46 additions & 0 deletions java/client/src/test/java/glide/api/RedisClusterClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import static redis_request.RedisRequestOuterClass.RequestType.ConfigResetStat;
import static redis_request.RedisRequestOuterClass.RequestType.ConfigRewrite;
import static redis_request.RedisRequestOuterClass.RequestType.ConfigSet;
import static redis_request.RedisRequestOuterClass.RequestType.Echo;
import static redis_request.RedisRequestOuterClass.RequestType.Info;
import static redis_request.RedisRequestOuterClass.RequestType.Ping;

Expand Down Expand Up @@ -235,6 +236,51 @@ public void ping_with_message_with_route_returns_success() {
assertEquals(message, pong);
}

@SneakyThrows
@Test
public void echo_returns_success() {
// setup
String message = "GLIDE FOR REDIS";
String[] arguments = new String[] {message};
CompletableFuture<String> testResponse = new CompletableFuture<>();
testResponse.complete(message);

// match on protobuf request
when(commandManager.<String>submitNewCommand(eq(Echo), eq(arguments), any()))
.thenReturn(testResponse);

// exercise
CompletableFuture<String> response = service.echo(message);
String echo = response.get();

// verify
assertEquals(testResponse, response);
assertEquals(message, echo);
}

@SneakyThrows
@Test
public void echo_with_route_returns_success() {
// setup
String message = "GLIDE FOR REDIS";
String[] arguments = new String[] {message};
CompletableFuture<ClusterValue<String>> testResponse = new CompletableFuture<>();
testResponse.complete(ClusterValue.ofSingleValue(message));

// match on protobuf request
when(commandManager.<ClusterValue<String>>submitNewCommand(
eq(Echo), eq(arguments), eq(RANDOM), any()))
.thenReturn(testResponse);

// exercise
CompletableFuture<ClusterValue<String>> response = service.echo(message, RANDOM);
String echo = response.get().getSingleValue();

// verify
assertEquals(testResponse, response);
assertEquals(message, echo);
}

@SneakyThrows
@Test
public void info_returns_string() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import static redis_request.RedisRequestOuterClass.RequestType.Decr;
import static redis_request.RedisRequestOuterClass.RequestType.DecrBy;
import static redis_request.RedisRequestOuterClass.RequestType.Del;
import static redis_request.RedisRequestOuterClass.RequestType.Echo;
import static redis_request.RedisRequestOuterClass.RequestType.Exists;
import static redis_request.RedisRequestOuterClass.RequestType.Expire;
import static redis_request.RedisRequestOuterClass.RequestType.ExpireAt;
Expand Down Expand Up @@ -100,6 +101,9 @@ public void transaction_builds_protobuf_request(BaseTransaction<?> transaction)
transaction.del(new String[] {"key1", "key2"});
results.add(Pair.of(Del, ArgsArray.newBuilder().addArgs("key1").addArgs("key2").build()));

transaction.echo("GLIDE");
results.add(Pair.of(Echo, ArgsArray.newBuilder().addArgs("GLIDE").build()));

transaction.ping();
results.add(Pair.of(Ping, ArgsArray.newBuilder().build()));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ public static BaseTransaction<?> transactionTest(BaseTransaction<?> baseTransact

baseTransaction.configResetStat();

baseTransaction.echo("GLIDE");

return baseTransaction;
}

Expand Down Expand Up @@ -145,7 +147,8 @@ public static Object[] transactionTestResult() {
2L,
OK,
Map.of("timeout", "1000"),
OK
OK,
"GLIDE", // echo
};
}
}
20 changes: 20 additions & 0 deletions java/integTest/src/test/java/glide/cluster/CommandTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -503,4 +503,24 @@ public void cluster_route_by_address_reaches_correct_node() {
public void cluster_fail_routing_by_address_if_no_port_is_provided() {
assertThrows(RequestException.class, () -> clusterClient.info(new ByAddressRoute("foo")).get());
}

@SneakyThrows
@Test
public void echo() {
String message = "GLIDE";
String response = clusterClient.echo(message).get();
assertEquals(message, response);
}

@SneakyThrows
@Test
public void echo_with_route() {
String message = "GLIDE";

String singlePayload = clusterClient.echo(message, RANDOM).get().getSingleValue();
assertEquals(message, singlePayload);

Map<String, String> multiPayload = clusterClient.echo(message, ALL_NODES).get().getMultiValue();
multiPayload.forEach((key, value) -> assertEquals(message, value));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -242,4 +242,12 @@ public void configSet_a_parameter() {
response = regularClient.configSet(Map.of("maxclients", oldValue)).get();
assertEquals(OK, response);
}

@SneakyThrows
@Test
public void echo() {
String message = "GLIDE";
String response = regularClient.echo(message).get();
assertEquals(message, response);
}
}

0 comments on commit 078a4cd

Please sign in to comment.