trawick 2003/06/04 19:14:08
Modified: test .cvsignore Makefile.in testpipe.c
Added: test readchild.c
Log:
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)
Revision Changes Path
1.47 +1 -0 apr/test/.cvsignore
Index: .cvsignore
===================================================================
RCS file: /home/cvs/apr/test/.cvsignore,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -r1.46 -r1.47
--- .cvsignore 29 Dec 2002 05:56:58 -0000 1.46
+++ .cvsignore 5 Jun 2003 02:14:08 -0000 1.47
@@ -11,6 +11,7 @@
testmmap
htdigest
proctest
+readchild
testatomic
testud
testargs
1.139 +6 -2 apr/test/Makefile.in
Index: Makefile.in
===================================================================
RCS file: /home/cvs/apr/test/Makefile.in,v
retrieving revision 1.138
retrieving revision 1.139
diff -u -r1.138 -r1.139
--- Makefile.in 15 May 2003 14:39:05 -0000 1.138
+++ Makefile.in 5 Jun 2003 02:14:08 -0000 1.139
@@ -37,7 +37,8 @@
LOCAL_LIBS=../[EMAIL PROTECTED]@.la
-CLEAN_TARGETS = testfile.tmp mod_test.slo [EMAIL PROTECTED]@ [EMAIL
PROTECTED]@
+CLEAN_TARGETS = testfile.tmp mod_test.slo [EMAIL PROTECTED]@ [EMAIL
PROTECTED]@ \
[EMAIL PROTECTED]@
INCDIR=../include
INCLUDES=-I$(INCDIR)
@@ -59,6 +60,9 @@
[EMAIL PROTECTED]@: occhild.lo $(LOCAL_LIBS)
$(LINK) occhild.lo $(LOCAL_LIBS) $(ALL_LIBS)
[EMAIL PROTECTED]@: readchild.lo $(LOCAL_LIBS)
+ $(LINK) readchild.lo $(LOCAL_LIBS) $(ALL_LIBS)
+
[EMAIL PROTECTED]@: proc_child.lo $(LOCAL_LIBS)
$(LINK) proc_child.lo $(LOCAL_LIBS) $(ALL_LIBS)
@@ -117,7 +121,7 @@
testenv.lo
testall: $(TESTS) mod_test.la libmod_test.la [EMAIL PROTECTED]@ \
- CuTest.lo [EMAIL PROTECTED]@ $(LOCAL_LIBS)
+ [EMAIL PROTECTED]@ CuTest.lo [EMAIL PROTECTED]@ $(LOCAL_LIBS)
$(LINK) $(TESTS) CuTest.lo $(LOCAL_LIBS) $(ALL_LIBS)
1.24 +67 -0 apr/test/testpipe.c
Index: testpipe.c
===================================================================
RCS file: /home/cvs/apr/test/testpipe.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- testpipe.c 1 Jan 2003 00:01:56 -0000 1.23
+++ testpipe.c 5 Jun 2003 02:14:08 -0000 1.24
@@ -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 @@
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 @@
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;
}
1.1 apr/test/readchild.c
Index: readchild.c
===================================================================
/* ====================================================================
* 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 [EMAIL PROTECTED]
*
* 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;
}