Skip to content

Commit 66a0d27

Browse files
committed
churn(test): use redislabs/client-libs-test for testing
1 parent 4bca10f commit 66a0d27

File tree

8 files changed

+63
-21
lines changed

8 files changed

+63
-21
lines changed

.github/workflows/tests.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ jobs:
2121
strategy:
2222
fail-fast: false
2323
matrix:
24-
node-version: ['18', '20', '22']
25-
redis-version: [ 'rs-7.4.0-v1', '8.0-M04-pre']
24+
node-version: [ '18', '20', '22' ]
25+
redis-version: [ 'rs-7.2.0-v13', 'rs-7.4.0-v1', '8.0-M04-pre' ]
2626
steps:
2727
- uses: actions/checkout@v4
2828
with:

packages/bloom/lib/test-utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import RedisBloomModules from '.';
33

44
export default new TestUtils({
55
dockerImageName: 'redislabs/client-libs-test',
6-
dockerImageVersionArgument: 'redisbloom-version',
6+
dockerImageVersionArgument: 'redis-version',
77
defaultDockerVersion: '8.0-M04-pre'
88
});
99

packages/graph/lib/test-utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import RedisGraph from '.';
44

55
export default new TestUtils({
66
dockerImageName: 'redislabs/client-libs-test',
7-
dockerImageVersionArgument: 'redisgraph-version',
7+
dockerImageVersionArgument: 'redis-version',
88
defaultDockerVersion: '8.0-M04-pre'
99
});
1010

packages/json/lib/test-utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import RedisJSON from '.';
33

44
export default new TestUtils({
55
dockerImageName: 'redislabs/client-libs-test',
6-
dockerImageVersionArgument: 'redisgraph-version',
6+
dockerImageVersionArgument: 'redis-version',
77
defaultDockerVersion: '8.0-M04-pre'
88
});
99

packages/search/lib/test-utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import RediSearch from '.';
33

44
export default new TestUtils({
55
dockerImageName: 'redislabs/client-libs-test',
6-
dockerImageVersionArgument: 'redisearch-version',
6+
dockerImageVersionArgument: 'redis-version',
77
defaultDockerVersion: '8.0-M04-pre'
88
});
99

packages/test-utils/lib/dockers.ts

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import { once } from 'node:events';
44
import { createClient } from '@redis/client/index';
55
import { setTimeout } from 'node:timers/promises';
66
// import { ClusterSlotsReply } from '@redis/client/dist/lib/commands/CLUSTER_SLOTS';
7+
8+
import { execFile as execFileCallback } from 'node:child_process';
79
import { promisify } from 'node:util';
8-
import { exec } from 'node:child_process';
9-
const execAsync = promisify(exec);
10+
11+
const execAsync = promisify(execFileCallback);
1012

