summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authortrawick <trawick@13f79535-47bb-0310-9956-ffa450edef68>2003-06-05 02:14:08 +0000
committertrawick <trawick@13f79535-47bb-0310-9956-ffa450edef68>2003-06-05 02:14:08 +0000
commit6f30688f19fd33c6c9f80c4a0b0ce6edb9653cda (patch)
treeb52d3ffae88ac64253041bd45417c58ac81322b9 /test
parentfcecd05dcf38a0e42b8c4b3eb813765a2eb097c3 (diff)
downloadlibapr-6f30688f19fd33c6c9f80c4a0b0ce6edb9653cda.tar.gz
add a testcase to catch the problem seen with PR 20295, where
apr_file_write_full() to pipe with timeout can return EAGAIN PR: 20295 (not fixed just yet) git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@64527 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'test')
-rw-r--r--test/.cvsignore1
-rw-r--r--test/Makefile.in8
-rw-r--r--test/readchild.c84
-rw-r--r--test/testpipe.c67
4 files changed, 158 insertions, 2 deletions
diff --git a/test/.cvsignore b/test/.cvsignore
index d37e3cf8d..4736de449 100644
--- a/test/.cvsignore
+++ b/test/.cvsignore
@@ -11,6 +11,7 @@ testmd5
testmmap
htdigest
proctest
+readchild
testatomic
testud
testargs
diff --git a/test/Makefile.in b/test/Makefile.in
index c5460ad2a..096cf89d0 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -37,7 +37,8 @@ TARGETS = $(PROGRAMS)
LOCAL_LIBS=../lib@APR_LIBNAME@.la
-CLEAN_TARGETS = testfile.tmp mod_test.slo proc_child@EXEEXT@ occhild@EXEEXT@
+CLEAN_TARGETS = testfile.tmp mod_test.slo proc_child@EXEEXT@ occhild@EXEEXT@ \
+readchild@EXEEXT@
INCDIR=../include
INCLUDES=-I$(INCDIR)
@@ -59,6 +60,9 @@ testflock@EXEEXT@: testflock.lo $(LOCAL_LIBS)
occhild@EXEEXT@: occhild.lo $(LOCAL_LIBS)
$(LINK) occhild.lo $(LOCAL_LIBS) $(ALL_LIBS)
+readchild@EXEEXT@: readchild.lo $(LOCAL_LIBS)
+ $(LINK) readchild.lo $(LOCAL_LIBS) $(ALL_LIBS)
+
proc_child@EXEEXT@: proc_child.lo $(LOCAL_LIBS)
$(LINK) proc_child.lo $(LOCAL_LIBS) $(ALL_LIBS)
@@ -117,7 +121,7 @@ TESTS = testall.lo testtime.lo teststr.lo testvsn.lo testipsub.lo \
testenv.lo
testall: $(TESTS) mod_test.la libmod_test.la occhild@EXEEXT@ \
- CuTest.lo proc_child@EXEEXT@ $(LOCAL_LIBS)
+ readchild@EXEEXT@ CuTest.lo proc_child@EXEEXT@ $(LOCAL_LIBS)
$(LINK) $(TESTS) CuTest.lo $(LOCAL_LIBS) $(ALL_LIBS)
diff --git a/test/readchild.c b/test/readchild.c
new file mode 100644
index 000000000..e20f6a3b6
--- /dev/null
+++ b/test/readchild.c
@@ -0,0 +1,84 @@
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2000-2003 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Apache" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+#include <stdlib.h>
+
+#include "apr_file_io.h"
+
+int main(int argc, char *argv[])
+{
+ apr_file_t *in, *out;
+ apr_size_t nbytes, total_bytes;
+ apr_pool_t *p;
+ char buf[128];
+ apr_status_t rv;
+
+ apr_initialize();
+ atexit(apr_terminate);
+ apr_pool_create(&p, NULL);
+
+ apr_file_open_stdin(&in, p);
+ apr_file_open_stdout(&out, p);
+
+ total_bytes = 0;
+ nbytes = sizeof(buf);
+ while ((rv = apr_file_read(in, buf, &nbytes)) == APR_SUCCESS) {
+ total_bytes += nbytes;
+ nbytes = sizeof(buf);
+ }
+
+ apr_file_printf(out, "%" APR_SIZE_T_FMT " bytes were read\n",
+ total_bytes);
+ return 0;
+}
diff --git a/test/testpipe.c b/test/testpipe.c
index 14df56e01..98702c0f3 100644
--- a/test/testpipe.c
+++ b/test/testpipe.c
@@ -52,11 +52,15 @@
* <http://www.apache.org/>.
*/
+#include <stdlib.h>
+
#include "test_apr.h"
#include "apr_file_io.h"
#include "apr_errno.h"
#include "apr_general.h"
#include "apr_lib.h"
+#include "apr_thread_proc.h"
+#include "apr_strings.h"
static apr_file_t *readp = NULL;
static apr_file_t *writep = NULL;
@@ -157,6 +161,68 @@ static void read_write_notimeout(CuTest *tc)
CuAssertStrEquals(tc, "this is a test", input);
}
+/* XXX FIXME */
+#ifdef WIN32
+#define EXTENSION ".exe"
+#elif NETWARE
+#define EXTENSION ".nlm"
+#else
+#define EXTENSION
+#endif
+
+static void test_pipe_writefull(CuTest *tc)
+{
+ int iterations = 1000;
+ int i;
+ int bytes_per_iteration = 8000;
+ char *buf = (char *)malloc(bytes_per_iteration);
+ char responsebuf[128];
+ apr_size_t nbytes;
+ int bytes_processed;
+ apr_proc_t proc = {0};
+ apr_procattr_t *procattr;
+ const char *args[2];
+ apr_status_t rv;
+
+ rv = apr_procattr_create(&procattr, p);
+ CuAssertIntEquals(tc, APR_SUCCESS, rv);
+
+ rv = apr_procattr_io_set(procattr, APR_CHILD_BLOCK, APR_CHILD_BLOCK,
+ APR_CHILD_BLOCK);
+ CuAssertIntEquals(tc, APR_SUCCESS, rv);
+
+ rv = apr_procattr_error_check_set(procattr, 1);
+ CuAssertIntEquals(tc, APR_SUCCESS, rv);
+
+ args[0] = "readchild" EXTENSION;
+ args[1] = NULL;
+ rv = apr_proc_create(&proc, "./readchild" EXTENSION, args, NULL, procattr, p);
+ CuAssertIntEquals(tc, APR_SUCCESS, rv);
+
+ rv = apr_file_pipe_timeout_set(proc.in, apr_time_from_sec(10));
+ CuAssertIntEquals(tc, APR_SUCCESS, rv);
+
+ rv = apr_file_pipe_timeout_set(proc.out, apr_time_from_sec(10));
+ CuAssertIntEquals(tc, APR_SUCCESS, rv);
+
+ i = iterations;
+ do {
+ rv = apr_file_write_full(proc.in, buf, bytes_per_iteration, NULL);
+ CuAssertIntEquals(tc, APR_SUCCESS, rv);
+ } while (--i);
+
+ free(buf);
+
+ rv = apr_file_close(proc.in);
+ CuAssertIntEquals(tc, APR_SUCCESS, rv);
+
+ nbytes = sizeof(responsebuf);
+ rv = apr_file_read(proc.out, responsebuf, &nbytes);
+ CuAssertIntEquals(tc, APR_SUCCESS, rv);
+ bytes_processed = (int)apr_strtoi64(responsebuf, NULL, 10);
+ CuAssertIntEquals(tc, iterations * bytes_per_iteration, bytes_processed);
+}
+
CuSuite *testpipe(void)
{
CuSuite *suite = CuSuiteNew("Pipes");
@@ -166,6 +232,7 @@ CuSuite *testpipe(void)
SUITE_ADD_TEST(suite, set_timeout);
SUITE_ADD_TEST(suite, read_write);
SUITE_ADD_TEST(suite, read_write_notimeout);
+ SUITE_ADD_TEST(suite, test_pipe_writefull);
return suite;
}