#1 Adds tests according to the CI
Opened 2 years ago by ssahani. Modified 2 years ago
rpms/ ssahani/libmnl tests  into  rawhide

Adds tests according to the CI
Susant Sahani • 2 years ago  
file added
+46
@@ -0,0 +1,46 @@ 

+ # SPDX-License-Identifier: LGPL-2.1+

+ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ #

+ #   Makefile of /CoreOS/libmnl

+ #   Description: Test if libmnl working ok

+ #   Author: Susant Sahani<susant@redhat.com>

+ #

+ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ export TEST=/CoreOS/libmnl

+ export TESTVERSION=1.0

+ 

+ OBJS =  test-rtnl.c

+ CFLAG = -Wall -g3

+ CC = gcc

+ LIBS = -lmnl -lcmocka

+ 

+ test-rtnl:${OBJ}

+ 	${CC} ${CFLAGS} ${INCLUDES} -o $@ ${OBJS} ${LIBS}

+ 

+ run: test-rtnl

+ 	./runtest.sh

+ clean:

+ 	-rm -f *.o core *.core test-rtnl

+ 

+ .c.o:

+ 	${CC} ${CFLAGS} ${INCLUDES} -c $<

+ 

+ CC = gcc

+ 

+ include /usr/share/rhts/lib/rhts-make.include

+ $(METADATA): Makefile

+         @echo "Owner:           Susant Sahani<susant@redhat.com>" > $(METADATA)

+         @echo "Name:            $(TEST)" >> $(METADATA)

+         @echo "TestVersion:     $(TESTVERSION)" >> $(METADATA)

+         @echo "Path:            $(TEST_DIR)" >> $(METADATA)

+         @echo "Description:     Test libmnl works ok" >> $(METADATA)

+         @echo "Type:            Sanity" >> $(METADATA)

+         @echo "TestTime:        5m" >> $(METADATA)

+         @echo "RunFor:          libmnl" >> $(METADATA)

+         @echo "Requires:        libmnl libmnl-devel" >> $(METADATA)

+         @echo "Priority:        Normal" >> $(METADATA)

+         @echo "License:         GPLv2" >> $(METADATA)

+         @echo "Confidential:    no" >> $(METADATA)

+         @echo "Destructive:     no" >> $(METADATA)

+         @echo "Releases:        -Fedora 29" >> $(METADATA)

+ 	rhts-lint $(METADATA)

@@ -0,0 +1,34 @@ 

+ #!/bin/bash

+ # SPDX-License-Identifier: LGPL-2.1+

+ # ~~~

+ #   runtest.sh of libmnl

+ #   Description: Tests for libmnl is a minimalistic user-space library oriented to Netlink developers.

+ #

+ #   Author: Susant Sahani <susant@redhat.com>

+ #   Copyright (c) 2018 Red Hat, Inc.

+ # ~~~

+ 

+ # Include Beaker environment

+ . /usr/share/beakerlib/beakerlib.sh || exit 1

+ 

+ PACKAGE="libmnl"

+ 

+ rlJournalStart

+     rlPhaseStartSetup

+         rlAssertRpm $PACKAGE

+         rlRun "cp test-rtnl /usr/bin/"

+     rlPhaseEnd

+ 

+     rlPhaseStartTest

+         rlLog "Starting libmnl tests ..."

+         rlRun "/usr/bin/test-rtnl"

+     rlPhaseEnd

+ 

+     rlPhaseStartCleanup

+         rlRun "rm /usr/bin/test-rtnl"

+         rlLog "libmnl tests done"

+     rlPhaseEnd

+ rlJournalPrintText

+ rlJournalEnd

+ 

+ rlGetTestState

file added
+422
@@ -0,0 +1,422 @@ 

+ /*

+ # SPDX-License-Identifier: LGPL-2.1+

+ # ~~~

+ #   Description: RTNL Tests libmnl

+ #

+ #   Author: Susant Sahani <susant@redhat.com>

+ #   Copyright (c) 2018 Red Hat, Inc.

+ # ~~~

+ */

