From 6a7ffd4389e943a1bc3574274b3d0e73594cb300 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 20 Mar 2012 11:55:11 +0000 Subject: [PATCH] Add test case for virURIPtr classs To ensure we properly escape & unescape IPv6 numeric addresses, add a test case * tests/Makefile.am, tests/viruritest.c: URI parsing test Signed-off-by: Daniel P. Berrange --- tests/Makefile.am | 7 ++- tests/viruritest.c | 139 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 tests/viruritest.c diff --git a/tests/Makefile.am b/tests/Makefile.am index 0c8cf376bc..19f55237d0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -96,7 +96,7 @@ check_PROGRAMS = virshtest conftest sockettest \ commandtest commandhelper seclabeltest \ virhashtest virnetmessagetest virnetsockettest ssh \ utiltest virnettlscontexttest shunloadtest \ - virtimetest + virtimetest viruritest check_LTLIBRARIES = libshunload.la @@ -219,6 +219,7 @@ TESTS = virshtest \ virnetsockettest \ virnettlscontexttest \ virtimetest \ + viruritest \ shunloadtest \ utiltest \ $(test_scripts) @@ -506,6 +507,10 @@ virtimetest_SOURCES = \ virtimetest_CFLAGS = -Dabs_builddir="\"$(abs_builddir)\"" $(AM_CFLAGS) virtimetest_LDADD = ../src/libvirt-net-rpc.la $(LDADDS) +viruritest_SOURCES = \ + viruritest.c testutils.h testutils.c +viruritest_CFLAGS = -Dabs_builddir="\"$(abs_builddir)\"" $(AM_CFLAGS) +viruritest_LDADD = ../src/libvirt-net-rpc.la $(LDADDS) seclabeltest_SOURCES = \ seclabeltest.c diff --git a/tests/viruritest.c b/tests/viruritest.c new file mode 100644 index 0000000000..39cb3d240c --- /dev/null +++ b/tests/viruritest.c @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2012 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Daniel P. Berrange + */ + +#include + +#include +#include + +#include "testutils.h" +#include "util.h" +#include "virterror_internal.h" +#include "memory.h" +#include "logging.h" + +#include "viruri.h" + +#define VIR_FROM_THIS VIR_FROM_RPC + +struct URIParseData { + const char *uri; + const char *scheme; + const char *server; + int port; + const char *path; + const char *query; + const char *fragment; +}; + +static int testURIParse(const void *args) +{ + int ret = -1; + virURIPtr uri = NULL; + const struct URIParseData *data = args; + char *uristr; + + if (!(uri = virURIParse(data->uri))) { + virReportOOMError(); + goto cleanup; + } + + if (!(uristr = virURIFormat(uri))) { + virReportOOMError(); + goto cleanup; + } + + if (!STREQ(uristr, data->uri)) { + VIR_DEBUG("URI did not roundtrip, expect '%s', actual '%s'", + data->uri, uristr); + goto cleanup; + } + + if (!STREQ(uri->scheme, data->scheme)) { + VIR_DEBUG("Expected scheme '%s', actual '%s'", + data->scheme, uri->scheme); + goto cleanup; + } + + if (!STREQ(uri->server, data->server)) { + VIR_DEBUG("Expected server '%s', actual '%s'", + data->server, uri->server); + goto cleanup; + } + + if (uri->port != data->port) { + VIR_DEBUG("Expected port '%d', actual '%d'", + data->port, uri->port); + goto cleanup; + } + + if (!STREQ_NULLABLE(uri->path, data->path)) { + VIR_DEBUG("Expected path '%s', actual '%s'", + data->path, uri->path); + goto cleanup; + } + + if (!STREQ_NULLABLE(uri->query, data->query)) { + VIR_DEBUG("Expected query '%s', actual '%s'", + data->query, uri->query); + goto cleanup; + } + + if (!STREQ_NULLABLE(uri->fragment, data->fragment)) { + VIR_DEBUG("Expected fragment '%s', actual '%s'", + data->fragment, uri->fragment); + goto cleanup; + } + + ret = 0; +cleanup: + VIR_FREE(uristr); + xmlFreeURI(uri); + return ret; +} + + +static int +mymain(void) +{ + int ret = 0; + + signal(SIGPIPE, SIG_IGN); + +#define TEST_PARSE(uri, scheme, server, port, path, query, fragment) \ + do { \ + const struct URIParseData data = { \ + uri, scheme, server, port, path, query, fragment \ + }; \ + if (virtTestRun("Test IPv6 " # uri, 1, testURIParse, &data) < 0) \ + ret = -1; \ + } while (0) + + TEST_PARSE("test://example.com", "test", "example.com", 0, NULL, NULL, NULL); + TEST_PARSE("test://example.com:123", "test", "example.com", 123, NULL, NULL, NULL); + TEST_PARSE("test://example.com:123/system?name=value#foo", "test", "example.com", 123, "/system", "name=value", "foo"); + TEST_PARSE("test://127.0.0.1:123/system", "test", "127.0.0.1", 123, "/system", NULL, NULL); + TEST_PARSE("test://[::1]:123/system", "test", "::1", 123, "/system", NULL, NULL); + TEST_PARSE("test://[2001:41c8:1:4fd4::2]:123/system", "test", "2001:41c8:1:4fd4::2", 123, "/system", NULL, NULL); + + return (ret==0 ? EXIT_SUCCESS : EXIT_FAILURE); +} + +VIRT_TEST_MAIN(mymain)