Skip to content

Commit 93b95c9

Browse files
committed
churn(test): use redislabs/client-libs-test for testing
This switches our testing infrastructure from redis/redis-stack to redislabs/client-libs-test Docker image across all packages. This change also updates the default Docker version from 7.4.0-v1 to 8.0-M04-pre.
1 parent 558ebb4 commit 93b95c9

File tree

13 files changed

+139
-47
lines changed

13 files changed

+139
-47
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: ['6.2.6-v17', '7.2.0-v13', '7.4.0-v1']
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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import TestUtils from '@redis/test-utils';
22
import RedisBloomModules from '.';
33

44
export default new TestUtils({
5-
dockerImageName: 'redis/redis-stack',
5+
dockerImageName: 'redislabs/client-libs-test',
66
dockerImageVersionArgument: 'redisbloom-version',
7-
defaultDockerVersion: '7.4.0-v1'
7+
defaultDockerVersion: '8.0-M04-pre'
88
});
99

1010
export const GLOBAL = {

packages/client/lib/test-utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import { Command } from './RESP/types';
66
import { BasicCommandParser } from './client/parser';
77

88
const utils = new TestUtils({
9-
dockerImageName: 'redis/redis-stack',
9+
dockerImageName: 'redislabs/client-libs-test',
1010
dockerImageVersionArgument: 'redis-version',
11-
defaultDockerVersion: '7.4.0-v1'
11+
defaultDockerVersion: '8.0-M04-pre'
1212
});
1313

1414
export default utils;

packages/entraid/lib/test-utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import TestUtils from '@redis/test-utils';
44
import { EntraidCredentialsProvider } from './entraid-credentials-provider';
55

66
export const testUtils = new TestUtils({
7-
dockerImageName: 'redis/redis-stack',
7+
dockerImageName: 'redislabs/client-libs-test',
88
dockerImageVersionArgument: 'redis-version',
9-
defaultDockerVersion: '7.4.0-v1'
9+
defaultDockerVersion: '8.0-M04-pre'
1010
});
1111

1212
const DEBUG_MODE_ARGS = testUtils.isVersionGreaterThan([7]) ?

packages/graph/lib/test-utils.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import TestUtils from '@redis/test-utils';
22
import RedisGraph from '.';
33

4+
45
export default new TestUtils({
5-
dockerImageName: 'redis/redis-stack',
6+
dockerImageName: 'redislabs/client-libs-test',
67
dockerImageVersionArgument: 'redisgraph-version',
7-
defaultDockerVersion: '7.4.0-v1'
8+
defaultDockerVersion: '8.0-M04-pre'
89
});
910

1011
export const GLOBAL = {

packages/json/lib/test-utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import TestUtils from '@redis/test-utils';
22
import RedisJSON from '.';
33

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

1010
export const GLOBAL = {

packages/search/lib/test-utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import TestUtils from '@redis/test-utils';
22
import RediSearch from '.';
33

44
export default new TestUtils({
5-
dockerImageName: 'redis/redis-stack',
5+
dockerImageName: 'redislabs/client-libs-test',
66
dockerImageVersionArgument: 'redisearch-version',
7-
defaultDockerVersion: '7.4.0-v1'
7+
defaultDockerVersion: '8.0-M04-pre'
88
});
99

1010
export const GLOBAL = {

packages/search/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
"!dist/tsconfig.tsbuildinfo"
1010
],
1111
"scripts": {
12-
"test": "nyc -r text-summary -r lcov mocha -r tsx './lib/**/*.spec.ts'"
12+
"test": "nyc -r text-summary -r lcov mocha -r tsx './lib/**/*.spec.ts'",
13+
"test-sourcemap": "mocha -r ts-node/register/transpile-only './lib/**/*.spec.ts'"
1314
},
1415
"peerDependencies": {
1516
"@redis/client": "^5.0.0-next.6"

packages/test-utils/lib/dockers.ts

Lines changed: 35 additions & 16 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;
@@ -46,11 +48,29 @@ export interface RedisServerDocker {
4648
dockerId: string;
4749
}
4850

49-
async function spawnRedisServerDocker({ image, version }: RedisServerDockerConfig, serverArguments: Array<string>): Promise<RedisServerDocker> {
50-
const port = (await portIterator.next()).value,
51-
{ stdout, stderr } = await execAsync(
52-
`docker run -e REDIS_ARGS="--port ${port.toString()} ${serverArguments.join(' ')}" -d --network host ${image}:${version}`
53-
);
51+
async function spawnRedisServerDocker({
52+
image,
53+
version
54+
}: 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+
];
66+
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);
5474

5575
if (!stdout) {
5676
throw new Error(`docker run error - ${stderr}`);
@@ -65,7 +85,6 @@ async function spawnRedisServerDocker({ image, version }: RedisServerDockerConfi
6585
dockerId: stdout.trim()
6686
};
6787
}
68-
6988
const RUNNING_SERVERS = new Map<Array<string>, ReturnType<typeof spawnRedisServerDocker>>();
7089

7190
export function spawnRedisServer(dockerConfig: RedisServerDockerConfig, serverArguments: Array<string>): Promise<RedisServerDocker> {
@@ -80,7 +99,7 @@ export function spawnRedisServer(dockerConfig: RedisServerDockerConfig, serverAr
8099
}
81100

82101
async function dockerRemove(dockerId: string): Promise<void> {
83-
const { stderr } = await execAsync(`docker rm -f ${dockerId}`);
102+
const { stderr } = await execAsync('docker', ['rm', '-f', dockerId]);
84103
if (stderr) {
85104
throw new Error(`docker rm error - ${stderr}`);
86105
}
@@ -132,15 +151,15 @@ async function spawnRedisClusterNodeDockers(
132151
'5000'
133152
], clientConfig).then(async replica => {
134153

135-
const requirePassIndex = serverArguments.findIndex((x)=>x==='--requirepass');
136-
if(requirePassIndex!==-1) {
137-
const password = serverArguments[requirePassIndex+1];
138-
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 })
139158
}
140159
await replica.client.clusterMeet('127.0.0.1', master.docker.port);
141160

142161
while ((await replica.client.clusterSlots()).length === 0) {
143-
await setTimeout(50);
162+
await setTimeout(25);
144163
}
145164

146165
await replica.client.clusterReplicate(
@@ -224,7 +243,7 @@ async function spawnRedisClusterDockers(
224243
while (
225244
totalNodes(await client.clusterSlots()) !== nodes.length ||
226245
!(await client.sendCommand<string>(['CLUSTER', 'INFO'])).startsWith('cluster_state:ok') // TODO
227-
) {
246+
) {
228247
await setTimeout(50);
229248
}
230249

@@ -257,7 +276,7 @@ export function spawnRedisCluster(
257276
return runningCluster;
258277
}
259278

260-
const dockersPromise = spawnRedisClusterDockers(dockersConfig, serverArguments,clientConfig);
279+
const dockersPromise = spawnRedisClusterDockers(dockersConfig, serverArguments, clientConfig);
261280

262281
RUNNING_CLUSTERS.set(serverArguments, dockersPromise);
263282
return dockersPromise;

packages/test-utils/lib/index.spec.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { strict as assert } from 'node:assert';
2+
import TestUtils from './index';
3+
4+
describe('TestUtils', () => {
5+
describe('parseVersionNumber', () => {
6+
it('should handle special versions', () => {
7+
assert.deepStrictEqual(TestUtils.parseVersionNumber('latest'), [Infinity]);
8+
assert.deepStrictEqual(TestUtils.parseVersionNumber('edge'), [Infinity]);
9+
});
10+
11+
it('should parse simple version numbers', () => {
12+
assert.deepStrictEqual(TestUtils.parseVersionNumber('7.4.0'), [7, 4, 0]);
13+
});
14+
15+
it('should handle versions with multiple dashes and prefixes', () => {
16+
assert.deepStrictEqual(TestUtils.parseVersionNumber('rs-7.4.0-v2'), [7, 4, 0]);
17+
assert.deepStrictEqual(TestUtils.parseVersionNumber('rs-7.4.0'), [7, 4, 0]);
18+
assert.deepStrictEqual(TestUtils.parseVersionNumber('7.4.0-v2'), [7, 4, 0]);
19+
});
20+
21+
it('should handle various version number formats', () => {
22+
assert.deepStrictEqual(TestUtils.parseVersionNumber('10.5'), [10, 5]);
23+
assert.deepStrictEqual(TestUtils.parseVersionNumber('8.0.0'), [8, 0, 0]);
24+
assert.deepStrictEqual(TestUtils.parseVersionNumber('rs-6.2.4-v1'), [6, 2, 4]);
25+
});
26+
27+
it('should throw TypeError for invalid version strings', () => {
28+
['', 'invalid', 'rs-', 'v2', 'rs-invalid-v2'].forEach(version => {
29+
assert.throws(
30+
() => TestUtils.parseVersionNumber(version),
31+
TypeError,
32+
`Expected TypeError for version string: ${version}`
33+
);
34+
});
35+
});
36+
});
37+
});

0 commit comments

Comments
 (0)