+ #include <stdio.h>

+ #include <stdlib.h>

+ #include <string.h>

+ #include <arpa/inet.h>

+ #include <sys/stat.h>

+ #include <linux/rtnetlink.h>

+ #include <net/if.h>

+ #include <linux/if.h>

+ #include <linux/ip.h>

+ #include <linux/if_link.h>

+ #include <linux/if_tunnel.h>

+ #include <libmnl/libmnl.h>

+ #include <netinet/in.h>

+ #include <setjmp.h>

+ #include <inttypes.h>

+ #include <cmocka.h>

+ 

+ #define RTNL_BUF_SIZE 8192

+ 

+ void test_link_exists(const char *link) {

+         char p[1024] = {};

+         struct stat s;

+ 

+         strcpy(p, "/sys/class/net/");

+         strcat(p, link);

+ 

+         assert_int_equal(stat(p, &s), 0);

+ }

+ 

+ void delete_link(const char *name) {

+         uint8_t buf[RTNL_BUF_SIZE] = {};

+         struct nlattr *linkinfo, *dummyinfo;

+         struct mnl_socket *nl_sock;

+         struct nlmsghdr *nlh;

+         struct ifinfomsg *ifinfo;

+ 

+         nl_sock = mnl_socket_open(NETLINK_ROUTE);

+         assert_non_null(nl_sock);

+ 

+         nlh = mnl_nlmsg_put_header(buf);

+         nlh->nlmsg_flags = NLM_F_REQUEST | RTM_DELLINK | NLM_F_ACK;

+         nlh->nlmsg_type = RTM_DELLINK;

+ 

+         ifinfo = mnl_nlmsg_put_extra_header(nlh, sizeof(struct ifinfomsg));

+         ifinfo->ifi_family = AF_UNSPEC;

+ 

+         mnl_attr_put_strz(nlh, IFLA_IFNAME, name);

+         mnl_socket_sendto(nl_sock, nlh, nlh->nlmsg_len);

+         mnl_socket_recvfrom(nl_sock, buf, sizeof(buf));

+ 

+         nlh = (struct nlmsghdr*) buf;

+ 

+         assert_return_code(nlh->nlmsg_type, 0);

+ }

+ 

+ void create_dummy(char *ifname) {

+         uint8_t buf[RTNL_BUF_SIZE] = {};

+         struct nlattr *linkinfo, *dummyinfo;

+         struct mnl_socket *nl_sock;

+         struct nlmsghdr *nlh;

+         struct ifinfomsg *ifinfo;

+ 

+         nl_sock = mnl_socket_open(NETLINK_ROUTE);

+         assert_non_null(nl_sock);

+ 

+         nlh = mnl_nlmsg_put_header(buf);

+         nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK;

+         nlh->nlmsg_type = RTM_NEWLINK;

+ 

+         ifinfo = mnl_nlmsg_put_extra_header(nlh, sizeof(struct ifinfomsg));

+         ifinfo->ifi_family = AF_UNSPEC;

+ 

+         mnl_attr_put_str(nlh, IFLA_IFNAME, "ci-dummy");

+ 

+         linkinfo = mnl_attr_nest_start(nlh, IFLA_LINKINFO);

+         assert_non_null(linkinfo);

+ 

+         mnl_attr_put_str(nlh, IFLA_INFO_KIND, "dummy");

+         dummyinfo = mnl_attr_nest_start(nlh, IFLA_INFO_DATA);

+ 

+         mnl_attr_nest_end(nlh, dummyinfo);

+         mnl_attr_nest_end(nlh, linkinfo);

+ 

+         mnl_socket_sendto(nl_sock, nlh, nlh->nlmsg_len);

+         mnl_socket_recvfrom(nl_sock, buf, sizeof(buf));

+ 

+         nlh = (struct nlmsghdr *) buf;

+ 

+         assert_return_code(nlh->nlmsg_type, 0);

+ }

