| /* 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; |
| } |