clawdie-ai/src/jail-runtime.test.ts
Sam & Claude 29484f1471 Reserved IP allocation for jail services
Priority-based scheme (lower = more foundational):
  .1 gateway, .2 controlplane, .3 database, .4 ollama,
  .5 cms, .6 browser, .7-.10 reserved

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 19:12:20 +00:00

111 lines
3.8 KiB
TypeScript

import { describe, it, expect, beforeEach, vi } from 'vitest';
import * as childProcess from 'child_process';
import * as fs from 'fs';
import { JailRuntime, useJailRuntime } from './jail-runtime.js';
vi.mock('child_process');
vi.mock('fs');
describe('JailRuntime', () => {
beforeEach(() => {
vi.clearAllMocks();
// Reset singleton between tests
Reflect.set(JailRuntime as unknown as Record<string, unknown>, 'instance', undefined);
});
describe('detectJail', () => {
it('returns true when running in a jail', () => {
vi.mocked(childProcess.execSync).mockReturnValue('1\n' as never);
const runtime = JailRuntime.getInstance();
expect(runtime.isInJail()).toBe(true);
});
it('returns false when not running in a jail', () => {
vi.mocked(childProcess.execSync).mockReturnValue('0\n' as never);
const runtime = JailRuntime.getInstance();
expect(runtime.isInJail()).toBe(false);
});
});
describe('isLinuxEmulationEnabled', () => {
it('returns true when Linux emulation is enabled', () => {
vi.mocked(childProcess.execSync).mockReturnValue('YES\n' as never);
expect(JailRuntime.isLinuxEmulationEnabled()).toBe(true);
});
it('returns false when Linux emulation is disabled', () => {
vi.mocked(childProcess.execSync).mockReturnValue('NO\n' as never);
expect(JailRuntime.isLinuxEmulationEnabled()).toBe(false);
});
});
describe('validateJailEnvironment', () => {
it('returns warnings when Linux emulation is enabled', () => {
vi.mocked(childProcess.execSync).mockReturnValue('YES\n' as never);
vi.mocked(fs.existsSync).mockReturnValue(true);
const validation = JailRuntime.validateJailEnvironment();
expect(validation.valid).toBe(true);
expect(validation.warnings).toContain(
'Linux emulation is enabled. Disable it for native performance.',
);
});
it('returns errors when jail path does not exist', () => {
vi.mocked(childProcess.execSync).mockImplementation(() => {
throw new Error('Command failed');
});
vi.mocked(fs.existsSync).mockReturnValue(false);
const validation = JailRuntime.validateJailEnvironment();
expect(validation.errors).toEqual(
expect.arrayContaining([expect.stringContaining('Jail path')]),
);
});
});
describe('getJailInfo', () => {
it('parses jail information correctly', () => {
const jlsOutput =
'jid=1 name=controlplane path=/usr/local/bastille/jails/controlplane/root host.hostname=controlplane.agent.local ip4.addr=10.0.0.2';
vi.mocked(childProcess.execSync)
.mockReturnValueOnce('1\n' as never)
.mockReturnValueOnce(jlsOutput as never);
const runtime = JailRuntime.getInstance();
expect(runtime.getJailInfo()).toEqual({
name: 'controlplane',
jid: 1,
hostname: 'controlplane.agent.local',
path: '/usr/local/bastille/jails/controlplane/root',
ip: '10.0.0.2',
});
});
});
});
describe('useJailRuntime', () => {
it('returns true on FreeBSD with valid jail environment', () => {
const originalPlatform = process.platform;
Object.defineProperty(process, 'platform', { value: 'freebsd' });
vi.mocked(childProcess.execSync).mockImplementation(() => {
throw new Error('linux_enable not set');
});
vi.mocked(fs.existsSync).mockReturnValue(true);
expect(useJailRuntime()).toBe(true);
Object.defineProperty(process, 'platform', { value: originalPlatform });
});
it('returns false on non-FreeBSD platforms', () => {
const originalPlatform = process.platform;
Object.defineProperty(process, 'platform', { value: 'linux' });
expect(useJailRuntime()).toBe(false);
Object.defineProperty(process, 'platform', { value: originalPlatform });
});
});