svn commit: r1935497 - in apr/apr-util/branches/1.7.x: . test
[email protected] Fri, 19 Jun 2026 06:54:04 -0000
| Newsgroups | gmane.comp.apache.apr.cvs |
|---|---|
| Message-ID | <178185204492.3213322.17810746598911602428@svn03-he-fi> |
Author: brane
Date: Fri Jun 19 06:54:04 2026
New Revision: 1935497
Log:
Merge r1935351 from trunk:
Overhaul the xlate tests, making each conversion a separate test case.
Print the source and target encoding of failing conversions.
Modified:
apr/apr-util/branches/1.7.x/ (props changed)
apr/apr-util/branches/1.7.x/test/testxlate.c
Modified: apr/apr-util/branches/1.7.x/test/testxlate.c
==============================================================================
--- apr/apr-util/branches/1.7.x/test/testxlate.c Fri Jun 19 06:53:43 2026 (r1935496)
+++ apr/apr-util/branches/1.7.x/test/testxlate.c Fri Jun 19 06:54:04 2026 (r1935497)
@@ -24,13 +24,45 @@
#if APR_HAS_XLATE
+static const char cs_utf7[] = "UTF-7";
+static const char cs_utf8[] = "UTF-8";
+static const char cs_latin1[] = "ISO-8859-1";
+static const char cs_latin2[] = "ISO-8859-2";
+
static const char test_utf8[] = "Edelwei\xc3\x9f";
static const char test_utf7[] = "Edelwei+AN8-";
static const char test_latin1[] = "Edelwei\xdf";
static const char test_latin2[] = "Edelwei\xdf";
+struct test_params
+{
+ const char *cs1; /* source encoding */
+ const char *cs2; /* target encoding */
+ const char *source;
+ const char *expected;
+ int check_xlate_supported;
+};
+
+#define DECLARE_TEST_PARAMS(src, dst, chk) \
+static struct test_params test_params_##src##_##dst = { \
+ cs_##src, cs_##dst, test_##src, test_##dst, (chk) \
+}
+DECLARE_TEST_PARAMS(utf8, utf8, 0);
+DECLARE_TEST_PARAMS(utf8, latin1, 0);
+DECLARE_TEST_PARAMS(latin1, utf8, 0);
+DECLARE_TEST_PARAMS(latin1, latin2, 1);
+DECLARE_TEST_PARAMS(latin2, latin1, 1);
+DECLARE_TEST_PARAMS(utf8, utf7, 0);
+/* NOTE: The system libiconv on macOS has a bug in the UTF-7 to UTF-8
+ * conversion that leaves the trailing '-' in the translated
+ * string, causing this test to fail. */
+DECLARE_TEST_PARAMS(utf7, utf8, 0);
+#undef DECLARE_TEST_PARAMS
+
+
static void test_conversion(abts_case *tc, apr_xlate_t *convset,
- const char *inbuf, const char *expected)
+ const char *inbuf, const char *expected,
+ const char *cs1, const char *cs2, apr_pool_t *pool)
{
static char buf[1024];
apr_size_t inbytes_left = strlen(inbuf);
@@ -43,32 +75,23 @@ static void test_conversion(abts_case *t
if (rv != APR_SUCCESS)
return;
- rv = apr_xlate_conv_buffer(convset, NULL, NULL, buf + sizeof(buf) -
- outbytes_left - 1, &outbytes_left);
+ rv = apr_xlate_conv_buffer(convset, NULL, NULL,
+ buf + sizeof(buf) - outbytes_left - 1,
+ &outbytes_left);
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
buf[sizeof(buf) - outbytes_left - 1] = '\0';
- ABTS_STR_EQUAL(tc, expected, buf);
-}
-
-static void one_test(abts_case *tc, const char *cs1, const char *cs2,
- const char *str1, const char *str2,
- apr_pool_t *pool)
-{
- apr_status_t rv;
- apr_xlate_t *convset;
-
- rv = apr_xlate_open(&convset, cs2, cs1, pool);
- ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
-
- if (rv != APR_SUCCESS)
- return;
-
- test_conversion(tc, convset, str1, str2);
-
- rv = apr_xlate_close(convset);
- ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ {
+ /* Make the source and target encodings part of the comparison
+ so that ABTS prints them if the results don't match, otherwise
+ we wouldn't know which conversion failed. */
+ const char *const expect = apr_psprintf(pool, "%s to %s: %s",
+ cs1, cs2, expected);
+ const char *const result = apr_psprintf(pool, "%s to %s: %s",
+ cs1, cs2, buf);
+ ABTS_STR_EQUAL(tc, expect, result);
+ }
}
#if APU_HAVE_APR_ICONV
@@ -81,8 +104,9 @@ static int is_transform_supported(abts_c
/* some iconv implementations don't support all tested transforms;
* example: 8859-1 <-> 8859-2 using native Solaris iconv
*/
-static int is_transform_supported(abts_case *tc, const char *cs1,
- const char *cs2, apr_pool_t *pool) {
+static int is_transform_supported(abts_case *tc,
+ const char *cs1, const char *cs2,
+ apr_pool_t *pool) {
apr_status_t rv;
apr_xlate_t *convset;
@@ -100,24 +124,30 @@ static int is_transform_supported(abts_c
static void test_transformation(abts_case *tc, void *data)
{
- /* 1. Identity transformation: UTF-8 -> UTF-8 */
- one_test(tc, "UTF-8", "UTF-8", test_utf8, test_utf8, p);
+ const struct test_params *const params = data;
- /* 2. UTF-8 <-> ISO-8859-1 */
- one_test(tc, "UTF-8", "ISO-8859-1", test_utf8, test_latin1, p);
- one_test(tc, "ISO-8859-1", "UTF-8", test_latin1, test_utf8, p);
+ apr_status_t rv;
+ apr_xlate_t *convset;
- /* 3. ISO-8859-1 <-> ISO-8859-2, identity */
- if (is_transform_supported(tc, "ISO-8859-1", "ISO-8859-2", p)) {
- one_test(tc, "ISO-8859-1", "ISO-8859-2", test_latin1, test_latin2, p);
- }
- if (is_transform_supported(tc, "ISO-8859-2", "ISO-8859-1", p)) {
- one_test(tc, "ISO-8859-2", "ISO-8859-1", test_latin2, test_latin1, p);
+ if (params->check_xlate_supported
+ && !is_transform_supported(tc, params->cs1, params->cs2, p)) {
+ ABTS_SKIP(tc, data,
+ apr_psprintf(p, "xlate not supported: %s to %s",
+ params->cs1, params->cs2));
+ return;
}
- /* 4. Transformation using charset aliases */
- one_test(tc, "UTF-8", "UTF-7", test_utf8, test_utf7, p);
- one_test(tc, "UTF-7", "UTF-8", test_utf7, test_utf8, p);
+ rv = apr_xlate_open(&convset, params->cs2, params->cs1, p);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ if (rv != APR_SUCCESS)
+ return;
+
+ test_conversion(tc, convset, params->source, params->expected,
+ params->cs1, params->cs2, p);
+
+ rv = apr_xlate_close(convset);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
}
#endif /* APR_HAS_XLATE */
@@ -127,7 +157,20 @@ abts_suite *testxlate(abts_suite *suite)
suite = ADD_SUITE(suite);
#if APR_HAS_XLATE
- abts_run_test(suite, test_transformation, NULL);
+ /* 1. Identity transformation: UTF-8 -> UTF-8 */
+ abts_run_test(suite, test_transformation, &test_params_utf8_utf8);
+
+ /* 2. UTF-8 <-> ISO-8859-1 */
+ abts_run_test(suite, test_transformation, &test_params_latin1_utf8);
+ abts_run_test(suite, test_transformation, &test_params_utf8_latin1);
+
+ /* 3. Identity transformation: ISO-8859-1 <-> ISO-8859-2 */
+ abts_run_test(suite, test_transformation, &test_params_latin1_latin2);
+ abts_run_test(suite, test_transformation, &test_params_latin2_latin1);
+
+ /* 4. Transformation using charset aliases */
+ abts_run_test(suite, test_transformation, &test_params_utf8_utf7);
+ abts_run_test(suite, test_transformation, &test_params_utf7_utf8);
#endif
return suite;