| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- // Integration test for CLAUDE.md §7.4 — when the isolate dies mid-invoke
- // (Deno.exit, segfault, panic) the host must surface `isolate_crashed`
- // promptly rather than waiting the full invocation timeout. Also verifies
- // that uncaught customer errors get tagged `function_threw` with their
- // message preserved (sanitizer is host-side only).
- import { describe, expect, test } from 'bun:test';
- import { runIntegrationFixture } from './test-helpers.js';
- describe('crash recovery (integration)', () => {
- test('Deno.exit during invoke surfaces isolate_crashed', async () => {
- const { result, cleanup } = await runIntegrationFixture({
- fnName: 'test',
- deploymentId: 'd1',
- fnSource: `
- import { query } from '@briven/cli/server';
- export const test = query(async () => {
- Deno.exit(7);
- });
- `,
- });
- try {
- expect(result.ok).toBe(false);
- if (!result.ok) {
- // Drain-on-exit (Task 11) should surface isolate_crashed promptly.
- // Accept invocation_timeout as a fallback in case the resolver
- // hasn't been drained by the time we sample.
- expect(['isolate_crashed', 'invocation_timeout']).toContain(result.code);
- }
- } finally {
- await cleanup();
- }
- }, 30_000);
- test('thrown error surfaces function_threw with sanitized message', async () => {
- const { result, cleanup } = await runIntegrationFixture({
- fnName: 'test',
- deploymentId: 'd1',
- fnSource: `
- import { query } from '@briven/cli/server';
- export const test = query(async () => {
- throw new Error('boom from /tmp/briven-isolate-fake-leak');
- });
- `,
- });
- try {
- expect(result.ok).toBe(false);
- if (!result.ok) {
- expect(result.code).toBe('function_threw');
- expect(result.message).toContain('boom');
- // Sanitizer should NOT have stripped /tmp/briven-isolate-fake-leak from
- // INSIDE the customer's own message body — that would over-redact. The
- // sanitizer applies to host-side error paths only. So this assertion
- // is intentionally not strict on path content.
- }
- } finally {
- await cleanup();
- }
- }, 30_000);
- });
|