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.
68 lines
2.3 KiB
Python
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"
|