Skip to content

Commit

Permalink
fix(swing-store): move getAllState/setAllState onto a debug object
Browse files Browse the repository at this point in the history
`getAllState` and `setAllState` are swing-store helper functions which
copy (or set) all the state of a store at once, used exclusively for
testing.

Previously, they were exported by swing-store, and applied to a
`kernelStorage` object, but that depended upon a
`streamStore.dumpStreams` method that we'd rather not expose to normal
users.

This commit adds a new `debug` object, next to `kernelStorage` and
`hostStorage`, which holds `getAllState`, `setAllState`, and
`dumpStreams`. The `kernelStorage.streamStore` object no longer has a
`dumpStreams` method.

This also updates all the swingset unit tests which were using the
helper functions.
  • Loading branch information
warner committed Jan 9, 2023
1 parent ab176ab commit 62fef7c
Show file tree
Hide file tree
Showing 14 changed files with 166 additions and 184 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,14 @@ import { test } from '../../tools/prepare-test-env-ava.js';

// eslint-disable-next-line import/order
import { assert } from '@agoric/assert';
import { initSwingStore, getAllState } from '@agoric/swing-store';
import { initSwingStore } from '@agoric/swing-store';
import { initializeSwingset, makeSwingsetController } from '../../src/index.js';
import { kunser } from '../../src/lib/kmarshal.js';

function bfile(name) {
return new URL(name, import.meta.url).pathname;
}

// eslint-disable-next-line no-unused-vars
function dumpState(kernelStorage, vatID) {
const s = getAllState(kernelStorage).kvStuff;
const keys = Array.from(Object.keys(s)).sort();
for (const k of keys) {
if (k.startsWith(`${vatID}.vs.`)) {
console.log(k, s[k]);
}
}
}

