Files
helper-tools/tests/helpers/checksums-network.test.ts
T
2026-09-01 02:33:45 +02:00

80 lines
2.7 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
adler32,
cidrContains,
digestHex,
encodeText,
fnv1a32,
formatChecksum,
formatIpv4,
formatIpv6,
parseCidr,
parseIpAddress,
parseIpv4,
parseIpv6,
crc32,
} from "../../src/helpers";
describe("checksums and cryptographic digests", () => {
it("matches published checksum vectors", async () => {
const input = encodeText("123456789");
expect(formatChecksum(crc32(input))).toBe("cbf43926");
expect(formatChecksum(adler32(input))).toBe("091e01de");
expect(formatChecksum(fnv1a32(encodeText("hello")))).toBe("4f9f2cab");
await expect(digestHex(encodeText("abc"), "SHA-256")).resolves.toBe(
"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
);
});
it("applies byte ceilings before digest work", async () => {
expect(() => crc32(new Uint8Array(2), 1)).toThrow(/limit/u);
await expect(digestHex(new Uint8Array(2), "SHA-256", 1)).rejects.toThrow(
/limit/u,
);
});
});
describe("IPv4, IPv6, and CIDR", () => {
it("parses strict IPv4 and canonical IPv6", () => {
expect(parseIpv4("192.0.2.1")).toMatchObject({
version: 4,
canonical: "192.0.2.1",
value: 3221225985n,
});
expect(formatIpv4(parseIpv4("203.0.113.4").bytes)).toBe("203.0.113.4");
expect(parseIpv6("2001:0db8:0:0:0:ff00:0042:8329").canonical).toBe(
"2001:db8::ff00:42:8329",
);
expect(parseIpv6("::ffff:192.0.2.128").canonical).toBe("::ffff:c000:280");
expect(formatIpv6(1n)).toBe("::1");
expect(parseIpAddress("::1").version).toBe(6);
});
it("computes exact network ranges and containment", () => {
const ipv4 = parseCidr("192.0.2.129/25");
expect(ipv4).toMatchObject({
canonical: "192.0.2.128/25",
size: 128n,
});
expect(ipv4.first.canonical).toBe("192.0.2.128");
expect(ipv4.last.canonical).toBe("192.0.2.255");
expect(ipv4.broadcast?.canonical).toBe("192.0.2.255");
expect(cidrContains(ipv4, "192.0.2.200")).toBe(true);
expect(cidrContains(ipv4, "192.0.3.1")).toBe(false);
const ipv6 = parseCidr("2001:db8::1/126");
expect(ipv6.canonical).toBe("2001:db8::/126");
expect(ipv6.last.canonical).toBe("2001:db8::3");
expect(cidrContains(ipv6, "2001:db8::2")).toBe(true);
});
it("rejects ambiguous and malformed addresses", () => {
expect(() => parseIpv4("127.00.0.1")).toThrow(/octet/u);
expect(() => parseIpv4("256.0.0.1")).toThrow(/255/u);
expect(() => parseIpv6("1::2::3")).toThrow(/IPv6/u);
expect(() => parseIpv6("fe80::1%eth0")).toThrow(/scoped/u);
expect(() => parseIpv6("::192.0.2.1:192.0.2.2")).toThrow(/final/u);
expect(() => parseCidr("192.0.2.1/33")).toThrow(/32/u);
});
});