diff options
author | Zack Weinberg <zackw@panix.com> | 2017-06-08 15:39:03 -0400 |
---|---|---|
committer | Zack Weinberg <zackw@panix.com> | 2017-06-08 15:39:03 -0400 |
commit | 5046dbb4a7eba5eccfd258f92f4735c9ffc8d069 (patch) | |
tree | 4470480d904b65cf14ca524f96f79eca818c3eaf /support/tst-support_capture_subprocess.c | |
parent | 199fc19d3aaaf57944ef036e15904febe877fc93 (diff) | |
download | glibc-zack/build-layout-experiment.tar glibc-zack/build-layout-experiment.tar.gz glibc-zack/build-layout-experiment.tar.bz2 glibc-zack/build-layout-experiment.zip |
Prepare for radical source tree reorganization.zack/build-layout-experiment
All top-level files and directories are moved into a temporary storage
directory, REORG.TODO, except for files that will certainly still
exist in their current form at top level when we're done (COPYING,
COPYING.LIB, LICENSES, NEWS, README), all old ChangeLog files (which
are moved to the new directory OldChangeLogs, instead), and the
generated file INSTALL (which is just deleted; in the new order, there
will be no generated files checked into version control).
Diffstat (limited to 'support/tst-support_capture_subprocess.c')
-rw-r--r-- | support/tst-support_capture_subprocess.c | 188 |
1 files changed, 0 insertions, 188 deletions
diff --git a/support/tst-support_capture_subprocess.c b/support/tst-support_capture_subprocess.c deleted file mode 100644 index 5672fba0f7..0000000000 --- a/support/tst-support_capture_subprocess.c +++ /dev/null @@ -1,188 +0,0 @@ -/* Test capturing output from a subprocess. - Copyright (C) 2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <support/capture_subprocess.h> -#include <support/check.h> -#include <support/support.h> -#include <sys/wait.h> -#include <unistd.h> - -/* Write one byte at *P to FD and advance *P. Do nothing if *P is - '\0'. */ -static void -transfer (const unsigned char **p, int fd) -{ - if (**p != '\0') - { - TEST_VERIFY (write (fd, *p, 1) == 1); - ++*p; - } -} - -/* Determine the order in which stdout and stderr are written. */ -enum write_mode { out_first, err_first, interleave, - write_mode_last = interleave }; - -/* Describe what to write in the subprocess. */ -struct test -{ - char *out; - char *err; - enum write_mode write_mode; - int signal; - int status; -}; - -/* For use with support_capture_subprocess. */ -static void -callback (void *closure) -{ - const struct test *test = closure; - bool mode_ok = false; - switch (test->write_mode) - { - case out_first: - TEST_VERIFY (fputs (test->out, stdout) >= 0); - TEST_VERIFY (fflush (stdout) == 0); - TEST_VERIFY (fputs (test->err, stderr) >= 0); - TEST_VERIFY (fflush (stderr) == 0); - mode_ok = true; - break; - case err_first: - TEST_VERIFY (fputs (test->err, stderr) >= 0); - TEST_VERIFY (fflush (stderr) == 0); - TEST_VERIFY (fputs (test->out, stdout) >= 0); - TEST_VERIFY (fflush (stdout) == 0); - mode_ok = true; - break; - case interleave: - { - const unsigned char *pout = (const unsigned char *) test->out; - const unsigned char *perr = (const unsigned char *) test->err; - do - { - transfer (&pout, STDOUT_FILENO); - transfer (&perr, STDERR_FILENO); - } - while (*pout != '\0' || *perr != '\0'); - } - mode_ok = true; - break; - } - TEST_VERIFY (mode_ok); - - if (test->signal != 0) - raise (test->signal); - exit (test->status); -} - -/* Create a heap-allocated random string of letters. */ -static char * -random_string (size_t length) -{ - char *result = xmalloc (length + 1); - for (size_t i = 0; i < length; ++i) - result[i] = 'a' + (rand () % 26); - result[length] = '\0'; - return result; -} - -/* Check that the specific stream from the captured subprocess matches - expectations. */ -static void -check_stream (const char *what, const struct xmemstream *stream, - const char *expected) -{ - if (strcmp (stream->buffer, expected) != 0) - { - support_record_failure (); - printf ("error: captured %s data incorrect\n" - " expected: %s\n" - " actual: %s\n", - what, expected, stream->buffer); - } - if (stream->length != strlen (expected)) - { - support_record_failure (); - printf ("error: captured %s data length incorrect\n" - " expected: %zu\n" - " actual: %zu\n", - what, strlen (expected), stream->length); - } -} - -static int -do_test (void) -{ - const int lengths[] = {0, 1, 17, 512, 20000, -1}; - - /* Test multiple combinations of support_capture_subprocess. - - length_idx_stdout: Index into the lengths array above, - controls how many bytes are written by the subprocess to - standard output. - length_idx_stderr: Same for standard error. - write_mode: How standard output and standard error writes are - ordered. - signal: Exit with no signal if zero, with SIGTERM if one. - status: Process exit status: 0 if zero, 3 if one. */ - for (int length_idx_stdout = 0; lengths[length_idx_stdout] >= 0; - ++length_idx_stdout) - for (int length_idx_stderr = 0; lengths[length_idx_stderr] >= 0; - ++length_idx_stderr) - for (int write_mode = 0; write_mode < write_mode_last; ++write_mode) - for (int signal = 0; signal < 2; ++signal) - for (int status = 0; status < 2; ++status) - { - struct test test = - { - .out = random_string (lengths[length_idx_stdout]), - .err = random_string (lengths[length_idx_stderr]), - .write_mode = write_mode, - .signal = signal * SIGTERM, /* 0 or SIGTERM. */ - .status = status * 3, /* 0 or 3. */ - }; - TEST_VERIFY (strlen (test.out) == lengths[length_idx_stdout]); - TEST_VERIFY (strlen (test.err) == lengths[length_idx_stderr]); - - struct support_capture_subprocess result - = support_capture_subprocess (callback, &test); - check_stream ("stdout", &result.out, test.out); - check_stream ("stderr", &result.err, test.err); - if (test.signal != 0) - { - TEST_VERIFY (WIFSIGNALED (result.status)); - TEST_VERIFY (WTERMSIG (result.status) == test.signal); - } - else - { - TEST_VERIFY (WIFEXITED (result.status)); - TEST_VERIFY (WEXITSTATUS (result.status) == test.status); - } - support_capture_subprocess_free (&result); - free (test.out); - free (test.err); - } - return 0; -} - -#include <support/test-driver.c> |