summaryrefslogtreecommitdiff
path: root/src/platform/tests/test-address.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/tests/test-address.c')
-rw-r--r--src/platform/tests/test-address.c173
1 files changed, 134 insertions, 39 deletions
diff --git a/src/platform/tests/test-address.c b/src/platform/tests/test-address.c
index 902bc43dfb..3c62e55139 100644
--- a/src/platform/tests/test-address.c
+++ b/src/platform/tests/test-address.c
@@ -4,10 +4,14 @@
#define DEVICE_NAME "nm-test-device"
#define IP4_ADDRESS "192.0.2.1"
+#define IP4_ADDRESS_PEER "192.0.2.2"
+#define IP4_ADDRESS_PEER2 "192.0.3.1"
#define IP4_PLEN 24
#define IP6_ADDRESS "2001:db8:a:b:1:2:3:4"
#define IP6_PLEN 64
+static int DEVICE_IFINDEX = -1;
+
static void
ip4_address_callback (NMPlatform *platform, NMPObjectType obj_type, int ifindex, NMPlatformIP4Address *received, NMPlatformSignalChangeType change_type, NMPlatformReason reason, SignalData *data)
{
@@ -51,7 +55,7 @@ ip6_address_callback (NMPlatform *platform, NMPObjectType obj_type, int ifindex,
static void
test_ip4_address (void)
{
- int ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
+ const int ifindex = DEVICE_IFINDEX;
SignalData *address_added = add_signal_ifindex (NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_ADDED, ip4_address_callback, ifindex);
SignalData *address_changed = add_signal_ifindex (NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_CHANGED, ip4_address_callback, ifindex);
SignalData *address_removed = add_signal_ifindex (NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, ip4_address_callback, ifindex);
@@ -99,7 +103,7 @@ test_ip4_address (void)
static void
test_ip6_address (void)
{
- int ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
+ const int ifindex = DEVICE_IFINDEX;
SignalData *address_added = add_signal_ifindex (NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_ADDED, ip6_address_callback, ifindex);
SignalData *address_changed = add_signal_ifindex (NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_CHANGED, ip6_address_callback, ifindex);
SignalData *address_removed = add_signal_ifindex (NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, ip6_address_callback, ifindex);
@@ -148,9 +152,9 @@ test_ip6_address (void)
static void
test_ip4_address_external (void)
{
+ const int ifindex = DEVICE_IFINDEX;
SignalData *address_added = add_signal (NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_ADDED, ip4_address_callback);
SignalData *address_removed = add_signal (NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, ip4_address_callback);
- int ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
in_addr_t addr;
guint32 lifetime = 2000;
guint32 preferred = 1000;
@@ -161,27 +165,21 @@ test_ip4_address_external (void)
/* Looks like addresses are not announced by kerenl when the interface
* is down. Link-local IPv6 address is automatically added.
*/
- g_assert (nm_platform_link_set_up (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME), NULL));
+ g_assert (nm_platform_link_set_up (NM_PLATFORM_GET, DEVICE_IFINDEX, NULL));
/* Add/delete notification */
- run_command ("ip address add %s/%d dev %s valid_lft %d preferred_lft %d",
- IP4_ADDRESS, IP4_PLEN, DEVICE_NAME, lifetime, preferred);
- wait_signal (address_added);
+ nmtstp_ip4_address_add (-1, ifindex, addr, IP4_PLEN, 0, lifetime, preferred, NULL);
+ accept_signal (address_added);
g_assert (nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, 0));
- run_command ("ip address delete %s/%d dev %s", IP4_ADDRESS, IP4_PLEN, DEVICE_NAME);
- wait_signal (address_removed);
+ nmtstp_ip4_address_del (-1, ifindex, addr, IP4_PLEN, 0);
+ accept_signal (address_removed);
g_assert (!nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, 0));
/* Add/delete conflict */
- run_command ("ip address add %s/%d dev %s valid_lft %d preferred_lft %d",
- IP4_ADDRESS, IP4_PLEN, DEVICE_NAME, lifetime, preferred);
+ nmtstp_ip4_address_add (-1, ifindex, addr, IP4_PLEN, 0, lifetime, preferred, NULL);
g_assert (nm_platform_ip4_address_add (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, 0, lifetime, preferred, NULL));
g_assert (nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, 0));
accept_signal (address_added);
- /*run_command ("ip address delete %s/%d dev %s", IP4_ADDRESS, IP4_PLEN, DEVICE_NAME);
- g_assert (nm_platform_ip4_address_delete (ifindex, addr, IP4_PLEN, 0));
- g_assert (!nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, 0));
- accept_signal (address_removed);*/
free_signal (address_added);
free_signal (address_removed);
@@ -190,9 +188,9 @@ test_ip4_address_external (void)
static void
test_ip6_address_external (void)
{
+ const int ifindex = DEVICE_IFINDEX;
SignalData *address_added = add_signal (NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_ADDED, ip6_address_callback);
SignalData *address_removed = add_signal (NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, ip6_address_callback);
- int ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
struct in6_addr addr;
guint32 lifetime = 2000;
guint32 preferred = 1000;
@@ -201,51 +199,148 @@ test_ip6_address_external (void)
inet_pton (AF_INET6, IP6_ADDRESS, &addr);
/* Add/delete notification */
- run_command ("ip address add %s/%d dev %s valid_lft %d preferred_lft %d",
- IP6_ADDRESS, IP6_PLEN, DEVICE_NAME, lifetime, preferred);
- wait_signal (address_added);
+ nmtstp_ip6_address_add (-1, ifindex, addr, IP6_PLEN, in6addr_any, lifetime, preferred, 0);
+ accept_signal (address_added);
g_assert (nm_platform_ip6_address_get (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
- run_command ("ip address delete %s/%d dev %s", IP6_ADDRESS, IP6_PLEN, DEVICE_NAME);
- wait_signal (address_removed);
+
+ nmtstp_ip6_address_del (-1, ifindex, addr, IP6_PLEN);
+ accept_signal (address_removed);
g_assert (!nm_platform_ip6_address_get (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
/* Add/delete conflict */
- run_command ("ip address add %s/%d dev %s valid_lft %d preferred_lft %d",
- IP6_ADDRESS, IP6_PLEN, DEVICE_NAME, lifetime, preferred);
+ nmtstp_ip6_address_add (-1, ifindex, addr, IP6_PLEN, in6addr_any, lifetime, preferred, 0);
+ accept_signal (address_added);
+ g_assert (nm_platform_ip6_address_get (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
+
g_assert (nm_platform_ip6_address_add (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN, in6addr_any, lifetime, preferred, flags));
+ ensure_no_signal (address_added);
g_assert (nm_platform_ip6_address_get (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
+
+ free_signal (address_added);
+ free_signal (address_removed);
+}
+
+/*****************************************************************************/
+
+static void
+test_ip4_address_external_peer (void)
+{
+ const int ifindex = DEVICE_IFINDEX;
+ SignalData *address_added = add_signal (NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_ADDED, ip4_address_callback);
+ SignalData *address_removed = add_signal (NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, ip4_address_callback);
+ in_addr_t addr, addr_peer, addr_peer2;
+ guint32 lifetime = 2000;
+ guint32 preferred = 1000;
+ const NMPlatformIP4Address *a;
+
+ inet_pton (AF_INET, IP4_ADDRESS, &addr);
+ inet_pton (AF_INET, IP4_ADDRESS_PEER, &addr_peer);
+ inet_pton (AF_INET, IP4_ADDRESS_PEER2, &addr_peer2);
+ g_assert (ifindex > 0);
+
+ g_assert (addr != addr_peer);
+
+ g_assert (nm_platform_link_set_up (NM_PLATFORM_GET, ifindex, NULL));
+ accept_signals (address_removed, 0, G_MAXINT);
+ accept_signals (address_added, 0, G_MAXINT);
+
+ /* Add/delete notification */
+ nmtstp_ip4_address_add (-1, ifindex, addr, IP4_PLEN, addr_peer, lifetime, preferred, NULL);
accept_signal (address_added);
- /*run_command ("ip address delete %s/%d dev %s", IP6_ADDRESS, IP6_PLEN, DEVICE_NAME);
- g_assert (nm_platform_ip6_address_delete (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
- g_assert (!nm_platform_ip6_address_get (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
- wait_signal (address_removed);*/
+ g_assert ((a = nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr_peer)));
+ g_assert (!nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr_peer2));
+
+ nmtstp_ip_address_assert_lifetime ((NMPlatformIPAddress *) a, -1, lifetime, preferred);
+
+ nmtstp_ip4_address_add (-1, ifindex, addr, IP4_PLEN, addr_peer2, lifetime, preferred, NULL);
+ accept_signal (address_added);
+ g_assert (nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr_peer));
+ g_assert ((a = nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr_peer2)));
+
+ nmtstp_ip_address_assert_lifetime ((NMPlatformIPAddress *) a, -1, lifetime, preferred);
+
+ g_assert (addr != addr_peer);
+ nmtstp_ip4_address_del (-1, ifindex, addr, IP4_PLEN, addr_peer);
+ accept_signal (address_removed);
+ g_assert (!nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr_peer));
+ g_assert (nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr_peer2));
free_signal (address_added);
free_signal (address_removed);
}
+/*****************************************************************************/
+
void
init_tests (int *argc, char ***argv)
{
nmtst_init_with_logging (argc, argv, NULL, "ALL");
}
-void
-setup_tests (void)
+/*****************************************************************************
+ * SETUP TESTS
+ *****************************************************************************/
+
+typedef struct {
+ const char *testpath;
+ GTestFunc test_func;
+} TestSetup;
+
+static void
+_test_setup_free (gpointer data)
+{
+ g_free (data);
+}
+
+static void
+_g_test_run (gconstpointer user_data)
{
- SignalData *link_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_ADDED, link_callback, DEVICE_NAME);
+ const TestSetup *s = user_data;
+ int ifindex;
+
+ nm_log_trace (LOGD_PLATFORM, ">>> TEST: start %s", s->testpath);
nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME));
g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
- g_assert (nm_platform_dummy_add (NM_PLATFORM_GET, DEVICE_NAME, NULL) == NM_PLATFORM_ERROR_SUCCESS);
- accept_signal (link_added);
- free_signal (link_added);
+ g_assert_cmpint (nm_platform_dummy_add (NM_PLATFORM_GET, DEVICE_NAME, NULL), ==, NM_PLATFORM_ERROR_SUCCESS);
+
+ ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
+ g_assert_cmpint (ifindex, >, 0);
+ g_assert_cmpint (DEVICE_IFINDEX, ==, -1);
+
+ DEVICE_IFINDEX = ifindex;
+
+ s->test_func ();
+
+ g_assert_cmpint (DEVICE_IFINDEX, ==, ifindex);
+ DEVICE_IFINDEX = -1;
+
+ g_assert_cmpint (ifindex, ==, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME));
+ g_assert (nm_platform_link_delete (NM_PLATFORM_GET, ifindex));
+ nm_log_trace (LOGD_PLATFORM, ">>> TEST: finished %s", s->testpath);
+}
+
+static void
+_g_test_add_func (const char *testpath,
+ GTestFunc test_func)
+{
+ TestSetup *s;
+
+ s = g_new0 (TestSetup, 1);
+ s->testpath = testpath;
+ s->test_func = test_func;
+
+ g_test_add_data_func_full (testpath, s, _g_test_run, _test_setup_free);
+}
+
+void
+setup_tests (void)
+{
+ _g_test_add_func ("/address/internal/ip4", test_ip4_address);
+ _g_test_add_func ("/address/internal/ip6", test_ip6_address);
- g_test_add_func ("/address/internal/ip4", test_ip4_address);
- g_test_add_func ("/address/internal/ip6", test_ip6_address);
+ _g_test_add_func ("/address/external/ip4", test_ip4_address_external);
+ _g_test_add_func ("/address/external/ip6", test_ip6_address_external);
- if (strcmp (g_type_name (G_TYPE_FROM_INSTANCE (nm_platform_get ())), "NMFakePlatform")) {
- g_test_add_func ("/address/external/ip4", test_ip4_address_external);
- g_test_add_func ("/address/external/ip6", test_ip6_address_external);
- }
+ _g_test_add_func ("/address/external/ip4-peer", test_ip4_address_external_peer);
}