From cd08b60f9c9d0e8cb42ae37c1a13e3abb25d4fc5 Mon Sep 17 00:00:00 2001 From: creatixchu Date: Wed, 23 Sep 2026 17:36:07 +0800 Subject: [PATCH] test(ptc): declare workflow runtime confinement capabilities --- packages/workflow/workflow-ptc/tests/host.spec.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/workflow/workflow-ptc/tests/host.spec.ts b/packages/workflow/workflow-ptc/tests/host.spec.ts index db741849d1..64a93f4aeb 100644 --- a/packages/workflow/workflow-ptc/tests/host.spec.ts +++ b/packages/workflow/workflow-ptc/tests/host.spec.ts @@ -16,6 +16,8 @@ type HostBindings = Record class ControlledRuntime extends PtcRuntime { language = 'typescript' readonly isolation = 'process' + policyMode: 'read-only' | undefined = 'read-only' + override get sandboxMode(): 'read-only' | undefined { return this.policyMode } execute: (spec: PtcRunSpec) => Promise = () => Promise.resolve(completed) resolve(request: PtcRunRequest): PtcRunSpec { @@ -96,17 +98,20 @@ describe('workflow host callback validation', () => { } finally { await handle.dispose() } }) - it('carries Session authority and an explicit unlimited deadline to the runtime', async () => { - const { ctx, parent, start } = await setup(async (bindings, spec) => { + it.each([true, false])('carries Session cwd and an unlimited deadline with confinement capability %s', async (confined) => { + const { ctx, runtime, parent, start } = await setup(async (bindings, spec) => { expect(spec.timeoutMs).toBeNull() expect(spec.cwd).toBe(parent.session.header.cwd) - expect(spec.sandboxPolicy).toEqual(ctx.sandboxPolicy.resolve({ session: parent.session })) + expect(spec.sandboxPolicy).toEqual(confined ? ctx.sandboxPolicy.resolve({ session: parent.session }) : undefined) expect(await bindings.begin!({})).toMatchObject({ body: 'return null', meta: { name: 'host-test' } }) return completed }) + runtime.policyMode = confined ? 'read-only' : undefined const handle = start() - try { expect((await handle.result).stopReason).toBe('completed') } - finally { await handle.dispose() } + try { + const result = await handle.result + expect(result.stopReason, result.error).toBe('completed') + } finally { await handle.dispose() } }) })