+ 

+ void test_create_dummy(void **state) {

+ 

+         create_dummy("ci-dummy");

+         test_link_exists("ci-dummy");

+         delete_link("ci-dummy");

+ }

+ 

+ void test_delete_link(void **state) {

+         test_create_dummy(NULL);

+         delete_link("ci-dummy");

+ }

+ 

+ void test_create_ipip(void **state) {

+         struct nlattr *linkinfo = NULL, *tunnelinfo = NULL;

+         uint8_t buf[RTNL_BUF_SIZE] = {};

+         struct mnl_socket *nl_sock = NULL;

+         struct ifinfomsg *ifinfo = NULL;

+         struct nlmsghdr *nlh = NULL;

+         struct in_addr addr;

+ 

+         nl_sock = mnl_socket_open(NETLINK_ROUTE);

+         assert_non_null(nl_sock);

+ 

+         nlh = mnl_nlmsg_put_header(buf);

+         nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK;

+         nlh->nlmsg_type = RTM_NEWLINK;

+ 

+         ifinfo = mnl_nlmsg_put_extra_header(nlh, sizeof(struct ifinfomsg));

+         ifinfo->ifi_family = AF_UNSPEC;

+ 

+         mnl_attr_put_str(nlh, IFLA_IFNAME, "ci-ipip");

+ 

+         linkinfo = mnl_attr_nest_start(nlh, IFLA_LINKINFO);

+         assert_non_null(linkinfo);

+ 

+         mnl_attr_put_str(nlh, IFLA_INFO_KIND, "ipip");

+ 

+         tunnelinfo = mnl_attr_nest_start(nlh, IFLA_INFO_DATA);

+         assert_non_null(tunnelinfo);

+ 

+         inet_pton(AF_INET, "192.168.203.19", &addr);

+         mnl_attr_put_u32(nlh, IFLA_IPTUN_LOCAL, addr.s_addr);

+         inet_pton(AF_INET, "10.0.0.2", &addr);

+         mnl_attr_put_u32(nlh, IFLA_IPTUN_REMOTE, addr.s_addr);

+ 

+         mnl_attr_nest_end(nlh, tunnelinfo);

+         mnl_attr_nest_end(nlh, linkinfo);

+ 

+         assert_return_code(mnl_socket_sendto(nl_sock, nlh, nlh->nlmsg_len), 0);

+         assert_return_code(mnl_socket_recvfrom(nl_sock, buf, sizeof(buf)), 0);

+ 

+         nlh = (struct nlmsghdr *) buf;

+ 

+         assert_return_code(nlh->nlmsg_type, 0);

+ 

+         test_link_exists("ci-ipip");

+         delete_link("ci-ipip");

+ }

+ 

