lldp/tests: add test for ttl

This commit is contained in:
Thomas Haller
2016-03-10 16:32:34 +01:00
parent cba9dc9d03
commit 4f8522423a

View File

@@ -105,7 +105,7 @@ typedef struct {
guint expected_num_called; guint expected_num_called;
gsize frames_len; gsize frames_len;
const TestRecvFrame *frames[10]; const TestRecvFrame *frames[10];
void (*check) (NMLldpListener *listener); void (*check) (GMainLoop *loop, NMLldpListener *listener);
} TestRecvData; } TestRecvData;
#define TEST_RECV_DATA_DEFINE(name, _expected_num_called, _check, ...) \ #define TEST_RECV_DATA_DEFINE(name, _expected_num_called, _check, ...) \
static const TestRecvData name = { \ static const TestRecvData name = { \
@@ -135,7 +135,7 @@ TEST_RECV_FRAME_DEFINE (_test_recv_data0_frame0,
); );
static void static void
_test_recv_data0_check (NMLldpListener *listener) _test_recv_data0_check (GMainLoop *loop, NMLldpListener *listener)
{ {
GVariant *neighbors, *attr; GVariant *neighbors, *attr;
gs_unref_variant GVariant *neighbor = NULL; gs_unref_variant GVariant *neighbor = NULL;
@@ -232,7 +232,7 @@ TEST_RECV_FRAME_DEFINE (_test_recv_data1_frame0,
); );
static void static void
_test_recv_data1_check (NMLldpListener *listener) _test_recv_data1_check (GMainLoop *loop, NMLldpListener *listener)
{ {
GVariant *neighbors, *attr; GVariant *neighbors, *attr;
gs_unref_variant GVariant *neighbor = NULL; gs_unref_variant GVariant *neighbor = NULL;
@@ -305,6 +305,48 @@ _test_recv_data1_check (NMLldpListener *listener)
TEST_RECV_DATA_DEFINE (_test_recv_data1, 1, _test_recv_data1_check, &_test_recv_data1_frame0); TEST_RECV_DATA_DEFINE (_test_recv_data1, 1, _test_recv_data1_check, &_test_recv_data1_frame0);
TEST_RECV_FRAME_DEFINE (_test_recv_data2_frame0_ttl1,
/* Ethernet header */
0x01, 0x80, 0xc2, 0x00, 0x00, 0x03, /* Destination MAC */
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, /* Source MAC */
0x88, 0xcc, /* Ethertype */
/* LLDP mandatory TLVs */
0x02, 0x07, 0x04, 0x00, 0x01, 0x02, /* Chassis: MAC, 00:01:02:03:04:05 */
0x03, 0x04, 0x05,
0x04, 0x04, 0x05, 0x31, 0x2f, 0x33, /* Port: interface name, "1/3" */
0x06, 0x02, 0x00, 0x01, /* TTL: 1 seconds */
/* LLDP optional TLVs */
0x08, 0x04, 0x50, 0x6f, 0x72, 0x74, /* Port Description: "Port" */
0x0a, 0x03, 0x53, 0x59, 0x53, /* System Name: "SYS" */
0x0c, 0x04, 0x66, 0x6f, 0x6f, 0x00, /* System Description: "foo" (NULL-terminated) */
0x00, 0x00 /* End Of LLDPDU */
);
static void
_test_recv_data2_ttl1_check (GMainLoop *loop, NMLldpListener *listener)
{
gulong notify_id;
GVariant *neighbors;
_test_recv_data0_check (loop, listener);
g_test_skip ("the test is known to fail");
return;
/* wait for signal. */
notify_id = g_signal_connect (listener, "notify::" NM_LLDP_LISTENER_NEIGHBORS,
nmtst_main_loop_quit_on_notify, loop);
if (!nmtst_main_loop_run (loop, 20000))
g_assert_not_reached ();
nm_clear_g_signal_handler (listener, &notify_id);
neighbors = nm_lldp_listener_get_neighbors (listener);
nmtst_assert_variant_is_of_type (neighbors, G_VARIANT_TYPE ("aa{sv}"));
g_assert_cmpint (g_variant_n_children (neighbors), ==, 0);
}
TEST_RECV_DATA_DEFINE (_test_recv_data2_ttl1, 1, _test_recv_data2_ttl1_check, &_test_recv_data2_frame0_ttl1);
static void static void
_test_recv_fixture_setup (TestRecvFixture *fixture, gconstpointer user_data) _test_recv_fixture_setup (TestRecvFixture *fixture, gconstpointer user_data)
{ {
@@ -353,13 +395,14 @@ test_recv (TestRecvFixture *fixture, gconstpointer user_data)
GMainLoop *loop; GMainLoop *loop;
TestRecvCallbackInfo info = { }; TestRecvCallbackInfo info = { };
gsize i_frames; gsize i_frames;
gulong notify_id;
listener = nm_lldp_listener_new (); listener = nm_lldp_listener_new ();
g_assert (listener != NULL); g_assert (listener != NULL);
g_assert (nm_lldp_listener_start (listener, fixture->ifindex, TEST_IFNAME, fixture->mac, ETH_ALEN, NULL)); g_assert (nm_lldp_listener_start (listener, fixture->ifindex, TEST_IFNAME, fixture->mac, ETH_ALEN, NULL));
g_signal_connect (listener, "notify::" NM_LLDP_LISTENER_NEIGHBORS, notify_id = g_signal_connect (listener, "notify::" NM_LLDP_LISTENER_NEIGHBORS,
(GCallback) lldp_neighbors_changed, &info); (GCallback) lldp_neighbors_changed, &info);
loop = g_main_loop_new (NULL, FALSE); loop = g_main_loop_new (NULL, FALSE);
for (i_frames = 0; i_frames < data->frames_len; i_frames++) { for (i_frames = 0; i_frames < data->frames_len; i_frames++) {
@@ -373,7 +416,9 @@ test_recv (TestRecvFixture *fixture, gconstpointer user_data)
g_assert_cmpint (info.num_called, ==, data->expected_num_called); g_assert_cmpint (info.num_called, ==, data->expected_num_called);
data->check (listener); nm_clear_g_signal_handler (listener, &notify_id);
data->check (loop, listener);
g_clear_pointer (&loop, g_main_loop_unref); g_clear_pointer (&loop, g_main_loop_unref);
} }
@@ -400,4 +445,5 @@ setup_tests (void)
_TEST_ADD_RECV ("/lldp/recv/0", &_test_recv_data0); _TEST_ADD_RECV ("/lldp/recv/0", &_test_recv_data0);
_TEST_ADD_RECV ("/lldp/recv/0_twice", &_test_recv_data0_twice); _TEST_ADD_RECV ("/lldp/recv/0_twice", &_test_recv_data0_twice);
_TEST_ADD_RECV ("/lldp/recv/1", &_test_recv_data1); _TEST_ADD_RECV ("/lldp/recv/1", &_test_recv_data1);
_TEST_ADD_RECV ("/lldp/recv/2_ttl1", &_test_recv_data2_ttl1);
} }