changeset 18714:dcaf508860ad

lib-charset: Added a minimal unit test
author Timo Sirainen <tss@iki.fi>
date Sat, 16 May 2015 12:46:38 +0300
parents 1044c55fb4ef
children aa216b4f1e0e
files src/lib-charset/Makefile.am src/lib-charset/charset-iconv.c src/lib-charset/test-charset.c
diffstat 3 files changed, 113 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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++;
--- /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);
+}