Skip to content

Commit 80bcb49

Browse files
committed
feat(kernel-test): Test ocap-url endowment
1 parent 8ac836f commit 80bcb49

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { makeSQLKernelDatabase } from '@metamask/kernel-store/sqlite/nodejs';
2+
import { waitUntilQuiescent } from '@metamask/kernel-utils';
3+
import { describe, expect, it } from 'vitest';
4+
5+
import {
6+
extractTestLogs,
7+
getBundleSpec,
8+
makeKernel,
9+
makeTestLogger,
10+
} from './utils.ts';
11+
12+
describe('ocap-url', () => {
13+
it('user-code can make an ocap url', async () => {
14+
const { logger, entries } = makeTestLogger();
15+
const database = await makeSQLKernelDatabase({});
16+
const kernel = await makeKernel(database, true, logger);
17+
const vatIds = ['v1'];
18+
const vat = await kernel.launchSubcluster({
19+
bootstrap: 'alice',
20+
vats: {
21+
alice: {
22+
bundleSpec: getBundleSpec('ocap-url'),
23+
parameters: {},
24+
},
25+
},
26+
});
27+
expect(vat).toBeDefined();
28+
const vats = kernel.getVatIds();
29+
expect(vats).toStrictEqual(vatIds);
30+
31+
await waitUntilQuiescent();
32+
const vatLogs = vatIds.map((vatId) => extractTestLogs(entries, vatId));
33+
expect(vatLogs).toStrictEqual([
34+
// This is a placeholder for the actual ocap url.
35+
[expect.stringContaining(`Alice's ocap url: ocap://o+`)],
36+
]);
37+
});
38+
});
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { E } from '@endo/eventual-send';
2+
import { Far } from '@endo/marshal';
3+
4+
/**
5+
* Build function for vats that will run various tests.
6+
*
7+
* @param {object} vatPowers - Special powers granted to this vat.
8+
* @param {object} vatPowers.logger - The logger for this vat.
9+
* @returns {*} The root object for the new vat.
10+
*/
11+
export function buildRootObject({ logger }) {
12+
const { log } = logger.subLogger({ tags: ['test'] });
13+
let contact;
14+
return Far('root', {
15+
async bootstrap({ alice }) {
16+
contact = Far('contact', {
17+
// An external actor can send a message to Alice by following an
18+
// ocap url like "ocap://.../contact?whoAmI=Bob&message=Hello".
19+
contact: (whoAmI, message) => E(alice).contact(whoAmI, message),
20+
});
21+
const ocapUrl = E(alice).makeContactUrl();
22+
log(`Alice's ocap url: ${await ocapUrl}`);
23+
},
24+
// `makeOcapUrl` is an endowment available in global scope.
25+
// eslint-disable-next-line no-undef
26+
makeContactUrl: () => makeOcapUrl(contact),
27+
async contact(sender = 'unknown', message = 'hello') {
28+
log(`contact from ${sender}: ${message}`);
29+
},
30+
});
31+
}

0 commit comments

Comments
 (0)