-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathcluster-launch.test.ts
More file actions
125 lines (108 loc) · 3.84 KB
/
Copy pathcluster-launch.test.ts
File metadata and controls
125 lines (108 loc) · 3.84 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
114
115
116
117
118
119
120
121
122
123
124
125
import { makeSQLKernelDatabase } from '@metamask/kernel-store/sqlite/nodejs';
import { Logger } from '@metamask/logger';
import type { LogEntry } from '@metamask/logger';
import type { Kernel } from '@metamask/ocap-kernel';
import { beforeEach, describe, expect, it } from 'vitest';
import {
extractTestLogs,
getBundleSpec,
makeKernel,
makeTestLogger,
} from './utils.ts';
describe('cluster initialization', { timeout: 4_000 }, () => {
let logger: Logger;
let entries: LogEntry[];
let kernel: Kernel;
type When = 'global' | 'build' | 'bootstrap';
type What = 'throw' | 'uncaught-rejection';
beforeEach(async () => {
const testLogger = makeTestLogger();
logger = testLogger.logger;
entries = testLogger.entries;
const database = await makeSQLKernelDatabase({});
kernel = await makeKernel(
database,
true,
logger.subLogger({ tags: ['test'] }),
);
});
const launch = async (scenario: `${When}-${What}`) =>
kernel.launchSubcluster({
bootstrap: 'main',
vats: {
main: {
bundleSpec: getBundleSpec(`error-${scenario}`),
parameters: {},
},
},
});
it('throws if globals scope throws', async () => {
await expect(launch('global-throw')).rejects.toMatchObject({
message: expect.stringMatching(/^Failed to launch vat \S+ \(main\)$/u),
cause: { message: expect.stringMatching(/from global scope/u) },
});
const vatLogs = extractTestLogs(entries, 'console');
expect(vatLogs).toStrictEqual(['global throw']);
});
it.todo('throws if global scope has an uncaught rejection', async () => {
await expect(launch('global-uncaught-rejection')).rejects.toThrow(
expect.objectContaining({
message: expect.stringContaining('Subcluster initialization failed'),
cause: expect.stringMatching(
/[Uu]nknown(.)+uncaught promise rejection/u,
),
}),
);
const vatLogs = extractTestLogs(entries, 'console');
expect(vatLogs).toStrictEqual(['global uncaught rejection']);
});
it('throws if buildRootObject throws', async () => {
await expect(launch('build-throw')).rejects.toMatchObject({
message: expect.stringMatching(/^Failed to launch vat \S+ \(main\)$/u),
cause: { message: expect.stringMatching(/from buildRootObject/u) },
});
const vatLogs = extractTestLogs(entries, 'console');
expect(vatLogs).toStrictEqual(['build throw', 'buildRootObject']);
});
it.todo('throws if buildRootObject has an uncaught rejection', async () => {
await expect(launch('build-uncaught-rejection')).rejects.toThrow(
expect.objectContaining({
message: expect.stringContaining('Subcluster initialization failed'),
cause: expect.stringMatching(
/[Uu]nknown(.)+uncaught promise rejection/u,
),
}),
);
const vatLogs = extractTestLogs(entries, 'console');
expect(vatLogs).toStrictEqual([
'build uncaught rejection',
'buildRootObject',
'bootstrap',
]);
});
it('throws if bootstrap throws', async () => {
await expect(launch('bootstrap-throw')).rejects.toThrow(/from bootstrap/u);
const vatLogs = extractTestLogs(entries, 'console');
expect(vatLogs).toStrictEqual([
'bootstrap throw',
'buildRootObject',
'bootstrap',
]);
});
it.todo('throws if bootstrap has an uncaught rejection', async () => {
await expect(launch('bootstrap-uncaught-rejection')).rejects.toThrow(
expect.objectContaining({
message: expect.stringContaining('Subcluster initialization failed'),
cause: expect.stringMatching(
/[Uu]nknown(.)+uncaught promise rejection/u,
),
}),
);
const vatLogs = extractTestLogs(entries, 'console');
expect(vatLogs).toStrictEqual([
'bootstrap uncaught rejection',
'buildRootObject',
'bootstrap',
]);
});
});