# HG changeset patch # User Timo Sirainen # Date 1431769598 -10800 # Node ID dcaf508860ad250195714c6c9795166a9614d3f3 # Parent 1044c55fb4ef87aaff580f4d48830235b37a5f4a lib-charset: Added a minimal unit test diff -r 1044c55fb4ef -r dcaf508860ad src/lib-charset/Makefile.am --- a/src/lib-charset/Makefile.am Sat May 16 11:47:09 2015 +0300 +++ b/src/lib-charset/Makefile.am Sat May 16 12:46:38 2015 +0300 @@ -1,7 +1,8 @@ noinst_LTLIBRARIES = libcharset.la AM_CPPFLAGS = \ - -I$(top_srcdir)/src/lib + -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/lib-test libcharset_la_LIBADD = $(LTLIBICONV) libcharset_la_SOURCES = \ @@ -13,3 +14,23 @@ pkginc_libdir=$(pkgincludedir) pkginc_lib_HEADERS = $(headers) + +test_programs = \ + test-charset + +noinst_PROGRAMS = $(test_programs) + +test_libs = \ + ../lib-test/libtest.la \ + ../lib/liblib.la +test_deps = $(noinst_LTLIBRARIES) $(test_libs) + +test_charset_SOURCES = test-charset.c +test_charset_LDADD = libcharset.la $(test_libs) +test_charset_DEPENDENCIES = libcharset.la $(test_deps) + +check: check-am check-test +check-test: all-am + for bin in $(test_programs); do \ + if ! $(RUN_TEST) ./$$bin; then exit 1; fi; \ + done diff -r 1044c55fb4ef -r dcaf508860ad src/lib-charset/charset-iconv.c --- a/src/lib-charset/charset-iconv.c Sat May 16 11:47:09 2015 +0300 +++ b/src/lib-charset/charset-iconv.c Sat May 16 12:46:38 2015 +0300 @@ -118,8 +118,7 @@ if (result == CHARSET_RET_INVALID_INPUT) { if (prev_invalid_pos != dest->used) { - uni_ucs4_to_utf8_c(UNICODE_REPLACEMENT_CHAR, - dest); + str_append(dest, UNICODE_REPLACEMENT_CHAR_UTF8); prev_invalid_pos = dest->used; } pos++; diff -r 1044c55fb4ef -r dcaf508860ad src/lib-charset/test-charset.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib-charset/test-charset.c Sat May 16 12:46:38 2015 +0300 @@ -0,0 +1,90 @@ +/* Copyright (c) 2015 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "str.h" +#include "test-common.h" +#include "charset-utf8.h" + +static void test_charset_is_utf8(void) +{ + test_begin("charset_is_utf8"); + test_assert(charset_is_utf8("AScII")); + test_assert(charset_is_utf8("us-AScII")); + test_assert(charset_is_utf8("uTF8")); + test_assert(charset_is_utf8("uTF-8")); + test_end(); +} + +static void test_charset_utf8_common(const char *input_charset) +{ + struct { + const char *input; + const char *output; + enum charset_result result; + } tests[] = { + { "päÃ", "pä", CHARSET_RET_INCOMPLETE_INPUT }, + { "päÃa", "pä"UNICODE_REPLACEMENT_CHAR_UTF8"a", CHARSET_RET_INVALID_INPUT } + }; + string_t *str = t_str_new(128); + enum charset_result result; + unsigned int i; + + for (i = 0; i < N_ELEMENTS(tests); i++) { + str_truncate(str, 0); + test_assert_idx(charset_to_utf8_str(input_charset, NULL, + tests[i].input, str, &result) == 0, i); + test_assert_idx(strcmp(tests[i].output, str_c(str)) == 0, i); + test_assert_idx(result == tests[i].result, i); + } +} + +static void test_charset_utf8(void) +{ + test_begin("charset utf8"); + test_charset_utf8_common("UTF-8"); + test_end(); +} + +#ifdef HAVE_ICONV +static void test_charset_iconv(void) +{ + struct { + const char *charset; + const char *input; + const char *output; + enum charset_result result; + } tests[] = { + { "ISO-8859-1", "p\xE4\xE4", "pää", CHARSET_RET_OK } + }; + string_t *str = t_str_new(128); + enum charset_result result; + unsigned int i; + + test_begin("charset iconv"); + for (i = 0; i < N_ELEMENTS(tests); i++) { + str_truncate(str, 0); + test_assert_idx(charset_to_utf8_str(tests[i].charset, NULL, + tests[i].input, str, &result) == 0, i); + test_assert_idx(strcmp(tests[i].output, str_c(str)) == 0, i); + test_assert_idx(result == tests[i].result, i); + } + /* Use //IGNORE just to force handling to be done by iconv + instead of our own UTF-8 routines. */ + test_charset_utf8_common("UTF-8//IGNORE"); + test_end(); +} +#endif + +int main(void) +{ + static void (*test_functions[])(void) = { + test_charset_is_utf8, + test_charset_utf8, +#ifdef HAVE_ICONV + test_charset_iconv, +#endif + NULL + }; + + return test_run(test_functions); +}