1113
interface ErrorWithCode extends Error {
1214
code: string;
@@ -50,10 +52,25 @@ async function spawnRedisServerDocker({
5052
image,
5153
version
5254
}: RedisServerDockerConfig, serverArguments: Array<string>): Promise<RedisServerDocker> {
55+
const port = (await portIterator.next()).value;
56+
const portStr = port.toString();
57+
58+
const dockerArgs = [
59+
'run',
60+
'-e', `PORT=${portStr}`,
61+
'-d',
62+
'--network', 'host',
63+
`${image}:${version}`,
64+
'--port', portStr
65+
];
5366

54-
const port = (await portIterator.next()).value
55-
const command = `docker run -e PORT="${port.toString()}" -d --network host ${image}:${version} --port ${port.toString()} ${serverArguments.join(' ')}`
56-
const { stdout, stderr } = await execAsync(command);
67+
if (serverArguments.length > 0) {
68+
dockerArgs.push(...serverArguments);
69+
}
70+
71+
console.log(`[Docker] Spawning Redis container - Image: ${image}:${version}, Port: ${port}`);
72+
73+
const { stdout, stderr } = await execAsync('docker', dockerArgs);
5774

5875
if (!stdout) {
5976
throw new Error(`docker run error - ${stderr}`);
@@ -68,7 +85,6 @@ async function spawnRedisServerDocker({
6885
dockerId: stdout.trim()
6986
};
7087
}
71-
7288
const RUNNING_SERVERS = new Map<Array<string>, ReturnType<typeof spawnRedisServerDocker>>();
7389

7490
export function spawnRedisServer(dockerConfig: RedisServerDockerConfig, serverArguments: Array<string>): Promise<RedisServerDocker> {
@@ -83,7 +99,7 @@ export function spawnRedisServer(dockerConfig: RedisServerDockerConfig, serverAr
8399
}
84100

85101
async function dockerRemove(dockerId: string): Promise<void> {
86-
const { stderr } = await execAsync(`docker rm -f ${dockerId}`);
102+
const { stderr } = await execAsync('docker', ['rm', '-f', dockerId]);
87103
if (stderr) {
88104
throw new Error(`docker rm error - ${stderr}`);
89105
}
@@ -135,10 +151,10 @@ async function spawnRedisClusterNodeDockers(
135151
'5000'
136152
], clientConfig).then(async replica => {
137153

138-
const requirePassIndex = serverArguments.findIndex((x)=>x==='--requirepass');
139-
if(requirePassIndex!==-1) {
140-
const password = serverArguments[requirePassIndex+1];
141-
await replica.client.configSet({'masterauth': password})
154+
const requirePassIndex = serverArguments.findIndex((x) => x === '--requirepass');
155+
if (requirePassIndex !== -1) {
156+
const password = serverArguments[requirePassIndex + 1];
157+
await replica.client.configSet({ 'masterauth': password })
142158
}
143159
await replica.client.clusterMeet('127.0.0.1', master.docker.port);
144160

@@ -227,7 +243,7 @@ async function spawnRedisClusterDockers(
227243
while (
228244
totalNodes(await client.clusterSlots()) !== nodes.length ||
229245
!(await client.sendCommand<string>(['CLUSTER', 'INFO'])).startsWith('cluster_state:ok') // TODO
230-
) {
246+
) {
231247
await setTimeout(50);
232248
}
233249

@@ -260,7 +276,7 @@ export function spawnRedisCluster(
260276
return runningCluster;
261277
}
262278

263-
const dockersPromise = spawnRedisClusterDockers(dockersConfig, serverArguments,clientConfig);
279+
const dockersPromise = spawnRedisClusterDockers(dockersConfig, serverArguments, clientConfig);
264280

265281
RUNNING_CLUSTERS.set(serverArguments, dockersPromise);
266282
return dockersPromise;

packages/test-utils/lib/index.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,38 @@ import { RedisServerDockerConfig, spawnRedisServer, spawnRedisCluster } from './
1919
import yargs from 'yargs';
2020
import { hideBin } from 'yargs/helpers';
2121

22+
2223
interface TestUtilsConfig {
24+
/**
25+
* The name of the Docker image to use for spawning Redis test instances.
26+
* This should be a valid Docker image name that contains a Redis server.
27+
*
28+
* @example 'redislabs/client-libs-test'
29+
*/
2330
dockerImageName: string;
31+
32+
/**
33+
* The command-line argument name used to specify the Redis version.
34+
* This argument can be passed when running tests / GH actions.
35+
*
36+
* @example
37+
* If set to 'redis-version', you can run tests with:
38+
* ```bash
39+
* npm test -- --redis-version="6.2"
40+
* ```
41+
*/
2442
dockerImageVersionArgument: string;
43+
44+
/**
45+
* The default Redis version to use if no version is specified via command-line arguments.
46+
* Can be a specific version number (e.g., '6.2'), 'latest', or 'edge'.
47+
* If not provided, defaults to 'latest'.
48+
*
49+
* @optional
50+
* @default 'latest'
51+
*/
2552
defaultDockerVersion?: string;
2653
}
27-
2854
interface CommonTestOptions {
2955
serverArguments: Array<string>;
3056
minimumDockerVersion?: Array<number>;

packages/time-series/lib/test-utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import TimeSeries from '.';
33

44
export default new TestUtils({
55
dockerImageName: 'redislabs/client-libs-test',
6-
dockerImageVersionArgument: 'timeseries-version',
6+
dockerImageVersionArgument: 'redis-version',
77
defaultDockerVersion: '8.0-M04-pre'
88
});
99

0 commit comments

Comments
 (0)