+ void test_create_sit(void **state) {

+         struct nlattr *linkinfo, *tunnelinfo;

+         uint8_t buf[RTNL_BUF_SIZE] = {};

+         struct mnl_socket *nl_sock;

+         struct ifinfomsg *ifinfo;

+         struct nlmsghdr *nlh;

+         struct in_addr addr;

+ 

+         nl_sock = mnl_socket_open(NETLINK_ROUTE);

+         assert_non_null(nl_sock);

+ 

+         nlh = mnl_nlmsg_put_header(buf);

+         nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK;

+         nlh->nlmsg_type = RTM_NEWLINK;

+ 

+         ifinfo = mnl_nlmsg_put_extra_header(nlh, sizeof(struct ifinfomsg));

+         ifinfo->ifi_family = AF_UNSPEC;

+ 

+         mnl_attr_put_str(nlh, IFLA_IFNAME, "ci-sit-tun");

+ 

+         linkinfo = mnl_attr_nest_start(nlh, IFLA_LINKINFO);

+         assert_non_null(linkinfo);

+ 

+         mnl_attr_put_str(nlh, IFLA_INFO_KIND, "sit");

+ 

+         tunnelinfo = mnl_attr_nest_start(nlh, IFLA_INFO_DATA);

+         assert_non_null(tunnelinfo);

+ 

+         inet_pton(AF_INET, "192.168.203.19", &addr);

+         mnl_attr_put_u32(nlh, IFLA_IPTUN_LOCAL, addr.s_addr);

+         inet_pton(AF_INET, "10.0.0.2", &addr);

+         mnl_attr_put_u32(nlh, IFLA_IPTUN_REMOTE, addr.s_addr);

+ 

+         mnl_attr_nest_end(nlh, tunnelinfo);

+         mnl_attr_nest_end(nlh, linkinfo);

+ 

+         assert_return_code(mnl_socket_sendto(nl_sock, nlh, nlh->nlmsg_len), 0);

+         assert_return_code(mnl_socket_recvfrom(nl_sock, buf, sizeof(buf)), 0);

+ 

+         nlh = (struct nlmsghdr*) buf;

+ 

+         assert_return_code(nlh->nlmsg_type, 0);

+ 

+         test_link_exists("ci-sit-tun");

+         delete_link("ci-sit-tun");

+ }

+ 

+ void test_create_bonding(void **state) {

+         uint8_t buf[RTNL_BUF_SIZE] = {};

+         struct nlattr *linkinfo;

+         struct mnl_socket *nl_sock;

+         struct ifinfomsg *ifinfo;

+         struct nlmsghdr *nlh;

+         struct in_addr addr;

+         int r;

+ 

+         nl_sock = mnl_socket_open(NETLINK_ROUTE);

+         assert_non_null(nl_sock);

+ 

+         nlh = mnl_nlmsg_put_header(buf);

+         nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK;

+         nlh->nlmsg_type = RTM_NEWLINK;

+ 

+         ifinfo = mnl_nlmsg_put_extra_header(nlh, sizeof(struct ifinfomsg));

+         ifinfo->ifi_family = AF_UNSPEC;

+ 

+         mnl_attr_put_str(nlh, IFLA_IFNAME, "ci-bond");

+ 

+         linkinfo = mnl_attr_nest_start(nlh, IFLA_LINKINFO);

+         assert_non_null(linkinfo);

+ 

+         mnl_attr_put_str(nlh, IFLA_INFO_KIND, "bond");

+         mnl_attr_nest_end(nlh, linkinfo);

+ 

+         assert_return_code(mnl_socket_sendto(nl_sock, nlh, nlh->nlmsg_len), 0);

+         assert_return_code(mnl_socket_recvfrom(nl_sock, buf, sizeof(buf)), 0);

+ 

+         nlh = (struct nlmsghdr*) buf;

+ 

+         assert_return_code(nlh->nlmsg_type, 0);

+ 

+         test_link_exists("ci-bond");

+         delete_link("ci-bond");

+ }

+ 

+ void test_create_bridge(void **state) {

+         uint8_t buf[RTNL_BUF_SIZE] = {};

+         struct nlattr *linkinfo;

+         struct mnl_socket *nl_sock;

+         struct ifinfomsg *ifinfo;

+         struct nlmsghdr *nlh;

+         struct in_addr addr;

+ 

+         nl_sock = mnl_socket_open(NETLINK_ROUTE);

+         assert_non_null(nl_sock);

+ 

+         nlh = mnl_nlmsg_put_header(buf);

+         nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK;

+         nlh->nlmsg_type = RTM_NEWLINK;

+ 

+         ifinfo = mnl_nlmsg_put_extra_header(nlh, sizeof(struct ifinfomsg));

+         ifinfo->ifi_family = AF_UNSPEC;

+ 

+         mnl_attr_put_str(nlh, IFLA_IFNAME, "ci-bridge");

+ 

+         linkinfo = mnl_attr_nest_start(nlh, IFLA_LINKINFO);

+         assert_non_null(linkinfo);

+ 

+         mnl_attr_put_str(nlh, IFLA_INFO_KIND, "bridge");

+ 

+         mnl_attr_nest_end(nlh, linkinfo);

+ 

+         assert_return_code(mnl_socket_sendto(nl_sock, nlh, nlh->nlmsg_len), 0);

+         assert_return_code(mnl_socket_recvfrom(nl_sock, buf, sizeof(buf)), 0);

+ 

+         nlh = (struct nlmsghdr*) buf;

+         assert_return_code(nlh->nlmsg_type, 0);

+ 

+         test_link_exists("ci-bridge");

+         delete_link("ci-bridge");

+ }

