From 8ae6a07d62256797e8ddcc918ff3e4f10ff69417 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sun, 2 Aug 2009 23:53:25 +0200 Subject: Tests for module 'pipe-filter-gi'. --- tests/test-pipe-filter-gi1.c | 125 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 tests/test-pipe-filter-gi1.c (limited to 'tests/test-pipe-filter-gi1.c') diff --git a/tests/test-pipe-filter-gi1.c b/tests/test-pipe-filter-gi1.c new file mode 100644 index 0000000000..95b9aa0cd9 --- /dev/null +++ b/tests/test-pipe-filter-gi1.c @@ -0,0 +1,125 @@ +/* Test of filtering of data through a subprocess. + Copyright (C) 2009 Free Software Foundation, Inc. + Written by Bruno Haible , 2009. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "pipe-filter.h" + +#include +#include + +#include "binary-io.h" +#include "c-ctype.h" +#include "read-file.h" +#include "progname.h" + +#define ASSERT(expr) \ + do \ + { \ + if (!(expr)) \ + { \ + fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ + fflush (stderr); \ + abort (); \ + } \ + } \ + while (0) + + +/* Pipe a text file through 'tr a-z A-Z', which converts ASCII characters from + lower case to upper case. */ + +struct locals +{ + const char *input; + size_t nread; + char buf[19]; +}; + +static void * +prepare_read (size_t *num_bytes_p, void *private_data) +{ + struct locals *l = (struct locals *) private_data; + *num_bytes_p = sizeof (l->buf); + return l->buf; +} + +static void +done_read (void *data_read, size_t num_bytes_read, void *private_data) +{ + struct locals *l = (struct locals *) private_data; + const char *p = l->input + l->nread; + const char *q = (const char *) data_read; + size_t i; + + for (i = 0; i < num_bytes_read; i++, q++) + { + /* Handle conversion NL -> CRLF possibly done by the child process. */ + if (!(O_BINARY && *q == '\r')) + { + char orig = *p; + char expected = c_toupper (orig); + ASSERT (*q == expected); + p++; + } + } + l->nread = p - l->input; +} + +int +main (int argc, char *argv[]) +{ + const char *input_filename; + size_t input_size; + char *input; + + set_program_name (argv[0]); + + ASSERT (argc == 2); + + /* Read some text from a file. */ + input_filename = argv[1]; + input = read_binary_file (input_filename, &input_size); + ASSERT (input != NULL); + + /* Convert it to uppercase, line by line. */ + { + const char *argv[4]; + struct locals l; + struct pipe_filter_gi *f; + int result; + + l.input = input; + l.nread = 0; + + argv[0] = "tr"; + argv[1] = "a-z"; + argv[2] = "A-Z"; + argv[3] = NULL; + + f = pipe_filter_gi_create ("tr", "tr", argv, false, true, + prepare_read, done_read, &l); + ASSERT (f != NULL); + result = pipe_filter_gi_write (f, input, input_size); + ASSERT (result == 0); + result = pipe_filter_gi_close (f); + ASSERT (result == 0); + ASSERT (l.nread == input_size); + } + + return 0; +} -- cgit v1.2.1