/* ==================================================================== * 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 * . */ #include "test_apr.h" #include #include #include #include #include "apr_general.h" #include "apr_strings.h" #include "apr_errno.h" /* I haven't bothered to check for APR_ENOTIMPL here, AFAIK, all string * functions exist on all platforms. */ static void test_strtok(CuTest *tc) { struct { char *input; char *sep; } cases[] = { { "", "Z" }, { " asdf jkl; 77889909 \r\n\1\2\3Z", " \r\n\3\2\1" }, { NULL, /* but who cares if apr_strtok() segfaults? */ " \t" }, #if 0 /* don't do this... you deserve to segfault */ { "a b c ", NULL }, #endif { " a b c ", "" }, { "a b c ", " " } }; int curtc; for (curtc = 0; curtc < sizeof cases / sizeof cases[0]; curtc++) { char *retval1, *retval2; char *str1, *str2; char *state; str1 = apr_pstrdup(p, cases[curtc].input); str2 = apr_pstrdup(p, cases[curtc].input); do { retval1 = apr_strtok(str1, cases[curtc].sep, &state); retval2 = strtok(str2, cases[curtc].sep); if (!retval1) { CuAssertTrue(tc, retval2 == NULL); } else { CuAssertTrue(tc, retval2 != NULL); CuAssertStrEquals(tc, retval2, retval1); } str1 = str2 = NULL; /* make sure we pass NULL on subsequent calls */ } while (retval1); } } static void snprintf_noNULL(CuTest *tc) { char buff[100]; char *testing = apr_palloc(p, 10); testing[0] = 't'; testing[1] = 'e'; testing[2] = 's'; testing[3] = 't'; testing[4] = 'i'; testing[5] = 'n'; testing[6] = 'g'; /* If this test fails, we are going to seg fault. */ apr_snprintf(buff, sizeof(buff), "%.*s", 7, testing); CuAssertStrNEquals(tc, buff, testing, 7); } static void snprintf_0NULL(CuTest *tc) { int rv; rv = apr_snprintf(NULL, 0, "%sBAR", "FOO"); CuAssertIntEquals(tc, 6, rv); } static void snprintf_0nonNULL(CuTest *tc) { int rv; char *buff = "testing"; rv = apr_snprintf(buff, 0, "%sBAR", "FOO"); CuAssertIntEquals(tc, 6, rv); CuAssert(tc, "buff unmangled", strcmp(buff, "FOOBAR") != 0); } static void snprintf_int64(CuTest *tc) { char buf[100]; apr_int64_t i = APR_INT64_C(-42); apr_uint64_t ui = APR_INT64_C(42); /* no APR_UINT64_C */ apr_uint64_t big = APR_INT64_C(3141592653589793238); apr_snprintf(buf, sizeof buf, "%" APR_INT64_T_FMT, i); CuAssertStrEquals(tc, buf, "-42"); apr_snprintf(buf, sizeof buf, "%" APR_UINT64_T_FMT, ui); CuAssertStrEquals(tc, buf, "42"); apr_snprintf(buf, sizeof buf, "%" APR_UINT64_T_FMT, big); CuAssertStrEquals(tc, buf, "3141592653589793238"); } static void string_error(CuTest *tc) { char buf[128], *rv; buf[0] = '\0'; rv = apr_strerror(APR_ENOENT, buf, sizeof buf); CuAssertPtrEquals(tc, buf, rv); CuAssertTrue(tc, strlen(buf) > 0); rv = apr_strerror(APR_TIMEUP, buf, sizeof buf); CuAssertPtrEquals(tc, buf, rv); CuAssertStrEquals(tc, "The timeout specified has expired", buf); } #define SIZE 180000 static void string_long(CuTest *tc) { char s[SIZE + 1]; memset(s, 'A', SIZE); s[SIZE] = '\0'; apr_psprintf(p, "%s", s); } CuSuite *teststr(void) { CuSuite *suite = CuSuiteNew("Strings"); SUITE_ADD_TEST(suite, snprintf_0NULL); SUITE_ADD_TEST(suite, snprintf_0nonNULL); SUITE_ADD_TEST(suite, snprintf_noNULL); SUITE_ADD_TEST(suite, snprintf_int64); SUITE_ADD_TEST(suite, test_strtok); SUITE_ADD_TEST(suite, string_error); SUITE_ADD_TEST(suite, string_long); return suite; }