From 83394826955ab60b18e7b7dad1086db271a7ce84 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Sun, 5 Jan 2025 22:50:55 -0800 Subject: [PATCH 01/26] Update documentation for CONFIG GET and CONFIG SET commands for Java client Signed-off-by: Jonathan Louie --- .../api/commands/ServerManagementClusterCommands.java | 8 ++++++-- .../java/glide/api/commands/ServerManagementCommands.java | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/java/client/src/main/java/glide/api/commands/ServerManagementClusterCommands.java b/java/client/src/main/java/glide/api/commands/ServerManagementClusterCommands.java index 92293de532..af6a1d3a24 100644 --- a/java/client/src/main/java/glide/api/commands/ServerManagementClusterCommands.java +++ b/java/client/src/main/java/glide/api/commands/ServerManagementClusterCommands.java @@ -170,6 +170,7 @@ public interface ServerManagementClusterCommands { /** * Get the values of configuration parameters.
+ * Starting from server version 7, command supports multiple parameters.
* The command will be sent to a random node. * * @see valkey.io for details. @@ -186,7 +187,8 @@ public interface ServerManagementClusterCommands { CompletableFuture> configGet(String[] parameters); /** - * Get the values of configuration parameters. + * Get the values of configuration parameters.
+ * Starting from server version 7, command supports multiple parameters. * * @see valkey.io for details. * @param parameters An array of configuration parameter names to retrieve values @@ -210,6 +212,7 @@ public interface ServerManagementClusterCommands { /** * Sets configuration parameters to the specified values.
+ * Starting from server version 7, command supports multiple parameters.
* The command will be sent to all nodes. * * @see valkey.io for details. @@ -226,7 +229,8 @@ public interface ServerManagementClusterCommands { CompletableFuture configSet(Map parameters); /** - * Sets configuration parameters to the specified values. + * Sets configuration parameters to the specified values.
+ * Starting from server version 7, command supports multiple parameters. * * @see valkey.io for details. * @param parameters A map consisting of configuration parameters and their diff --git a/java/client/src/main/java/glide/api/commands/ServerManagementCommands.java b/java/client/src/main/java/glide/api/commands/ServerManagementCommands.java index 3617ce3af0..9c7104d99b 100644 --- a/java/client/src/main/java/glide/api/commands/ServerManagementCommands.java +++ b/java/client/src/main/java/glide/api/commands/ServerManagementCommands.java @@ -89,7 +89,8 @@ public interface ServerManagementCommands { CompletableFuture configResetStat(); /** - * Get the values of configuration parameters. + * Get the values of configuration parameters.
+ * Starting from server version 7, command supports multiple parameters. * * @see valkey.io for details. * @param parameters An array of configuration parameter names to retrieve values @@ -105,7 +106,8 @@ public interface ServerManagementCommands { CompletableFuture> configGet(String[] parameters); /** - * Sets configuration parameters to the specified values. + * Sets configuration parameters to the specified values.
+ * Starting from server version 7, command supports multiple parameters. * * @see valkey.io for details. * @param parameters A map consisting of configuration parameters and their From e58bfd6138dc5e462cb3fdbdc9bf416326b0aea3 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Mon, 6 Jan 2025 09:35:36 -0800 Subject: [PATCH 02/26] Update documentation for BaseTransaction CONFIG GET and CONFIG SET Signed-off-by: Jonathan Louie --- .../src/main/java/glide/api/models/BaseTransaction.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/java/client/src/main/java/glide/api/models/BaseTransaction.java b/java/client/src/main/java/glide/api/models/BaseTransaction.java index bfdd81efc0..9ef52710e0 100644 --- a/java/client/src/main/java/glide/api/models/BaseTransaction.java +++ b/java/client/src/main/java/glide/api/models/BaseTransaction.java @@ -1648,7 +1648,8 @@ public T sunionstore(@NonNull ArgType destination, @NonNull ArgType[] } /** - * Reads the configuration parameters of the running server. + * Reads the configuration parameters of the running server.
+ * Starting from server version 7, command supports multiple parameters. * * @implNote {@link ArgType} is limited to {@link String} or {@link GlideString}, any other type * will throw {@link IllegalArgumentException}. @@ -1665,7 +1666,8 @@ public T configGet(@NonNull ArgType[] parameters) { } /** - * Sets configuration parameters to the specified values. + * Sets configuration parameters to the specified values.
+ * Starting from server version 7, command supports multiple parameters. * * @implNote {@link ArgType} is limited to {@link String} or {@link GlideString}, any other type * will throw {@link IllegalArgumentException}. From 2c4cca301d570882ee11194e3c3ab37906c432b9 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Mon, 6 Jan 2025 13:54:30 -0800 Subject: [PATCH 03/26] Add transaction test for CONFIG SET and CONFIG GET with multiple parameters Signed-off-by: Jonathan Louie --- .../java/glide/TransactionTestUtilities.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/java/integTest/src/test/java/glide/TransactionTestUtilities.java b/java/integTest/src/test/java/glide/TransactionTestUtilities.java index 46545f786a..6b7040f425 100644 --- a/java/integTest/src/test/java/glide/TransactionTestUtilities.java +++ b/java/integTest/src/test/java/glide/TransactionTestUtilities.java @@ -813,7 +813,13 @@ private static Object[] serverManagementCommands(BaseTransaction transaction) .flushdb(ASYNC) .dbsize(); - return new Object[] { + if (SERVER_VERSION.isGreaterThanOrEqualTo("7.0.0")) { + transaction + .configSet(Map.of("timeout", "2000", "rdb-save-incremental-fsync", "no")) + .configGet(new String[] {"timeout", "rdb-save-incremental-fsync"}); + } + + var expectedResults = new Object[] { OK, // configSet(Map.of("timeout", "1000")) Map.of("timeout", "1000"), // configGet(new String[] {"timeout"}) OK, // configResetStat() @@ -824,6 +830,18 @@ private static Object[] serverManagementCommands(BaseTransaction transaction) OK, // flushdb(ASYNC) 0L, // dbsize() }; + + if (SERVER_VERSION.isGreaterThanOrEqualTo("7.0.0")) { + expectedResults = + concatenateArrays( + expectedResults, + new Object[] { + OK, // configSet(Map.of("timeout", "2000", "rdb-save-incremental-fsync", "no")) + Map.of("timeout", "2000", "rdb-save-incremental-fsync", "no"), // configGet(new String[] {"timeout", "rdb-save-incremental-fsync"}) + }); + } + + return expectedResults; } private static Object[] connectionManagementCommands(BaseTransaction transaction) { From ff274c81a15c604501515f1ff59691b74853e71b Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Mon, 6 Jan 2025 16:21:22 -0800 Subject: [PATCH 04/26] Update Python client CONFIG SET and CONFIG GET docs and tests Signed-off-by: Jonathan Louie --- .../glide/async_commands/cluster_commands.py | 2 ++ .../async_commands/standalone_commands.py | 2 ++ python/python/tests/test_async_client.py | 19 +++++++++++++++++++ python/python/tests/test_transaction.py | 5 +++++ 4 files changed, 28 insertions(+) diff --git a/python/python/glide/async_commands/cluster_commands.py b/python/python/glide/async_commands/cluster_commands.py index ab73e5ef0e..e1b9135221 100644 --- a/python/python/glide/async_commands/cluster_commands.py +++ b/python/python/glide/async_commands/cluster_commands.py @@ -204,6 +204,7 @@ async def config_get( ) -> TClusterResponse[Dict[bytes, bytes]]: """ Get the values of configuration parameters. + Starting from server version 7, command supports multiple parameters. See https://valkey.io/commands/config-get/ for details. Args: @@ -236,6 +237,7 @@ async def config_set( ) -> TOK: """ Set configuration parameters to the specified values. + Starting from server version 7, command supports multiple parameters. See https://valkey.io/commands/config-set/ for details. Args: diff --git a/python/python/glide/async_commands/standalone_commands.py b/python/python/glide/async_commands/standalone_commands.py index b02b29a77b..4595d894dc 100644 --- a/python/python/glide/async_commands/standalone_commands.py +++ b/python/python/glide/async_commands/standalone_commands.py @@ -153,6 +153,7 @@ async def ping(self, message: Optional[TEncodable] = None) -> bytes: async def config_get(self, parameters: List[TEncodable]) -> Dict[bytes, bytes]: """ Get the values of configuration parameters. + Starting from server version 7, command supports multiple parameters. See https://valkey.io/commands/config-get/ for details. Args: @@ -175,6 +176,7 @@ async def config_get(self, parameters: List[TEncodable]) -> Dict[bytes, bytes]: async def config_set(self, parameters_map: Mapping[TEncodable, TEncodable]) -> TOK: """ Set configuration parameters to the specified values. + Starting from server version 7, command supports multiple parameters. See https://valkey.io/commands/config-set/ for details. Args: diff --git a/python/python/tests/test_async_client.py b/python/python/tests/test_async_client.py index 3db7e965db..038a8f19dc 100644 --- a/python/python/tests/test_async_client.py +++ b/python/python/tests/test_async_client.py @@ -855,6 +855,25 @@ async def test_config_get_set(self, glide_client: TGlideClient): == OK ) + if not await check_if_server_version_lt(glide_client, "7.0.0"): + previous_timeout = await glide_client.config_get(["timeout"]) + previous_logfile = await glide_client.config_get(["logfile"]) + assert await glide_client.config_set({"timeout": "1000", "logfile": "foo"}) == OK + assert await glide_client.config_get(["timeout", "logfile"]) == {b"timeout": b"1000", b"logfile": b"foo"} + # revert changes to previous timeout + previous_timeout_decoded = convert_bytes_to_string_object(previous_timeout) + previous_logfile_decoded = convert_bytes_to_string_object(previous_logfile) + assert isinstance(previous_timeout_decoded, dict) + assert isinstance(previous_logfile_decoded, dict) + assert isinstance(previous_timeout_decoded["timeout"], str) + assert isinstance(previous_logfile_decoded["logfile"], str) + assert ( + await glide_client.config_set( + {"timeout": previous_timeout_decoded["timeout"], "logfile": previous_logfile_decoded["logfile"]} + ) + == OK + ) + @pytest.mark.parametrize("cluster_mode", [True]) @pytest.mark.parametrize("protocol", [ProtocolVersion.RESP2, ProtocolVersion.RESP3]) async def test_config_get_with_wildcard_and_multi_node_route( diff --git a/python/python/tests/test_transaction.py b/python/python/tests/test_transaction.py index 7affca711b..b947a5cb4e 100644 --- a/python/python/tests/test_transaction.py +++ b/python/python/tests/test_transaction.py @@ -271,6 +271,11 @@ async def transaction_test( args.append(OK) transaction.config_get(["timeout"]) args.append({b"timeout": b"1000"}) + if not await check_if_server_version_lt(glide_client, "7.0.0"): + transaction.config_set({"timeout": "2000", "logfile": "foo"}) + args.append(OK) + transaction.config_get(["timeout", "logfile"]) + args.append({b"timeout": b"2000", b"logfile": b"foo"}) transaction.hset(key4, {key: value, key2: value2}) args.append(2) From accc9281d2665290b619eda9d0cf2b38229c2de8 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Mon, 6 Jan 2025 16:26:35 -0800 Subject: [PATCH 05/26] Update Python transaction CONFIG GET and CONFIG SET docs Signed-off-by: Jonathan Louie --- python/python/glide/async_commands/transaction.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/python/glide/async_commands/transaction.py b/python/python/glide/async_commands/transaction.py index 9bc7879c65..9b84c6ac4e 100644 --- a/python/python/glide/async_commands/transaction.py +++ b/python/python/glide/async_commands/transaction.py @@ -313,6 +313,7 @@ def delete(self: TTransaction, keys: List[TEncodable]) -> TTransaction: def config_get(self: TTransaction, parameters: List[TEncodable]) -> TTransaction: """ Get the values of configuration parameters. + Starting from server version 7, command supports multiple parameters. See https://valkey.io/commands/config-get/ for details. Args: @@ -329,6 +330,7 @@ def config_set( ) -> TTransaction: """ Set configuration parameters to the specified values. + Starting from server version 7, command supports multiple parameters. See https://valkey.io/commands/config-set/ for details. Args: From e9aa5f227033a0b72f5505d5cb51274cf69862a1 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Mon, 6 Jan 2025 16:40:08 -0800 Subject: [PATCH 06/26] Update Node client docs and tests for CONFIG SET and CONFIG GET Signed-off-by: Jonathan Louie --- node/src/GlideClient.ts | 2 ++ node/src/GlideClusterClient.ts | 2 ++ node/src/Transaction.ts | 2 ++ node/tests/GlideClusterClient.test.ts | 13 +++++++++++ node/tests/SharedTests.ts | 33 +++++++++++++++++++++++++++ 5 files changed, 52 insertions(+) diff --git a/node/src/GlideClient.ts b/node/src/GlideClient.ts index fc9301bd75..9270e7f814 100644 --- a/node/src/GlideClient.ts +++ b/node/src/GlideClient.ts @@ -490,6 +490,7 @@ export class GlideClient extends BaseClient { /** * Reads the configuration parameters of the running server. + * Starting from server version 7, command supports multiple parameters. * * @see {@link https://valkey.io/commands/config-get/|valkey.io} for details. * @@ -517,6 +518,7 @@ export class GlideClient extends BaseClient { /** * Sets configuration parameters to the specified values. + * Starting from server version 7, command supports multiple parameters. * * @see {@link https://valkey.io/commands/config-set/|valkey.io} for details. * @param parameters - A map consisting of configuration parameters and their respective values to set. diff --git a/node/src/GlideClusterClient.ts b/node/src/GlideClusterClient.ts index c12264f078..d21914ec46 100644 --- a/node/src/GlideClusterClient.ts +++ b/node/src/GlideClusterClient.ts @@ -943,6 +943,7 @@ export class GlideClusterClient extends BaseClient { /** * Reads the configuration parameters of the running server. + * Starting from server version 7, command supports multiple parameters. * * The command will be routed to a random node, unless `route` is provided. * @@ -981,6 +982,7 @@ export class GlideClusterClient extends BaseClient { /** * Sets configuration parameters to the specified values. + * Starting from server version 7, command supports multiple parameters. * * The command will be routed to all nodes, unless `route` is provided. * diff --git a/node/src/Transaction.ts b/node/src/Transaction.ts index bdccbe151f..4d28d6f82c 100644 --- a/node/src/Transaction.ts +++ b/node/src/Transaction.ts @@ -744,6 +744,7 @@ export class BaseTransaction> { /** * Reads the configuration parameters of the running server. + * Starting from server version 7, command supports multiple parameters. * * @see {@link https://valkey.io/commands/config-get/|valkey.io} for details. * @@ -758,6 +759,7 @@ export class BaseTransaction> { /** * Sets configuration parameters to the specified values. + * Starting from server version 7, command supports multiple parameters. * * @see {@link https://valkey.io/commands/config-set/|valkey.io} for details. * diff --git a/node/tests/GlideClusterClient.test.ts b/node/tests/GlideClusterClient.test.ts index f2553131f1..570a3b7c70 100644 --- a/node/tests/GlideClusterClient.test.ts +++ b/node/tests/GlideClusterClient.test.ts @@ -323,6 +323,19 @@ describe("GlideClusterClient", () => { "OK", convertRecordToGlideRecord({ timeout: "1000" }), ]); + + if ( + !cluster.checkIfServerVersionLessThan("7.0.0") + ) { + const transaction = new ClusterTransaction() + .configSet({ timeout: "2000", logfile: "foo" }) + .configGet(["timeout", "logfile"]); + const result = await client.exec(transaction); + expect(result).toEqual([ + "OK", + convertRecordToGlideRecord({ timeout: "2000", logfile: "foo" }), + ]); + } }, TIMEOUT, ); diff --git a/node/tests/SharedTests.ts b/node/tests/SharedTests.ts index 7ed788f990..45867df5b4 100644 --- a/node/tests/SharedTests.ts +++ b/node/tests/SharedTests.ts @@ -1230,6 +1230,39 @@ export function runBaseTests(config: { config.timeout, ); + it.each([ProtocolVersion.RESP2, ProtocolVersion.RESP3])( + `config get and config set with timeout and logfile parameters_%p`, + async (protocol) => { + await runTest(async (client: BaseClient) => { + if (cluster.checkIfServerVersionLessThan("7.0.0")) { + return; + } + const prevTimeout = (await client.configGet([ + "timeout", + ])) as Record; + const prevLogfile = (await client.configGet([ + "logfile", + ])) as Record; + expect(await client.configSet({ timeout: "1000", logfile: "foo" })).toEqual( + "OK", + ); + const currParameterValues = (await client.configGet([ + "timeout", + "logfile" + ])) as Record; + expect(currParameterValues).toEqual({ timeout: "1000", logfile: "foo" }); + /// Revert to the previous configuration + expect( + await client.configSet({ + timeout: prevTimeout["timeout"], + logfile: prevLogfile["logfile"] + }), + ).toEqual("OK"); + }, protocol); + }, + config.timeout, + ); + it.each([ProtocolVersion.RESP2, ProtocolVersion.RESP3])( `getdel test_%p`, async (protocol) => { From 03df33e43446dacbf92895456f7cb751aa758bea Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Mon, 6 Jan 2025 16:44:48 -0800 Subject: [PATCH 07/26] Update CHANGELOG Signed-off-by: Jonathan Louie --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c7585a2f8..9d424bb8df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ * Go: Add `ZPopMin` and `ZPopMax` ([#2850](https://github.com/valkey-io/valkey-glide/pull/2850)) * Java: Add binary version of `ZRANK WITHSCORE` ([#2896](https://github.com/valkey-io/valkey-glide/pull/2896)) * Go: Add `ZCARD` ([#2838](https://github.com/valkey-io/valkey-glide/pull/2838)) +* Java, Node, Python: Update documentation for CONFIG SET and CONFIG GET ([#2919](https://github.com/valkey-io/valkey-glide/pull/2919)) #### Breaking Changes From 57b80eb7afb559b19c8a8d7489217b107a15c77a Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Mon, 6 Jan 2025 16:46:16 -0800 Subject: [PATCH 08/26] Fix linter issue Signed-off-by: Jonathan Louie --- node/tests/SharedTests.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/node/tests/SharedTests.ts b/node/tests/SharedTests.ts index 45867df5b4..434585ba6f 100644 --- a/node/tests/SharedTests.ts +++ b/node/tests/SharedTests.ts @@ -1237,6 +1237,7 @@ export function runBaseTests(config: { if (cluster.checkIfServerVersionLessThan("7.0.0")) { return; } + const prevTimeout = (await client.configGet([ "timeout", ])) as Record; From 94967efc7ceaaca2ce69a7e0cb094a683333843e Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Mon, 6 Jan 2025 16:53:38 -0800 Subject: [PATCH 09/26] Fix Prettier issues Signed-off-by: Jonathan Louie --- node/tests/GlideClusterClient.test.ts | 9 +++++---- node/tests/SharedTests.ts | 15 +++++++++------ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/node/tests/GlideClusterClient.test.ts b/node/tests/GlideClusterClient.test.ts index 570a3b7c70..ae4768d05f 100644 --- a/node/tests/GlideClusterClient.test.ts +++ b/node/tests/GlideClusterClient.test.ts @@ -324,16 +324,17 @@ describe("GlideClusterClient", () => { convertRecordToGlideRecord({ timeout: "1000" }), ]); - if ( - !cluster.checkIfServerVersionLessThan("7.0.0") - ) { + if (!cluster.checkIfServerVersionLessThan("7.0.0")) { const transaction = new ClusterTransaction() .configSet({ timeout: "2000", logfile: "foo" }) .configGet(["timeout", "logfile"]); const result = await client.exec(transaction); expect(result).toEqual([ "OK", - convertRecordToGlideRecord({ timeout: "2000", logfile: "foo" }), + convertRecordToGlideRecord({ + timeout: "2000", + logfile: "foo", + }), ]); } }, diff --git a/node/tests/SharedTests.ts b/node/tests/SharedTests.ts index 434585ba6f..2f72a7a4a0 100644 --- a/node/tests/SharedTests.ts +++ b/node/tests/SharedTests.ts @@ -1244,19 +1244,22 @@ export function runBaseTests(config: { const prevLogfile = (await client.configGet([ "logfile", ])) as Record; - expect(await client.configSet({ timeout: "1000", logfile: "foo" })).toEqual( - "OK", - ); + expect( + await client.configSet({ timeout: "1000", logfile: "foo" }), + ).toEqual("OK"); const currParameterValues = (await client.configGet([ "timeout", - "logfile" + "logfile", ])) as Record; - expect(currParameterValues).toEqual({ timeout: "1000", logfile: "foo" }); + expect(currParameterValues).toEqual({ + timeout: "1000", + logfile: "foo", + }); /// Revert to the previous configuration expect( await client.configSet({ timeout: prevTimeout["timeout"], - logfile: prevLogfile["logfile"] + logfile: prevLogfile["logfile"], }), ).toEqual("OK"); }, protocol); From 8fd4ad22da718b95494468150f7f0bb5e4ba013c Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Mon, 6 Jan 2025 17:18:30 -0800 Subject: [PATCH 10/26] Apply Spotless Signed-off-by: Jonathan Louie --- .../java/glide/TransactionTestUtilities.java | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/java/integTest/src/test/java/glide/TransactionTestUtilities.java b/java/integTest/src/test/java/glide/TransactionTestUtilities.java index 6b7040f425..c155ae908a 100644 --- a/java/integTest/src/test/java/glide/TransactionTestUtilities.java +++ b/java/integTest/src/test/java/glide/TransactionTestUtilities.java @@ -815,30 +815,35 @@ private static Object[] serverManagementCommands(BaseTransaction transaction) if (SERVER_VERSION.isGreaterThanOrEqualTo("7.0.0")) { transaction - .configSet(Map.of("timeout", "2000", "rdb-save-incremental-fsync", "no")) - .configGet(new String[] {"timeout", "rdb-save-incremental-fsync"}); + .configSet(Map.of("timeout", "2000", "rdb-save-incremental-fsync", "no")) + .configGet(new String[] {"timeout", "rdb-save-incremental-fsync"}); } - var expectedResults = new Object[] { - OK, // configSet(Map.of("timeout", "1000")) - Map.of("timeout", "1000"), // configGet(new String[] {"timeout"}) - OK, // configResetStat() - "Redis ver. " + SERVER_VERSION + '\n', // lolwut(1) - OK, // flushall() - OK, // flushall(ASYNC) - OK, // flushdb() - OK, // flushdb(ASYNC) - 0L, // dbsize() - }; + var expectedResults = + new Object[] { + OK, // configSet(Map.of("timeout", "1000")) + Map.of("timeout", "1000"), // configGet(new String[] {"timeout"}) + OK, // configResetStat() + "Redis ver. " + SERVER_VERSION + '\n', // lolwut(1) + OK, // flushall() + OK, // flushall(ASYNC) + OK, // flushdb() + OK, // flushdb(ASYNC) + 0L, // dbsize() + }; if (SERVER_VERSION.isGreaterThanOrEqualTo("7.0.0")) { expectedResults = - concatenateArrays( - expectedResults, - new Object[] { - OK, // configSet(Map.of("timeout", "2000", "rdb-save-incremental-fsync", "no")) - Map.of("timeout", "2000", "rdb-save-incremental-fsync", "no"), // configGet(new String[] {"timeout", "rdb-save-incremental-fsync"}) - }); + concatenateArrays( + expectedResults, + new Object[] { + OK, // configSet(Map.of("timeout", "2000", "rdb-save-incremental-fsync", "no")) + Map.of( + "timeout", + "2000", + "rdb-save-incremental-fsync", + "no"), // configGet(new String[] {"timeout", "rdb-save-incremental-fsync"}) + }); } return expectedResults; From f9a38a3fe7328a33e5b0c7c0cdf346c43560e680 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Tue, 7 Jan 2025 11:26:58 -0800 Subject: [PATCH 11/26] Add missing cluster argument for Node SharedTests Signed-off-by: Jonathan Louie --- node/tests/SharedTests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/tests/SharedTests.ts b/node/tests/SharedTests.ts index 2f72a7a4a0..a912e833a0 100644 --- a/node/tests/SharedTests.ts +++ b/node/tests/SharedTests.ts @@ -1233,7 +1233,7 @@ export function runBaseTests(config: { it.each([ProtocolVersion.RESP2, ProtocolVersion.RESP3])( `config get and config set with timeout and logfile parameters_%p`, async (protocol) => { - await runTest(async (client: BaseClient) => { + await runTest(async (client: BaseClient, cluster) => { if (cluster.checkIfServerVersionLessThan("7.0.0")) { return; } From b75e2862b1f5b394d7578a221c59b6f71db84315 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Tue, 7 Jan 2025 14:20:25 -0800 Subject: [PATCH 12/26] Try changing cluster-node-timeout instead of logfile to avoid immutable config error Signed-off-by: Jonathan Louie --- node/tests/SharedTests.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/node/tests/SharedTests.ts b/node/tests/SharedTests.ts index a912e833a0..9ce3fde2c5 100644 --- a/node/tests/SharedTests.ts +++ b/node/tests/SharedTests.ts @@ -1231,7 +1231,7 @@ export function runBaseTests(config: { ); it.each([ProtocolVersion.RESP2, ProtocolVersion.RESP3])( - `config get and config set with timeout and logfile parameters_%p`, + `config get and config set with timeout and cluster-node-timeout parameters_%p`, async (protocol) => { await runTest(async (client: BaseClient, cluster) => { if (cluster.checkIfServerVersionLessThan("7.0.0")) { @@ -1241,25 +1241,25 @@ export function runBaseTests(config: { const prevTimeout = (await client.configGet([ "timeout", ])) as Record; - const prevLogfile = (await client.configGet([ - "logfile", + const prevClusterNodeTimeout = (await client.configGet([ + "cluster-node-timeout", ])) as Record; expect( - await client.configSet({ timeout: "1000", logfile: "foo" }), + await client.configSet({ timeout: "1000", cluster-node-timeout: "16000" }), ).toEqual("OK"); const currParameterValues = (await client.configGet([ "timeout", - "logfile", + "cluster-node-timeout", ])) as Record; expect(currParameterValues).toEqual({ timeout: "1000", - logfile: "foo", + cluster-node-timeout: "16000", }); /// Revert to the previous configuration expect( await client.configSet({ timeout: prevTimeout["timeout"], - logfile: prevLogfile["logfile"], + logfile: prevClusterNodeTimeout["cluster-node-timeout"], }), ).toEqual("OK"); }, protocol); From 62ec79d7fc345884885565be350c0b39ced5426d Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Tue, 7 Jan 2025 21:57:25 -0800 Subject: [PATCH 13/26] Fix test failures for Node client Signed-off-by: Jonathan Louie --- node/tests/GlideClusterClient.test.ts | 20 +++++++++++--------- node/tests/SharedTests.ts | 6 +++--- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/node/tests/GlideClusterClient.test.ts b/node/tests/GlideClusterClient.test.ts index ae4768d05f..cee4814035 100644 --- a/node/tests/GlideClusterClient.test.ts +++ b/node/tests/GlideClusterClient.test.ts @@ -326,16 +326,18 @@ describe("GlideClusterClient", () => { if (!cluster.checkIfServerVersionLessThan("7.0.0")) { const transaction = new ClusterTransaction() - .configSet({ timeout: "2000", logfile: "foo" }) - .configGet(["timeout", "logfile"]); + .configSet({ timeout: "2000", "cluster-node-timeout": "16000" }) + .configGet(["timeout", "cluster-node-timeout"]); const result = await client.exec(transaction); - expect(result).toEqual([ - "OK", - convertRecordToGlideRecord({ - timeout: "2000", - logfile: "foo", - }), - ]); + expect(result[0]).toEqual("OK"); + const expectedConfigGetResult = convertRecordToGlideRecord({ + timeout: "2000", + "cluster-node-timeout": "16000", + }); + expect(result[1][0]["key"]).toEqual("cluster-node-timeout"); + expect(result[1][0]["value"]).toEqual("16000"); + expect(result[1][1]["key"]).toEqual("timeout"); + expect(result[1][1]["value"]).toEqual("2000"); } }, TIMEOUT, diff --git a/node/tests/SharedTests.ts b/node/tests/SharedTests.ts index 9ce3fde2c5..e06c329ca7 100644 --- a/node/tests/SharedTests.ts +++ b/node/tests/SharedTests.ts @@ -1245,7 +1245,7 @@ export function runBaseTests(config: { "cluster-node-timeout", ])) as Record; expect( - await client.configSet({ timeout: "1000", cluster-node-timeout: "16000" }), + await client.configSet({ timeout: "1000", "cluster-node-timeout": "16000" }), ).toEqual("OK"); const currParameterValues = (await client.configGet([ "timeout", @@ -1253,13 +1253,13 @@ export function runBaseTests(config: { ])) as Record; expect(currParameterValues).toEqual({ timeout: "1000", - cluster-node-timeout: "16000", + "cluster-node-timeout": "16000", }); /// Revert to the previous configuration expect( await client.configSet({ timeout: prevTimeout["timeout"], - logfile: prevClusterNodeTimeout["cluster-node-timeout"], + "cluster-node-timeout": prevClusterNodeTimeout["cluster-node-timeout"], }), ).toEqual("OK"); }, protocol); From 1dd027bece69f0aed770862c99f9cd8e47ade58d Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Tue, 7 Jan 2025 22:03:12 -0800 Subject: [PATCH 14/26] Fix linting errors Signed-off-by: Jonathan Louie --- node/tests/.GlideClusterClient.test.ts.swp | Bin 0 -> 126976 bytes node/tests/GlideClusterClient.test.ts | 9 ++++----- node/tests/SharedTests.ts | 8 ++++++-- 3 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 node/tests/.GlideClusterClient.test.ts.swp diff --git a/node/tests/.GlideClusterClient.test.ts.swp b/node/tests/.GlideClusterClient.test.ts.swp new file mode 100644 index 0000000000000000000000000000000000000000..7691fe5ba50e68ca163ee0ad958b75564c3c2ac3 GIT binary patch literal 126976 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 VWrx{eLqOi{$_S literal 0 HcmV?d00001 diff --git a/node/tests/GlideClusterClient.test.ts b/node/tests/GlideClusterClient.test.ts index cee4814035..f8031425e8 100644 --- a/node/tests/GlideClusterClient.test.ts +++ b/node/tests/GlideClusterClient.test.ts @@ -326,14 +326,13 @@ describe("GlideClusterClient", () => { if (!cluster.checkIfServerVersionLessThan("7.0.0")) { const transaction = new ClusterTransaction() - .configSet({ timeout: "2000", "cluster-node-timeout": "16000" }) + .configSet({ + timeout: "2000", + "cluster-node-timeout": "16000", + }) .configGet(["timeout", "cluster-node-timeout"]); const result = await client.exec(transaction); expect(result[0]).toEqual("OK"); - const expectedConfigGetResult = convertRecordToGlideRecord({ - timeout: "2000", - "cluster-node-timeout": "16000", - }); expect(result[1][0]["key"]).toEqual("cluster-node-timeout"); expect(result[1][0]["value"]).toEqual("16000"); expect(result[1][1]["key"]).toEqual("timeout"); diff --git a/node/tests/SharedTests.ts b/node/tests/SharedTests.ts index e06c329ca7..867fcff748 100644 --- a/node/tests/SharedTests.ts +++ b/node/tests/SharedTests.ts @@ -1245,7 +1245,10 @@ export function runBaseTests(config: { "cluster-node-timeout", ])) as Record; expect( - await client.configSet({ timeout: "1000", "cluster-node-timeout": "16000" }), + await client.configSet({ + timeout: "1000", + "cluster-node-timeout": "16000", + }), ).toEqual("OK"); const currParameterValues = (await client.configGet([ "timeout", @@ -1259,7 +1262,8 @@ export function runBaseTests(config: { expect( await client.configSet({ timeout: prevTimeout["timeout"], - "cluster-node-timeout": prevClusterNodeTimeout["cluster-node-timeout"], + "cluster-node-timeout": + prevClusterNodeTimeout["cluster-node-timeout"], }), ).toEqual("OK"); }, protocol); From 594b9184c81efb72c516a633b6cedf718fce1307 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Tue, 7 Jan 2025 22:23:05 -0800 Subject: [PATCH 15/26] Sort expected result for CONFIG GET and CONFIG SET transaction test Signed-off-by: Jonathan Louie --- node/tests/GlideClusterClient.test.ts | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/node/tests/GlideClusterClient.test.ts b/node/tests/GlideClusterClient.test.ts index f8031425e8..ffadc2d2d2 100644 --- a/node/tests/GlideClusterClient.test.ts +++ b/node/tests/GlideClusterClient.test.ts @@ -332,11 +332,22 @@ describe("GlideClusterClient", () => { }) .configGet(["timeout", "cluster-node-timeout"]); const result = await client.exec(transaction); - expect(result[0]).toEqual("OK"); - expect(result[1][0]["key"]).toEqual("cluster-node-timeout"); - expect(result[1][0]["value"]).toEqual("16000"); - expect(result[1][1]["key"]).toEqual("timeout"); - expect(result[1][1]["value"]).toEqual("2000"); + result.sort((a, b) => { + if (a.key < b.key) { + return -1; + } else if (a.key > b.key) { + return 1; + } else { + return 0; + } + }); + expect(result).toEqual([ + "OK", + convertRecordToGlideRecord({ + "cluster-node-timeout": "16000", + timeout: "2000", + }), + ]); } }, TIMEOUT, From c08410a5e2a0b0f04fb4349ef56e632091a18542 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Tue, 7 Jan 2025 22:49:37 -0800 Subject: [PATCH 16/26] Assign sorted array to new variable Signed-off-by: Jonathan Louie --- node/tests/GlideClusterClient.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node/tests/GlideClusterClient.test.ts b/node/tests/GlideClusterClient.test.ts index ffadc2d2d2..9318ba05bf 100644 --- a/node/tests/GlideClusterClient.test.ts +++ b/node/tests/GlideClusterClient.test.ts @@ -332,7 +332,7 @@ describe("GlideClusterClient", () => { }) .configGet(["timeout", "cluster-node-timeout"]); const result = await client.exec(transaction); - result.sort((a, b) => { + const sortedResult = result.sort((a, b) => { if (a.key < b.key) { return -1; } else if (a.key > b.key) { @@ -341,7 +341,7 @@ describe("GlideClusterClient", () => { return 0; } }); - expect(result).toEqual([ + expect(sortedResult).toEqual([ "OK", convertRecordToGlideRecord({ "cluster-node-timeout": "16000", From aa604c99e23d45db279236e1342b7f227c9ecfd6 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Tue, 7 Jan 2025 23:35:42 -0800 Subject: [PATCH 17/26] Apply Black linter Signed-off-by: Jonathan Louie --- python/python/tests/test_async_client.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/python/python/tests/test_async_client.py b/python/python/tests/test_async_client.py index 038a8f19dc..28a61d6a65 100644 --- a/python/python/tests/test_async_client.py +++ b/python/python/tests/test_async_client.py @@ -858,8 +858,14 @@ async def test_config_get_set(self, glide_client: TGlideClient): if not await check_if_server_version_lt(glide_client, "7.0.0"): previous_timeout = await glide_client.config_get(["timeout"]) previous_logfile = await glide_client.config_get(["logfile"]) - assert await glide_client.config_set({"timeout": "1000", "logfile": "foo"}) == OK - assert await glide_client.config_get(["timeout", "logfile"]) == {b"timeout": b"1000", b"logfile": b"foo"} + assert ( + await glide_client.config_set({"timeout": "1000", "logfile": "foo"}) + == OK + ) + assert await glide_client.config_get(["timeout", "logfile"]) == { + b"timeout": b"1000", + b"logfile": b"foo", + } # revert changes to previous timeout previous_timeout_decoded = convert_bytes_to_string_object(previous_timeout) previous_logfile_decoded = convert_bytes_to_string_object(previous_logfile) @@ -869,7 +875,10 @@ async def test_config_get_set(self, glide_client: TGlideClient): assert isinstance(previous_logfile_decoded["logfile"], str) assert ( await glide_client.config_set( - {"timeout": previous_timeout_decoded["timeout"], "logfile": previous_logfile_decoded["logfile"]} + { + "timeout": previous_timeout_decoded["timeout"], + "logfile": previous_logfile_decoded["logfile"], + } ) == OK ) From 833e9aa802aae10c102f3f36ddf3196c03e92e8e Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Wed, 8 Jan 2025 09:52:18 -0800 Subject: [PATCH 18/26] Update Python tests to avoid immutable config error Signed-off-by: Jonathan Louie --- python/python/tests/test_async_client.py | 12 ++++++------ python/python/tests/test_transaction.py | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/python/python/tests/test_async_client.py b/python/python/tests/test_async_client.py index 28a61d6a65..cb66ac5901 100644 --- a/python/python/tests/test_async_client.py +++ b/python/python/tests/test_async_client.py @@ -857,9 +857,9 @@ async def test_config_get_set(self, glide_client: TGlideClient): if not await check_if_server_version_lt(glide_client, "7.0.0"): previous_timeout = await glide_client.config_get(["timeout"]) - previous_logfile = await glide_client.config_get(["logfile"]) + previous_node_cluster_timeout = await glide_client.config_get(["node-cluster-timeout"]) assert ( - await glide_client.config_set({"timeout": "1000", "logfile": "foo"}) + await glide_client.config_set({"timeout": "1000", "node-cluster-timeout": "16000"}) == OK ) assert await glide_client.config_get(["timeout", "logfile"]) == { @@ -868,16 +868,16 @@ async def test_config_get_set(self, glide_client: TGlideClient): } # revert changes to previous timeout previous_timeout_decoded = convert_bytes_to_string_object(previous_timeout) - previous_logfile_decoded = convert_bytes_to_string_object(previous_logfile) + previous_node_cluster_timeout_decoded = convert_bytes_to_string_object(pprevious_node_cluster_timeout) assert isinstance(previous_timeout_decoded, dict) - assert isinstance(previous_logfile_decoded, dict) + assert isinstance(previous_node_cluster_timeout_decoded, dict) assert isinstance(previous_timeout_decoded["timeout"], str) - assert isinstance(previous_logfile_decoded["logfile"], str) + assert isinstance(previous_node_cluster_timeout_decoded["node-cluster-timeout"], str) assert ( await glide_client.config_set( { "timeout": previous_timeout_decoded["timeout"], - "logfile": previous_logfile_decoded["logfile"], + "node-cluster-timeout": previous_node_cluster_timeout_decoded["node-cluster-timeout"], } ) == OK diff --git a/python/python/tests/test_transaction.py b/python/python/tests/test_transaction.py index b947a5cb4e..fe0033c9b4 100644 --- a/python/python/tests/test_transaction.py +++ b/python/python/tests/test_transaction.py @@ -272,10 +272,10 @@ async def transaction_test( transaction.config_get(["timeout"]) args.append({b"timeout": b"1000"}) if not await check_if_server_version_lt(glide_client, "7.0.0"): - transaction.config_set({"timeout": "2000", "logfile": "foo"}) + transaction.config_set({"timeout": "2000", "cluster-node-timeout": "16000"}) args.append(OK) - transaction.config_get(["timeout", "logfile"]) - args.append({b"timeout": b"2000", b"logfile": b"foo"}) + transaction.config_get(["timeout", "cluster-node-timeout"]) + args.append({b"timeout": b"2000", b"cluster-node-timeout": b"16000"}) transaction.hset(key4, {key: value, key2: value2}) args.append(2) From fe096b0bef687a1a589e38fa58abe697d4276bd8 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Wed, 8 Jan 2025 09:56:06 -0800 Subject: [PATCH 19/26] Apply Black linter Signed-off-by: Jonathan Louie --- python/python/tests/test_async_client.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/python/python/tests/test_async_client.py b/python/python/tests/test_async_client.py index cb66ac5901..c8e991a096 100644 --- a/python/python/tests/test_async_client.py +++ b/python/python/tests/test_async_client.py @@ -857,9 +857,13 @@ async def test_config_get_set(self, glide_client: TGlideClient): if not await check_if_server_version_lt(glide_client, "7.0.0"): previous_timeout = await glide_client.config_get(["timeout"]) - previous_node_cluster_timeout = await glide_client.config_get(["node-cluster-timeout"]) + previous_node_cluster_timeout = await glide_client.config_get( + ["node-cluster-timeout"] + ) assert ( - await glide_client.config_set({"timeout": "1000", "node-cluster-timeout": "16000"}) + await glide_client.config_set( + {"timeout": "1000", "node-cluster-timeout": "16000"} + ) == OK ) assert await glide_client.config_get(["timeout", "logfile"]) == { @@ -868,16 +872,22 @@ async def test_config_get_set(self, glide_client: TGlideClient): } # revert changes to previous timeout previous_timeout_decoded = convert_bytes_to_string_object(previous_timeout) - previous_node_cluster_timeout_decoded = convert_bytes_to_string_object(pprevious_node_cluster_timeout) + previous_node_cluster_timeout_decoded = convert_bytes_to_string_object( + pprevious_node_cluster_timeout + ) assert isinstance(previous_timeout_decoded, dict) assert isinstance(previous_node_cluster_timeout_decoded, dict) assert isinstance(previous_timeout_decoded["timeout"], str) - assert isinstance(previous_node_cluster_timeout_decoded["node-cluster-timeout"], str) + assert isinstance( + previous_node_cluster_timeout_decoded["node-cluster-timeout"], str + ) assert ( await glide_client.config_set( { "timeout": previous_timeout_decoded["timeout"], - "node-cluster-timeout": previous_node_cluster_timeout_decoded["node-cluster-timeout"], + "node-cluster-timeout": previous_node_cluster_timeout_decoded[ + "node-cluster-timeout" + ], } ) == OK From 0547a8fa8c613ee23becfa9daabc796d007ae0a3 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Wed, 8 Jan 2025 10:00:34 -0800 Subject: [PATCH 20/26] Fix typo Signed-off-by: Jonathan Louie --- python/python/tests/test_async_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/python/tests/test_async_client.py b/python/python/tests/test_async_client.py index c8e991a096..cfd60d4e9e 100644 --- a/python/python/tests/test_async_client.py +++ b/python/python/tests/test_async_client.py @@ -873,7 +873,7 @@ async def test_config_get_set(self, glide_client: TGlideClient): # revert changes to previous timeout previous_timeout_decoded = convert_bytes_to_string_object(previous_timeout) previous_node_cluster_timeout_decoded = convert_bytes_to_string_object( - pprevious_node_cluster_timeout + previous_node_cluster_timeout ) assert isinstance(previous_timeout_decoded, dict) assert isinstance(previous_node_cluster_timeout_decoded, dict) From 9408c872bd04927da1187e4ccaa513b8d0492f89 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Wed, 8 Jan 2025 11:13:40 -0800 Subject: [PATCH 21/26] Fix typo in Python tests Signed-off-by: Jonathan Louie --- python/python/tests/test_async_client.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/python/python/tests/test_async_client.py b/python/python/tests/test_async_client.py index cfd60d4e9e..c51677fa72 100644 --- a/python/python/tests/test_async_client.py +++ b/python/python/tests/test_async_client.py @@ -857,36 +857,36 @@ async def test_config_get_set(self, glide_client: TGlideClient): if not await check_if_server_version_lt(glide_client, "7.0.0"): previous_timeout = await glide_client.config_get(["timeout"]) - previous_node_cluster_timeout = await glide_client.config_get( - ["node-cluster-timeout"] + previous_cluster_node_timeout= await glide_client.config_get( + ["cluster-node-timeout"] ) assert ( await glide_client.config_set( - {"timeout": "1000", "node-cluster-timeout": "16000"} + {"timeout": "2000", "cluster-node-timeout": "16000"} ) == OK ) - assert await glide_client.config_get(["timeout", "logfile"]) == { - b"timeout": b"1000", - b"logfile": b"foo", + assert await glide_client.config_get(["timeout", "cluster-node-timeout"]) == { + b"timeout": b"2000", + b"cluster-node-timeout": b"16000", } # revert changes to previous timeout previous_timeout_decoded = convert_bytes_to_string_object(previous_timeout) - previous_node_cluster_timeout_decoded = convert_bytes_to_string_object( - previous_node_cluster_timeout + previous_cluster_node_timeout_decoded = convert_bytes_to_string_object( + previous_cluster_node_timeout ) assert isinstance(previous_timeout_decoded, dict) - assert isinstance(previous_node_cluster_timeout_decoded, dict) + assert isinstance(previous_cluster_node_timeout_decoded, dict) assert isinstance(previous_timeout_decoded["timeout"], str) assert isinstance( - previous_node_cluster_timeout_decoded["node-cluster-timeout"], str + previous_cluster_node_timeout_decoded["cluster-node-timeout"], str ) assert ( await glide_client.config_set( { "timeout": previous_timeout_decoded["timeout"], - "node-cluster-timeout": previous_node_cluster_timeout_decoded[ - "node-cluster-timeout" + "cluster-node-timeout": previous_cluster_node_timeout_decoded[ + "cluster-node-timeout" ], } ) From 7928f92f6da8acd82587d5780b794a359cadf4d6 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Wed, 8 Jan 2025 11:14:07 -0800 Subject: [PATCH 22/26] Run Black linter Signed-off-by: Jonathan Louie --- python/python/tests/test_async_client.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/python/python/tests/test_async_client.py b/python/python/tests/test_async_client.py index c51677fa72..bbd1060a40 100644 --- a/python/python/tests/test_async_client.py +++ b/python/python/tests/test_async_client.py @@ -857,7 +857,7 @@ async def test_config_get_set(self, glide_client: TGlideClient): if not await check_if_server_version_lt(glide_client, "7.0.0"): previous_timeout = await glide_client.config_get(["timeout"]) - previous_cluster_node_timeout= await glide_client.config_get( + previous_cluster_node_timeout = await glide_client.config_get( ["cluster-node-timeout"] ) assert ( @@ -866,7 +866,9 @@ async def test_config_get_set(self, glide_client: TGlideClient): ) == OK ) - assert await glide_client.config_get(["timeout", "cluster-node-timeout"]) == { + assert await glide_client.config_get( + ["timeout", "cluster-node-timeout"] + ) == { b"timeout": b"2000", b"cluster-node-timeout": b"16000", } From 1a0c1c087dc0a5fcd69dcbe342d238183a8c5971 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Wed, 8 Jan 2025 14:09:38 -0800 Subject: [PATCH 23/26] Fix failing Node test Signed-off-by: Jonathan Louie --- node/tests/GlideClusterClient.test.ts | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/node/tests/GlideClusterClient.test.ts b/node/tests/GlideClusterClient.test.ts index 9318ba05bf..2d5b86f52e 100644 --- a/node/tests/GlideClusterClient.test.ts +++ b/node/tests/GlideClusterClient.test.ts @@ -34,6 +34,7 @@ import { SlotKeyTypes, SortOrder, convertRecordToGlideRecord, + convertGlideRecordToRecord, } from ".."; import { ValkeyCluster } from "../../utils/TestUtils"; import { runBaseTests } from "./SharedTests"; @@ -332,21 +333,16 @@ describe("GlideClusterClient", () => { }) .configGet(["timeout", "cluster-node-timeout"]); const result = await client.exec(transaction); - const sortedResult = result.sort((a, b) => { - if (a.key < b.key) { - return -1; - } else if (a.key > b.key) { - return 1; - } else { - return 0; - } - }); - expect(sortedResult).toEqual([ + const convertedResult = [ + result[0], + convertGlideRecordToRecord(result[1]), + ]; + expect(convertedResult).toEqual([ "OK", - convertRecordToGlideRecord({ - "cluster-node-timeout": "16000", + { timeout: "2000", - }), + "cluster-node-timeout": "16000", + }, ]); } }, From 9baf9f41ca80c2d125d877ed3b1324ce893e80d3 Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Thu, 9 Jan 2025 09:50:29 -0800 Subject: [PATCH 24/26] Remove swap file Signed-off-by: Jonathan Louie --- node/tests/.GlideClusterClient.test.ts.swp | Bin 126976 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 node/tests/.GlideClusterClient.test.ts.swp diff --git a/node/tests/.GlideClusterClient.test.ts.swp b/node/tests/.GlideClusterClient.test.ts.swp deleted file mode 100644 index 7691fe5ba50e68ca163ee0ad958b75564c3c2ac3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126976 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 VWrx{eLqOi{$_S From 13604e8996953eb5514d65b8885eb61a27d93c3f Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Thu, 9 Jan 2025 10:07:19 -0800 Subject: [PATCH 25/26] Combine CONFIG GET and CONFIG SET tests in SharedTests.ts Signed-off-by: Jonathan Louie --- node/tests/SharedTests.ts | 68 +++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 39 deletions(-) diff --git a/node/tests/SharedTests.ts b/node/tests/SharedTests.ts index 867fcff748..26fd3a9939 100644 --- a/node/tests/SharedTests.ts +++ b/node/tests/SharedTests.ts @@ -1206,7 +1206,7 @@ export function runBaseTests(config: { ); it.each([ProtocolVersion.RESP2, ProtocolVersion.RESP3])( - `config get and config set with timeout parameter_%p`, + `config get and config set with multiple parameters_%p`, async (protocol) => { await runTest(async (client: BaseClient) => { const prevTimeout = (await client.configGet([ @@ -1225,47 +1225,37 @@ export function runBaseTests(config: { timeout: prevTimeout["timeout"], }), ).toEqual("OK"); - }, protocol); - }, - config.timeout, - ); - it.each([ProtocolVersion.RESP2, ProtocolVersion.RESP3])( - `config get and config set with timeout and cluster-node-timeout parameters_%p`, - async (protocol) => { - await runTest(async (client: BaseClient, cluster) => { - if (cluster.checkIfServerVersionLessThan("7.0.0")) { - return; - } - - const prevTimeout = (await client.configGet([ - "timeout", - ])) as Record; - const prevClusterNodeTimeout = (await client.configGet([ - "cluster-node-timeout", - ])) as Record; - expect( - await client.configSet({ + if (!cluster.checkIfServerVersionLessThan("7.0.0")) { + const prevTimeout = (await client.configGet([ + "timeout", + ])) as Record; + const prevClusterNodeTimeout = (await client.configGet([ + "cluster-node-timeout", + ])) as Record; + expect( + await client.configSet({ + timeout: "1000", + "cluster-node-timeout": "16000", + }), + ).toEqual("OK"); + const currParameterValues = (await client.configGet([ + "timeout", + "cluster-node-timeout", + ])) as Record; + expect(currParameterValues).toEqual({ timeout: "1000", "cluster-node-timeout": "16000", - }), - ).toEqual("OK"); - const currParameterValues = (await client.configGet([ - "timeout", - "cluster-node-timeout", - ])) as Record; - expect(currParameterValues).toEqual({ - timeout: "1000", - "cluster-node-timeout": "16000", - }); - /// Revert to the previous configuration - expect( - await client.configSet({ - timeout: prevTimeout["timeout"], - "cluster-node-timeout": - prevClusterNodeTimeout["cluster-node-timeout"], - }), - ).toEqual("OK"); + }); + /// Revert to the previous configuration + expect( + await client.configSet({ + timeout: prevTimeout["timeout"], + "cluster-node-timeout": + prevClusterNodeTimeout["cluster-node-timeout"], + }), + ).toEqual("OK"); + } }, protocol); }, config.timeout, From a007819e347c4a35c626f55b04258fc2bb1b73ef Mon Sep 17 00:00:00 2001 From: Jonathan Louie Date: Thu, 9 Jan 2025 10:29:27 -0800 Subject: [PATCH 26/26] Fix build error Signed-off-by: Jonathan Louie --- node/tests/SharedTests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/tests/SharedTests.ts b/node/tests/SharedTests.ts index 26fd3a9939..5ba0ebbed4 100644 --- a/node/tests/SharedTests.ts +++ b/node/tests/SharedTests.ts @@ -1208,7 +1208,7 @@ export function runBaseTests(config: { it.each([ProtocolVersion.RESP2, ProtocolVersion.RESP3])( `config get and config set with multiple parameters_%p`, async (protocol) => { - await runTest(async (client: BaseClient) => { + await runTest(async (client: BaseClient, cluster) => { const prevTimeout = (await client.configGet([ "timeout", ])) as Record;