| /* Licensed to the Apache Software Foundation (ASF) under one or more | |
| * contributor license agreements. See the NOTICE file distributed with | |
| * this work for additional information regarding copyright ownership. | |
| * The ASF licenses this file to You under the Apache License, Version 2.0 | |
| * (the "License"); you may not use this file except in compliance with | |
| * the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #include "testutil.h" | |
| #include "apr_general.h" | |
| #include "apr_buffer.h" | |
| #include "apr_tables.h" | |
| static unsigned char test_memory[] = {1, 2, 3, 4}; | |
| static char *test_string = "Hello"; | |
| static void test_memory_buffer(abts_case *tc, void *data) | |
| { | |
| apr_pool_t *pool; | |
| apr_buffer_t *mb; | |
| char *str; | |
| void *mem; | |
| apr_size_t len; | |
| apr_pool_create(&pool, p); | |
| ABTS_ASSERT(tc, "mem_create was not created", | |
| APR_SUCCESS == apr_buffer_mem_create(&mb, pool, test_memory, | |
| sizeof(test_memory))); | |
| ABTS_ASSERT(tc, "mem_create stored wrong data", | |
| memcmp(test_memory, mb->d.mem, sizeof(test_memory)) == 0); | |
| ABTS_ASSERT(tc, "memory buffer is NULL", | |
| !apr_buffer_is_null(mb)); | |
| ABTS_ASSERT(tc, "memory buffer is a string", | |
| !apr_buffer_is_str(mb)); | |
| ABTS_ASSERT(tc, "memory buffer returned a string", | |
| apr_buffer_str(mb) == NULL); | |
| ABTS_ASSERT(tc, "memory buffer returned memory", | |
| apr_buffer_mem(mb, NULL) != NULL); | |
| str = apr_buffer_pstrdup(pool, mb); | |
| ABTS_ASSERT(tc, "memory buffer returned same memory", | |
| str != mb->d.mem && !memcmp(str, mb->d.mem, strlen(str))); | |
| mem = apr_buffer_pmemdup(pool, mb, &len); | |
| ABTS_ASSERT(tc, "memory buffer returned same memory", | |
| mem != mb->d.mem && !memcmp(mem, mb->d.mem, len)); | |
| ABTS_ASSERT(tc, "memory buffer has wrong length", | |
| apr_buffer_len(mb) == sizeof(test_memory)); | |
| ABTS_ASSERT(tc, "memory buffer has wrong allocation", | |
| apr_buffer_allocated(mb) == sizeof(test_memory)); | |
| apr_pool_destroy(pool); | |
| } | |
| static void test_string_buffer(abts_case *tc, void *data) | |
| { | |
| apr_pool_t *pool; | |
| apr_buffer_t *sb; | |
| char *str; | |
| void *mem; | |
| apr_size_t len; | |
| apr_pool_create(&pool, p); | |
| ABTS_ASSERT(tc, "str_create was not created", | |
| APR_SUCCESS == apr_buffer_str_create(&sb, pool, test_string, | |
| APR_BUFFER_STRING)); | |
| ABTS_ASSERT(tc, "str_create stored wrong data", | |
| strncmp(test_string, sb->d.str, strlen(test_string)) == 0); | |
| ABTS_ASSERT(tc, "str_create's buffer is NULL", | |
| !apr_buffer_is_null(sb)); | |
| ABTS_ASSERT(tc, "str_create's buffer is not a string", | |
| apr_buffer_is_str(sb)); | |
| ABTS_ASSERT(tc, "str_create's buffer didn't return a string", | |
| apr_buffer_str(sb) != NULL); | |
| ABTS_ASSERT(tc, "str_create's buffer returned memory", | |
| apr_buffer_mem(sb, NULL) != NULL); | |
| str = apr_buffer_pstrdup(pool, sb); | |
| ABTS_ASSERT(tc, "string buffer returned same string", | |
| str != sb->d.str && !strncmp(str, sb->d.str, strlen(str))); | |
| mem = apr_buffer_pmemdup(pool, sb, &len); | |
| ABTS_ASSERT(tc, "string buffer returned same memory", | |
| mem != sb->d.str && !memcmp(mem, sb->d.str, len)); | |
| ABTS_ASSERT(tc, "string buffer has wrong length", | |
| apr_buffer_len(sb) == strlen(test_string)); | |
| ABTS_ASSERT(tc, "string buffer has wrong allocation", | |
| apr_buffer_allocated(sb) == strlen(test_string) + 1); | |
| ABTS_ASSERT(tc, "string buffer accepted bogus non-zero terminated string", | |
| APR_EINVAL == apr_buffer_str_set(sb, (char *)test_memory, | |
| sizeof(test_memory) - 1)); | |
| apr_pool_destroy(pool); | |
| } | |
| static void test_null_buffer(abts_case *tc, void *data) | |
| { | |
| apr_pool_t *pool; | |
| apr_buffer_t *nb; | |
| apr_pool_create(&pool, p); | |
| ABTS_ASSERT(tc, "null_create was not created", | |
| APR_SUCCESS == apr_buffer_null_create(&nb, pool)); | |
| ABTS_ASSERT(tc, "null buffer isn't NULL", | |
| apr_buffer_is_null(nb)); | |
| apr_buffer_str_set(nb, test_string, strlen(test_string)); | |
| ABTS_ASSERT(tc, "string buffer is NULL", | |
| !apr_buffer_is_null(nb)); | |
| apr_buffer_mem_set(nb, test_memory, sizeof(test_memory)); | |
| ABTS_ASSERT(tc, "memory buffer is NULL", | |
| !apr_buffer_is_null(nb)); | |
| apr_buffer_str_set(nb, NULL, 0); | |
| ABTS_ASSERT(tc, "null buffer isn't NULL", | |
| apr_buffer_is_null(nb)); | |
| apr_buffer_mem_set(nb, NULL, 0); | |
| ABTS_ASSERT(tc, "null buffer isn't NULL", | |
| apr_buffer_is_null(nb)); | |
| apr_pool_destroy(pool); | |
| } | |
| static void *test_buffers_palloc(void *ctx, apr_size_t size) | |
| { | |
| apr_pool_t *pool = ctx; | |
| return apr_palloc(pool, size); | |
| } | |
| static void test_buffers(abts_case *tc, void *data) | |
| { | |
| apr_pool_t *pool; | |
| apr_array_header_t *vals; | |
| apr_buffer_t src[4]; | |
| apr_buffer_t *dst; | |
| char *str; | |
| apr_size_t len; | |
| memset(&src, 0, sizeof(src)); | |
| apr_pool_create(&pool, p); | |
| /* populate our source buffers */ | |
| apr_buffer_mem_set(&src[0], test_memory, sizeof(test_memory)); | |
| apr_buffer_str_set(&src[1], test_string, strlen(test_string)); | |
| apr_buffer_mem_set(&src[2], test_memory, sizeof(test_memory)); | |
| apr_buffer_str_set(&src[3], test_string, strlen(test_string)); | |
| /* duplicate the source buffers, allocating memory from a pool */ | |
| vals = apr_array_make(pool, 4, sizeof(apr_buffer_t)); | |
| apr_buffer_arraydup((apr_buffer_t **)(&vals->elts), src, test_buffers_palloc, pool, 4); | |
| vals->nelts = 4; | |
| dst = apr_array_pop(vals); | |
| ABTS_ASSERT(tc, "second buffer compare fail", | |
| !apr_buffer_cmp(dst, &src[1])); | |
| dst = apr_array_pop(vals); | |
| ABTS_ASSERT(tc, "first buffer compare fail", | |
| !apr_buffer_cmp(dst, &src[0])); | |
| dst = apr_buffer_cpy(dst, &src[1], test_buffers_palloc, pool); | |
| ABTS_ASSERT(tc, "buffer copy fail", | |
| !apr_buffer_cmp(dst, &src[1])); | |
| str = apr_buffer_pstrncat(pool, &src[0], 4, "; ", APR_BUFFER_BASE64, &len); | |
| ABTS_ASSERT(tc, "buffer strcat fail", | |
| !strcmp(str, "AQIDBA==; Hello; AQIDBA==; Hello")); | |
| apr_pool_destroy(pool); | |
| } | |
| static void test_compare_buffers(abts_case *tc, void *data) | |
| { | |
| apr_pool_t *pool; | |
| apr_buffer_t *small; | |
| apr_buffer_t *large; | |
| char *same = "same"; | |
| apr_pool_create(&pool, p); | |
| small = NULL; | |
| large = NULL; | |
| ABTS_ASSERT(tc, "NULL equals NULL", | |
| !apr_buffer_cmp(small, large)); | |
| apr_buffer_null_create(&small, pool); | |
| ABTS_ASSERT(tc, "null buffer equals NULL", | |
| !apr_buffer_cmp(small, large)); | |
| ABTS_ASSERT(tc, "NULL equals null buffer", | |
| !apr_buffer_cmp(large, small)); | |
| apr_buffer_null_create(&large, pool); | |
| ABTS_ASSERT(tc, "null buffer equals null buffer", | |
| !apr_buffer_cmp(small, large)); | |
| apr_buffer_str_set(small, same, APR_BUFFER_STRING); | |
| apr_buffer_str_set(large, same, APR_BUFFER_STRING); | |
| ABTS_ASSERT(tc, "pointer equals same pointer", | |
| !apr_buffer_cmp(small, large)); | |
| apr_buffer_str_set(small, "same", APR_BUFFER_STRING); | |
| apr_buffer_str_set(large, "same", APR_BUFFER_STRING); | |
| ABTS_ASSERT(tc, "'same' equals 'same'", | |
| !apr_buffer_cmp(small, large)); | |
| apr_buffer_str_set(small, "short", APR_BUFFER_STRING); | |
| apr_buffer_str_set(large, "l o n g", APR_BUFFER_STRING); | |
| ABTS_ASSERT(tc, "'short' less than 'l o n g'", | |
| apr_buffer_cmp(small, large) < 0); | |
| ABTS_ASSERT(tc, "'l o n g' greater than 'short'", | |
| apr_buffer_cmp(large, small) > 0); | |
| apr_buffer_str_set(small, "aardvark", APR_BUFFER_STRING); | |
| apr_buffer_str_set(large, "zucchini", APR_BUFFER_STRING); | |
| ABTS_ASSERT(tc, "'aardvark' less than 'zucchini'", | |
| apr_buffer_cmp(small, large) < 0); | |
| ABTS_ASSERT(tc, "'zucchini' greater than 'aardvark'", | |
| apr_buffer_cmp(large, small) > 0); | |
| apr_pool_destroy(pool); | |
| } | |
| abts_suite *testbuffer(abts_suite *suite) | |
| { | |
| suite = ADD_SUITE(suite); | |
| abts_run_test(suite, test_memory_buffer, NULL); | |
| abts_run_test(suite, test_string_buffer, NULL); | |
| abts_run_test(suite, test_null_buffer, NULL); | |
| abts_run_test(suite, test_buffers, NULL); | |
| abts_run_test(suite, test_compare_buffers, NULL); | |
| return suite; | |
| } |