X-Git-Url: http://git.pk910.de/?p=ircu2.10.12-pk.git;a=blobdiff_plain;f=ircd%2Ftest%2Fircd_in_addr_t.c;h=381460789508a7cb0911744a1b4b571ca9efae7e;hp=90dd3194318f3f18c35e8bd7b00712ac7c998b33;hb=b7f25dcf93cc44cd9f5b4132c976e72118bcd44f;hpb=0b0c08bc68c523b72bbd94f23f7e080f287d5623 diff --git a/ircd/test/ircd_in_addr_t.c b/ircd/test/ircd_in_addr_t.c index 90dd319..3814607 100644 --- a/ircd/test/ircd_in_addr_t.c +++ b/ircd/test/ircd_in_addr_t.c @@ -29,17 +29,23 @@ static struct address_test test_addrs[] = { {{ 0, 0, 0, 0, 0, 0, 0, 1 }}, "AAAAAA", "_AAB", 1, 0, 1 }, { "127.0.0.1", "127.0.0.1", - {{ 0, 0, 0, 0, 0, 0, 0x7f00, 1 }}, + {{ 0, 0, 0, 0, 0, 0xffff, 0x7f00, 1 }}, "B]AAAB", "B]AAAB", 1, 1, 1 }, { "::ffff:127.0.0.3", "127.0.0.3", {{ 0, 0, 0, 0, 0, 0xffff, 0x7f00, 3 }}, "B]AAAD", "B]AAAD", 1, 1, 1 }, + { "::127.0.0.1", "127.0.0.1", + {{ 0, 0, 0, 0, 0, 0, 0x7f00, 1 }}, + "B]AAAB", "B]AAAB", 1, 1, 1 }, { "2002:7f00:3::1", "2002:7f00:3::1", {{ 0x2002, 0x7f00, 3, 0, 0, 0, 0, 1 }}, "B]AAAD", "CACH8AAAD_AAB", 1, 0, 0 }, { "8352:0344:0:0:0:0:2001:1204", "8352:344::2001:1204", {{ 0x8352, 0x344, 0, 0, 0, 0, 0x2001, 0x1204 }}, "AAAAAA", "INSANE_CABBIE", 1, 0, 0 }, + { "1:2:3:4:5:6:7:8", "1:2:3:4:5:6:7:8", + {{ 1, 2, 3, 4, 5, 6, 7, 8 }}, + "AAAAAA", "AABAACAADAAEAAFAAGAAHAAI", 1, 0, 0 }, { 0 }, }; @@ -77,16 +83,93 @@ test_address(struct address_test *addr) assert(!!val == addr->is_ipv4); val = irc_in_addr_is_loopback(&parsed); assert(!!val == addr->is_loopback); + /* Check base64-to-IP conversion. */ + if (addr->is_ipv4) { + base64toip(addr->base64_v4, &parsed); + assert(!memcmp(parsed.in6_16+6, addr->expected.in6_16+6, 4)); + } else { + base64toip(addr->base64_v6, &parsed); + assert(!memcmp(&parsed, &addr->expected, sizeof(parsed))); + } + /* Tests completed. */ printf("Passed: %s (%s/%s)\n", addr->text, base64_v4, base64_v6); } +/** Structure to describe a test for IP mask parsing. */ +struct ipmask_test { + const char *text; /**< Textual IP mask to parse. */ + struct irc_in_addr expected; /**< Canonical form of address. */ + unsigned int is_ipmask : 1; /**< Parse as an ipmask? */ + unsigned int is_parseable : 1; /**< Is address parseable? */ + unsigned int exp_bits : 8; /**< Number of bits expected in netmask */ +}; + +/** Array of ipmasks to test with. */ +static struct ipmask_test test_masks[] = { + { "::", {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 1, 1, 128 }, + { "::/0", {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 1, 1, 0 }, + { "::10.0.0.0", {{ 0, 0, 0, 0, 0, 0, 0xa00, 0 }}, 1, 1, 128 }, + { "192.168/16", {{ 0, 0, 0, 0, 0, 0xffff, 0xc0a8, 0 }}, 1, 1, 112 }, + { "192.*", {{ 0, 0, 0, 0, 0, 0xffff, 0xc000, 0 }}, 1, 1, 104 }, + { "192.*.*.*", {{ 0, 0, 0, 0, 0, 0xffff, 0xc000, 0 }}, 1, 1, 104 }, + { "192.*/8", {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 1, 0, 0 }, + { "192*", {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 1, 0, 0 }, + { "192.168.0.0/16", {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0, 0, 0 }, + { "ab.*", {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 1, 0, 0 }, + { "a*", {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 1, 0, 0 }, + { "*", {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 1, 1, 0 }, + { "a:b", {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 1, 0, 0 }, + { "a::*", {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 1, 0, 0 }, + { "a:*", {{ 0xa, 0, 0, 0, 0, 0, 0, 0 }}, 1, 1, 16 }, + { "a:*:*", {{ 0xa, 0, 0, 0, 0, 0, 0, 0 }}, 1, 1, 16 }, + { "a:/16", {{ 0xa, 0, 0, 0, 0, 0, 0, 0 }}, 1, 1, 16 }, + { "0.0.0.0.0/1", {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 0, 0, 0 }, + { "2607:3f00:1:30c:9999*", + {{ 0x2607, 0x3f00, 1, 0x30c, 0x9999, 0, 0, 0 }}, 1, 1, 80 }, + { "1234:5678:9abc:def0:feed:abba:cabb:1e55::", + {{ 0, 0, 0, 0, 0, 0, 0, 0 }}, 1, 0, 0 }, + { 0 } +}; + +/** Perform tests for a single IP mask. + * @param[in] mask IP mask test structure. + */ +static void +test_ipmask(struct ipmask_test *mask) +{ + struct irc_in_addr parsed; + unsigned int len, ii; + unsigned char bits = 0; + + /* Convert expected address to network order. */ + for (ii = 0; ii < 8; ++ii) + mask->expected.in6_16[ii] = htons(mask->expected.in6_16[ii]); + /* Try to parse; make sure its parseability and netmask length are + * as expected. */ + len = ipmask_parse(mask->text, &parsed, mask->is_ipmask ? &bits : 0); + assert(!!len == mask->is_parseable); + if (!len) { + printf("X-Fail: %s\n", mask->text); + return; + } + if (mask->is_ipmask) + assert(bits == mask->exp_bits); + assert(!memcmp(&parsed, &mask->expected, sizeof(parsed))); + printf("Passed: %s (%s/%u)\n", mask->text, ircd_ntoa(&parsed), bits); +} + int main(int argc, char *argv[]) { unsigned int ii; + printf("Testing address parsing..\n"); for (ii = 0; test_addrs[ii].text; ++ii) test_address(&test_addrs[ii]); + printf("\nTesting ipmask parsing..\n"); + for (ii = 0; test_masks[ii].text; ++ii) + test_ipmask(&test_masks[ii]); + return 0; }