xref: /qemu/tests/unit/test-io-channel-command.c (revision 195e14d0262c5676cb9ff4b253e4b2b15c19d3f0)
1*195e14d0SDaniel P. Berrange /*
2*195e14d0SDaniel P. Berrange  * QEMU I/O channel command test
3*195e14d0SDaniel P. Berrange  *
4*195e14d0SDaniel P. Berrange  * Copyright (c) 2015 Red Hat, Inc.
5*195e14d0SDaniel P. Berrange  *
6*195e14d0SDaniel P. Berrange  * This library is free software; you can redistribute it and/or
7*195e14d0SDaniel P. Berrange  * modify it under the terms of the GNU Lesser General Public
8*195e14d0SDaniel P. Berrange  * License as published by the Free Software Foundation; either
9*195e14d0SDaniel P. Berrange  * version 2 of the License, or (at your option) any later version.
10*195e14d0SDaniel P. Berrange  *
11*195e14d0SDaniel P. Berrange  * This library is distributed in the hope that it will be useful,
12*195e14d0SDaniel P. Berrange  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*195e14d0SDaniel P. Berrange  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*195e14d0SDaniel P. Berrange  * Lesser General Public License for more details.
15*195e14d0SDaniel P. Berrange  *
16*195e14d0SDaniel P. Berrange  * You should have received a copy of the GNU Lesser General Public
17*195e14d0SDaniel P. Berrange  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18*195e14d0SDaniel P. Berrange  *
19*195e14d0SDaniel P. Berrange  */
20*195e14d0SDaniel P. Berrange 
21*195e14d0SDaniel P. Berrange #include "io/channel-command.h"
22*195e14d0SDaniel P. Berrange #include "io-channel-helpers.h"
23*195e14d0SDaniel P. Berrange 
24*195e14d0SDaniel P. Berrange #ifndef WIN32
25*195e14d0SDaniel P. Berrange static void test_io_channel_command_fifo(bool async)
26*195e14d0SDaniel P. Berrange {
27*195e14d0SDaniel P. Berrange #define TEST_FIFO "tests/test-io-channel-command.fifo"
28*195e14d0SDaniel P. Berrange     QIOChannel *src, *dst;
29*195e14d0SDaniel P. Berrange     QIOChannelTest *test;
30*195e14d0SDaniel P. Berrange     char *srcfifo = g_strdup_printf("PIPE:%s,wronly", TEST_FIFO);
31*195e14d0SDaniel P. Berrange     char *dstfifo = g_strdup_printf("PIPE:%s,rdonly", TEST_FIFO);
32*195e14d0SDaniel P. Berrange     const char *srcargv[] = {
33*195e14d0SDaniel P. Berrange         "/bin/socat", "-", srcfifo, NULL,
34*195e14d0SDaniel P. Berrange     };
35*195e14d0SDaniel P. Berrange     const char *dstargv[] = {
36*195e14d0SDaniel P. Berrange         "/bin/socat", dstfifo, "-", NULL,
37*195e14d0SDaniel P. Berrange     };
38*195e14d0SDaniel P. Berrange 
39*195e14d0SDaniel P. Berrange     unlink(TEST_FIFO);
40*195e14d0SDaniel P. Berrange     if (access("/bin/socat", X_OK) < 0) {
41*195e14d0SDaniel P. Berrange         return; /* Pretend success if socat is not present */
42*195e14d0SDaniel P. Berrange     }
43*195e14d0SDaniel P. Berrange     if (mkfifo(TEST_FIFO, 0600) < 0) {
44*195e14d0SDaniel P. Berrange         abort();
45*195e14d0SDaniel P. Berrange     }
46*195e14d0SDaniel P. Berrange     src = QIO_CHANNEL(qio_channel_command_new_spawn(srcargv,
47*195e14d0SDaniel P. Berrange                                                     O_WRONLY,
48*195e14d0SDaniel P. Berrange                                                     &error_abort));
49*195e14d0SDaniel P. Berrange     dst = QIO_CHANNEL(qio_channel_command_new_spawn(dstargv,
50*195e14d0SDaniel P. Berrange                                                     O_RDONLY,
51*195e14d0SDaniel P. Berrange                                                     &error_abort));
52*195e14d0SDaniel P. Berrange 
53*195e14d0SDaniel P. Berrange     test = qio_channel_test_new();
54*195e14d0SDaniel P. Berrange     qio_channel_test_run_threads(test, async, src, dst);
55*195e14d0SDaniel P. Berrange     qio_channel_test_validate(test);
56*195e14d0SDaniel P. Berrange 
57*195e14d0SDaniel P. Berrange     object_unref(OBJECT(src));
58*195e14d0SDaniel P. Berrange     object_unref(OBJECT(dst));
59*195e14d0SDaniel P. Berrange 
60*195e14d0SDaniel P. Berrange     g_free(srcfifo);
61*195e14d0SDaniel P. Berrange     g_free(dstfifo);
62*195e14d0SDaniel P. Berrange     unlink(TEST_FIFO);
63*195e14d0SDaniel P. Berrange }
64*195e14d0SDaniel P. Berrange 
65*195e14d0SDaniel P. Berrange 
66*195e14d0SDaniel P. Berrange static void test_io_channel_command_fifo_async(void)
67*195e14d0SDaniel P. Berrange {
68*195e14d0SDaniel P. Berrange     test_io_channel_command_fifo(true);
69*195e14d0SDaniel P. Berrange }
70*195e14d0SDaniel P. Berrange 
71*195e14d0SDaniel P. Berrange static void test_io_channel_command_fifo_sync(void)
72*195e14d0SDaniel P. Berrange {
73*195e14d0SDaniel P. Berrange     test_io_channel_command_fifo(false);
74*195e14d0SDaniel P. Berrange }
75*195e14d0SDaniel P. Berrange 
76*195e14d0SDaniel P. Berrange 
77*195e14d0SDaniel P. Berrange static void test_io_channel_command_echo(bool async)
78*195e14d0SDaniel P. Berrange {
79*195e14d0SDaniel P. Berrange     QIOChannel *ioc;
80*195e14d0SDaniel P. Berrange     QIOChannelTest *test;
81*195e14d0SDaniel P. Berrange     const char *socatargv[] = {
82*195e14d0SDaniel P. Berrange         "/bin/socat", "-", "-", NULL,
83*195e14d0SDaniel P. Berrange     };
84*195e14d0SDaniel P. Berrange 
85*195e14d0SDaniel P. Berrange     if (access("/bin/socat", X_OK) < 0) {
86*195e14d0SDaniel P. Berrange         return; /* Pretend success if socat is not present */
87*195e14d0SDaniel P. Berrange     }
88*195e14d0SDaniel P. Berrange 
89*195e14d0SDaniel P. Berrange     ioc = QIO_CHANNEL(qio_channel_command_new_spawn(socatargv,
90*195e14d0SDaniel P. Berrange                                                     O_RDWR,
91*195e14d0SDaniel P. Berrange                                                     &error_abort));
92*195e14d0SDaniel P. Berrange     test = qio_channel_test_new();
93*195e14d0SDaniel P. Berrange     qio_channel_test_run_threads(test, async, ioc, ioc);
94*195e14d0SDaniel P. Berrange     qio_channel_test_validate(test);
95*195e14d0SDaniel P. Berrange 
96*195e14d0SDaniel P. Berrange     object_unref(OBJECT(ioc));
97*195e14d0SDaniel P. Berrange }
98*195e14d0SDaniel P. Berrange 
99*195e14d0SDaniel P. Berrange 
100*195e14d0SDaniel P. Berrange static void test_io_channel_command_echo_async(void)
101*195e14d0SDaniel P. Berrange {
102*195e14d0SDaniel P. Berrange     test_io_channel_command_echo(true);
103*195e14d0SDaniel P. Berrange }
104*195e14d0SDaniel P. Berrange 
105*195e14d0SDaniel P. Berrange static void test_io_channel_command_echo_sync(void)
106*195e14d0SDaniel P. Berrange {
107*195e14d0SDaniel P. Berrange     test_io_channel_command_echo(false);
108*195e14d0SDaniel P. Berrange }
109*195e14d0SDaniel P. Berrange #endif
110*195e14d0SDaniel P. Berrange 
111*195e14d0SDaniel P. Berrange int main(int argc, char **argv)
112*195e14d0SDaniel P. Berrange {
113*195e14d0SDaniel P. Berrange     module_call_init(MODULE_INIT_QOM);
114*195e14d0SDaniel P. Berrange 
115*195e14d0SDaniel P. Berrange     g_test_init(&argc, &argv, NULL);
116*195e14d0SDaniel P. Berrange 
117*195e14d0SDaniel P. Berrange #ifndef WIN32
118*195e14d0SDaniel P. Berrange     g_test_add_func("/io/channel/command/fifo/sync",
119*195e14d0SDaniel P. Berrange                     test_io_channel_command_fifo_sync);
120*195e14d0SDaniel P. Berrange     g_test_add_func("/io/channel/command/fifo/async",
121*195e14d0SDaniel P. Berrange                     test_io_channel_command_fifo_async);
122*195e14d0SDaniel P. Berrange     g_test_add_func("/io/channel/command/echo/sync",
123*195e14d0SDaniel P. Berrange                     test_io_channel_command_echo_sync);
124*195e14d0SDaniel P. Berrange     g_test_add_func("/io/channel/command/echo/async",
125*195e14d0SDaniel P. Berrange                     test_io_channel_command_echo_async);
126*195e14d0SDaniel P. Berrange #endif
127*195e14d0SDaniel P. Berrange 
128*195e14d0SDaniel P. Berrange     return g_test_run();
129*195e14d0SDaniel P. Berrange }
130