1 /* Test harness for pipe-filter-ii.
3 Copyright (C) 2009-2011 Free Software Foundation, Inc.
4 Written by Paolo Bonzini <bonzini@gnu.org>, 2009.
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "pipe-filter.h"
29 #include "full-write.h"
43 prepare_write (size_t *num_bytes_p, void *private_data)
45 struct locals *l = (struct locals *) private_data;
46 if (l->nwritten < l->size)
48 *num_bytes_p = l->size - l->nwritten;
49 return l->input + l->nwritten;
56 done_write (void *data_written, size_t num_bytes_written, void *private_data)
58 struct locals *l = (struct locals *) private_data;
59 l->nwritten += num_bytes_written;
63 prepare_read (size_t *num_bytes_p, void *private_data)
65 struct locals *l = (struct locals *) private_data;
66 *num_bytes_p = sizeof (l->buf);
70 /* Callback that ignores the data that has been read. */
73 ignore_done_read (void *data_read, size_t num_bytes_read, void *private_data)
77 /* Callback that outputs the data that has been read. */
80 output_done_read (void *data_read, size_t num_bytes_read, void *private_data)
82 full_write (STDOUT_FILENO, data_read, num_bytes_read);
86 main (int argc, char **argv)
88 const char *path[] = { NULL, NULL };
90 set_program_name (argv[0]);
94 /* Test writing to a nonexistent program traps sooner or later. */
103 path[0] = "/nonexistent/blah";
104 rc = pipe_filter_ii_execute ("pipe-filter-test", path[0], path, true, false,
105 prepare_write, done_write,
106 prepare_read, ignore_done_read,
108 ASSERT (rc == 127 || rc == -1);
109 printf ("Test 1 passed.\n");
113 /* Test returning the exit status. */
119 l.size = strlen (l.input);
123 rc = pipe_filter_ii_execute ("pipe-filter-test", path[0], path, false, false,
124 prepare_write, done_write,
125 prepare_read, ignore_done_read,
128 printf ("Test 2 passed.\n");
132 /* Now test asynchronous I/O. */
137 l.input = "1 50\n51\n100";
138 l.size = strlen (l.input);
142 rc = pipe_filter_ii_execute ("pipe-filter-test", path[0], path, false, true,
143 prepare_write, done_write,
144 prepare_read, output_done_read,
147 printf ("Test 3 passed.\n");