Files
gemini-cli/packages/core/src/context/tracer.test.ts
T

86 lines
2.9 KiB
TypeScript
Raw Normal View History

2026-04-07 02:16:06 +00:00
/**
* @license
* Copyright 2026 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
2026-04-07 04:46:04 +00:00
2026-04-06 22:17:32 +00:00
import { describe, it, expect, beforeEach, vi } from 'vitest';
2026-04-06 21:57:54 +00:00
import { ContextTracer } from './tracer.js';
2026-04-06 22:17:32 +00:00
import { InMemoryFileSystem } from './system/InMemoryFileSystem.js';
import { DeterministicIdGenerator } from './system/DeterministicIdGenerator.js';
2026-04-06 21:57:54 +00:00
2026-04-06 22:17:32 +00:00
describe('ContextTracer (Fake FS & ID Gen)', () => {
let fileSystem: InMemoryFileSystem;
let idGenerator: DeterministicIdGenerator;
2026-04-06 21:57:54 +00:00
beforeEach(() => {
2026-04-06 22:17:32 +00:00
fileSystem = new InMemoryFileSystem();
idGenerator = new DeterministicIdGenerator('mock-uuid-');
2026-04-07 04:46:04 +00:00
2026-04-06 22:17:32 +00:00
// We must mock Date.now() to ensure asset file names are perfectly deterministic
vi.useFakeTimers();
vi.setSystemTime(new Date('2026-01-01T12:00:00Z'));
2026-04-06 21:57:54 +00:00
});
2026-04-06 22:17:32 +00:00
it('initializes, logs events, and auto-saves large assets deterministically', () => {
const tracer = new ContextTracer(
{ enabled: true, targetDir: '/fake/target', sessionId: 'test-session' },
fileSystem,
2026-04-07 04:46:04 +00:00
idGenerator,
2026-04-06 22:17:32 +00:00
);
2026-04-06 21:57:54 +00:00
2026-04-06 22:17:32 +00:00
// Verify Initialization
2026-04-07 04:46:04 +00:00
const initTraceLog = fileSystem.readFileSync(
'/fake/target/.gemini/context_trace/test-session/trace.log',
'utf8',
);
2026-04-06 22:17:32 +00:00
expect(initTraceLog).toContain('[SYSTEM] Context Tracer Initialized');
2026-04-06 21:57:54 +00:00
// Small logging: shouldn't trigger saveAsset
tracer.logEvent('TestComponent', 'TestAction', { key: 'value' });
2026-04-07 04:46:04 +00:00
const smallTraceLog = fileSystem.readFileSync(
'/fake/target/.gemini/context_trace/test-session/trace.log',
'utf8',
);
2026-04-06 22:17:32 +00:00
expect(smallTraceLog).toContain('[TestComponent] TestAction');
expect(smallTraceLog).toContain('{"key":"value"}');
2026-04-06 21:57:54 +00:00
// Large logging: should trigger auto-asset save
const hugeString = 'a'.repeat(2000);
tracer.logEvent('TestComponent', 'LargeAction', { largeKey: hugeString });
2026-04-07 04:46:04 +00:00
2026-04-06 22:17:32 +00:00
// 1767268800000 is 2026-01-01T12:00:00Z
2026-04-07 04:46:04 +00:00
const expectedAssetPath =
'/fake/target/.gemini/context_trace/test-session/assets/1767268800000-mock-uuid-1-largeKey.json';
2026-04-06 22:17:32 +00:00
// Assert asset was written to FS
expect(fileSystem.existsSync(expectedAssetPath)).toBe(true);
2026-04-07 04:46:04 +00:00
const largeTraceLog = fileSystem.readFileSync(
'/fake/target/.gemini/context_trace/test-session/trace.log',
'utf8',
);
2026-04-06 22:17:32 +00:00
expect(largeTraceLog).toContain('[TestComponent] LargeAction');
2026-04-07 04:46:04 +00:00
expect(largeTraceLog).toContain(
`{"largeKey":{"$asset":"1767268800000-mock-uuid-1-largeKey.json"}}`,
);
2026-04-06 21:57:54 +00:00
});
2026-04-06 22:17:32 +00:00
it('silently ignores logging when disabled', () => {
const tracer = new ContextTracer(
{ enabled: false, targetDir: '/fake/target', sessionId: 'test-session' },
fileSystem,
2026-04-07 04:46:04 +00:00
idGenerator,
2026-04-06 22:17:32 +00:00
);
2026-04-06 21:57:54 +00:00
tracer.logEvent('TestComponent', 'TestAction');
2026-04-07 04:46:04 +00:00
2026-04-06 21:57:54 +00:00
const hugeString = 'a'.repeat(2000);
tracer.logEvent('TestComponent', 'LargeAction', { largeKey: hugeString });
2026-04-07 04:46:04 +00:00
2026-04-06 22:17:32 +00:00
// FS should be completely empty
expect(fileSystem.getFiles().size).toBe(0);
2026-04-06 21:57:54 +00:00
});
});