test+test.ha (3328B)
1 // SPDX-License-Identifier: MPL-2.0 2 // (c) Hare authors <https://harelang.org> 3 4 use strings; 5 6 fn ip_test(s: str, expected: (addr|invalid)) void = { 7 let pr = parse(s); 8 let ip = if (pr is invalid) { 9 assert(expected is invalid); 10 return; 11 } else { 12 assert(expected is addr); 13 assert(equal(pr as addr, expected as addr)); 14 yield pr as addr; 15 }; 16 let fmted = string(ip); 17 let iprp = parse(fmted); 18 assert(iprp is addr); 19 let ipr = iprp as addr; 20 assert(equal(ip, ipr)); 21 if (ip is addr4) { 22 assert(fmted == s); 23 } else { 24 const dup = strings::dup(fmted); 25 defer free(dup); 26 assert(dup == string(ipr)); 27 }; 28 }; 29 30 @test fn parse_ip() void = { 31 let tests: [](str, (addr|invalid)) = [ 32 ("127.0.0.1", [127, 0, 0, 1]: addr4), 33 ("192.168.18.1", [192, 168, 18, 1]: addr4), 34 ("-127.0.0.1", invalid), 35 ("127.-0.0.1", invalid), 36 ("0.011.001.000", invalid), 37 ("::", [0...]: addr6), 38 ("::1", [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]: addr6), 39 ("::FFFF:FFFF", [0,0,0,0,0,0,0,0,0,0,0,0,0xFF,0xFF,0xFF,0xFF]: addr6), 40 ("::FFFF", [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xFF,0xFF]: addr6), 41 (":FFFF", invalid), 42 ("::1:1", [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1]: addr6), 43 ("1::1", [0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1]: addr6), 44 (":::1:1", invalid), 45 (":::", invalid), 46 ("::1::1", invalid), 47 ("1::::1", invalid), 48 ("FFFF::FFFF::1", invalid), 49 ("::127.0.0.1", [0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,1]: addr6), 50 ("FFFF:FFFF", invalid), 51 ("DEAD::BEef", [0xDE, 0xAD, 0,0,0,0,0,0,0,0,0,0,0,0, 0xBE, 0xEF]: addr6), 52 ("DEAD::BEef:A12D", [0xDE, 0xAD, 0,0,0,0,0,0,0,0,0,0, 0xBE, 0xEF, 0xA1, 0x2D]: addr6), 53 ("DEAD:BEef::0102:A12D", [0xDE, 0xAD,0xBE,0xEF,0,0,0,0,0,0,0,0,0x01,0x02,0xA1,0x2D]: addr6), 54 ("DEAD:BEef:::A12D", invalid), 55 ("1980:cafe:a:babe::1", [0x19, 0x80, 0xca, 0xfe, 0x0, 0xa, 0xba, 0xbe, 0, 0, 0, 0, 0, 0, 0, 1]: addr6), 56 ("a1:a2:a3:a4::b1:b2:b3:b4", invalid), 57 ("", invalid), 58 ]; 59 for (let (string, expected) .. tests) { 60 ip_test(string, expected); 61 }; 62 }; 63 64 fn subnet_test_simple(s: str) void = { 65 let net = match (parsecidr(s)) { 66 case let a: subnet => 67 yield a; 68 case => 69 return; 70 }; 71 let fmted = string(net); 72 assert(fmted == s); 73 let netrp = parsecidr(fmted); 74 assert(netrp is subnet); 75 let netr = netrp as subnet; 76 assert(equal(net.addr, netr.addr)); 77 assert(equal(net.mask, netr.mask)); 78 }; 79 80 @test fn parse_subnet() void = { 81 let subnet_tests: []str = [ 82 "192.168.1.0/0", 83 "192.168.1.0/23", 84 "192.168.1.0/24", 85 "192.168.1.0/32", 86 ]; 87 for (let test .. subnet_tests) { 88 subnet_test_simple(test); 89 }; 90 }; 91 92 @test fn test_subnet_contains() void = { 93 let addr_tests: [](str, str, bool) = [ 94 // a, b, want 95 ("10.10.10.0/24", "10.10.10.0", true), 96 ("10.10.10.0/24", "10.10.10.255", true), 97 ("10.10.10.0/24", "10.10.11.0", false), 98 ("127.0.0.1/24", "::1", false), 99 ("::1/8", "::1", true), 100 ]; 101 let cidr_tests: [](str, str, bool) = [ 102 // a, b, want 103 ("10.10.10.0/24", "10.10.10.0/24", true), 104 ("10.10.10.0/24", "10.10.10.0/25", true), 105 ("10.10.10.0/24", "10.10.10.0/23", false), 106 ("10.10.10.0/24", "10.10.11.0/24", false), 107 ]; 108 for (let (a, b, want) .. addr_tests) { 109 let a = parsecidr(a)!; 110 let b = parse(b)!; 111 assert(subnet_contains(a, b) == want); 112 }; 113 for (let (a, b, want) .. cidr_tests) { 114 let a = parsecidr(a)!; 115 let b = parsecidr(b)!; 116 assert(subnet_contains(a, b) == want); 117 }; 118 };