glib/gio/tests/inet-address.c
Philip Withnall 128c413261 gsocketconnectable: Add a to_string() virtual method
Add string serialisation functions for GNetworkAddress, GSocketAddress,
GUnixSocketAddress, GInetSocketAddress, GNetworkService and
GSocketConnectable. These are intended for use in debug output, not for
serialisation in network or disc protocols.

They are implemented as a new virtual method on GSocketConnectable:
g_socket_connectable_to_string().

GInetSocketAddress and GUnixSocketAddress now implement
GSocketConnectable directly to implement to_string(). Previously they
implemented it via their abstract parent class, GSocketAddress.

https://bugzilla.gnome.org/show_bug.cgi?id=737116
2015-10-13 15:42:14 +01:00

428 lines
13 KiB
C

/* Unit tests for GInetAddress
* Copyright (C) 2012 Red Hat, Inc
* Author: Matthias Clasen
*
* This work is provided "as is"; redistribution and modification
* in whole or in part, in any medium, physical or electronic is
* permitted without restriction.
*
* This work 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.
*
* In no event shall the authors or contributors be liable for any
* direct, indirect, incidental, special, exemplary, or consequential
* damages (including, but not limited to, procurement of substitute
* goods or services; loss of use, data, or profits; or business
* interruption) however caused and on any theory of liability, whether
* in contract, strict liability, or tort (including negligence or
* otherwise) arising in any way out of the use of this software, even
* if advised of the possibility of such damage.
*/
#include "config.h"
#include <gio/gio.h>
#include <gio/gnetworking.h>
static void
test_parse (void)
{
GInetAddress *addr;
addr = g_inet_address_new_from_string ("0:0:0:0:0:0:0:0");
g_assert (addr != NULL);
g_object_unref (addr);
addr = g_inet_address_new_from_string ("1:0:0:0:0:0:0:8");
g_assert (addr != NULL);
g_object_unref (addr);
addr = g_inet_address_new_from_string ("0:0:0:0:0:FFFF:204.152.189.116");
g_assert (addr != NULL);
g_object_unref (addr);
addr = g_inet_address_new_from_string ("::1");
g_assert (addr != NULL);
g_object_unref (addr);
addr = g_inet_address_new_from_string ("::");
g_assert (addr != NULL);
g_object_unref (addr);
addr = g_inet_address_new_from_string ("::FFFF:204.152.189.116");
g_assert (addr != NULL);
g_object_unref (addr);
addr = g_inet_address_new_from_string ("204.152.189.116");
g_assert (addr != NULL);
g_object_unref (addr);
addr = g_inet_address_new_from_string ("::1::2");
g_assert (addr == NULL);
addr = g_inet_address_new_from_string ("2001:1:2:3:4:5:6:7]");
g_assert (addr == NULL);
addr = g_inet_address_new_from_string ("[2001:1:2:3:4:5:6:7");
g_assert (addr == NULL);
addr = g_inet_address_new_from_string ("[2001:1:2:3:4:5:6:7]");
g_assert (addr == NULL);
addr = g_inet_address_new_from_string ("[2001:1:2:3:4:5:6:7]:80");
g_assert (addr == NULL);
addr = g_inet_address_new_from_string ("0:1:2:3:4:5:6:7:8:9");
g_assert (addr == NULL);
addr = g_inet_address_new_from_string ("::FFFFFFF");
g_assert (addr == NULL);
addr = g_inet_address_new_from_string ("204.152.189.116:80");
g_assert (addr == NULL);
}
static void
test_any (void)
{
GInetAddress *addr;
GSocketFamily family[2] = { G_SOCKET_FAMILY_IPV4, G_SOCKET_FAMILY_IPV6 };
gsize size[2] = { 4, 16 };
gint i;
for (i = 0; i < 2; i++)
{
addr = g_inet_address_new_any (family[i]);
g_assert (g_inet_address_get_is_any (addr));
g_assert (g_inet_address_get_family (addr) == family[i]);
g_assert (g_inet_address_get_native_size (addr) == size[i]);
g_assert (!g_inet_address_get_is_loopback (addr));
g_assert (!g_inet_address_get_is_link_local (addr));
g_assert (!g_inet_address_get_is_site_local (addr));
g_assert (!g_inet_address_get_is_multicast (addr));
g_assert (!g_inet_address_get_is_mc_global (addr));
g_assert (!g_inet_address_get_is_mc_link_local (addr));
g_assert (!g_inet_address_get_is_mc_node_local (addr));
g_assert (!g_inet_address_get_is_mc_org_local (addr));
g_assert (!g_inet_address_get_is_mc_site_local (addr));
g_object_unref (addr);
}
}
static void
test_loopback (void)
{
GInetAddress *addr;
addr = g_inet_address_new_from_string ("::1");
g_assert (g_inet_address_get_family (addr) == G_SOCKET_FAMILY_IPV6);
g_assert (g_inet_address_get_is_loopback (addr));
g_object_unref (addr);
addr = g_inet_address_new_from_string ("127.0.0.0");
g_assert (g_inet_address_get_family (addr) == G_SOCKET_FAMILY_IPV4);
g_assert (g_inet_address_get_is_loopback (addr));
g_object_unref (addr);
}
static void
test_bytes (void)
{
GInetAddress *addr1, *addr2, *addr3;
const guint8 *bytes;
addr1 = g_inet_address_new_from_string ("192.168.0.100");
addr2 = g_inet_address_new_from_string ("192.168.0.101");
bytes = g_inet_address_to_bytes (addr1);
addr3 = g_inet_address_new_from_bytes (bytes, G_SOCKET_FAMILY_IPV4);
g_assert (!g_inet_address_equal (addr1, addr2));
g_assert (g_inet_address_equal (addr1, addr3));
g_object_unref (addr1);
g_object_unref (addr2);
g_object_unref (addr3);
}
static void
test_property (void)
{
GInetAddress *addr;
GSocketFamily family;
const guint8 *bytes;
gboolean any;
gboolean loopback;
gboolean link_local;
gboolean site_local;
gboolean multicast;
gboolean mc_global;
gboolean mc_link_local;
gboolean mc_node_local;
gboolean mc_org_local;
gboolean mc_site_local;
addr = g_inet_address_new_from_string ("ff85::");
g_object_get (addr,
"family", &family,
"bytes", &bytes,
"is-any", &any,
"is-loopback", &loopback,
"is-link-local", &link_local,
"is-site-local", &site_local,
"is-multicast", &multicast,
"is-mc-global", &mc_global,
"is-mc-link-local", &mc_link_local,
"is-mc-node-local", &mc_node_local,
"is-mc-org-local", &mc_org_local,
"is-mc-site-local", &mc_site_local,
NULL);
g_assert (family == G_SOCKET_FAMILY_IPV6);
g_assert (!any);
g_assert (!loopback);
g_assert (!link_local);
g_assert (!site_local);
g_assert (multicast);
g_assert (!mc_global);
g_assert (!mc_link_local);
g_assert (!mc_node_local);
g_assert (!mc_org_local);
g_assert (mc_site_local);
g_object_unref (addr);
}
static void
test_socket_address (void)
{
GInetAddress *addr;
GInetSocketAddress *saddr;
guint port;
guint32 flowinfo;
guint32 scope_id;
GSocketFamily family;
addr = g_inet_address_new_from_string ("::ffff:125.1.15.5");
saddr = G_INET_SOCKET_ADDRESS (g_inet_socket_address_new (addr, 308));
g_assert (g_inet_address_equal (addr, g_inet_socket_address_get_address (saddr)));
g_object_unref (addr);
g_assert (g_inet_socket_address_get_port (saddr) == 308);
g_assert (g_inet_socket_address_get_flowinfo (saddr) == 0);
g_assert (g_inet_socket_address_get_scope_id (saddr) == 0);
g_object_unref (saddr);
addr = g_inet_address_new_from_string ("::1");
saddr = G_INET_SOCKET_ADDRESS (g_object_new (G_TYPE_INET_SOCKET_ADDRESS,
"address", addr,
"port", 308,
"flowinfo", 10,
"scope-id", 25,
NULL));
g_object_unref (addr);
g_assert (g_inet_socket_address_get_port (saddr) == 308);
g_assert (g_inet_socket_address_get_flowinfo (saddr) == 10);
g_assert (g_inet_socket_address_get_scope_id (saddr) == 25);
g_object_get (saddr,
"family", &family,
"address", &addr,
"port", &port,
"flowinfo", &flowinfo,
"scope-id", &scope_id,
NULL);
g_assert (family == G_SOCKET_FAMILY_IPV6);
g_assert (addr != NULL);
g_assert (port == 308);
g_assert (flowinfo == 10);
g_assert (scope_id == 25);
g_object_unref (addr);
g_object_unref (saddr);
}
static void
test_socket_address_to_string (void)
{
GSocketAddress *sa = NULL;
GInetAddress *ia = NULL;
gchar *str = NULL;
/* IPv4. */
ia = g_inet_address_new_from_string ("123.1.123.1");
sa = g_inet_socket_address_new (ia, 80);
str = g_socket_connectable_to_string (G_SOCKET_CONNECTABLE (sa));
g_assert_cmpstr (str, ==, "123.1.123.1:80");
g_free (str);
g_object_unref (sa);
g_object_unref (ia);
/* IPv6. */
ia = g_inet_address_new_from_string ("::80");
sa = g_inet_socket_address_new (ia, 80);
str = g_socket_connectable_to_string (G_SOCKET_CONNECTABLE (sa));
g_assert_cmpstr (str, ==, "[::80]:80");
g_free (str);
g_object_unref (sa);
g_object_unref (ia);
/* IPv6 without port. */
ia = g_inet_address_new_from_string ("::80");
sa = g_inet_socket_address_new (ia, 0);
str = g_socket_connectable_to_string (G_SOCKET_CONNECTABLE (sa));
g_assert_cmpstr (str, ==, "::80");
g_free (str);
g_object_unref (sa);
g_object_unref (ia);
/* IPv6 with scope. */
ia = g_inet_address_new_from_string ("::1");
sa = G_SOCKET_ADDRESS (g_object_new (G_TYPE_INET_SOCKET_ADDRESS,
"address", ia,
"port", 123,
"flowinfo", 10,
"scope-id", 25,
NULL));
str = g_socket_connectable_to_string (G_SOCKET_CONNECTABLE (sa));
g_assert_cmpstr (str, ==, "[::1%25]:123");
g_free (str);
g_object_unref (sa);
g_object_unref (ia);
}
static void
test_mask_parse (void)
{
GInetAddressMask *mask;
GError *error = NULL;
mask = g_inet_address_mask_new_from_string ("10.0.0.0/8", &error);
g_assert_no_error (error);
g_assert (mask != NULL);
g_object_unref (mask);
mask = g_inet_address_mask_new_from_string ("fe80::/10", &error);
g_assert_no_error (error);
g_assert (mask != NULL);
g_object_unref (mask);
mask = g_inet_address_mask_new_from_string ("::", &error);
g_assert_no_error (error);
g_assert (mask != NULL);
g_object_unref (mask);
mask = g_inet_address_mask_new_from_string ("::/abc", &error);
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT);
g_assert (mask == NULL);
g_clear_error (&error);
mask = g_inet_address_mask_new_from_string ("127.0.0.1/128", &error);
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT);
g_assert (mask == NULL);
g_clear_error (&error);
}
static void
test_mask_property (void)
{
GInetAddressMask *mask;
GInetAddress *addr;
GSocketFamily family;
guint len;
addr = g_inet_address_new_from_string ("fe80::");
mask = g_inet_address_mask_new_from_string ("fe80::/10", NULL);
g_assert (g_inet_address_mask_get_family (mask) == G_SOCKET_FAMILY_IPV6);
g_assert (g_inet_address_equal (addr, g_inet_address_mask_get_address (mask)));
g_assert (g_inet_address_mask_get_length (mask) == 10);
g_object_unref (addr);
g_object_get (mask,
"family", &family,
"address", &addr,
"length", &len,
NULL);
g_assert (family == G_SOCKET_FAMILY_IPV6);
g_assert (addr != NULL);
g_assert (len == 10);
g_object_unref (addr);
g_object_unref (mask);
}
static void
test_mask_equal (void)
{
GInetAddressMask *mask;
GInetAddressMask *mask2;
gchar *str;
mask = g_inet_address_mask_new_from_string ("fe80:0:0::/10", NULL);
str = g_inet_address_mask_to_string (mask);
g_assert_cmpstr (str, ==, "fe80::/10");
mask2 = g_inet_address_mask_new_from_string (str, NULL);
g_assert (g_inet_address_mask_equal (mask, mask2));
g_object_unref (mask2);
g_free (str);
mask2 = g_inet_address_mask_new_from_string ("fe80::/12", NULL);
g_assert (!g_inet_address_mask_equal (mask, mask2));
g_object_unref (mask2);
mask2 = g_inet_address_mask_new_from_string ("ff80::/10", NULL);
g_assert (!g_inet_address_mask_equal (mask, mask2));
g_object_unref (mask2);
g_object_unref (mask);
}
static void
test_mask_match (void)
{
GInetAddressMask *mask;
GInetAddress *addr;
mask = g_inet_address_mask_new_from_string ("1.2.0.0/16", NULL);
addr = g_inet_address_new_from_string ("1.2.0.0");
g_assert (g_inet_address_mask_matches (mask, addr));
g_object_unref (addr);
addr = g_inet_address_new_from_string ("1.2.3.4");
g_assert (g_inet_address_mask_matches (mask, addr));
g_object_unref (addr);
addr = g_inet_address_new_from_string ("1.3.1.1");
g_assert (!g_inet_address_mask_matches (mask, addr));
g_object_unref (addr);
g_object_unref (mask);
mask = g_inet_address_mask_new_from_string ("1.2.0.0/24", NULL);
addr = g_inet_address_new_from_string ("1.2.0.0");
g_assert (g_inet_address_mask_matches (mask, addr));
g_object_unref (addr);
addr = g_inet_address_new_from_string ("1.2.3.4");
g_assert (!g_inet_address_mask_matches (mask, addr));
g_object_unref (addr);
addr = g_inet_address_new_from_string ("1.2.0.24");
g_assert (g_inet_address_mask_matches (mask, addr));
g_object_unref (addr);
g_object_unref (mask);
}
int
main (int argc, char *argv[])
{
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/inet-address/parse", test_parse);
g_test_add_func ("/inet-address/any", test_any);
g_test_add_func ("/inet-address/loopback", test_loopback);
g_test_add_func ("/inet-address/bytes", test_bytes);
g_test_add_func ("/inet-address/property", test_property);
g_test_add_func ("/socket-address/basic", test_socket_address);
g_test_add_func ("/socket-address/to-string", test_socket_address_to_string);
g_test_add_func ("/address-mask/parse", test_mask_parse);
g_test_add_func ("/address-mask/property", test_mask_property);
g_test_add_func ("/address-mask/equal", test_mask_equal);
g_test_add_func ("/address-mask/match", test_mask_match);
return g_test_run ();
}