Files
DECNET/tests/geoip/test_parse.py
anti f2b3393669 chore: relicense to AGPL-3.0-or-later and add SPDX headers
Replaces LICENSE (GPLv3 -> AGPLv3) and prepends
`SPDX-License-Identifier: AGPL-3.0-or-later` to every source file
across decnet/, decnet_web/, tests/, scripts/, and tools/.

Rationale: closes the GPLv3 ASP loophole so any party operating a
modified DECNET as a network service must offer their modified
source. Personal copyright (Samuel Paschuan) + inbound=outbound
contributions make a future unilateral relicense infeasible.

- LICENSE: full AGPL-3.0 text (gnu.org/licenses/agpl-3.0.txt)
- COPYRIGHT: project copyright notice
- tools/add_spdx_headers.py: idempotent header injector
  (shebang- and PEP 263-aware)

Touches 1565 source files (.py, .ts, .tsx, .js, .jsx, .css, .sh).
No behavior change; comments only.
2026-05-22 21:04:16 -04:00

68 lines
2.3 KiB
Python

# SPDX-License-Identifier: AGPL-3.0-or-later
"""Parser tests for RIR delegated-stats files."""
from __future__ import annotations
import ipaddress
from pathlib import Path
from decnet.geoip.rir.parse import parse_file
_FIXTURE = """\
2|ripencc|20260420|230000|19830101|20260419|+0000
ripencc|*|asn|*|35000|summary
ripencc|*|ipv4|*|25000|summary
ripencc|DE|ipv4|85.214.0.0|65536|20060814|allocated|abc
ripencc|GB|ipv4|46.101.0.0|65536|20120101|assigned|def
ripencc|FR|ipv6|2001:db8::|32|20100101|allocated|ghi
ripencc|*|ipv4|5.0.0.0|256|20200101|reserved|jkl
ripencc|ZZ|ipv4|6.0.0.0|256|20200101|allocated|mno
ripencc|ES|ipv4|*|0|20200101|allocated|pqr
# comment line
ripencc|IT|asn|12345|1|20100101|allocated|stu
arin|US|ipv4|8.8.8.0|256|20000101|allocated|xyz
"""
def test_parse_skips_non_ipv4_and_sentinels(tmp_path: Path) -> None:
fixture = tmp_path / "ripe.txt"
fixture.write_text(_FIXTURE)
ranges = list(parse_file(fixture))
ccs = {r[2] for r in ranges}
# v4 allocated/assigned with real country codes only.
assert ccs == {"DE", "GB", "US"}
def test_parse_range_boundaries(tmp_path: Path) -> None:
fixture = tmp_path / "arin.txt"
fixture.write_text(_FIXTURE)
ranges = [r for r in parse_file(fixture) if r[2] == "US"]
assert len(ranges) == 1
start, end, cc = ranges[0]
assert start == int(ipaddress.IPv4Address("8.8.8.0"))
assert end == int(ipaddress.IPv4Address("8.8.8.255"))
assert cc == "US"
def test_parse_lowercase_cc_is_uppercased(tmp_path: Path) -> None:
fixture = tmp_path / "apnic.txt"
fixture.write_text("apnic|jp|ipv4|1.0.0.0|256|19990101|allocated|abc\n")
ranges = list(parse_file(fixture))
assert ranges == [(int(ipaddress.IPv4Address("1.0.0.0")),
int(ipaddress.IPv4Address("1.0.0.255")),
"JP")]
def test_parse_malformed_lines_are_skipped(tmp_path: Path) -> None:
fixture = tmp_path / "broken.txt"
fixture.write_text(
"garbage\n"
"a|b|c\n"
"ripencc|DE|ipv4|not-an-ip|65536|20060814|allocated|abc\n"
"ripencc|DE|ipv4|85.214.0.0|not-a-count|20060814|allocated|abc\n"
"ripencc|DE|ipv4|85.214.0.0|65536|20060814|allocated|ok\n"
)
ranges = list(parse_file(fixture))
assert len(ranges) == 1
assert ranges[0][2] == "DE"