xref: /qemu/tests/unit/test-util-sockets.c (revision d2a71d7474d4649eabe554994a3fcba75244cce3)
158dc31f1SDaniel P. Berrange /*
258dc31f1SDaniel P. Berrange  * Tests for util/qemu-sockets.c
358dc31f1SDaniel P. Berrange  *
458dc31f1SDaniel P. Berrange  * Copyright 2018 Red Hat, Inc.
558dc31f1SDaniel P. Berrange  *
658dc31f1SDaniel P. Berrange  * This program is free software; you can redistribute it and/or modify
758dc31f1SDaniel P. Berrange  * it under the terms of the GNU General Public License as published by
858dc31f1SDaniel P. Berrange  * the Free Software Foundation; either version 2 of the License, or
958dc31f1SDaniel P. Berrange  * (at your option) any later version.
1058dc31f1SDaniel P. Berrange  *
1158dc31f1SDaniel P. Berrange  * This program is distributed in the hope that it will be useful,
1258dc31f1SDaniel P. Berrange  * but WITHOUT ANY WARRANTY; without even the implied warranty of
1358dc31f1SDaniel P. Berrange  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1458dc31f1SDaniel P. Berrange  * GNU General Public License for more details.
1558dc31f1SDaniel P. Berrange  *
1658dc31f1SDaniel P. Berrange  * You should have received a copy of the GNU General Public License
1758dc31f1SDaniel P. Berrange  * along with this library; if not, see <http://www.gnu.org/licenses/>.
1858dc31f1SDaniel P. Berrange  *
1958dc31f1SDaniel P. Berrange  */
2058dc31f1SDaniel P. Berrange 
2158dc31f1SDaniel P. Berrange #include "qemu/osdep.h"
2258dc31f1SDaniel P. Berrange #include "qemu-common.h"
2358dc31f1SDaniel P. Berrange #include "qemu/sockets.h"
2458dc31f1SDaniel P. Berrange #include "qapi/error.h"
2558dc31f1SDaniel P. Berrange #include "socket-helpers.h"
2630bdb3c5SDaniel P. Berrange #include "monitor/monitor.h"
2758dc31f1SDaniel P. Berrange 
2858dc31f1SDaniel P. Berrange static void test_fd_is_socket_bad(void)
2958dc31f1SDaniel P. Berrange {
3058dc31f1SDaniel P. Berrange     char *tmp = g_strdup("qemu-test-util-sockets-XXXXXX");
3158dc31f1SDaniel P. Berrange     int fd = mkstemp(tmp);
3258dc31f1SDaniel P. Berrange     if (fd != 0) {
3358dc31f1SDaniel P. Berrange         unlink(tmp);
3458dc31f1SDaniel P. Berrange     }
3558dc31f1SDaniel P. Berrange     g_free(tmp);
3658dc31f1SDaniel P. Berrange 
3758dc31f1SDaniel P. Berrange     g_assert(fd >= 0);
3858dc31f1SDaniel P. Berrange 
3958dc31f1SDaniel P. Berrange     g_assert(!fd_is_socket(fd));
4058dc31f1SDaniel P. Berrange     close(fd);
4158dc31f1SDaniel P. Berrange }
4258dc31f1SDaniel P. Berrange 
4358dc31f1SDaniel P. Berrange static void test_fd_is_socket_good(void)
4458dc31f1SDaniel P. Berrange {
4558dc31f1SDaniel P. Berrange     int fd = qemu_socket(PF_INET, SOCK_STREAM, 0);
4658dc31f1SDaniel P. Berrange 
4758dc31f1SDaniel P. Berrange     g_assert(fd >= 0);
4858dc31f1SDaniel P. Berrange 
4958dc31f1SDaniel P. Berrange     g_assert(fd_is_socket(fd));
5058dc31f1SDaniel P. Berrange     close(fd);
5158dc31f1SDaniel P. Berrange }
5258dc31f1SDaniel P. Berrange 
5330bdb3c5SDaniel P. Berrange static int mon_fd = -1;
5430bdb3c5SDaniel P. Berrange static const char *mon_fdname;
5530bdb3c5SDaniel P. Berrange 
5630bdb3c5SDaniel P. Berrange int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp)
5730bdb3c5SDaniel P. Berrange {
5830bdb3c5SDaniel P. Berrange     g_assert(cur_mon);
5930bdb3c5SDaniel P. Berrange     g_assert(mon == cur_mon);
6030bdb3c5SDaniel P. Berrange     if (mon_fd == -1 || !g_str_equal(mon_fdname, fdname)) {
6130bdb3c5SDaniel P. Berrange         error_setg(errp, "No fd named %s", fdname);
6230bdb3c5SDaniel P. Berrange         return -1;
6330bdb3c5SDaniel P. Berrange     }
6430bdb3c5SDaniel P. Berrange     return dup(mon_fd);
6530bdb3c5SDaniel P. Berrange }
6630bdb3c5SDaniel P. Berrange 
67*d2a71d74SThomas Huth /*
68*d2a71d74SThomas Huth  * Syms of stubs in libqemuutil.a are discarded at .o file granularity.
6930bdb3c5SDaniel P. Berrange  * To replace monitor_get_fd() we must ensure everything in
7030bdb3c5SDaniel P. Berrange  * stubs/monitor.c is defined, to make sure monitor.o is discarded
7130bdb3c5SDaniel P. Berrange  * otherwise we get duplicate syms at link time.
7230bdb3c5SDaniel P. Berrange  */
7362aa1d88SPeter Xu __thread Monitor *cur_mon;
74637de4dbSMarkus Armbruster int monitor_vprintf(Monitor *mon, const char *fmt, va_list ap) { abort(); }
75f27a9bb3SKevin Wolf void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp) {}
768e9119a8SKevin Wolf void monitor_init_hmp(Chardev *chr, bool use_readline, Error **errp) {}
7730bdb3c5SDaniel P. Berrange 
7830bdb3c5SDaniel P. Berrange 
791723d6b1SDaniel P. Berrange static void test_socket_fd_pass_name_good(void)
8030bdb3c5SDaniel P. Berrange {
8130bdb3c5SDaniel P. Berrange     SocketAddress addr;
8230bdb3c5SDaniel P. Berrange     int fd;
8330bdb3c5SDaniel P. Berrange 
8430bdb3c5SDaniel P. Berrange     cur_mon = g_malloc(1); /* Fake a monitor */
8530bdb3c5SDaniel P. Berrange     mon_fdname = "myfd";
8630bdb3c5SDaniel P. Berrange     mon_fd = qemu_socket(AF_INET, SOCK_STREAM, 0);
8730bdb3c5SDaniel P. Berrange     g_assert_cmpint(mon_fd, >, STDERR_FILENO);
8830bdb3c5SDaniel P. Berrange 
8930bdb3c5SDaniel P. Berrange     addr.type = SOCKET_ADDRESS_TYPE_FD;
9030bdb3c5SDaniel P. Berrange     addr.u.fd.str = g_strdup(mon_fdname);
9130bdb3c5SDaniel P. Berrange 
9230bdb3c5SDaniel P. Berrange     fd = socket_connect(&addr, &error_abort);
9330bdb3c5SDaniel P. Berrange     g_assert_cmpint(fd, !=, -1);
9430bdb3c5SDaniel P. Berrange     g_assert_cmpint(fd, !=, mon_fd);
9530bdb3c5SDaniel P. Berrange     close(fd);
9630bdb3c5SDaniel P. Berrange 
97e5b6353cSJuan Quintela     fd = socket_listen(&addr, 1, &error_abort);
9830bdb3c5SDaniel P. Berrange     g_assert_cmpint(fd, !=, -1);
9930bdb3c5SDaniel P. Berrange     g_assert_cmpint(fd, !=, mon_fd);
10030bdb3c5SDaniel P. Berrange     close(fd);
10130bdb3c5SDaniel P. Berrange 
10230bdb3c5SDaniel P. Berrange     g_free(addr.u.fd.str);
10330bdb3c5SDaniel P. Berrange     mon_fdname = NULL;
10430bdb3c5SDaniel P. Berrange     close(mon_fd);
10530bdb3c5SDaniel P. Berrange     mon_fd = -1;
10630bdb3c5SDaniel P. Berrange     g_free(cur_mon);
10730bdb3c5SDaniel P. Berrange     cur_mon = NULL;
10830bdb3c5SDaniel P. Berrange }
10930bdb3c5SDaniel P. Berrange 
1101723d6b1SDaniel P. Berrange static void test_socket_fd_pass_name_bad(void)
11130bdb3c5SDaniel P. Berrange {
11230bdb3c5SDaniel P. Berrange     SocketAddress addr;
11330bdb3c5SDaniel P. Berrange     Error *err = NULL;
11430bdb3c5SDaniel P. Berrange     int fd;
11530bdb3c5SDaniel P. Berrange 
11630bdb3c5SDaniel P. Berrange     cur_mon = g_malloc(1); /* Fake a monitor */
11730bdb3c5SDaniel P. Berrange     mon_fdname = "myfd";
11830bdb3c5SDaniel P. Berrange     mon_fd = dup(STDOUT_FILENO);
11930bdb3c5SDaniel P. Berrange     g_assert_cmpint(mon_fd, >, STDERR_FILENO);
12030bdb3c5SDaniel P. Berrange 
12130bdb3c5SDaniel P. Berrange     addr.type = SOCKET_ADDRESS_TYPE_FD;
12230bdb3c5SDaniel P. Berrange     addr.u.fd.str = g_strdup(mon_fdname);
12330bdb3c5SDaniel P. Berrange 
12430bdb3c5SDaniel P. Berrange     fd = socket_connect(&addr, &err);
12530bdb3c5SDaniel P. Berrange     g_assert_cmpint(fd, ==, -1);
12630bdb3c5SDaniel P. Berrange     error_free_or_abort(&err);
12730bdb3c5SDaniel P. Berrange 
128e5b6353cSJuan Quintela     fd = socket_listen(&addr, 1, &err);
12930bdb3c5SDaniel P. Berrange     g_assert_cmpint(fd, ==, -1);
13030bdb3c5SDaniel P. Berrange     error_free_or_abort(&err);
13130bdb3c5SDaniel P. Berrange 
13230bdb3c5SDaniel P. Berrange     g_free(addr.u.fd.str);
13330bdb3c5SDaniel P. Berrange     mon_fdname = NULL;
13430bdb3c5SDaniel P. Berrange     close(mon_fd);
13530bdb3c5SDaniel P. Berrange     mon_fd = -1;
13630bdb3c5SDaniel P. Berrange     g_free(cur_mon);
13730bdb3c5SDaniel P. Berrange     cur_mon = NULL;
13830bdb3c5SDaniel P. Berrange }
13930bdb3c5SDaniel P. Berrange 
1401723d6b1SDaniel P. Berrange static void test_socket_fd_pass_name_nomon(void)
1411723d6b1SDaniel P. Berrange {
1421723d6b1SDaniel P. Berrange     SocketAddress addr;
1431723d6b1SDaniel P. Berrange     Error *err = NULL;
1441723d6b1SDaniel P. Berrange     int fd;
1451723d6b1SDaniel P. Berrange 
1461723d6b1SDaniel P. Berrange     g_assert(cur_mon == NULL);
1471723d6b1SDaniel P. Berrange 
1481723d6b1SDaniel P. Berrange     addr.type = SOCKET_ADDRESS_TYPE_FD;
1491723d6b1SDaniel P. Berrange     addr.u.fd.str = g_strdup("myfd");
1501723d6b1SDaniel P. Berrange 
1511723d6b1SDaniel P. Berrange     fd = socket_connect(&addr, &err);
1521723d6b1SDaniel P. Berrange     g_assert_cmpint(fd, ==, -1);
1531723d6b1SDaniel P. Berrange     error_free_or_abort(&err);
1541723d6b1SDaniel P. Berrange 
155e5b6353cSJuan Quintela     fd = socket_listen(&addr, 1, &err);
1561723d6b1SDaniel P. Berrange     g_assert_cmpint(fd, ==, -1);
1571723d6b1SDaniel P. Berrange     error_free_or_abort(&err);
1581723d6b1SDaniel P. Berrange 
1591723d6b1SDaniel P. Berrange     g_free(addr.u.fd.str);
1601723d6b1SDaniel P. Berrange }
1611723d6b1SDaniel P. Berrange 
1621723d6b1SDaniel P. Berrange 
1631723d6b1SDaniel P. Berrange static void test_socket_fd_pass_num_good(void)
1641723d6b1SDaniel P. Berrange {
1651723d6b1SDaniel P. Berrange     SocketAddress addr;
1661723d6b1SDaniel P. Berrange     int fd, sfd;
1671723d6b1SDaniel P. Berrange 
1681723d6b1SDaniel P. Berrange     g_assert(cur_mon == NULL);
1691723d6b1SDaniel P. Berrange     sfd = qemu_socket(AF_INET, SOCK_STREAM, 0);
1701723d6b1SDaniel P. Berrange     g_assert_cmpint(sfd, >, STDERR_FILENO);
1711723d6b1SDaniel P. Berrange 
1721723d6b1SDaniel P. Berrange     addr.type = SOCKET_ADDRESS_TYPE_FD;
1731723d6b1SDaniel P. Berrange     addr.u.fd.str = g_strdup_printf("%d", sfd);
1741723d6b1SDaniel P. Berrange 
1751723d6b1SDaniel P. Berrange     fd = socket_connect(&addr, &error_abort);
1761723d6b1SDaniel P. Berrange     g_assert_cmpint(fd, ==, sfd);
1771723d6b1SDaniel P. Berrange 
178e5b6353cSJuan Quintela     fd = socket_listen(&addr, 1, &error_abort);
1791723d6b1SDaniel P. Berrange     g_assert_cmpint(fd, ==, sfd);
1801723d6b1SDaniel P. Berrange 
1811723d6b1SDaniel P. Berrange     g_free(addr.u.fd.str);
1821723d6b1SDaniel P. Berrange     close(sfd);
1831723d6b1SDaniel P. Berrange }
1841723d6b1SDaniel P. Berrange 
1851723d6b1SDaniel P. Berrange static void test_socket_fd_pass_num_bad(void)
1861723d6b1SDaniel P. Berrange {
1871723d6b1SDaniel P. Berrange     SocketAddress addr;
1881723d6b1SDaniel P. Berrange     Error *err = NULL;
1891723d6b1SDaniel P. Berrange     int fd, sfd;
1901723d6b1SDaniel P. Berrange 
1911723d6b1SDaniel P. Berrange     g_assert(cur_mon == NULL);
1921723d6b1SDaniel P. Berrange     sfd = dup(STDOUT_FILENO);
1931723d6b1SDaniel P. Berrange 
1941723d6b1SDaniel P. Berrange     addr.type = SOCKET_ADDRESS_TYPE_FD;
1951723d6b1SDaniel P. Berrange     addr.u.fd.str = g_strdup_printf("%d", sfd);
1961723d6b1SDaniel P. Berrange 
1971723d6b1SDaniel P. Berrange     fd = socket_connect(&addr, &err);
1981723d6b1SDaniel P. Berrange     g_assert_cmpint(fd, ==, -1);
1991723d6b1SDaniel P. Berrange     error_free_or_abort(&err);
2001723d6b1SDaniel P. Berrange 
201e5b6353cSJuan Quintela     fd = socket_listen(&addr, 1, &err);
2021723d6b1SDaniel P. Berrange     g_assert_cmpint(fd, ==, -1);
2031723d6b1SDaniel P. Berrange     error_free_or_abort(&err);
2041723d6b1SDaniel P. Berrange 
2051723d6b1SDaniel P. Berrange     g_free(addr.u.fd.str);
2061723d6b1SDaniel P. Berrange     close(sfd);
2071723d6b1SDaniel P. Berrange }
2081723d6b1SDaniel P. Berrange 
2091723d6b1SDaniel P. Berrange static void test_socket_fd_pass_num_nocli(void)
2101723d6b1SDaniel P. Berrange {
2111723d6b1SDaniel P. Berrange     SocketAddress addr;
2121723d6b1SDaniel P. Berrange     Error *err = NULL;
2131723d6b1SDaniel P. Berrange     int fd;
2141723d6b1SDaniel P. Berrange 
2151723d6b1SDaniel P. Berrange     cur_mon = g_malloc(1); /* Fake a monitor */
2161723d6b1SDaniel P. Berrange 
2171723d6b1SDaniel P. Berrange     addr.type = SOCKET_ADDRESS_TYPE_FD;
2181723d6b1SDaniel P. Berrange     addr.u.fd.str = g_strdup_printf("%d", STDOUT_FILENO);
2191723d6b1SDaniel P. Berrange 
2201723d6b1SDaniel P. Berrange     fd = socket_connect(&addr, &err);
2211723d6b1SDaniel P. Berrange     g_assert_cmpint(fd, ==, -1);
2221723d6b1SDaniel P. Berrange     error_free_or_abort(&err);
2231723d6b1SDaniel P. Berrange 
224e5b6353cSJuan Quintela     fd = socket_listen(&addr, 1, &err);
2251723d6b1SDaniel P. Berrange     g_assert_cmpint(fd, ==, -1);
2261723d6b1SDaniel P. Berrange     error_free_or_abort(&err);
2271723d6b1SDaniel P. Berrange 
2281723d6b1SDaniel P. Berrange     g_free(addr.u.fd.str);
2291723d6b1SDaniel P. Berrange }
2301723d6b1SDaniel P. Berrange 
2314d3a329aSxiaoqiang zhao #ifdef __linux__
2324d3a329aSxiaoqiang zhao static gchar *abstract_sock_name;
2334d3a329aSxiaoqiang zhao 
2344d3a329aSxiaoqiang zhao static gpointer unix_server_thread_func(gpointer user_data)
2354d3a329aSxiaoqiang zhao {
2364d3a329aSxiaoqiang zhao     SocketAddress addr;
2374d3a329aSxiaoqiang zhao     Error *err = NULL;
2384d3a329aSxiaoqiang zhao     int fd = -1;
2394d3a329aSxiaoqiang zhao     int connfd = -1;
2404d3a329aSxiaoqiang zhao     struct sockaddr_un un;
2414d3a329aSxiaoqiang zhao     socklen_t len = sizeof(un);
2424d3a329aSxiaoqiang zhao 
2434d3a329aSxiaoqiang zhao     addr.type = SOCKET_ADDRESS_TYPE_UNIX;
2444d3a329aSxiaoqiang zhao     addr.u.q_unix.path = abstract_sock_name;
2454d3a329aSxiaoqiang zhao     addr.u.q_unix.tight = user_data != NULL;
2464d3a329aSxiaoqiang zhao     addr.u.q_unix.abstract = true;
2474d3a329aSxiaoqiang zhao 
2484d3a329aSxiaoqiang zhao     fd = socket_listen(&addr, 1, &err);
2494d3a329aSxiaoqiang zhao     g_assert_cmpint(fd, >=, 0);
2504d3a329aSxiaoqiang zhao     g_assert(fd_is_socket(fd));
2514d3a329aSxiaoqiang zhao 
2524d3a329aSxiaoqiang zhao     connfd = accept(fd, (struct sockaddr *)&un, &len);
2534d3a329aSxiaoqiang zhao     g_assert_cmpint(connfd, !=, -1);
2544d3a329aSxiaoqiang zhao 
2554d3a329aSxiaoqiang zhao     close(fd);
2564d3a329aSxiaoqiang zhao 
2574d3a329aSxiaoqiang zhao     return NULL;
2584d3a329aSxiaoqiang zhao }
2594d3a329aSxiaoqiang zhao 
2604d3a329aSxiaoqiang zhao static gpointer unix_client_thread_func(gpointer user_data)
2614d3a329aSxiaoqiang zhao {
2624d3a329aSxiaoqiang zhao     SocketAddress addr;
2634d3a329aSxiaoqiang zhao     Error *err = NULL;
2644d3a329aSxiaoqiang zhao     int fd = -1;
2654d3a329aSxiaoqiang zhao 
2664d3a329aSxiaoqiang zhao     addr.type = SOCKET_ADDRESS_TYPE_UNIX;
2674d3a329aSxiaoqiang zhao     addr.u.q_unix.path = abstract_sock_name;
2684d3a329aSxiaoqiang zhao     addr.u.q_unix.tight = user_data != NULL;
2694d3a329aSxiaoqiang zhao     addr.u.q_unix.abstract = true;
2704d3a329aSxiaoqiang zhao 
2714d3a329aSxiaoqiang zhao     fd = socket_connect(&addr, &err);
2724d3a329aSxiaoqiang zhao 
2734d3a329aSxiaoqiang zhao     g_assert_cmpint(fd, >=, 0);
2744d3a329aSxiaoqiang zhao 
2754d3a329aSxiaoqiang zhao     close(fd);
2764d3a329aSxiaoqiang zhao 
2774d3a329aSxiaoqiang zhao     return NULL;
2784d3a329aSxiaoqiang zhao }
2794d3a329aSxiaoqiang zhao 
2804d3a329aSxiaoqiang zhao static void test_socket_unix_abstract_good(void)
2814d3a329aSxiaoqiang zhao {
2824d3a329aSxiaoqiang zhao     GRand *r = g_rand_new();
2834d3a329aSxiaoqiang zhao 
2844d3a329aSxiaoqiang zhao     abstract_sock_name = g_strdup_printf("unix-%d-%d", getpid(),
2854d3a329aSxiaoqiang zhao                                          g_rand_int_range(r, 100, 1000));
2864d3a329aSxiaoqiang zhao 
2874d3a329aSxiaoqiang zhao     /* non tight socklen serv and cli */
2884d3a329aSxiaoqiang zhao     GThread *serv = g_thread_new("abstract_unix_server",
2894d3a329aSxiaoqiang zhao                                  unix_server_thread_func,
2904d3a329aSxiaoqiang zhao                                  NULL);
2914d3a329aSxiaoqiang zhao 
2924d3a329aSxiaoqiang zhao     sleep(1);
2934d3a329aSxiaoqiang zhao 
2944d3a329aSxiaoqiang zhao     GThread *cli = g_thread_new("abstract_unix_client",
2954d3a329aSxiaoqiang zhao                                 unix_client_thread_func,
2964d3a329aSxiaoqiang zhao                                 NULL);
2974d3a329aSxiaoqiang zhao 
2984d3a329aSxiaoqiang zhao     g_thread_join(cli);
2994d3a329aSxiaoqiang zhao     g_thread_join(serv);
3004d3a329aSxiaoqiang zhao 
3014d3a329aSxiaoqiang zhao     /* tight socklen serv and cli */
3024d3a329aSxiaoqiang zhao     serv = g_thread_new("abstract_unix_server",
3034d3a329aSxiaoqiang zhao                         unix_server_thread_func,
3044d3a329aSxiaoqiang zhao                         (gpointer)1);
3054d3a329aSxiaoqiang zhao 
3064d3a329aSxiaoqiang zhao     sleep(1);
3074d3a329aSxiaoqiang zhao 
3084d3a329aSxiaoqiang zhao     cli = g_thread_new("abstract_unix_client",
3094d3a329aSxiaoqiang zhao                        unix_client_thread_func,
3104d3a329aSxiaoqiang zhao                        (gpointer)1);
3114d3a329aSxiaoqiang zhao 
3124d3a329aSxiaoqiang zhao     g_thread_join(cli);
3134d3a329aSxiaoqiang zhao     g_thread_join(serv);
3144d3a329aSxiaoqiang zhao 
3154d3a329aSxiaoqiang zhao     g_free(abstract_sock_name);
3164d3a329aSxiaoqiang zhao }
3174d3a329aSxiaoqiang zhao #endif
3181723d6b1SDaniel P. Berrange 
31958dc31f1SDaniel P. Berrange int main(int argc, char **argv)
32058dc31f1SDaniel P. Berrange {
32158dc31f1SDaniel P. Berrange     bool has_ipv4, has_ipv6;
32258dc31f1SDaniel P. Berrange 
32358dc31f1SDaniel P. Berrange     socket_init();
32458dc31f1SDaniel P. Berrange 
32558dc31f1SDaniel P. Berrange     g_test_init(&argc, &argv, NULL);
32658dc31f1SDaniel P. Berrange 
32758dc31f1SDaniel P. Berrange     /* We're creating actual IPv4/6 sockets, so we should
32858dc31f1SDaniel P. Berrange      * check if the host running tests actually supports
32958dc31f1SDaniel P. Berrange      * each protocol to avoid breaking tests on machines
33058dc31f1SDaniel P. Berrange      * with either IPv4 or IPv6 disabled.
33158dc31f1SDaniel P. Berrange      */
33258dc31f1SDaniel P. Berrange     if (socket_check_protocol_support(&has_ipv4, &has_ipv6) < 0) {
333a4eb74a6SMarc-André Lureau         g_printerr("socket_check_protocol_support() failed\n");
334a4eb74a6SMarc-André Lureau         goto end;
33558dc31f1SDaniel P. Berrange     }
33658dc31f1SDaniel P. Berrange 
33758dc31f1SDaniel P. Berrange     if (has_ipv4) {
33858dc31f1SDaniel P. Berrange         g_test_add_func("/util/socket/is-socket/bad",
33958dc31f1SDaniel P. Berrange                         test_fd_is_socket_bad);
34058dc31f1SDaniel P. Berrange         g_test_add_func("/util/socket/is-socket/good",
34158dc31f1SDaniel P. Berrange                         test_fd_is_socket_good);
3421723d6b1SDaniel P. Berrange         g_test_add_func("/socket/fd-pass/name/good",
3431723d6b1SDaniel P. Berrange                         test_socket_fd_pass_name_good);
3441723d6b1SDaniel P. Berrange         g_test_add_func("/socket/fd-pass/name/bad",
3451723d6b1SDaniel P. Berrange                         test_socket_fd_pass_name_bad);
3461723d6b1SDaniel P. Berrange         g_test_add_func("/socket/fd-pass/name/nomon",
3471723d6b1SDaniel P. Berrange                         test_socket_fd_pass_name_nomon);
3481723d6b1SDaniel P. Berrange         g_test_add_func("/socket/fd-pass/num/good",
3491723d6b1SDaniel P. Berrange                         test_socket_fd_pass_num_good);
3501723d6b1SDaniel P. Berrange         g_test_add_func("/socket/fd-pass/num/bad",
3511723d6b1SDaniel P. Berrange                         test_socket_fd_pass_num_bad);
3521723d6b1SDaniel P. Berrange         g_test_add_func("/socket/fd-pass/num/nocli",
3531723d6b1SDaniel P. Berrange                         test_socket_fd_pass_num_nocli);
35458dc31f1SDaniel P. Berrange     }
35558dc31f1SDaniel P. Berrange 
3564d3a329aSxiaoqiang zhao #ifdef __linux__
3574d3a329aSxiaoqiang zhao     g_test_add_func("/util/socket/unix-abstract/good",
3584d3a329aSxiaoqiang zhao                     test_socket_unix_abstract_good);
3594d3a329aSxiaoqiang zhao #endif
3604d3a329aSxiaoqiang zhao 
361a4eb74a6SMarc-André Lureau end:
36258dc31f1SDaniel P. Berrange     return g_test_run();
36358dc31f1SDaniel P. Berrange }
364