Skip to content

Commit

Permalink
fix(liveSlots): reflect return value marshalling failures
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelfig authored and warner committed Dec 15, 2021
1 parent 9232e62 commit fd17b22
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 1 deletion.
9 changes: 8 additions & 1 deletion packages/SwingSet/src/kernel/liveSlots.js
Original file line number Diff line number Diff line change
Expand Up @@ -673,7 +673,14 @@ function build(
function collect(promiseID, rejected, value) {
doneResolutions.add(promiseID);
meterControl.assertIsMetered(); // else userspace getters could escape
const valueSer = m.serialize(value);
let valueSer;
try {
valueSer = m.serialize(value);
} catch (e) {
// Serialization failure.
valueSer = m.serialize(e);
rejected = true;
}
valueSer.slots.map(retainExportedVref);
resolutions.push([promiseID, rejected, valueSer]);
scanSlots(valueSer.slots);
Expand Down
22 changes: 22 additions & 0 deletions packages/spawner/test/swingsetTests/contractHost/bootstrap.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,25 @@ export function buildRootObject(vatPowers, vatParameters) {
);
}

async function farFailureContractTest(spawner, trivialBundle) {
log('starting farFailureContractTest');
const installationP = E(spawner).install(trivialBundle);
const trivial = await E(installationP).spawn('terms are provided');
await E(trivial)
.getTerms(harden({ failureArg() {} }))
.then(
() => log(`wrong: far failure arg resolves`),
err => log(`send non-Far: ${err}`),
);
await E(trivial)
.failureToFar()
.then(
() => log(`wrong: far failure return resolves`),
err => log(`far failure: ${err}`),
);
log(`++ DONE`);
}

return Far('root', {
async bootstrap(vats, devices) {
const vatAdminSvc = await E(vats.vatAdmin).createVatAdminService(
Expand All @@ -56,6 +75,9 @@ export function buildRootObject(vatPowers, vatParameters) {
case 'exhaust': {
return exhaustedContractTest(spawner, trivialBundle);
}
case 'farFailure': {
return farFailureContractTest(spawner, trivialBundle);
}
default: {
assert.fail(X`unrecognized argument value ${mode}`);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,15 @@ test('exhaustion', async t => {
const dump = await main(t, 'exhaust');
t.deepEqual(dump.log, contractExhaustedGolden);
});

const farFailureGolden = [
'starting farFailureContractTest',
'send non-Far: Error: Remotables must be explicitly declared: {"failureArg":"[Function failureArg]"}',
'far failure: Error: Remotables must be explicitly declared: {"failureReturn":"[Function failureReturn]"}',
'++ DONE',
];

test('farFailure', async t => {
const dump = await main(t, 'farFailure');
t.deepEqual(dump.log, farFailureGolden);
});
5 changes: 5 additions & 0 deletions packages/spawner/test/swingsetTests/contractHost/trivial.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,10 @@ export default function start(terms) {
areYouOk() {
return 'yes';
},
failureToFar() {
return harden({
failureReturn() {},
});
},
});
}

0 comments on commit fd17b22

Please sign in to comment.