summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2022-07-21 16:39:23 +0200
committerBastien Nocera <hadess@hadess.net>2022-07-22 11:16:50 +0200
commit6ac57af143aa023231e4851af5cc16f83f96644d (patch)
tree359b184327e239deac528c5ac308ea9c8b75eea6
parentdd34d89b668254aa8b05192d396ab9f3069a0c28 (diff)
downloadaccountsservice-6ac57af143aa023231e4851af5cc16f83f96644d.tar.gz
tests: Add tests for new locale verification
-rw-r--r--tests/meson.build15
-rw-r--r--tests/util.c96
2 files changed, 111 insertions, 0 deletions
diff --git a/tests/meson.build b/tests/meson.build
index 697b4ac..d4a2570 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -70,3 +70,18 @@ else
test(test_name, find_program('sh'), args: ['-c', 'exit 77'])
endforeach
endif
+
+tests = [ 'util' ]
+
+deps = [
+ gio_unix_dep,
+ glib_dep,
+ polkit_gobject_dep,
+]
+
+foreach test_name : tests
+ exe = executable(test_name, '@0@.c'.format(test_name),
+ include_directories: top_inc,
+ dependencies: deps)
+ test(test_name, exe)
+endforeach
diff --git a/tests/util.c b/tests/util.c
new file mode 100644
index 0000000..b330a82
--- /dev/null
+++ b/tests/util.c
@@ -0,0 +1,96 @@
+#include <locale.h>
+#undef _DEFAULT_SOURCE
+#include "src/util.c"
+
+int
+main (int argc,
+ char **argv)
+{
+ guint i;
+
+ setlocale(LC_ALL, "C.UTF-8");
+
+ if (argc > 1) {
+ for (i = 1; i < argc; i++) {
+ g_autofree char *language = NULL;
+ g_autofree char *territory = NULL;
+ g_autofree char *codeset = NULL;
+ g_autofree char *modifier = NULL;
+
+ explode_locale (argv[i],
+ &language,
+ &territory,
+ &codeset,
+ &modifier);
+
+ g_print ("Locale: %s\n", argv[i]);
+ g_print ("\tlanguage: %s\n", language);
+ g_print ("\tterritory: %s\n", territory);
+ g_print ("\tcodeset: %s\n", codeset);
+ g_print ("\tmodifier: %s\n", modifier);
+ g_print ("\n");
+ }
+ return 0;
+ }
+
+ struct {
+ const char *locale;
+ const char *lang;
+ const char *territory;
+ const char *codeset;
+ const char *modifier;
+ } tests[] = {
+ { "en", "en", NULL, NULL, NULL },
+ { "en_GB", "en", "GB", NULL, NULL },
+ { "en_GB.UTF-8", "en", "GB", "UTF-8", NULL },
+ { "en_GB.UTF-8@latin", "en", "GB", "UTF-8", "latin" },
+ { "en_GB@latin", "en", "GB", NULL, "latin" },
+ { "en_GB.iso8859-1", "en", "GB", "iso8859-1", NULL },
+ { "1234", NULL, NULL, NULL, NULL },
+ { "Test Language 1", NULL, NULL, NULL, NULL },
+ { "en_GB.UTF-8@latin WOOP", NULL, NULL, NULL, NULL },
+ { "ace", "ace", NULL, NULL, NULL },
+ { "be@latin", "be", NULL, NULL, "latin" },
+ { "ca.us-ascii", "ca", NULL, "us-ascii", NULL },
+ { "cs.cp1250", "cs", NULL, "cp1250", NULL },
+ /* qaa-qtz is a fake locale erroneously generated by some
+ * downstream distributions because of a mistaken entry
+ * shipped in iso-codes. The ISO 639.2 registration authority
+ * intended all codes starting with "q" less than "qu" to be
+ * reserved for local use. Ensure the fake locale isn't
+ * allowed. */
+ { "qaa-qtz", NULL, NULL, NULL, NULL },
+ { "ru_RU.KOI8-R", "ru", "RU", "KOI8-R", NULL },
+ { "", NULL, NULL, NULL, NULL },
+ { NULL },
+ };
+
+ for (i = 0; tests[i].locale != NULL; i++) {
+ guint mask = 0;
+ g_autofree char *language = NULL;
+ g_autofree char *territory = NULL;
+ g_autofree char *codeset = NULL;
+ g_autofree char *modifier = NULL;
+ int verify = 0;
+
+ g_test_message ("Testing locale %s", tests[i].locale);
+
+ mask = explode_locale (tests[i].locale,
+ &language,
+ &territory,
+ &codeset,
+ &modifier);
+ g_assert_cmpstr (language, ==, tests[i].lang);
+ g_assert_cmpstr (territory, ==, tests[i].territory);
+ g_assert_cmpstr (codeset, ==, tests[i].codeset);
+ g_assert_cmpstr (modifier, ==, tests[i].modifier);
+
+ verify = verify_xpg_locale (tests[i].locale) ? 1 : 0;
+ g_assert_cmpint (verify, ==, language != NULL);
+ g_assert_cmpint (!!mask, ==, verify);
+ }
+
+ g_assert_cmpint (!!verify_locale (""), ==, TRUE);
+
+ return 0;
+}