mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-10 22:21:22 -07:00
bug(core): Ensure storage is initialized early, even if config is not. (#18471)
This commit is contained in:
1
integration-tests/resume_repro.responses
Normal file
1
integration-tests/resume_repro.responses
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"method":"generateContentStream","response":[{"candidates":[{"content":{"parts":[{"text":"Session started."}],"role":"model"},"finishReason":"STOP","index":0}]}]}
|
||||||
42
integration-tests/resume_repro.test.ts
Normal file
42
integration-tests/resume_repro.test.ts
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2025 Google LLC
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
||||||
|
import { TestRig } from './test-helper.js';
|
||||||
|
import * as path from 'node:path';
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
|
|
||||||
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||||
|
|
||||||
|
describe('resume-repro', () => {
|
||||||
|
let rig: TestRig;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
rig = new TestRig();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(async () => await rig.cleanup());
|
||||||
|
|
||||||
|
it('should be able to resume a session without "Storage must be initialized before use"', async () => {
|
||||||
|
const responsesPath = path.join(__dirname, 'resume_repro.responses');
|
||||||
|
await rig.setup('should be able to resume a session', {
|
||||||
|
fakeResponsesPath: responsesPath,
|
||||||
|
});
|
||||||
|
|
||||||
|
// 1. First run to create a session
|
||||||
|
await rig.run({
|
||||||
|
args: 'hello',
|
||||||
|
});
|
||||||
|
|
||||||
|
// 2. Second run with --resume latest
|
||||||
|
// This should NOT fail with "Storage must be initialized before use"
|
||||||
|
const result = await rig.run({
|
||||||
|
args: ['--resume', 'latest', 'continue'],
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result).toContain('Session started');
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -510,6 +510,12 @@ export async function main() {
|
|||||||
projectHooks: settings.workspace.settings.hooks,
|
projectHooks: settings.workspace.settings.hooks,
|
||||||
});
|
});
|
||||||
loadConfigHandle?.end();
|
loadConfigHandle?.end();
|
||||||
|
|
||||||
|
// Initialize storage immediately after loading config to ensure that
|
||||||
|
// storage-related operations (like listing or resuming sessions) have
|
||||||
|
// access to the project identifier.
|
||||||
|
await config.storage.initialize();
|
||||||
|
|
||||||
adminControlsListner.setConfig(config);
|
adminControlsListner.setConfig(config);
|
||||||
|
|
||||||
if (config.isInteractive() && config.storage && config.getDebugMode()) {
|
if (config.isInteractive() && config.storage && config.getDebugMode()) {
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ vi.mock('./config/config.js', () => ({
|
|||||||
getSandbox: vi.fn(() => false),
|
getSandbox: vi.fn(() => false),
|
||||||
getQuestion: vi.fn(() => ''),
|
getQuestion: vi.fn(() => ''),
|
||||||
isInteractive: () => false,
|
isInteractive: () => false,
|
||||||
|
storage: { initialize: vi.fn().mockResolvedValue(undefined) },
|
||||||
} as unknown as Config),
|
} as unknown as Config),
|
||||||
parseArguments: vi.fn().mockResolvedValue({}),
|
parseArguments: vi.fn().mockResolvedValue({}),
|
||||||
isDebugMode: vi.fn(() => false),
|
isDebugMode: vi.fn(() => false),
|
||||||
@@ -195,6 +196,7 @@ describe('gemini.tsx main function cleanup', () => {
|
|||||||
getEnableHooks: vi.fn(() => false),
|
getEnableHooks: vi.fn(() => false),
|
||||||
getHookSystem: () => undefined,
|
getHookSystem: () => undefined,
|
||||||
initialize: vi.fn(),
|
initialize: vi.fn(),
|
||||||
|
storage: { initialize: vi.fn().mockResolvedValue(undefined) },
|
||||||
getContentGeneratorConfig: vi.fn(),
|
getContentGeneratorConfig: vi.fn(),
|
||||||
getMcpServers: () => ({}),
|
getMcpServers: () => ({}),
|
||||||
getMcpClientManager: vi.fn(),
|
getMcpClientManager: vi.fn(),
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ export const createMockConfig = (overrides: Partial<Config> = {}): Config =>
|
|||||||
setTerminalBackground: vi.fn(),
|
setTerminalBackground: vi.fn(),
|
||||||
storage: {
|
storage: {
|
||||||
getProjectTempDir: vi.fn().mockReturnValue('/tmp/gemini-test'),
|
getProjectTempDir: vi.fn().mockReturnValue('/tmp/gemini-test'),
|
||||||
|
initialize: vi.fn().mockResolvedValue(undefined),
|
||||||
},
|
},
|
||||||
getDebugMode: vi.fn(() => false),
|
getDebugMode: vi.fn(() => false),
|
||||||
getProjectRoot: vi.fn(() => '/'),
|
getProjectRoot: vi.fn(() => '/'),
|
||||||
|
|||||||
Reference in New Issue
Block a user