+ 

+ static int link_status_data_attr_cb(const struct nlattr *attr, void *data) {

+         const struct nlattr **tb = data;

+         int type = mnl_attr_get_type(attr);

+ 

+         /* skip unsupported attribute in user-space */

+         if (mnl_attr_type_valid(attr, IFLA_MAX) < 0)

+                 return MNL_CB_OK;

+ 

+         switch(type) {

+         case IFLA_ADDRESS:

+                 if (mnl_attr_validate(attr, MNL_TYPE_BINARY) < 0) {

+                         perror("mnl_attr_validate");

+                         return MNL_CB_ERROR;

+                 }

+                 break;

+         case IFLA_MTU:

+                 if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {

+                         perror("mnl_attr_validate");

+                         return MNL_CB_ERROR;

+                 }

+                 break;

+         case IFLA_IFNAME:

+                 if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0) {

+                         perror("mnl_attr_validate");

+                         return MNL_CB_ERROR;

+                 }

+                 break;

+         }

+ 

+         tb[type] = attr;

+         return MNL_CB_OK;

+ }

+ 

+ static int link_status_data_cb(const struct nlmsghdr *nlh, void *data) {

+         struct ifinfomsg *ifm = mnl_nlmsg_get_payload(nlh);

+         struct nlattr *tb[IFLA_MAX+1] = {};

+ 

+         mnl_attr_parse(nlh, sizeof(*ifm), link_status_data_attr_cb, tb);

+ 

+         if (!strcmp("ci-dummy", mnl_attr_get_str(tb[IFLA_IFNAME]))) {

+                 int status = 0;

+ 

+                 if (ifm->ifi_flags & IFF_UP)

+                         status = 1;

+ 

+                 assert_int_equal(status, 1);

+                 assert_int_equal(1234, mnl_attr_get_u32(tb[IFLA_MTU]));

+         }

+ 

+         return MNL_CB_OK;

+ }

+ 

+ static int link_dump(char *ifname) {

+         struct mnl_socket *nl;

+         char buf[MNL_SOCKET_BUFFER_SIZE];

+         struct nlmsghdr *nlh;

+         struct ifinfomsg *ifinfo;

+         unsigned int seq, portid;

+         int ret;

+ 

+         nlh = mnl_nlmsg_put_header(buf);

+         nlh->nlmsg_type = RTM_GETLINK;

+         nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;

+         ifinfo = mnl_nlmsg_put_extra_header(nlh, sizeof(struct ifinfomsg));

+         ifinfo->ifi_family = AF_UNSPEC;

+ 

+         nl = mnl_socket_open(NETLINK_ROUTE);

+         if (nl == NULL) {

+                 perror("mnl_socket_open");

+                 exit(EXIT_FAILURE);

+         }

+ 

+         if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {

+                 perror("mnl_socket_bind");

+                 exit(EXIT_FAILURE);

+         }

+         portid = mnl_socket_get_portid(nl);

+ 

+         if (mnl_socket_sendto(nl, nlh, nlh->nlmsg_len) < 0) {

+                 perror("mnl_socket_sendto");

+                 exit(EXIT_FAILURE);

+         }

+ 

+         assert_return_code(mnl_socket_recvfrom(nl, buf, sizeof(buf)), 0);

+         mnl_cb_run(buf, ret, seq, portid, link_status_data_cb, NULL);

+         assert_return_code(mnl_socket_recvfrom(nl, buf, sizeof(buf)), 0);

+ 

+         mnl_socket_close(nl);

+ 

+         return 0;

+ }

