END_TEST START_TEST(test_ip_address) { DESCRIBE_TEST; struct cork_ip addr; #define GOOD(str, normalized) \ { \ struct cork_ip addr; \ fail_if_error(cork_ip_init(&addr, str)); \ char actual[CORK_IP_STRING_LENGTH]; \ cork_ip_to_raw_string(&addr, actual); \ fail_unless(strcmp(actual, normalized) == 0, \ "Unexpected string representation: " \ "got \"%s\", expected \"%s\"", \ actual, normalized); \ \ struct cork_ip addr2; \ cork_ip_init(&addr2, normalized); \ fail_unless(cork_ip_equal(&addr, &addr2), \ "IP instances should be equal"); \ } #define BAD(str, unused) \ { \ struct cork_ip addr; \ fail_unless_error \ (cork_ip_init(&addr, str), \ "Shouldn't be able to initialize IP address from \"%s\"", \ str); \ } IPV4_TESTS(GOOD, BAD); IPV6_TESTS(GOOD, BAD); #undef GOOD #undef BAD struct cork_ipv4 addr4; struct cork_ipv6 addr6; fprintf(stderr, "Testing IP address versions\n"); cork_ip_init(&addr, "192.168.1.1"); cork_ipv4_init(&addr4, "192.168.1.1"); fail_unless(addr.version == 4, "Unexpected IP address version (expected 4, got %u)", addr.version); fail_unless(cork_ipv4_equal(&addr.ip.v4, &addr4), "IP addresses should be equal"); cork_ip_init(&addr, "fe80::1"); cork_ipv6_init(&addr6, "fe80::1"); fail_unless(addr.version == 6, "Unexpected IP address version (expected 6, got %u)", addr.version); fail_unless(cork_ipv6_equal(&addr.ip.v6, &addr6), "IP addresses should be equal"); }
bool cork_ip_equal(const struct cork_ip *addr1, const struct cork_ip *addr2) { if (addr1 == addr2) { return true; } if (!addr1 || !addr2) { return false; } if (addr1->version != addr2->version) { return false; } switch (addr1->version) { case 4: return cork_ipv4_equal(&addr1->ip.v4, &addr2->ip.v4); case 6: return cork_ipv6_equal(&addr1->ip.v6, &addr2->ip.v6); default: return false; } }