async function testChangeParameters(t) {
const config = {
bootstrap: 'bootstrap',
Expand Down
6 changes: 3 additions & 3 deletions packages/SwingSet/test/devices/test-devices.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import { test } from '../../tools/prepare-test-env-ava.js';

import bundleSource from '@endo/bundle-source';
import { initSwingStore, getAllState } from '@agoric/swing-store';
import { initSwingStore } from '@agoric/swing-store';
import { parse } from '@endo/marshal';

import {
Expand Down Expand Up @@ -211,7 +211,7 @@ test.serial('d2.5', async t => {
});

test.serial('device state', async t => {
const kernelStorage = initSwingStore().kernelStorage;
const { kernelStorage, debug } = initSwingStore();
const config = {
bootstrap: 'bootstrap',
vats: {
Expand All @@ -236,7 +236,7 @@ test.serial('device state', async t => {
const d3 = c1.deviceNameToID('d3');
await c1.run();
t.deepEqual(c1.dump().log, ['undefined', 'w+r', 'called', 'got {"s":"new"}']);
const s = getAllState(kernelStorage).kvStuff;
const s = debug.getAllState().kvStuff;
t.deepEqual(JSON.parse(s[`${d3}.deviceState`]), kser({ s: 'new' }));
t.deepEqual(JSON.parse(s[`${d3}.o.nextID`]), 10);
});
Expand Down
13 changes: 1 addition & 12 deletions packages/SwingSet/test/promise-watcher/test-promise-watcher.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,13 @@ import { test } from '../../tools/prepare-test-env-ava.js';
// eslint-disable-next-line import/order
import { assert } from '@agoric/assert';
// eslint-disable-next-line import/order
import { initSwingStore, getAllState } from '@agoric/swing-store';
import { initSwingStore } from '@agoric/swing-store';
import { initializeSwingset, makeSwingsetController } from '../../src/index.js';

function bfile(name) {
return new URL(name, import.meta.url).pathname;
}

// eslint-disable-next-line no-unused-vars
function dumpState(kernelStorage, vatID) {
const s = getAllState(kernelStorage).kvStuff;
const keys = Array.from(Object.keys(s)).sort();
for (const k of keys) {
if (k.startsWith(`${vatID}.vs.`)) {
console.log(k, s[k]);
}
}
}

async function testPromiseWatcher(t) {
const config = {
includeDevDependencies: true, // for vat-data
Expand Down
18 changes: 9 additions & 9 deletions packages/SwingSet/test/test-activityhash-vs-start.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import { test } from '../tools/prepare-test-env-ava.js';

// eslint-disable-next-line import/order
import { initSwingStore, getAllState, setAllState } from '@agoric/swing-store';
import { initSwingStore } from '@agoric/swing-store';
import { initializeSwingset, makeSwingsetController } from '../src/index.js';
import { buildTimer } from '../src/devices/timer/timer.js';

Expand Down Expand Up @@ -38,7 +38,7 @@ test.serial('restarting kernel does not change activityhash', async t => {
const deviceEndowments1 = {
timer: { ...timer1.endowments },
};
const ks1 = initSwingStore().kernelStorage;
const { kernelStorage: ks1, debug: debug1 } = initSwingStore();
// console.log(`--c1 build`);
await initializeSwingset(config, [], ks1);
const c1 = await makeSwingsetController(ks1, deviceEndowments1);
Expand All @@ -49,7 +49,7 @@ test.serial('restarting kernel does not change activityhash', async t => {
await c1.run();

// console.log(`--c1 getAllState`);
const state = getAllState(ks1);
const state = debug1.getAllState();
// console.log(`ah: ${c1.getActivityhash()}`);

// console.log(`--c1 poll1`);
Expand All @@ -70,8 +70,8 @@ test.serial('restarting kernel does not change activityhash', async t => {
const deviceEndowments2 = {
timer: { ...timer2.endowments },
};
const ks2 = initSwingStore().kernelStorage;
setAllState(ks2, state);
const { kernelStorage: ks2, debug: debug2 } = initSwingStore();
debug2.setAllState(state);
// console.log(`--c2 build`);
const c2 = await makeSwingsetController(ks2, deviceEndowments2);
// console.log(`ah: ${c2.getActivityhash()}`);
Expand Down Expand Up @@ -102,14 +102,14 @@ test.serial('comms initialize is deterministic', async t => {
const config = {};
config.bootstrap = 'bootstrap';
config.vats = { bootstrap: { sourceSpec } };
const ks1 = initSwingStore().kernelStorage;
const { kernelStorage: ks1, debug: debug1 } = initSwingStore();
await initializeSwingset(config, [], ks1);
const c1 = await makeSwingsetController(ks1, {});
c1.pinVatRoot('bootstrap');
// the bootstrap message will cause comms to initialize itself
await c1.run();

const state = getAllState(ks1);
const state = debug1.getAllState();

// but the second message should not
c1.queueToVatRoot('bootstrap', 'addRemote', ['remote2']);
Expand All @@ -118,8 +118,8 @@ test.serial('comms initialize is deterministic', async t => {
await c1.shutdown();

// a kernel restart is loading a new kernel from the same state
const ks2 = initSwingStore().kernelStorage;
setAllState(ks2, state);
const { kernelStorage: ks2, debug: debug2 } = initSwingStore();
debug2.setAllState(state);
const c2 = await makeSwingsetController(ks2, {});

// the "am I already initialized?" check must be identical to the
Expand Down
20 changes: 10 additions & 10 deletions packages/SwingSet/test/test-state.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import { test } from '../tools/prepare-test-env-ava.js';
// eslint-disable-next-line import/order
import { createHash } from 'crypto';
import { initSwingStore, getAllState, setAllState } from '@agoric/swing-store';
import { initSwingStore } from '@agoric/swing-store';
import makeKernelKeeper from '../src/kernel/state/kernelKeeper.js';
import { makeKernelStats } from '../src/kernel/state/stats.js';
import { KERNEL_STATS_METRICS } from '../src/kernel/metrics.js';
Expand Down Expand Up @@ -70,17 +70,17 @@ async function testStorage(t, s, getState, commit) {
}

test('storageInMemory', async t => {
const kernelStorage = initSwingStore(null).kernelStorage;
const { kernelStorage, debug } = initSwingStore(null);
await testStorage(
t,
kernelStorage.kvStore,
() => getAllState(kernelStorage).kvStuff,
() => debug.getAllState().kvStuff,
null,
);
});

test('storage helpers', t => {
const kernelStorage = initSwingStore(null).kernelStorage;
const { kernelStorage, debug } = initSwingStore(null);
const kv = kernelStorage.kvStore;

kv.set('foo.0', 'f0');
Expand All @@ -89,7 +89,7 @@ test('storage helpers', t => {
kv.set('foo.3', 'f3');
// omit foo.4
kv.set('foo.5', 'f5');
checkState(t, () => getAllState(kernelStorage).kvStuff, [
checkState(t, () => debug.getAllState().kvStuff, [
['foo.0', 'f0'],
['foo.1', 'f1'],
['foo.2', 'f2'],
Expand All @@ -114,20 +114,20 @@ test('storage helpers', t => {
// zero, so if there is a gap in the key sequence (e.g., 'foo.4' in the
// above), they stop counting when they hit it
t.truthy(kv.has('foo.5'));
checkState(t, () => getAllState(kernelStorage).kvStuff, [['foo.5', 'f5']]);
checkState(t, () => debug.getAllState().kvStuff, [['foo.5', 'f5']]);
});

function buildKeeperStorageInMemory() {
const kernelStorage = initSwingStore(null).kernelStorage;
const { kernelStorage, debug } = initSwingStore(null);
return {
getState: () => getAllState(kernelStorage).kvStuff,
getState: () => debug.getAllState().kvStuff,
...kernelStorage,
};
}

function duplicateKeeper(getState) {
const kernelStorage = initSwingStore(null).kernelStorage;
setAllState(kernelStorage, { kvStuff: getState(), streamStuff: new Map() });
const { kernelStorage, debug } = initSwingStore(null);
debug.setAllState({ kvStuff: getState(), streamStuff: new Map() });
const kernelKeeper = makeKernelKeeper(kernelStorage, null);
kernelKeeper.loadStats();
return kernelKeeper;
Expand Down
56 changes: 28 additions & 28 deletions packages/SwingSet/test/test-transcript-light.js
Original file line number Diff line number Diff line change
@@ -1,110 +1,110 @@
// eslint-disable-next-line import/order
import { test } from '../tools/prepare-test-env-ava.js';
// eslint-disable-next-line import/order
import { initSwingStore, getAllState, setAllState } from '@agoric/swing-store';
import { initSwingStore } from '@agoric/swing-store';
import { buildVatController, loadBasedir } from '../src/index.js';

test('transcript-light load', async t => {
const config = await loadBasedir(
new URL('basedir-transcript', import.meta.url).pathname,
);
const kernelStorage = initSwingStore().kernelStorage;
const { kernelStorage, debug } = initSwingStore();
const c = await buildVatController(config, ['one'], { kernelStorage });
t.teardown(c.shutdown);
const state0 = getAllState(kernelStorage);
const state0 = debug.getAllState();
t.is(state0.kvStuff.initialized, 'true');
t.is(state0.kvStuff.runQueue, '[1,1]');
t.not(state0.kvStuff.acceptanceQueue, '[]');

await c.step();
const state1 = getAllState(kernelStorage);
const state1 = debug.getAllState();

await c.step();
const state2 = getAllState(kernelStorage);
const state2 = debug.getAllState();

await c.step();
const state3 = getAllState(kernelStorage);
const state3 = debug.getAllState();

await c.step();
const state4 = getAllState(kernelStorage);
const state4 = debug.getAllState();

await c.step();
const state5 = getAllState(kernelStorage);
const state5 = debug.getAllState();

// build from loaded state
// Step 0

const cfg0 = await loadBasedir(
new URL('basedir-transcript', import.meta.url).pathname,
);
const kernelStorage0 = initSwingStore().kernelStorage;
setAllState(kernelStorage0, state0);
const { kernelStorage: kernelStorage0, debug: debug0 } = initSwingStore();
debug0.setAllState(state0);
const c0 = await buildVatController(cfg0, ['one'], {
kernelStorage: kernelStorage0,
});
t.teardown(c0.shutdown);

await c0.step();
t.deepEqual(state1, getAllState(kernelStorage0), `p1`);
t.deepEqual(state1, debug0.getAllState(), `p1`);

await c0.step();
t.deepEqual(state2, getAllState(kernelStorage0), `p2`);
t.deepEqual(state2, debug0.getAllState(), `p2`);

await c0.step();
t.deepEqual(state3, getAllState(kernelStorage0), `p3`);
t.deepEqual(state3, debug0.getAllState(), `p3`);

await c0.step();
t.deepEqual(state4, getAllState(kernelStorage0), `p4`);
t.deepEqual(state4, debug0.getAllState(), `p4`);

await c0.step();
t.deepEqual(state5, getAllState(kernelStorage0), `p5`);
t.deepEqual(state5, debug0.getAllState(), `p5`);

// Step 1

const cfg1 = await loadBasedir(
new URL('basedir-transcript', import.meta.url).pathname,
);
const kernelStorage1 = initSwingStore().kernelStorage;
setAllState(kernelStorage1, state1);
const { kernelStorage: kernelStorage1, debug: debug1 } = initSwingStore();
debug1.setAllState(state1);
const c1 = await buildVatController(cfg1, ['one'], {
kernelStorage: kernelStorage1,
});
t.teardown(c1.shutdown);

t.deepEqual(state1, getAllState(kernelStorage1), `p6`); // actual, expected
t.deepEqual(state1, debug1.getAllState(), `p6`); // actual, expected

await c1.step();
t.deepEqual(state2, getAllState(kernelStorage1), `p7`);
t.deepEqual(state2, debug1.getAllState(), `p7`);

await c1.step();
t.deepEqual(state3, getAllState(kernelStorage1), `p8`);
t.deepEqual(state3, debug1.getAllState(), `p8`);

await c1.step();
t.deepEqual(state4, getAllState(kernelStorage1), `p9`);
t.deepEqual(state4, debug1.getAllState(), `p9`);

await c1.step();
t.deepEqual(state5, getAllState(kernelStorage1), `p10`);
t.deepEqual(state5, debug1.getAllState(), `p10`);

// Step 2

const cfg2 = await loadBasedir(
new URL('basedir-transcript', import.meta.url).pathname,
);
const kernelStorage2 = initSwingStore().kernelStorage;
setAllState(kernelStorage2, state2);
const { kernelStorage: kernelStorage2, debug: debug2 } = initSwingStore();
debug2.setAllState(state2);
const c2 = await buildVatController(cfg2, ['one'], {
kernelStorage: kernelStorage2,
});
t.teardown(c2.shutdown);

t.deepEqual(state2, getAllState(kernelStorage2), `p11`);
t.deepEqual(state2, debug2.getAllState(), `p11`);

await c2.step();
t.deepEqual(state3, getAllState(kernelStorage2), `p12`);
t.deepEqual(state3, debug2.getAllState(), `p12`);

await c2.step();
t.deepEqual(state4, getAllState(kernelStorage2), `p13`);
t.deepEqual(state4, debug2.getAllState(), `p13`);

await c2.step();
t.deepEqual(state5, getAllState(kernelStorage2), `p14`);
t.deepEqual(state5, debug2.getAllState(), `p14`);
});
Loading

0 comments on commit 62fef7c

Please sign in to comment.