+ 

+ void test_rtnl_set_link(void **state) {

+         struct nlattr *linkinfo;

+         uint8_t buf[RTNL_BUF_SIZE] = {};

+         struct mnl_socket *nl_sock;

+         struct ifinfomsg *ifinfo;

+         struct nlmsghdr *nlh;

+         struct in_addr addr;

+ 

+         create_dummy("ci-dummy");

+         test_link_exists("ci-dummy");

+ 

+         nl_sock = mnl_socket_open(NETLINK_ROUTE);

+         nlh = mnl_nlmsg_put_header(buf);

+ 

+         nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;

+         nlh->nlmsg_type = RTM_SETLINK;

+ 

+         ifinfo = mnl_nlmsg_put_extra_header(nlh, sizeof(struct ifinfomsg));

+         ifinfo->ifi_family = AF_UNSPEC;

+         ifinfo->ifi_change |= IFF_UP;

+         ifinfo->ifi_flags |= IFF_UP;

+ 

+         mnl_attr_put_str(nlh, IFLA_IFNAME, "ci-dummy");

+         mnl_attr_put_u32(nlh, IFLA_MTU, 1234);

+ 

+         assert_return_code(mnl_socket_sendto(nl_sock, nlh, nlh->nlmsg_len), 0);

+         assert_return_code(mnl_socket_recvfrom(nl_sock, buf, sizeof(buf)), 0);

+ 

+         nlh = (struct nlmsghdr *) buf;

+ 

+         assert_return_code(nlh->nlmsg_type, 0);

+ 

+         link_dump("ci-dummy");

+         delete_link("ci-dummy");

+ }

+ 

+ int main(int argc, char *argv[]) {

+         const struct CMUnitTest rtnl_tests[] = {

+                                                 cmocka_unit_test(test_create_dummy),

+                                                 cmocka_unit_test(test_create_ipip),

+                                                 cmocka_unit_test(test_create_sit),

+                                                 cmocka_unit_test(test_create_bonding),

+                                                 cmocka_unit_test(test_create_bridge),

+                                                 cmocka_unit_test(test_delete_link),

+                                                 cmocka_unit_test(test_rtnl_set_link),

+         };

+ 

+         return cmocka_run_group_tests(rtnl_tests, NULL, NULL);

+ }

file added
+13
@@ -0,0 +1,13 @@ 

+ - hosts: localhost

+   roles:

+     - role: standard-test-beakerlib

+       tags:

+         - classic

+       tests:

+         - rtnl

+       required_packages:

+         - libnl3

+         - libnl3-devel

+         - libcmocka

+         - libcmocka-devel

+         - gcc

justification
Adds tests according to the CI wiki specifically the standard test interface in the spec.
The playbook includes Tier1 level test cases that have been tested in the following contexts and
is passing reliably: Classic. Test logs are stored in the artifacts directory.
The following steps are used to execute the tests using the standard test interface:

Test enveronment
Make sure you have installed packages from the spec

ansible-2.4.1.0-2.fc28.noarch
python2-dnf-2.7.5-1.fc28.noarch
libselinux-python-2.7-2.fc28.x86_64
standard-test-roles-2.5-1.fc28.noarch

Run tests for Classic
Snip of the example test run for Classic tests:

::   TEST PROTOCOL
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    Package       : libmnl
    Installed     : libmnl-1.0.4-6.fc28.x86_64
    beakerlib RPM : beakerlib-1.17-13.fc28.noarch
    Test version  : 1.0
    Test started  : 2018-06-20 16:20:22 IST
    Test finished :
    Test duration :
    Test name     : /CoreOS/libmnl
    Distro        : Fedora release 28 (Twenty Eight)
    Hostname      : Zeus
    Architecture  : x86_64
    CPUs          : 8 x Intel(R) Core(TM) i7-6820HQ CPU @ 2.70GHz
    RAM size      : 31542 MB
    HDD size      : 452.94 GB

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Setup
::   Setup
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

