/* ** OSSP sio - Stream I/O ** Copyright (c) 2002-2003 Cable & Wireless Deutschland ** Copyright (c) 2002-2003 The OSSP Project ** Copyright (c) 2002-2003 Ralf S. Engelschall ** ** This file is part of OSSP sio, a layered stream I/O library ** which can be found at http://www.ossp.org/pkg/lib/sio/. ** ** Permission to use, copy, modify, and distribute this software for ** any purpose with or without fee is hereby granted, provided that ** the above copyright notice and this permission notice appear in all ** copies. ** ** 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR ** 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. ** ** sio_test.c: stream I/O library test suite */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "ts.h" #include "al.h" #include "sio.h" #if ENABLE_BIO #include #include extern BIO_METHOD *BIO_s_socket(); extern sio_module_t sio_module_bio; #endif #if ENABLE_SA #include "sa.h" extern sio_module_t sio_module_sa; #endif extern sio_module_t sio_module_null; extern sio_module_t sio_module_hole; extern sio_module_t sio_module_buffer; extern sio_module_t sio_module_zlib; extern sio_module_t sio_module_sio; extern sio_module_t sio_module_fd; extern sio_module_t sio_module_hello; extern sio_module_t sio_module_sillymux; #define EVAL(name,rc,rc0,block) \ ts_test_check(TS_CTX, name); \ block \ if (rc != rc0) \ ts_test_fail(TS_CTX, "%s -> %d[%s] (expected %d[%s])\n", \ rc, sio_error(rc), rc0, sio_error(rc0)) #define EVAL0(name,block) EVAL(name,rc,SIO_OK,block) sio_rc_t readloop(sio_t *sio, char *buf, size_t len, size_t *actualp) { sio_rc_t rc; size_t actual, total = 0; while (len > 0) { rc = sio_read(sio, buf, len, &actual); if (rc != SIO_OK) break; buf += actual; total += actual; len -= actual; } *actualp = total; return rc; } TS_TEST(test_sio_buffer) { sio_rc_t rc; sio_t *sio; sio_stage_t *sios_buffer, *sios_hole; size_t bufsize = 1000; /* output/input buffer size */ int i,wcount = 100; char S[] = "Hello world\n"; size_t actual, len = strlen(S); EVAL0("sio_create", { rc = sio_create(&sio); }); if (rc != SIO_OK) return; EVAL0("sio_create_stage(&sios_hole)", { rc = sio_create_stage(sio, &sio_module_hole, &sios_hole); }); if (rc != SIO_OK) return; EVAL0("sio_create_stage(&sios_buffer)", { rc = sio_create_stage(sio, &sio_module_buffer, &sios_buffer); }); if (rc != SIO_OK) return; EVAL0("sio_configure_stage(sios_buffer, outputsize)", { rc = sio_configure_stage(sio, sios_buffer, "outputsize", &bufsize); }); if (rc != SIO_OK) return; EVAL0("sio_attach(sios_hole)", { rc = sio_attach(sio, sios_hole, SIO_MODE_WRITE); }); if (rc != SIO_OK) return; EVAL0("sio_attach(sios_buffer)", { rc = sio_attach(sio, sios_buffer, SIO_MODE_WRITE); }); if (rc != SIO_OK) return; for (i=0; i