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