From 2d50370e077b1a94820bc4ca484d3a2cc8ccf07b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 7 Jun 2020 23:11:48 +0200 Subject: [PATCH] lldp/tests: add test for parsing LLDP frame --- src/devices/nm-lldp-listener.c | 28 ++++++++++++++++++++++++++++ src/devices/nm-lldp-listener.h | 3 +++ src/devices/tests/test-lldp.c | 27 +++++++++++++++++++++++++-- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/devices/nm-lldp-listener.c b/src/devices/nm-lldp-listener.c index 22f356d115..decc97e55d 100644 --- a/src/devices/nm-lldp-listener.c +++ b/src/devices/nm-lldp-listener.c @@ -815,6 +815,34 @@ lldp_neighbor_to_variant (LldpNeighbor *neigh) /*****************************************************************************/ +GVariant * +nmtst_lldp_parse_from_raw (const guint8 *raw_data, + gsize raw_len) +{ + nm_auto (sd_lldp_neighbor_unrefp) sd_lldp_neighbor *neighbor_sd = NULL; + nm_auto (lldp_neighbor_freep) LldpNeighbor *neigh = NULL; + gs_free_error GError *error = NULL; + GVariant *variant; + int r; + + g_assert (raw_data); + g_assert (raw_len > 0); + + r = sd_lldp_neighbor_from_raw (&neighbor_sd, raw_data, raw_len); + g_assert (r >= 0); + + neigh = lldp_neighbor_new (neighbor_sd, &error); + g_assert (neigh); + g_assert (!error); + + variant = lldp_neighbor_to_variant (neigh); + g_assert (variant); + + return g_variant_ref (variant); +} + +/*****************************************************************************/ + static void data_changed_notify (NMLldpListener *self, NMLldpListenerPrivate *priv) { diff --git a/src/devices/nm-lldp-listener.h b/src/devices/nm-lldp-listener.h index 92e1d00ffd..adea91b8d9 100644 --- a/src/devices/nm-lldp-listener.h +++ b/src/devices/nm-lldp-listener.h @@ -25,4 +25,7 @@ gboolean nm_lldp_listener_is_running (NMLldpListener *self); GVariant *nm_lldp_listener_get_neighbors (NMLldpListener *self); +GVariant *nmtst_lldp_parse_from_raw (const guint8 *raw_data, + gsize raw_len); + #endif /* __NM_LLDP_LISTENER__ */ diff --git a/src/devices/tests/test-lldp.c b/src/devices/tests/test-lldp.c index 25e87babf6..54f5a413e2 100644 --- a/src/devices/tests/test-lldp.c +++ b/src/devices/tests/test-lldp.c @@ -119,7 +119,7 @@ TEST_RECV_FRAME_DEFINE (_test_recv_data0_frame0, ); static void -_test_recv_data0_check (GMainLoop *loop, NMLldpListener *listener) +_test_recv_data0_check_do (GMainLoop *loop, NMLldpListener *listener, const TestRecvFrame *frame) { GVariant *neighbors, *attr; gs_unref_variant GVariant *neighbor = NULL; @@ -151,6 +151,12 @@ _test_recv_data0_check (GMainLoop *loop, NMLldpListener *listener) nm_clear_g_variant (&attr); } +static void +_test_recv_data0_check (GMainLoop *loop, NMLldpListener *listener) +{ + _test_recv_data0_check_do (loop, listener, &_test_recv_data0_frame0); +} + TEST_RECV_DATA_DEFINE (_test_recv_data0, 1, _test_recv_data0_check, &_test_recv_data0_frame0); TEST_RECV_DATA_DEFINE (_test_recv_data0_twice, 1, _test_recv_data0_check, &_test_recv_data0_frame0, &_test_recv_data0_frame0); @@ -374,7 +380,7 @@ _test_recv_data2_ttl1_check (GMainLoop *loop, NMLldpListener *listener) gulong notify_id; GVariant *neighbors; - _test_recv_data0_check (loop, listener); + _test_recv_data0_check_do (loop, listener, &_test_recv_data2_frame0_ttl1); /* wait for signal. */ notify_id = g_signal_connect (listener, "notify::" NM_LLDP_LISTENER_NEIGHBORS, @@ -513,6 +519,19 @@ _test_recv_fixture_teardown (TestRecvFixture *fixture, gconstpointer user_data) /*****************************************************************************/ +static void +test_parse_frames (gconstpointer test_data) +{ + const TestRecvFrame *frame = test_data; + gs_unref_variant GVariant *v_neighbor = NULL; + gs_unref_variant GVariant *attr = NULL; + + v_neighbor = nmtst_lldp_parse_from_raw (frame->frame, frame->frame_len); + g_assert (v_neighbor); +} + +/*****************************************************************************/ + NMTstpSetupFunc const _nmtstp_setup_platform_func = nm_linux_platform_setup; void @@ -530,4 +549,8 @@ _nmtstp_setup_tests (void) _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/2_ttl1", &_test_recv_data2_ttl1); + + g_test_add_data_func ("/lldp/parse-frames/0", &_test_recv_data0_frame0, test_parse_frames); + g_test_add_data_func ("/lldp/parse-frames/1", &_test_recv_data1_frame0, test_parse_frames); + g_test_add_data_func ("/lldp/parse-frames/2", &_test_recv_data2_frame0_ttl1, test_parse_frames); }