Skip to content

Commit cfa48f3

Browse files
committed
test: cover WSL support on Windows
1 parent f0f4f38 commit cfa48f3

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
"bin": {
66
"codedash": "./bin/cli.js"
77
},
8+
"scripts": {
9+
"test": "node --test"
10+
},
811
"files": [
912
"bin/",
1013
"src/"

test/wsl-windows.test.js

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
const test = require('node:test');
2+
const assert = require('node:assert/strict');
3+
4+
const data = require('../src/data');
5+
6+
const {
7+
parseWslDistroList,
8+
getWslDistroList,
9+
getRunningWslDistroSet,
10+
filterWslDistrosForProcessScan,
11+
buildWslUncPath,
12+
parseWslProcessLine,
13+
parseWslPsSnapshotLine,
14+
resolveWslActiveSession,
15+
shortenHomePath,
16+
} = data.__test;
17+
18+
test('parseWslDistroList decodes UTF-16LE output and strips BOM/nulls', () => {
19+
const raw = Buffer.from('\uFEFFUbuntu-24.04\r\ndocker-desktop\r\n', 'utf16le');
20+
assert.deepEqual(parseWslDistroList(raw), ['Ubuntu-24.04', 'docker-desktop']);
21+
assert.deepEqual(parseWslDistroList('\uFEFFUbuntu\0-24.04\r\ndocker\0-desktop\r\n'), ['Ubuntu-24.04', 'docker-desktop']);
22+
});
23+
24+
test('getWslDistroList and getRunningWslDistroSet fail safely when WSL is unavailable', () => {
25+
assert.deepEqual(getWslDistroList(() => { throw new Error('ENOENT'); }), []);
26+
assert.equal(getRunningWslDistroSet(() => { throw new Error('disabled'); }), null);
27+
});
28+
29+
test('getRunningWslDistroSet parses running distros and process scan filters to them', () => {
30+
const running = getRunningWslDistroSet(() => Buffer.from('\uFEFFUbuntu-24.04\r\ndebian\r\n', 'utf16le'));
31+
assert.deepEqual(Array.from(running).sort(), ['Ubuntu-24.04', 'debian']);
32+
assert.deepEqual(
33+
filterWslDistrosForProcessScan(['Ubuntu-24.04', 'docker-desktop', 'debian'], running),
34+
['Ubuntu-24.04', 'debian']
35+
);
36+
assert.deepEqual(filterWslDistrosForProcessScan(['Ubuntu-24.04'], null), ['Ubuntu-24.04']);
37+
});
38+
39+
test('buildWslUncPath and shortenHomePath normalize WSL-visible paths', () => {
40+
assert.equal(buildWslUncPath('Ubuntu-24.04', '/home/dius'), '\\\\wsl$\\Ubuntu-24.04\\home\\dius');
41+
assert.equal(buildWslUncPath('Ubuntu-24.04', '/'), '\\\\wsl$\\Ubuntu-24.04\\');
42+
assert.equal(buildWslUncPath('', '/home/dius'), '');
43+
assert.equal(buildWslUncPath('Ubuntu-24.04', 'home/dius'), '');
44+
assert.equal(shortenHomePath('/home/dius/projects/codedash', ['\\\\wsl$\\Ubuntu-24.04\\home\\dius']), '~/projects/codedash');
45+
assert.equal(shortenHomePath('\\\\wsl$\\Ubuntu-24.04\\home\\dius\\projects\\codedash', ['\\\\wsl$\\Ubuntu-24.04\\home\\dius']), '~\\projects\\codedash');
46+
});
47+
48+
test('parseWslPsSnapshotLine and parseWslProcessLine normalize process data', () => {
49+
const snapshot = parseWslPsSnapshotLine('1190 985 0.0 1528 42 sh -c sleep 300 codex');
50+
assert.equal(snapshot.rawPid, 1190);
51+
assert.equal(snapshot.rawParentPid, 985);
52+
assert.equal(snapshot.rssKb, 1528);
53+
assert.equal(snapshot.commandLine, 'sh -c sleep 300 codex');
54+
55+
const parsed = parseWslProcessLine('123\t45\t1.7\t20480\t600\t/home/dius/projects/codedash\tcodex resume 019d6dc8-03d4-72e0-8239-bda72acb65fb', 'Ubuntu-24.04');
56+
assert.equal(parsed.pid, 'wsl:Ubuntu-24.04:123');
57+
assert.equal(parsed.parentPid, 'wsl:Ubuntu-24.04:45');
58+
assert.equal(parsed.cwd, '/home/dius/projects/codedash');
59+
assert.equal(parsed.ws, 20480 * 1024);
60+
});
61+
62+
test('resolveWslActiveSession uses cmdline, then cwd, then synthetic fallback', () => {
63+
const cmdlineProc = {
64+
distro: 'Ubuntu-24.04',
65+
rawPid: 123,
66+
commandLine: 'codex resume 019d6dc8-03d4-72e0-8239-bda72acb65fb',
67+
cwd: '/home/dius/projects/codedash',
68+
startedAt: '2026-04-09T10:00:00.000Z',
69+
};
70+
const sessions = [
71+
{ id: '019d6dc8-03d4-72e0-8239-bda72acb65fb', project: '/real/from-session' },
72+
{ id: 'cwd-session', project: '/home/dius/projects/codedash' },
73+
];
74+
const latestByToolProject = {
75+
'codex|/home/dius/projects/codedash': { id: 'cwd-session' },
76+
};
77+
78+
const fromCmdline = resolveWslActiveSession(cmdlineProc, 'codex', sessions, latestByToolProject);
79+
assert.equal(fromCmdline.sessionId, '019d6dc8-03d4-72e0-8239-bda72acb65fb');
80+
assert.equal(fromCmdline.sessionSource, 'cmdline');
81+
assert.equal(fromCmdline.unassociated, false);
82+
83+
const fromCwd = resolveWslActiveSession({
84+
distro: 'Ubuntu-24.04',
85+
rawPid: 124,
86+
commandLine: 'codex',
87+
cwd: '/home/dius/projects/codedash',
88+
startedAt: '2026-04-09T10:00:00.000Z',
89+
}, 'codex', sessions, latestByToolProject);
90+
assert.equal(fromCwd.sessionId, 'cwd-session');
91+
assert.equal(fromCwd.sessionSource, 'cwd-match');
92+
93+
const synthetic = resolveWslActiveSession({
94+
distro: 'Ubuntu-24.04',
95+
rawPid: 125,
96+
commandLine: 'codex',
97+
cwd: '/home/dius/projects/unknown',
98+
startedAt: '',
99+
}, 'codex', sessions, latestByToolProject);
100+
assert.equal(synthetic.sessionId, 'wsl-proc:Ubuntu-24.04:125');
101+
assert.equal(synthetic.sessionSource, 'wsl-proc');
102+
assert.equal(synthetic.unassociated, true);
103+
});

0 commit comments

Comments
 (0)