Skip to content

Commit ac439a0

Browse files
committed
feat: implement a mock virtual object manager to support unit tests outside SwingSet
1 parent 0ee93e5 commit ac439a0

File tree

2 files changed

+75
-71
lines changed

2 files changed

+75
-71
lines changed

packages/SwingSet/test/virtualObjects/test-virtualObjectManager.js

+4-71
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,13 @@
11
import '@agoric/install-ses';
22
import test from 'ava';
3-
import { makeMarshal, Far } from '@agoric/marshal';
4-
import { assert } from '@agoric/assert';
5-
import { parseVatSlot } from '../../src/parseVatSlots';
6-
import { makeVirtualObjectManager } from '../../src/kernel/virtualObjectManager';
3+
import { Far } from '@agoric/marshal';
4+
import { makeFakeVirtualObjectManager } from '../../tools/fakeVirtualObjectManager';
75

86
function capdata(body, slots = []) {
97
return harden({ body, slots });
108
}
119
const s = JSON.stringify;
1210

13-
function makeAllTheStuff(cacheSize) {
14-
const fakeStore = new Map();
15-
16-
function dumpStore() {
17-
const result = [];
18-
for (const entry of fakeStore.entries()) {
19-
result.push(entry);
20-
}
21-
result.sort((e1, e2) => e1[0].localeCompare(e2[0]));
22-
return result;
23-
}
24-
25-
const fakeSyscall = {
26-
vatstoreGet: key => fakeStore.get(key),
27-
vatstoreSet: (key, value) => fakeStore.set(key, value),
28-
vatstoreDelete: key => fakeStore.delete(key),
29-
};
30-
31-
let nextExportID = 1;
32-
function fakeAllocateExportID() {
33-
const exportID = nextExportID;
34-
nextExportID += 1;
35-
return exportID;
36-
}
37-
38-
const valToSlot = new WeakMap();
39-
40-
// eslint-disable-next-line no-use-before-define
41-
const fakeMarshal = makeMarshal(fakeConvertValToSlot, fakeConvertSlotToVal);
42-
43-
const {
44-
makeVirtualObjectRepresentative,
45-
makeWeakStore,
46-
makeKind,
47-
flushCache,
48-
} = makeVirtualObjectManager(
49-
fakeSyscall,
50-
fakeAllocateExportID,
51-
valToSlot,
52-
fakeMarshal,
53-
cacheSize,
54-
);
55-
56-
function fakeConvertValToSlot(val) {
57-
return valToSlot.get(val);
58-
}
59-
60-
function fakeConvertSlotToVal(slot) {
61-
const { type, virtual } = parseVatSlot(slot);
62-
assert(
63-
virtual,
64-
'fakeConvertSlotToVal only works with virtual object references',
65-
);
66-
assert.equal(type, 'object');
67-
return makeVirtualObjectRepresentative(slot);
68-
}
69-
70-
return {
71-
makeWeakStore,
72-
makeKind,
73-
flushCache,
74-
dumpStore,
75-
};
76-
}
77-
7811
function makeThingInstance(state) {
7912
return {
8013
init(label = 'thing', counter = 0) {
@@ -132,7 +65,7 @@ function makeZotInstance(state) {
13265
}
13366

13467
test('virtual object operations', t => {
135-
const { makeKind, flushCache, dumpStore } = makeAllTheStuff(3);
68+
const { makeKind, flushCache, dumpStore } = makeFakeVirtualObjectManager(3);
13669

13770
const thingMaker = makeKind(makeThingInstance);
13871
const zotMaker = makeKind(makeZotInstance);
@@ -231,7 +164,7 @@ test('virtual object operations', t => {
231164
});
232165

233166
test('weak store operations', t => {
234-
const { makeWeakStore, makeKind } = makeAllTheStuff(3);
167+
const { makeWeakStore, makeKind } = makeFakeVirtualObjectManager(3);
235168

236169
const thingMaker = makeKind(makeThingInstance);
237170
const zotMaker = makeKind(makeZotInstance);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { makeMarshal } from '@agoric/marshal';
2+
import { assert } from '@agoric/assert';
3+
import { parseVatSlot } from '../src/parseVatSlots';
4+
5+
import { makeVirtualObjectManager } from '../src/kernel/virtualObjectManager';
6+
7+
export function makeFakeVirtualObjectManager(cacheSize = 100) {
8+
const fakeStore = new Map();
9+
10+
function dumpStore() {
11+
const result = [];
12+
for (const entry of fakeStore.entries()) {
13+
result.push(entry);
14+
}
15+
result.sort((e1, e2) => e1[0].localeCompare(e2[0]));
16+
return result;
17+
}
18+
19+
const fakeSyscall = {
20+
vatstoreGet: key => fakeStore.get(key),
21+
vatstoreSet: (key, value) => fakeStore.set(key, value),
22+
vatstoreDelete: key => fakeStore.delete(key),
23+
};
24+
25+
let nextExportID = 1;
26+
function fakeAllocateExportID() {
27+
const exportID = nextExportID;
28+
nextExportID += 1;
29+
return exportID;
30+
}
31+
32+
const valToSlot = new WeakMap();
33+
34+
function fakeConvertValToSlot(val) {
35+
return valToSlot.get(val);
36+
}
37+
38+
function fakeConvertSlotToVal(slot) {
39+
const { type, virtual } = parseVatSlot(slot);
40+
assert(
41+
virtual,
42+
'fakeConvertSlotToVal only works with virtual object references',
43+
);
44+
assert.equal(type, 'object');
45+
// eslint-disable-next-line no-use-before-define
46+
return makeVirtualObjectRepresentative(slot);
47+
}
48+
49+
// eslint-disable-next-line no-use-before-define
50+
const fakeMarshal = makeMarshal(fakeConvertValToSlot, fakeConvertSlotToVal);
51+
52+
const {
53+
makeVirtualObjectRepresentative,
54+
makeWeakStore,
55+
makeKind,
56+
flushCache,
57+
} = makeVirtualObjectManager(
58+
fakeSyscall,
59+
fakeAllocateExportID,
60+
valToSlot,
61+
fakeMarshal,
62+
cacheSize,
63+
);
64+
65+
return {
66+
makeKind,
67+
makeWeakStore,
68+
flushCache,
69+
dumpStore,
70+
};
71+
}

0 commit comments

Comments
 (0)