1251876Speter/* Licensed to the Apache Software Foundation (ASF) under one or more 2251876Speter * contributor license agreements. See the NOTICE file distributed with 3251876Speter * this work for additional information regarding copyright ownership. 4251876Speter * The ASF licenses this file to You under the Apache License, Version 2.0 5251876Speter * (the "License"); you may not use this file except in compliance with 6251876Speter * the License. You may obtain a copy of the License at 7251876Speter * 8251876Speter * http://www.apache.org/licenses/LICENSE-2.0 9251876Speter * 10251876Speter * Unless required by applicable law or agreed to in writing, software 11251876Speter * distributed under the License is distributed on an "AS IS" BASIS, 12251876Speter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13251876Speter * See the License for the specific language governing permissions and 14251876Speter * limitations under the License. 15251876Speter */ 16251876Speter 17251876Speter#include "apr.h" 18251876Speter#include "apr_errno.h" 19251876Speter#include "apr_general.h" 20251876Speter#include "apr_strings.h" 21251876Speter#include "apr_xlate.h" 22251876Speter#include "abts.h" 23251876Speter#include "testutil.h" 24251876Speter 25251876Speter#if APR_HAS_XLATE 26251876Speter 27251876Speterstatic const char test_utf8[] = "Edelwei\xc3\x9f"; 28251876Speterstatic const char test_utf7[] = "Edelwei+AN8-"; 29251876Speterstatic const char test_latin1[] = "Edelwei\xdf"; 30251876Speterstatic const char test_latin2[] = "Edelwei\xdf"; 31251876Speter 32251876Speterstatic void test_conversion(abts_case *tc, apr_xlate_t *convset, 33251876Speter const char *inbuf, const char *expected) 34251876Speter{ 35251876Speter static char buf[1024]; 36251876Speter apr_size_t inbytes_left = strlen(inbuf); 37251876Speter apr_size_t outbytes_left = sizeof(buf) - 1; 38251876Speter apr_status_t rv; 39251876Speter 40251876Speter rv = apr_xlate_conv_buffer(convset, inbuf, &inbytes_left, buf, &outbytes_left); 41251876Speter ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); 42251876Speter 43251876Speter if (rv != APR_SUCCESS) 44251876Speter return; 45251876Speter 46251876Speter rv = apr_xlate_conv_buffer(convset, NULL, NULL, buf + sizeof(buf) - 47251876Speter outbytes_left - 1, &outbytes_left); 48251876Speter ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); 49251876Speter 50251876Speter buf[sizeof(buf) - outbytes_left - 1] = '\0'; 51251876Speter 52251876Speter ABTS_STR_EQUAL(tc, expected, buf); 53251876Speter} 54251876Speter 55251876Speterstatic void one_test(abts_case *tc, const char *cs1, const char *cs2, 56251876Speter const char *str1, const char *str2, 57251876Speter apr_pool_t *pool) 58251876Speter{ 59251876Speter apr_status_t rv; 60251876Speter apr_xlate_t *convset; 61251876Speter 62251876Speter rv = apr_xlate_open(&convset, cs2, cs1, pool); 63251876Speter ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); 64251876Speter 65251876Speter if (rv != APR_SUCCESS) 66251876Speter return; 67251876Speter 68251876Speter test_conversion(tc, convset, str1, str2); 69251876Speter 70251876Speter rv = apr_xlate_close(convset); 71251876Speter ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); 72251876Speter} 73251876Speter 74251876Speter#if APU_HAVE_APR_ICONV 75251876Speter/* it is a bug if iconv_open() fails */ 76251876Speterstatic int is_transform_supported(abts_case *tc, const char *cs1, 77251876Speter const char *cs2, apr_pool_t *pool) { 78251876Speter return 1; 79251876Speter} 80251876Speter#else 81251876Speter/* some iconv implementations don't support all tested transforms; 82251876Speter * example: 8859-1 <-> 8859-2 using native Solaris iconv 83251876Speter */ 84251876Speterstatic int is_transform_supported(abts_case *tc, const char *cs1, 85251876Speter const char *cs2, apr_pool_t *pool) { 86251876Speter apr_status_t rv; 87251876Speter apr_xlate_t *convset; 88251876Speter 89251876Speter rv = apr_xlate_open(&convset, cs2, cs1, pool); 90251876Speter if (rv != APR_SUCCESS) { 91251876Speter return 0; 92251876Speter } 93251876Speter 94251876Speter rv = apr_xlate_close(convset); 95251876Speter ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); 96251876Speter 97251876Speter return 1; 98251876Speter} 99251876Speter#endif 100251876Speter 101251876Speterstatic void test_transformation(abts_case *tc, void *data) 102251876Speter{ 103251876Speter /* 1. Identity transformation: UTF-8 -> UTF-8 */ 104251876Speter one_test(tc, "UTF-8", "UTF-8", test_utf8, test_utf8, p); 105251876Speter 106251876Speter /* 2. UTF-8 <-> ISO-8859-1 */ 107251876Speter one_test(tc, "UTF-8", "ISO-8859-1", test_utf8, test_latin1, p); 108251876Speter one_test(tc, "ISO-8859-1", "UTF-8", test_latin1, test_utf8, p); 109251876Speter 110251876Speter /* 3. ISO-8859-1 <-> ISO-8859-2, identity */ 111251876Speter if (is_transform_supported(tc, "ISO-8859-1", "ISO-8859-2", p)) { 112251876Speter one_test(tc, "ISO-8859-1", "ISO-8859-2", test_latin1, test_latin2, p); 113251876Speter } 114251876Speter if (is_transform_supported(tc, "ISO-8859-2", "ISO-8859-1", p)) { 115251876Speter one_test(tc, "ISO-8859-2", "ISO-8859-1", test_latin2, test_latin1, p); 116251876Speter } 117251876Speter 118251876Speter /* 4. Transformation using charset aliases */ 119251876Speter one_test(tc, "UTF-8", "UTF-7", test_utf8, test_utf7, p); 120251876Speter one_test(tc, "UTF-7", "UTF-8", test_utf7, test_utf8, p); 121251876Speter} 122251876Speter 123251876Speter#endif /* APR_HAS_XLATE */ 124251876Speter 125251876Speterabts_suite *testxlate(abts_suite *suite) 126251876Speter{ 127251876Speter suite = ADD_SUITE(suite); 128251876Speter 129251876Speter#if APR_HAS_XLATE 130251876Speter abts_run_test(suite, test_transformation, NULL); 131251876Speter#endif 132251876Speter 133251876Speter return suite; 134251876Speter} 135