Commit 4d3a329a authored by xiaoqiang zhao's avatar xiaoqiang zhao Committed by Daniel P. Berrangé
Browse files

tests/util-sockets: add abstract unix socket cases



add cases to test tight and non-tight for abstract address type

Signed-off-by: default avatarxiaoqiang zhao <zxq_yx_007@163.com>
Signed-off-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
parent 776b97d3
Loading
Loading
Loading
Loading
+92 −0
Original line number Diff line number Diff line
@@ -227,6 +227,93 @@ static void test_socket_fd_pass_num_nocli(void)
    g_free(addr.u.fd.str);
}

#ifdef __linux__
static gchar *abstract_sock_name;

static gpointer unix_server_thread_func(gpointer user_data)
{
    SocketAddress addr;
    Error *err = NULL;
    int fd = -1;
    int connfd = -1;
    struct sockaddr_un un;
    socklen_t len = sizeof(un);

    addr.type = SOCKET_ADDRESS_TYPE_UNIX;
    addr.u.q_unix.path = abstract_sock_name;
    addr.u.q_unix.tight = user_data != NULL;
    addr.u.q_unix.abstract = true;

    fd = socket_listen(&addr, 1, &err);
    g_assert_cmpint(fd, >=, 0);
    g_assert(fd_is_socket(fd));

    connfd = accept(fd, (struct sockaddr *)&un, &len);
    g_assert_cmpint(connfd, !=, -1);

    close(fd);

    return NULL;
}

static gpointer unix_client_thread_func(gpointer user_data)
{
    SocketAddress addr;
    Error *err = NULL;
    int fd = -1;

    addr.type = SOCKET_ADDRESS_TYPE_UNIX;
    addr.u.q_unix.path = abstract_sock_name;
    addr.u.q_unix.tight = user_data != NULL;
    addr.u.q_unix.abstract = true;

    fd = socket_connect(&addr, &err);

    g_assert_cmpint(fd, >=, 0);

    close(fd);

    return NULL;
}

static void test_socket_unix_abstract_good(void)
{
    GRand *r = g_rand_new();

    abstract_sock_name = g_strdup_printf("unix-%d-%d", getpid(),
                                         g_rand_int_range(r, 100, 1000));

    /* non tight socklen serv and cli */
    GThread *serv = g_thread_new("abstract_unix_server",
                                 unix_server_thread_func,
                                 NULL);

    sleep(1);

    GThread *cli = g_thread_new("abstract_unix_client",
                                unix_client_thread_func,
                                NULL);

    g_thread_join(cli);
    g_thread_join(serv);

    /* tight socklen serv and cli */
    serv = g_thread_new("abstract_unix_server",
                        unix_server_thread_func,
                        (gpointer)1);

    sleep(1);

    cli = g_thread_new("abstract_unix_client",
                       unix_client_thread_func,
                       (gpointer)1);

    g_thread_join(cli);
    g_thread_join(serv);

    g_free(abstract_sock_name);
}
#endif

int main(int argc, char **argv)
{
@@ -265,6 +352,11 @@ int main(int argc, char **argv)
                        test_socket_fd_pass_num_nocli);
    }

#ifdef __linux__
    g_test_add_func("/util/socket/unix-abstract/good",
                    test_socket_unix_abstract_good);
#endif

end:
    return g_test_run();
}