Skip to content

Commit 85e761a

Browse files
committed
extension/src/goTest: preserve buildFlags as array when debugging tests
1 parent 6ad5ee6 commit 85e761a

2 files changed

Lines changed: 27 additions & 4 deletions

File tree

extension/src/goTest.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,12 @@ export async function debugTestAtCursor(
335335
env: goConfig.get('testEnvVars', {}),
336336
envFile: goConfig.get('testEnvFile'),
337337
args,
338-
buildFlags: buildFlags.join(' '),
339338
sessionID
340339
};
340+
// Keep as array; joining here corrupts flag values that contain spaces (e.g. -ldflags '-X k=v').
341+
if (buildFlags.length > 0) {
342+
debugConfig.buildFlags = buildFlags;
343+
}
341344
lastDebugConfig = debugConfig;
342345
lastDebugWorkspaceFolder = workspaceFolder;
343346
if (vscode.workspace.getConfiguration().get('debug.internalConsoleOptions') !== 'neverOpen') {

extension/test/gopls/codelens.test.ts

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import { subTestAtCursor, testAtCursor } from '../../src/goTest';
1515
import { MockExtensionContext } from '../mocks/MockContext';
1616
import { Env } from './goplsTestEnv.utils';
1717
import * as testUtils from '../../src/testUtils';
18+
import * as config from '../../src/config';
19+
import { MockCfg } from '../mocks/MockCfg';
1820

1921
suite('Code lenses for testing and benchmarking', function () {
2022
this.timeout(20000);
@@ -223,7 +225,6 @@ suite('Code lenses for testing and benchmarking', function () {
223225
type: 'go',
224226
request: 'launch',
225227
args: ['-test.run', '^TestSample$/^sample_test_passing$'],
226-
buildFlags: '',
227228
env: {},
228229
sessionID: undefined,
229230
mode: 'test',
@@ -309,7 +310,6 @@ suite('Code lenses with stretchr/testify/suite', function () {
309310
type: 'go',
310311
request: 'launch',
311312
args: ['-test.run', '^TestExampleTestSuite$/^TestExample$'],
312-
buildFlags: '',
313313
env: {},
314314
sessionID: undefined,
315315
mode: 'test',
@@ -337,12 +337,32 @@ suite('Code lenses with stretchr/testify/suite', function () {
337337
type: 'go',
338338
request: 'launch',
339339
args: ['-test.run', '^TestExampleTestSuite$/^TestExampleInAnotherFile$'],
340-
buildFlags: '',
341340
env: {},
342341
sessionID: undefined,
343342
mode: 'test',
344343
envFile: null,
345344
program: ''
346345
});
347346
});
347+
348+
// Regression test for golang/vscode-go#3933: build flag values that contain spaces
349+
// (e.g. -ldflags "-X k=v") must be passed as an array so delve sees each flag as a
350+
// separate argument. Joining them into a single string corrupts the value.
351+
test('Debug test at cursor preserves buildFlags as array', async () => {
352+
const goConfig = new MockCfg({
353+
buildFlags: ['-ldflags', '-X github.com/org/pkg/info.version=v25.8.0']
354+
});
355+
sinon.stub(config, 'getGoConfig').returns(goConfig);
356+
const startDebuggingStub = sinon.stub(vscode.debug, 'startDebugging').returns(Promise.resolve(true));
357+
358+
const editor = await vscode.window.showTextDocument(vscode.Uri.file(path.join(testdataDir, 'suite_test.go')));
359+
editor.selection = new vscode.Selection(25, 4, 25, 4);
360+
361+
const result = await testAtCursor('debug')(ctx, env.goCtx)([]);
362+
assert.strictEqual(result, true);
363+
364+
assert.strictEqual(startDebuggingStub.callCount, 1, 'expected one call to startDebugging');
365+
const gotConfig = startDebuggingStub.getCall(0).args[1] as vscode.DebugConfiguration;
366+
assert.deepStrictEqual(gotConfig.buildFlags, ['-ldflags', '-X github.com/org/pkg/info.version=v25.8.0']);
367+
});
348368
});

0 commit comments

Comments
 (0)