Files
bare-operating-system/packages/bare-os-coreutils/test/telnet-protocol.test.mjs
T
2026-04-26 05:36:20 -04:00

67 lines
2.0 KiB
JavaScript

import { readFile } from 'node:fs/promises'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
import test from 'brittle'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
async function loadTelnetFns() {
const body = await readFile(path.join(__dirname, '../src/telnet.js'), 'utf8')
const fn = new Function(
`${body}
return {
TELNET_IAC,
TELNET_DO,
TELNET_DONT,
TELNET_WILL,
TELNET_WONT,
TELNET_SB,
TELNET_SE,
TELNET_OPT_ECHO,
TELNET_OPT_NAWS,
TELNET_OPT_TTYPE,
bareTelnetNewParseState,
bareTelnetParseChunk,
bareTelnetMakeNego,
bareTelnetHandleNeg,
bareTelnetHandleSB,
bareTelnetEncodeNAWS,
bareTelnetEncodeTTYPEIs
}`
)
return fn()
}
test('telnet parser separates data and negotiation records', async (t) => {
const tel = await loadTelnetFns()
const st = tel.bareTelnetNewParseState()
const data = new Uint8Array([65, tel.TELNET_IAC, tel.TELNET_WILL, tel.TELNET_OPT_ECHO, 66])
const out = tel.bareTelnetParseChunk(st, data)
t.is(new TextDecoder().decode(out.data), 'AB')
t.is(out.commands.length, 1)
t.is(out.commands[0].kind, 'neg')
t.is(out.commands[0].cmd, tel.TELNET_WILL)
t.is(out.commands[0].opt, tel.TELNET_OPT_ECHO)
})
test('telnet negotiation responds to DO NAWS with WILL + SB NAWS', async (t) => {
const tel = await loadTelnetFns()
const nego = tel.bareTelnetMakeNego({ nawsCols: 120, nawsRows: 40, ttype: 'xterm' })
const r = tel.bareTelnetHandleNeg(nego, tel.TELNET_DO, tel.TELNET_OPT_NAWS)
t.ok(r.responses.length >= 2)
t.is(r.responses[0][0], tel.TELNET_IAC)
t.is(r.responses[0][1], tel.TELNET_WILL)
t.is(r.responses[0][2], tel.TELNET_OPT_NAWS)
})
test('telnet subnegotiation SEND TTYPE returns IS TTYPE', async (t) => {
const tel = await loadTelnetFns()
const nego = tel.bareTelnetMakeNego({ ttype: 'xterm-256color' })
const r = tel.bareTelnetHandleSB(nego, tel.TELNET_OPT_TTYPE, new Uint8Array([1]))
t.ok(r.responses.length >= 1)
const sb = r.responses[0]
t.is(sb[0], tel.TELNET_IAC)
t.is(sb[1], tel.TELNET_SB)
t.is(sb[2], tel.TELNET_OPT_TTYPE)
})