libmnl-1.0.4-6.fc28.x86_64
:: [ 16:20:24 ] :: [   PASS   ] :: Checking for the presence of libmnl rpm
:: [ 16:20:24 ] :: [   PASS   ] :: Checking for the presence of libmnl rpm
:: [ 16:20:24 ] :: [   LOG    ] :: Package versions:
:: [ 16:20:24 ] :: [   LOG    ] :: Package versions:
:: [ 16:20:24 ] :: [   LOG    ] ::   libmnl-1.0.4-6.fc28.x86_64
:: [ 16:20:24 ] :: [   LOG    ] ::   libmnl-1.0.4-6.fc28.x86_64
:: [ 16:20:24 ] :: [  BEGIN   ] :: Running 'cp test-rtnl /usr/bin/'
:: [ 16:20:24 ] :: [   PASS   ] :: Command 'cp test-rtnl /usr/bin/' (Expected 0, got 0)
:: [ 16:20:24 ] :: [   PASS   ] :: Command 'cp test-rtnl /usr/bin/' (Expected 0, got 0)
:::::::::::::::

: [ 16:20:24 ] :: [   PASS   ] :: Command 'cp test-rtnl /usr/bin/' (Expected 0, got 0)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 0s
::   Duration: 0s
::   Assertions: 2 good, 0 bad
::   Assertions: 2 good, 0 bad
::   RESULT: PASS
::   RESULT: PASS

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Test
::   Test
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: [ 16:20:24 ] :: [   LOG    ] :: Starting libmnl tests ...
:: [ 16:20:24 ] :: [   LOG    ] :: Starting libmnl tests ...
:: [ 16:20:24 ] :: [  BEGIN   ] :: Running '/usr/bin/test-rtnl'
[==========] Running 7 test(s).
[ RUN      ] test_create_dummy
[       OK ] test_create_dummy
[ RUN      ] test_create_ipip
[       OK ] test_create_ipip
[ RUN      ] test_create_sit
[       OK ] test_create_sit
[ RUN      ] test_create_bonding
[       OK ] test_create_bonding
[ RUN      ] test_create_bridge
[       OK ] test_create_bridge
[ RUN      ] test_delete_link
[       OK ] test_delete_link
[ RUN      ] test_rtnl_set_link
[       OK ] test_rtnl_set_link
[==========] 7 test(s) run.
[  PASSED  ] 7 test(s).
:: [ 16:20:24 ] :: [   PASS   ] :: Command '/usr/bin/test-rtnl' (Expected 0, got 0)
:: [ 16:20:24 ] :: [   PASS   ] :: Command '/usr/bin/test-rtnl' (Expected 0, got 0)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 0s
::   Duration: 0s
::   Assertions: 1 good, 0 bad
::   Assertions: 1 good, 0 bad
::   RESULT: PASS
::   RESULT: PASS

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Cleanup
::   Cleanup
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: [ 16:20:24 ] :: [  BEGIN   ] :: Running 'rm /usr/bin/test-rtnl'
:: [ 16:20:24 ] :: [   PASS   ] :: Command 'rm /usr/bin/test-rtnl' (Expected 0, got 0)
:: [ 16:20:24 ] :: [   PASS   ] :: Command 'rm /usr/bin/test-rtnl' (Expected 0, got 0)
:: [ 16:20:24 ] :: [   LOG    ] :: libmnl tests done
:: [ 16:20:24 ] :: [   LOG    ] :: libmnl tests done
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::   Duration: 0s
::   Duration: 0s
::   Assertions: 1 good, 0 bad
::   Assertions: 1 good, 0 bad
::   RESULT: PASS
::   RESULT: PASS