|
| 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