-
Notifications
You must be signed in to change notification settings - Fork 9.7k
Expand file tree
/
Copy pathserver-shutdown.test.ts
More file actions
113 lines (97 loc) · 2.87 KB
/
Copy pathserver-shutdown.test.ts
File metadata and controls
113 lines (97 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import type { Server } from 'node:http';
import { afterEach, describe, expect, it, vi } from 'vitest';
import {
ByokCredentialService,
type ByokSecretBackend,
} from '../../src/byok/credential-service.js';
import {
startServer,
type StartServerResult,
} from '../../src/server.js';
class ShutdownTestBackend implements ByokSecretBackend {
readonly kind = 'shutdown-test';
async available() {
return true;
}
async close() {}
async set() {}
async get() {
return null;
}
async delete() {
return false;
}
}
describe('daemon BYOK shutdown ownership', () => {
let server: Server | undefined;
let releaseClose: (() => void) | undefined;
afterEach(async () => {
releaseClose?.();
if (server?.listening) {
await new Promise<void>((resolve) => server?.close(() => resolve()));
}
server = undefined;
releaseClose = undefined;
});
it('shares one shutdown promise and waits for the credential worker owner to close', async () => {
const service = new ByokCredentialService({
dataDir: '/test/byok-shutdown',
backend: new ShutdownTestBackend(),
});
let closeStarted: (() => void) | undefined;
const closeObserved = new Promise<void>((resolve) => {
closeStarted = resolve;
});
const closeGate = new Promise<void>((resolve) => {
releaseClose = resolve;
});
service.close = vi.fn(async () => {
closeStarted?.();
await closeGate;
});
const started = await startServer({
byokCredentialService: service,
port: 0,
returnServer: true,
}) as StartServerResult;
server = started.server;
const firstShutdown = started.shutdown() as Promise<void>;
const secondShutdown = started.shutdown() as Promise<void>;
expect(secondShutdown).toBe(firstShutdown);
await closeObserved;
let settled = false;
void firstShutdown.then(() => {
settled = true;
});
await Promise.resolve();
expect(settled).toBe(false);
releaseClose?.();
await expect(Promise.all([firstShutdown, secondShutdown])).resolves.toEqual([
undefined,
undefined,
]);
expect(service.close).toHaveBeenCalledTimes(1);
});
it('closes the credential worker owner when the HTTP server closes first', async () => {
const service = new ByokCredentialService({
dataDir: '/test/byok-server-close',
backend: new ShutdownTestBackend(),
});
service.close = vi.fn(async () => undefined);
const started = await startServer({
byokCredentialService: service,
port: 0,
returnServer: true,
}) as StartServerResult;
server = started.server;
await new Promise<void>((resolve, reject) => {
started.server.close((error) => {
if (error) reject(error);
else resolve();
});
});
await vi.waitFor(() => {
expect(service.close).toHaveBeenCalledTimes(1);
});
});
});