Add comprehensive test coverage for virSocketAddrFormatWithPrefix() to verify its behavior with both masked and unmasked address formatting.
The tests cover: - IPv4 addresses with various prefix lengths (24, 16, 8) - IPv6 addresses with /64 prefixes - Both masked output (e.g., "1.2.3.4" → "1.2.3.0/24") - And unmasked output (e.g., "1.2.3.4" → "1.2.3.4/24") - Error handling for unsupported AF_UNIX family This test suite validates the fix from the previous commit and prevents regressions in address formatting logic. Signed-off-by: Julio Faracco <[email protected]> --- tests/sockettest.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/tests/sockettest.c b/tests/sockettest.c index 5cb8a9fb72..df6ad62b6f 100644 --- a/tests/sockettest.c +++ b/tests/sockettest.c @@ -55,6 +55,22 @@ static int testFormat(virSocketAddr *addr, const char *addrstr, bool pass) } } +static int testFormatWithPrefix(virSocketAddr *addr, const char *addrstr, + unsigned int prefix, bool masked, bool pass) +{ + g_autofree char *newaddrstr = NULL; + + newaddrstr = virSocketAddrFormatWithPrefix(addr, prefix, masked); + if (!newaddrstr) + return pass ? -1 : 0; + + if (virTestCompareToString(newaddrstr, addrstr) < 0) { + return pass ? -1 : 0; + } else { + return pass ? 0 : -1; + } +} + struct testParseData { virSocketAddr *addr; const char *addrstr; @@ -78,6 +94,20 @@ static int testFormatHelper(const void *opaque) return testFormat(data->addr, data->addrstr, data->pass); } +struct testFormatWithPrefixData { + virSocketAddr *addr; + const char *addrstr; + unsigned int prefix; + bool masked; + bool pass; +}; +static int testFormatWithPrefixHelper(const void *opaque) +{ + const struct testFormatWithPrefixData *data = opaque; + return testFormatWithPrefix(data->addr, data->addrstr, data->prefix, + data->masked, data->pass); +} + static int testRange(const char *saddrstr, const char *eaddrstr, @@ -293,6 +323,32 @@ mymain(void) ret = -1; \ } while (0) +#define DO_TEST_PARSE_AND_FORMAT_WITH_PREFIX(addrstr, family, prefix, masked, pass) \ + do { \ + virSocketAddr addr = { 0 }; \ + struct testParseData data = { &addr, addrstr, family, pass }; \ + struct testFormatWithPrefixData data2 = { &addr, addrstr, prefix, masked, pass }; \ + if (virTestRun("Test parse " addrstr " family " #family, \ + testParseHelper, &data) < 0) \ + ret = -1; \ + if (virTestRun("Test format " addrstr " family " #family " with prefix /" #prefix, \ + testFormatWithPrefixHelper, &data2) < 0) \ + ret = -1; \ + } while (0) + +#define DO_TEST_PARSE_AND_CHECK_FORMAT_WITH_PREFIX(addrstr, addrformated, family, prefix, masked, pass) \ + do { \ + virSocketAddr addr = { 0 }; \ + struct testParseData data = { &addr, addrstr, family, pass }; \ + struct testFormatWithPrefixData data2 = { &addr, addrformated, prefix, masked, pass }; \ + if (virTestRun("Test parse " addrstr " family " #family, \ + testParseHelper, &data) < 0) \ + ret = -1; \ + if (virTestRun("Test format " addrstr " family " #family " with prefix /" #prefix, \ + testFormatWithPrefixHelper, &data2) < 0) \ + ret = -1; \ + } while (0) + #define DO_TEST_RANGE(saddr, eaddr, netaddr, prefix, size, pass) \ do { \ struct testRangeData data \ @@ -376,6 +432,20 @@ mymain(void) DO_TEST_PARSE_AND_FORMAT("::fffe:0:0", AF_UNSPEC, true); DO_TEST_PARSE_AND_FORMAT("::ffff:10.1.2.3", AF_UNSPEC, true); + DO_TEST_PARSE_AND_CHECK_FORMAT_WITH_PREFIX("1.2.3.4", "1.2.3.0/24", AF_INET, 24, true, true); + DO_TEST_PARSE_AND_CHECK_FORMAT_WITH_PREFIX("1.2.3.4", "1.2.3.4/24", AF_INET, 24, false, true); + DO_TEST_PARSE_AND_CHECK_FORMAT_WITH_PREFIX("10.1.1.12", "10.0.0.0/8", AF_INET, 8, true, true); + DO_TEST_PARSE_AND_CHECK_FORMAT_WITH_PREFIX("10.1.1.12", "10.1.1.12/8", AF_INET, 8, false, true); + DO_TEST_PARSE_AND_CHECK_FORMAT_WITH_PREFIX("192.168.1.124", "192.168.0.0/16", AF_INET, 16, true, true); + DO_TEST_PARSE_AND_CHECK_FORMAT_WITH_PREFIX("192.168.1.124", "192.168.1.124/16", AF_INET, 16, false, true); + DO_TEST_PARSE_AND_CHECK_FORMAT_WITH_PREFIX("2001:db8:dead:beef:1::", "2001:db8:dead:beef::/64", AF_INET6, 64, true, true); + DO_TEST_PARSE_AND_CHECK_FORMAT_WITH_PREFIX("2001:db8:dead:beef:1::", "2001:db8:dead:beef:1::/64", AF_INET6, 64, false, true); + + DO_TEST_PARSE_AND_FORMAT_WITH_PREFIX("1.2.3.4", AF_UNIX, 24, true, false); + DO_TEST_PARSE_AND_FORMAT_WITH_PREFIX("1.2.3.4", AF_UNIX, 24, false, false); + DO_TEST_PARSE_AND_FORMAT_WITH_PREFIX("2001:db8:dead:beef:1::", AF_UNIX, 64, true, false); + DO_TEST_PARSE_AND_FORMAT_WITH_PREFIX("2001:db8:dead:beef:1::", AF_UNIX, 64, false, false); + /* tests that specify a network that should contain the range */ DO_TEST_RANGE("192.168.122.1", "192.168.122.1", "192.168.122.1", 24, 1, true); DO_TEST_RANGE("192.168.122.1", "192.168.122.20", "192.168.122.22", 24, 20, true); -- 2.52.0
