From bead78fda7e3ff9815674cd3d7486ff5e691916e Mon Sep 17 00:00:00 2001 From: Turadg Aleahmad Date: Thu, 7 Mar 2024 10:43:23 -0800 Subject: [PATCH 1/3] test: re-use buildProposal from SwingsetTestKit --- packages/boot/test/bootstrapTests/test-vats-restart.ts | 6 ------ packages/boot/test/bootstrapTests/test-zcf-upgrade.ts | 6 ------ 2 files changed, 12 deletions(-) diff --git a/packages/boot/test/bootstrapTests/test-vats-restart.ts b/packages/boot/test/bootstrapTests/test-vats-restart.ts index 66ad605ff61..83a131cb1a5 100644 --- a/packages/boot/test/bootstrapTests/test-vats-restart.ts +++ b/packages/boot/test/bootstrapTests/test-vats-restart.ts @@ -53,16 +53,10 @@ export const makeTestContext = async t => { console.timeEnd('DefaultTestContext'); - const buildProposal = makeProposalExtractor({ - childProcess: processAmbient, - fs: fsAmbientPromises, - }); - return { ...swingsetTestKit, agoricNamesRemotes, walletFactoryDriver, - buildProposal, }; }; diff --git a/packages/boot/test/bootstrapTests/test-zcf-upgrade.ts b/packages/boot/test/bootstrapTests/test-zcf-upgrade.ts index d226398280f..51b2ba73b3e 100644 --- a/packages/boot/test/bootstrapTests/test-zcf-upgrade.ts +++ b/packages/boot/test/bootstrapTests/test-zcf-upgrade.ts @@ -71,17 +71,11 @@ export const makeZoeTestContext = async t => { console.timeEnd('DefaultTestContext'); - const buildProposal = makeProposalExtractor({ - childProcess: processAmbient, - fs: fsAmbientPromises, - }); - return { ...swingsetTestKit, controller, agoricNamesRemotes, zoeDriver, - buildProposal, }; }; From e7740056c0123f6447734f9212a0283594c20a0c Mon Sep 17 00:00:00 2001 From: Turadg Aleahmad Date: Thu, 7 Mar 2024 14:37:37 -0800 Subject: [PATCH 2/3] test: add and use evalProposal --- .../test/bootstrapTests/test-addAssets.ts | 23 +-------- .../test/bootstrapTests/test-vats-restart.ts | 48 +++---------------- .../test-walletSurvivesZoeRestart.ts | 26 ++-------- .../test/bootstrapTests/test-zcf-upgrade.ts | 27 ++--------- packages/boot/tools/supports.ts | 27 +++++++++++ 5 files changed, 43 insertions(+), 108 deletions(-) diff --git a/packages/boot/test/bootstrapTests/test-addAssets.ts b/packages/boot/test/bootstrapTests/test-addAssets.ts index 3494f0a6a56..9cdaea18c6d 100644 --- a/packages/boot/test/bootstrapTests/test-addAssets.ts +++ b/packages/boot/test/bootstrapTests/test-addAssets.ts @@ -26,14 +26,6 @@ test.before(async t => { '@agoric/builders/scripts/inter-protocol/add-STARS.js', ); - t.log('installing proposal'); - // share a single proposal so tests don't stomp on each other's files; It has - // to be edited by each so as not to re-use keywords. - for await (const bundle of proposal.bundles) { - await context.controller.validateAndInstallBundle(bundle); - } - t.log('installed', proposal.bundles.length, 'bundles'); - const getCollateralProposal = (name, id) => { // stringify, modify and parse because modifying a deep copy was fragile. const proposalJSON = JSON.stringify(proposal); @@ -46,7 +38,6 @@ test.before(async t => { ...context, getCollateralProposal, }; - t.log('installed', proposal.bundles.length, 'bundles'); }); test.after.always(t => { @@ -59,13 +50,9 @@ test.after.always(t => { }); test('addAsset to quiescent auction', async t => { - const { advanceTimeTo, readLatest } = t.context; + const { advanceTimeTo, evalProposal, readLatest } = t.context; - const proposal = t.context.getCollateralProposal('COMETS', 'A'); - const bridgeMessage = { - type: 'CORE_EVAL', - evals: proposal.evals, - }; + await evalProposal(t.context.getCollateralProposal('COMETS', 'A')); const { EV } = t.context.runUtils; @@ -82,12 +69,6 @@ test('addAsset to quiescent auction', async t => { const nextQuiescentTime = TimeMath.addAbsRel(nextEndTime, fiveMinutes); await advanceTimeTo(nextQuiescentTime); - const coreEvalBridgeHandler = await EV.vat('bootstrap').consumeItem( - 'coreEvalBridgeHandler', - ); - await EV(coreEvalBridgeHandler).fromBridge(bridgeMessage); - t.log('proposal executed'); - t.like(readLatest(`${auctioneerPath}.book1`), { currentPriceLevel: null, }); diff --git a/packages/boot/test/bootstrapTests/test-vats-restart.ts b/packages/boot/test/bootstrapTests/test-vats-restart.ts index 83a131cb1a5..79d8f4f8aa2 100644 --- a/packages/boot/test/bootstrapTests/test-vats-restart.ts +++ b/packages/boot/test/bootstrapTests/test-vats-restart.ts @@ -92,31 +92,13 @@ test.serial('open vault', async t => { }); test.serial('run network vat proposal', async t => { - const { controller, buildProposal } = t.context; + const { buildProposal, evalProposal } = t.context; t.log('building network proposal'); - const proposal = await buildProposal( - '@agoric/builders/scripts/vats/init-network.js', + await evalProposal( + buildProposal('@agoric/builders/scripts/vats/init-network.js'), ); - for await (const bundle of proposal.bundles) { - await controller.validateAndInstallBundle(bundle); - } - t.log('installed', proposal.bundles.length, 'bundles'); - - t.log('executing proposal'); - const bridgeMessage = { - type: 'CORE_EVAL', - evals: proposal.evals, - }; - t.log({ bridgeMessage }); - const { EV } = t.context.runUtils; - const coreEvalBridgeHandler: BridgeHandler = await EV.vat( - 'bootstrap', - ).consumeItem('coreEvalBridgeHandler'); - await EV(coreEvalBridgeHandler).fromBridge(bridgeMessage); - - t.log('network proposal executed'); t.pass(); // reached here without throws }); @@ -135,31 +117,13 @@ test.serial('register network protocol before upgrade', async t => { }); test.serial('run restart-vats proposal', async t => { - const { controller, buildProposal } = t.context; + const { controller, buildProposal, evalProposal } = t.context; t.log('building proposal'); - const proposal = await buildProposal( - '@agoric/builders/scripts/vats/restart-vats.js', + await evalProposal( + buildProposal('@agoric/builders/scripts/vats/restart-vats.js'), ); - for await (const bundle of proposal.bundles) { - await controller.validateAndInstallBundle(bundle); - } - t.log('installed', proposal.bundles.length, 'bundles'); - - t.log('launching proposal'); - const bridgeMessage = { - type: 'CORE_EVAL', - evals: proposal.evals, - }; - t.log({ bridgeMessage }); - const { EV } = t.context.runUtils; - const coreEvalBridgeHandler: BridgeHandler = await EV.vat( - 'bootstrap', - ).consumeItem('coreEvalBridgeHandler'); - await EV(coreEvalBridgeHandler).fromBridge(bridgeMessage); - - t.log('restart-vats proposal executed'); t.pass(); // reached here without throws }); diff --git a/packages/boot/test/bootstrapTests/test-walletSurvivesZoeRestart.ts b/packages/boot/test/bootstrapTests/test-walletSurvivesZoeRestart.ts index 6d3151d4721..7fbddc26492 100644 --- a/packages/boot/test/bootstrapTests/test-walletSurvivesZoeRestart.ts +++ b/packages/boot/test/bootstrapTests/test-walletSurvivesZoeRestart.ts @@ -60,37 +60,19 @@ test.serial('wallet survives zoe null upgrade', async t => { const collateralBrandKey = 'ATOM'; const managerIndex = 0; - const { walletFactoryDriver, setupVaults, controller, buildProposal } = + const { walletFactoryDriver, setupVaults, buildProposal, evalProposal } = t.context; - const { EV } = t.context.runUtils; - const buyer = await walletFactoryDriver.provideSmartWallet('agoric1buyer'); - const buildAndExecuteProposal = async (packageSpec: string) => { - const proposal = await buildProposal(packageSpec); - - for await (const bundle of proposal.bundles) { - await controller.validateAndInstallBundle(bundle); - } - - const bridgeMessage = { - type: 'CORE_EVAL', - evals: proposal.evals, - }; - - const coreEvalBridgeHandler: ERef = await EV.vat( - 'bootstrap', - ).consumeItem('coreEvalBridgeHandler'); - await EV(coreEvalBridgeHandler).fromBridge(bridgeMessage); - }; - await setupVaults(collateralBrandKey, managerIndex, setup); // restart Zoe // /////// Upgrading //////////////////////////////// - await buildAndExecuteProposal('@agoric/builders/scripts/vats/upgrade-zoe.js'); + await evalProposal( + buildProposal('@agoric/builders/scripts/vats/upgrade-zoe.js'), + ); t.like(await buyer.getLatestUpdateRecord(), { currentAmount: { diff --git a/packages/boot/test/bootstrapTests/test-zcf-upgrade.ts b/packages/boot/test/bootstrapTests/test-zcf-upgrade.ts index 51b2ba73b3e..b2a3601af3c 100644 --- a/packages/boot/test/bootstrapTests/test-zcf-upgrade.ts +++ b/packages/boot/test/bootstrapTests/test-zcf-upgrade.ts @@ -88,30 +88,9 @@ test.before(async t => { test.after.always(t => t.context.shutdown?.()); test('run restart-vats proposal', async t => { - const { controller, buildProposal, zoeDriver } = t.context; + const { controller, buildProposal, evalProposal, zoeDriver } = t.context; const { EV } = t.context.runUtils; - const buildAndExecuteProposal = async packageSpec => { - const proposal = await buildProposal(packageSpec); - - for await (const bundle of proposal.bundles) { - await controller.validateAndInstallBundle(bundle); - } - - t.log('installed', proposal.bundles.length, 'bundles'); - - t.log('launching proposal'); - const bridgeMessage = { - type: 'CORE_EVAL', - evals: proposal.evals, - }; - - t.log({ bridgeMessage }); - const coreEvalBridgeHandler: ERef = await EV.vat( - 'bootstrap', - ).consumeItem('coreEvalBridgeHandler'); - await EV(coreEvalBridgeHandler).fromBridge(bridgeMessage); - }; const source = `${dirname}/${ZCF_PROBE_SRC}`; const zcfProbeBundle = await bundleSource(source); await controller.validateAndInstallBundle(zcfProbeBundle); @@ -139,7 +118,9 @@ test('run restart-vats proposal', async t => { t.log('building proposal'); // /////// Upgrading //////////////////////////////// - await buildAndExecuteProposal('@agoric/builders/scripts/vats/replace-zoe.js'); + await evalProposal( + buildProposal('@agoric/builders/scripts/vats/replace-zoe.js'), + ); t.log('upgrade zoe&zcf proposal executed'); await zoeDriver.upgradeProbe(zcfProbeBundle); diff --git a/packages/boot/tools/supports.ts b/packages/boot/tools/supports.ts index 828c18c599d..b95e6e1695f 100644 --- a/packages/boot/tools/supports.ts +++ b/packages/boot/tools/supports.ts @@ -27,6 +27,7 @@ import type { ExecutionContext as AvaT } from 'ava'; import { makeRunUtils } from '@agoric/swingset-vat/tools/run-utils.js'; import type { CoreEvalSDKType } from '@agoric/cosmic-proto/dist/codegen/agoric/swingset/swingset'; +import type { BridgeHandler } from '@agoric/vats'; const trace = makeTracer('BSTSupport', false); @@ -386,6 +387,31 @@ export const makeSwingsetTestKit = async ( fs: fsAmbientPromises, }); + const evalProposal = async ( + proposalP: ERef>>, + ) => { + const { EV } = runUtils; + + const proposal = harden(await proposalP); + + for await (const bundle of proposal.bundles) { + await controller.validateAndInstallBundle(bundle); + } + log('installed', proposal.bundles.length, 'bundles'); + + log('executing proposal'); + const bridgeMessage = { + type: 'CORE_EVAL', + evals: proposal.evals, + }; + log({ bridgeMessage }); + const coreEvalBridgeHandler: BridgeHandler = await EV.vat( + 'bootstrap', + ).consumeItem('coreEvalBridgeHandler'); + await EV(coreEvalBridgeHandler).fromBridge(bridgeMessage); + log(`proposal executed`); + }; + console.timeEnd('makeBaseSwingsetTestKit'); let currentTime = 0n; @@ -435,6 +461,7 @@ export const makeSwingsetTestKit = async ( advanceTimeTo, buildProposal, controller, + evalProposal, getCrankNumber, jumpTimeTo, readLatest, From 62c1842b67e1bca669a4fc4e3c94b500cf2a7338 Mon Sep 17 00:00:00 2001 From: Turadg Aleahmad Date: Thu, 7 Mar 2024 12:40:58 -0800 Subject: [PATCH 3/3] test: add getOutboundMessages --- packages/boot/tools/supports.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/boot/tools/supports.ts b/packages/boot/tools/supports.ts index b95e6e1695f..822b20b4dd5 100644 --- a/packages/boot/tools/supports.ts +++ b/packages/boot/tools/supports.ts @@ -12,9 +12,9 @@ import { buildSwingset } from '@agoric/cosmic-swingset/src/launch-chain.js'; import { BridgeId, VBankAccount, makeTracer } from '@agoric/internal'; import { unmarshalFromVstorage } from '@agoric/internal/src/marshal.js'; import { makeFakeStorageKit } from '@agoric/internal/src/storage-test-utils.js'; +import { krefOf } from '@agoric/kmarshal'; import { initSwingStore } from '@agoric/swing-store'; import { loadSwingsetConfigFile } from '@agoric/swingset-vat'; -import { krefOf } from '@agoric/kmarshal'; import { makeSlogSender } from '@agoric/telemetry'; import { TimeMath, Timestamp } from '@agoric/time'; import '@agoric/vats/exported.js'; @@ -281,11 +281,19 @@ export const makeSwingsetTestKit = async ( let lastNonce = 0n; + const outboundMessages = new Map(); + /** * Mock the bridge outbound handler. The real one is implemented in Golang so * changes there will sometimes require changes here. */ const bridgeOutbound = (bridgeId: string, obj: any) => { + // store all messages for querying by tests + if (!outboundMessages.has(bridgeId)) { + outboundMessages.set(bridgeId, []); + } + outboundMessages.get(bridgeId).push(obj); + switch (bridgeId) { case BridgeId.BANK: { trace( @@ -341,6 +349,7 @@ export const makeSwingsetTestKit = async ( case BridgeId.DIBC: case BridgeId.PROVISION: case BridgeId.PROVISION_SMART_WALLET: + case BridgeId.VTRANSFER: case BridgeId.WALLET: console.warn('Bridge returning undefined for', bridgeId, ':', obj); return undefined; @@ -456,6 +465,9 @@ export const makeSwingsetTestKit = async ( const getCrankNumber = () => Number(kernelStorage.kvStore.get('crankNumber')); + const getOutboundMessages = (bridgeId: string) => + harden([...outboundMessages.get(bridgeId)]); + return { advanceTimeBy, advanceTimeTo, @@ -463,6 +475,7 @@ export const makeSwingsetTestKit = async ( controller, evalProposal, getCrankNumber, + getOutboundMessages, jumpTimeTo, readLatest, runUtils,