Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

default to XDG_RUNTIME_DIR for mac/linux in temp file for testing comms #24859

Merged
merged 6 commits into from
Mar 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 19 additions & 2 deletions src/client/testing/testController/common/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,22 @@ interface ExecutionResultMessage extends Message {
params: ExecutionTestPayload;
}

/**
* Retrieves the path to the temporary directory.
*
* On Windows, it returns the default temporary directory.
* On macOS/Linux, it prefers the `XDG_RUNTIME_DIR` environment variable if set,
* otherwise, it falls back to the default temporary directory.
*
* @returns {string} The path to the temporary directory.
*/
function getTempDir(): string {
if (process.platform === 'win32') {
return os.tmpdir(); // Default Windows behavior
}
return process.env.XDG_RUNTIME_DIR || os.tmpdir(); // Prefer XDG_RUNTIME_DIR on macOS/Linux
}

/**
* Writes an array of test IDs to a temporary file.
*
Expand All @@ -50,11 +66,12 @@ export async function writeTestIdsFile(testIds: string[]): Promise<string> {
const tempName = `test-ids-${randomSuffix}.txt`;
// create temp file
let tempFileName: string;
const tempDir: string = getTempDir();
try {
traceLog('Attempting to use temp directory for test ids file, file name:', tempName);
tempFileName = path.join(os.tmpdir(), tempName);
tempFileName = path.join(tempDir, tempName);
// attempt access to written file to check permissions
await fs.promises.access(os.tmpdir());
await fs.promises.access(tempDir);
} catch (error) {
// Handle the error when accessing the temp directory
traceError('Error accessing temp directory:', error, ' Attempt to use extension root dir instead');
Expand Down
49 changes: 44 additions & 5 deletions src/test/testing/testController/utils.unit.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import * as assert from 'assert';
import * as sinon from 'sinon';
import * as fs from 'fs';
import * as path from 'path';
import * as os from 'os';
import { writeTestIdsFile } from '../../../client/testing/testController/common/utils';
import { EXTENSION_ROOT_DIR } from '../../../client/constants';

Expand All @@ -21,11 +20,13 @@ suite('writeTestIdsFile tests', () => {
const testIds = ['test1', 'test2', 'test3'];
const writeFileStub = sandbox.stub(fs.promises, 'writeFile').resolves();

const result = await writeTestIdsFile(testIds);

const tmpDir = os.tmpdir();
// Set up XDG_RUNTIME_DIR
process.env = {
...process.env,
XDG_RUNTIME_DIR: '/xdg/runtime/dir',
};

assert.ok(result.startsWith(tmpDir));
await writeTestIdsFile(testIds);

assert.ok(writeFileStub.calledOnceWith(sinon.match.string, testIds.join('\n')));
});
Expand All @@ -48,3 +49,41 @@ suite('writeTestIdsFile tests', () => {
assert.ok(writeFileStub.calledOnceWith(sinon.match.string, testIds.join('\n')));
});
});

suite('getTempDir tests', () => {
let sandbox: sinon.SinonSandbox;
let originalPlatform: NodeJS.Platform;
let originalEnv: NodeJS.ProcessEnv;

setup(() => {
sandbox = sinon.createSandbox();
originalPlatform = process.platform;
originalEnv = process.env;
});

teardown(() => {
sandbox.restore();
Object.defineProperty(process, 'platform', { value: originalPlatform });
process.env = originalEnv;
});

test('should use XDG_RUNTIME_DIR on non-Windows if available', async () => {
if (process.platform === 'win32') {
return;
}
// Force platform to be Linux
Object.defineProperty(process, 'platform', { value: 'linux' });

// Set up XDG_RUNTIME_DIR
process.env = { ...process.env, XDG_RUNTIME_DIR: '/xdg/runtime/dir' };

const testIds = ['test1', 'test2', 'test3'];
sandbox.stub(fs.promises, 'access').resolves();
sandbox.stub(fs.promises, 'writeFile').resolves();

// This will use getTempDir internally
const result = await writeTestIdsFile(testIds);

assert.ok(result.startsWith('/xdg/runtime/dir'));
});
});