import test from 'brittle'
import c from 'compact-encoding'
import {
port,
ipv4,
ipv6,
ipv4Address,
ipv6Address,
ip,
ipAddress
} from './index.js'
test('port', (t) => {
const p = 0x1234
const buf = Buffer.from([0x34, 0x12])
t.alike(c.encode(port, p), buf)
t.alike(c.decode(port, buf), p)
})
test('ipv4', (t) => {
const ip = '1.2.3.4'
const buf = Buffer.from([1, 2, 3, 4])
t.alike(c.encode(ipv4, ip), buf)
t.alike(c.decode(ipv4, buf), ip)
})
test('ipv4 + port', (t) => {
const host = '1.2.3.4'
const port = 1234
t.alike(c.decode(ipv4Address, c.encode(ipv4Address, { host, port })), {
host,
family: 4,
port
})
})
test('default ipv4', (t) => {
const host = null
const port = 1234
t.alike(c.decode(ipv4Address, c.encode(ipv4Address, { host, port })), {
host: '127.0.0.1',
family: 4,
port
})
})
test('ipv6', (t) => {
const ip = '1:2:3:4:5:6:7:8'
const buf = Buffer.from([0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8])
t.alike(c.encode(ipv6, ip), buf)
t.alike(c.decode(ipv6, buf), ip)
t.test('abbreviated', (t) => {
const buf = Buffer.from([0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8])
t.alike(c.encode(ipv6, '1:2::7:8'), buf)
t.alike(c.decode(ipv6, buf), '1:2:0:0:0:0:7:8')
})
t.test('prefix abbreviated', (t) => {
const buf = Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 6, 0, 7, 0, 8])
t.alike(c.encode(ipv6, '::5:6:7:8'), buf)
t.alike(c.decode(ipv6, buf), '0:0:0:0:5:6:7:8')
})
t.test('suffix abbreviated', (t) => {
const buf = Buffer.from([0, 1, 0, 2, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0])
t.alike(c.encode(ipv6, '1:2:3:4::'), buf)
t.alike(c.decode(ipv6, buf), '1:2:3:4:0:0:0:0')
})
t.test('any', (t) => {
const buf = Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
t.alike(c.encode(ipv6, '::'), buf)
t.alike(c.decode(ipv6, buf), '0:0:0:0:0:0:0:0')
})
t.test('lowercase hex', (t) => {
const buf = Buffer.from([
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xab, 0xcd
])
t.alike(c.encode(ipv6, '::abcd'), buf)
t.alike(c.decode(ipv6, buf), '0:0:0:0:0:0:0:abcd')
})
t.test('uppercase hex', (t) => {
const buf = Buffer.from([
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xab, 0xcd
])
t.alike(c.encode(ipv6, '::ABCD'), buf)
t.alike(c.decode(ipv6, buf), '0:0:0:0:0:0:0:abcd')
})
})
test('ipv6 + port', (t) => {
const host = '1:2:3:4:5:6:7:8'
const port = 1234
t.alike(c.decode(ipv6Address, c.encode(ipv6Address, { host, port })), {
host,
family: 6,
port
})
})
test('default ipv6', (t) => {
const host = null
const port = 1234
t.alike(c.decode(ipv6Address, c.encode(ipv6Address, { host, port })), {
host: '0:0:0:0:0:0:0:1',
family: 6,
port
})
})
test('dual ip', (t) => {
{
const host = '1.2.3.4'
t.alike(c.decode(ip, c.encode(ip, host)), host, 'ipv4')
}
{
const host = '1:2:3:4:5:6:7:8'
t.alike(c.decode(ip, c.encode(ip, host)), host, 'ipv6')
}
})
test('dual ip + port', (t) => {
const port = 1234
{
const host = '1.2.3.4'
t.alike(
c.decode(ipAddress, c.encode(ipAddress, { host, port })),
{
host,
family: 4,
port
},
'ipv4'
)
}
{
const host = '1:2:3:4:5:6:7:8'
t.alike(
c.decode(ipAddress, c.encode(ipAddress, { host, port })),
{
host,
family: 6,
port
},
'ipv6'
)
}
})