Functional Weave
Code in Python

net.hostname-validate@1.0.0

vectors.json

5,949 bytes · view raw

[
  {"name": "a single-label name", "args": ["router"], "expect": {"valid": true, "hostname": "router", "reason": null, "labels": 1}},
  {"name": "a fully qualified name is lower-cased", "args": ["Mail.Example.COM"], "expect": {"valid": true, "hostname": "mail.example.com", "reason": null, "labels": 3}},
  {"name": "one trailing dot (the root) is removed", "args": ["www.example.com."], "expect": {"valid": true, "hostname": "www.example.com", "reason": null, "labels": 3}},
  {"name": "RFC 1123 lets a label start with a digit", "args": ["3com.example"], "expect": {"valid": true, "hostname": "3com.example", "reason": null, "labels": 2}},
  {"name": "hyphens inside a label are fine", "args": ["core-sw-01.lan"], "expect": {"valid": true, "hostname": "core-sw-01.lan", "reason": null, "labels": 2}},
  {"name": "a 63-character label is the longest allowed", "args": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com"], "expect": {"valid": true, "hostname": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com", "reason": null, "labels": 2}},
  {"name": "253 characters is the longest name allowed", "args": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"], "expect": {"valid": true, "hostname": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "reason": null, "labels": 4}},
  {"name": "253 characters plus the trailing root dot is still allowed", "args": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb."], "expect": {"valid": true, "hostname": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "reason": null, "labels": 4}},
  {"name": "empty text", "args": [""], "expect": {"valid": false, "hostname": null, "reason": "empty", "labels": 0}},
  {"name": "the root alone is empty", "args": ["."], "expect": {"valid": false, "hostname": null, "reason": "empty", "labels": 0}},
  {"name": "254 characters is too long", "args": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"], "expect": {"valid": false, "hostname": null, "reason": "longer than 253 characters", "labels": 4}},
  {"name": "a 64-character label is too long", "args": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com"], "expect": {"valid": false, "hostname": null, "reason": "label longer than 63 characters", "labels": 2}},
  {"name": "an empty label between two dots", "args": ["a..example"], "expect": {"valid": false, "hostname": null, "reason": "empty label", "labels": 3}},
  {"name": "a leading dot makes an empty first label", "args": [".example.com"], "expect": {"valid": false, "hostname": null, "reason": "empty label", "labels": 3}},
  {"name": "two trailing dots leave an empty label", "args": ["example.com.."], "expect": {"valid": false, "hostname": null, "reason": "empty label", "labels": 3}},
  {"name": "a label may not start with a hyphen", "args": ["-router.lan"], "expect": {"valid": false, "hostname": null, "reason": "label starts or ends with a hyphen", "labels": 2}},
  {"name": "a label may not end with a hyphen", "args": ["router-.lan"], "expect": {"valid": false, "hostname": null, "reason": "label starts or ends with a hyphen", "labels": 2}},
  {"name": "an underscore is not allowed in a host name (it is in some DNS records)", "args": ["my_host.lan"], "expect": {"valid": false, "hostname": null, "reason": "character other than a letter, digit, hyphen or dot", "labels": 2}},
  {"name": "a dotted quad is an address, not a name: the top-level label is all numeric", "args": ["192.168.1.1"], "expect": {"valid": false, "hostname": null, "reason": "top-level label is all numeric", "labels": 4}},
  {"name": "an all-numeric single label is refused too", "args": ["1234"], "expect": {"valid": false, "hostname": null, "reason": "top-level label is all numeric", "labels": 1}},
  {"name": "digits in a label before a named TLD are fine", "args": ["10.0.0.1.example"], "expect": {"valid": true, "hostname": "10.0.0.1.example", "reason": null, "labels": 5}},
  {"name": "a trailing newline is not a host name", "args": ["example.com\n"], "expect": {"valid": false, "hostname": null, "reason": "character other than a letter, digit, hyphen or dot", "labels": 2}},
  {"name": "a space is not allowed", "args": ["my host"], "expect": {"valid": false, "hostname": null, "reason": "character other than a letter, digit, hyphen or dot", "labels": 1}},
  {"name": "an internationalised name must be punycoded first", "args": ["bücher.example"], "expect": {"valid": false, "hostname": null, "reason": "character other than a letter, digit, hyphen or dot", "labels": 2}},
  {"name": "Arabic-Indic digits are not ASCII digits", "args": ["host١.lan"], "expect": {"valid": false, "hostname": null, "reason": "character other than a letter, digit, hyphen or dot", "labels": 2}},
  {"name": "the punycode form of an IDN is accepted", "args": ["xn--bcher-kva.example"], "expect": {"valid": true, "hostname": "xn--bcher-kva.example", "reason": null, "labels": 2}}
]