Skip to content

Commit 4191ec6

Browse files
committed
tests: Add tests for health checker
1 parent 36d453e commit 4191ec6

File tree

1 file changed

+137
-0
lines changed

1 file changed

+137
-0
lines changed

test/server/lib/HealthChecker.ts

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
import {TestServer} from 'test/server/lib/helpers/TestServer';
2+
import {RedisForwarder} from 'test/server/tcpForwarder';
3+
import * as testUtils from 'test/server/testUtils';
4+
import {prepareFilesystemDirectoryForTests} from 'test/server/lib/helpers/PrepareFilesystemDirectoryForTests';
5+
import {prepareDatabase} from 'test/server/lib/helpers/PrepareDatabase';
6+
7+
import fetch from 'node-fetch';
8+
import {assert} from 'chai';
9+
import IORedis from "ioredis";
10+
11+
import * as path from 'path';
12+
import {tmpdir} from 'os';
13+
14+
const username = process.env.USER || "nobody";
15+
const tmpDir = path.join(tmpdir(), `grist_test_${username}_health_checker`);
16+
17+
describe('HealthChecker', function() {
18+
testUtils.setTmpLogLevel('error');
19+
this.timeout(10_000);
20+
21+
let servers: {server: TestServer, forwarder?: RedisForwarder}[] = [];
22+
let client: IORedis;
23+
24+
before(async function() {
25+
await prepareFilesystemDirectoryForTests(tmpDir);
26+
await prepareDatabase(tmpDir);
27+
28+
if(process.env.TEST_REDIS_URL) {
29+
client = new IORedis(process.env.TEST_REDIS_URL);
30+
await client.flushall();
31+
32+
for(let i = 0; i < 3; i++) {
33+
// Use a forwarder for each server so we can simulate
34+
// disconnects
35+
const forwarder = await RedisForwarder.create();
36+
37+
const server = await TestServer.startServer('home', tmpDir, `with-redis-${i}`, {
38+
REDIS_URL: forwarder.redisUrl,
39+
GRIST_INSTANCE_ID: `test-instance-${i}`,
40+
});
41+
servers.push({server, forwarder});
42+
}
43+
}
44+
else {
45+
servers = [{server: await TestServer.startServer('home', tmpDir, 'without-redis')}];
46+
}
47+
});
48+
49+
after(async function () {
50+
await Promise.all(servers.map(async (pair) => {
51+
await pair.server.stop();
52+
await pair.forwarder?.disconnect();
53+
}));
54+
client?.disconnect();
55+
});
56+
57+
it('registers all servers', async function () {
58+
if(!process.env.TEST_REDIS_URL) {
59+
this.skip();
60+
}
61+
62+
const instances = await client.smembers('grist-instances');
63+
instances.sort();
64+
assert.deepEqual(instances, ['test-instance-0', 'test-instance-1', 'test-instance-2']);
65+
});
66+
67+
it('reports healthy when all servers are healthy', async function () {
68+
const server = servers[process.env.TEST_REDIS_URL ? 2 : 0].server;
69+
const resp = await fetch(`${server.serverUrl}/status?allInstancesReady=1`);
70+
assert.equal(resp.status, 200);
71+
assert.match(await resp.text(), /allInstancesReady ok/);
72+
});
73+
74+
it('reports not healthy when one server is not healthy', async function () {
75+
if(!process.env.TEST_REDIS_URL) {
76+
this.skip();
77+
}
78+
79+
const downServer = servers[2];
80+
await downServer.forwarder?.disconnect();
81+
82+
const server = servers[0].server;
83+
const resp = await fetch(`${server.serverUrl}/status?allInstancesReady=1&timeout=500`);
84+
const text = await resp.text();
85+
assert.equal(resp.status, 500);
86+
assert.match(text, /allInstancesReady not ok/);
87+
88+
await downServer.forwarder?.connect();
89+
});
90+
91+
it('reports healthy when one server is cleanly disconnected', async function () {
92+
if(!process.env.TEST_REDIS_URL) {
93+
this.skip();
94+
}
95+
96+
const downServer = servers[2];
97+
await downServer.server.stop();
98+
await downServer.forwarder?.disconnect();
99+
servers.pop();
100+
101+
const server = servers[0].server;
102+
const resp = await fetch(`${server.serverUrl}/status?allInstancesReady=1`);
103+
const text = await resp.text();
104+
assert.equal(resp.status, 200);
105+
assert.match(text, /allInstancesReady ok/);
106+
});
107+
108+
it('checks when a new server comes back', async function() {
109+
if(!process.env.TEST_REDIS_URL) {
110+
this.skip();
111+
}
112+
113+
let instances = await client.smembers('grist-instances');
114+
instances.sort();
115+
assert.deepEqual(instances, ['test-instance-0', 'test-instance-1']);
116+
117+
const newForwarder = await RedisForwarder.create();
118+
await newForwarder.connect();
119+
const newServer = await TestServer.startServer('home', tmpDir, `with-redis-3`, {
120+
REDIS_URL: newForwarder.redisUrl,
121+
GRIST_INSTANCE_ID: `test-instance-3`,
122+
});
123+
124+
instances = await client.smembers('grist-instances');
125+
instances.sort();
126+
assert.deepEqual(instances, ['test-instance-0', 'test-instance-1', 'test-instance-3']);
127+
128+
const server = servers[0].server;
129+
const resp = await fetch(`${server.serverUrl}/status?allInstancesReady=1`);
130+
const text = await resp.text();
131+
assert.equal(resp.status, 200);
132+
assert.match(text, /allInstancesReady ok/);
133+
134+
await newServer.stop();
135+
await newForwarder.disconnect();
136+
});
137+
});

0 commit comments

Comments
 (0)