While testing a 'grep' snapshot, I was seeing 'test-localename' failures on a few systems. The cause / conditions are rather particular: - I'm working in an environment where all LC_* variables are set to 'de_DE.UTF-8'. - When I log in through a remote machine through ssh, the LC_* and LANG environment values are transported to that machine. - The locale 'de_DE.UTF-8' does not exist on that machine. - The test unsets LC_ALL; thus these LC_* values become relevant. - The test calls 'setlocale (LC_ALL, "")'. Thus glibc attempts to configure the locale to use the "C" locale for LC_CTYPE and "de_DE.UTF-8" for LC_PAPER etc. This fails (due to inconsistent charset).
This patch fixes it. 2018-12-16 Bruno Haible <br...@clisp.org> localename: Avoid test failure on some glibc systems. * tests/test-localename.c (test_locale_name, test_locale_name_posix): Unset environment variables that might disturb the first setlocale call, and verify that this setlocale call succeeds. diff --git a/tests/test-localename.c b/tests/test-localename.c index 8c3c425..2b91782 100644 --- a/tests/test-localename.c +++ b/tests/test-localename.c @@ -67,6 +67,7 @@ static struct { int cat; int mask; const char *string; } const categories[] = static void test_locale_name (void) { + const char *ret; const char *name; /* Check that gl_locale_name returns non-NULL. */ @@ -85,7 +86,21 @@ test_locale_name (void) unsetenv ("LC_MESSAGES"); unsetenv ("LC_NUMERIC"); unsetenv ("LANG"); - setlocale (LC_ALL, ""); + /* Need also to unset all environment variables that specify standard or + non-standard locale categories. Otherwise, on glibc systems, when some + of these variables are set and reference a nonexistent locale, the + setlocale (LC_ALL, "") call below would fail. */ + unsetenv ("LC_COLLATE"); + unsetenv ("LC_MONETARY"); + unsetenv ("LC_TIME"); + unsetenv ("LC_ADDRESS"); + unsetenv ("LC_IDENTIFICATION"); + unsetenv ("LC_MEASUREMENT"); + unsetenv ("LC_NAME"); + unsetenv ("LC_PAPER"); + unsetenv ("LC_TELEPHONE"); + ret = setlocale (LC_ALL, ""); + ASSERT (ret != NULL); ASSERT (strcmp (gl_locale_name (LC_MESSAGES, "LC_MESSAGES"), gl_locale_name_default ()) == 0); ASSERT (strcmp (gl_locale_name (LC_NUMERIC, "LC_NUMERIC"), @@ -496,6 +511,7 @@ test_locale_name_thread (void) static void test_locale_name_posix (void) { + const char *ret; const char *name; /* Get into a defined state, */ @@ -511,7 +527,21 @@ test_locale_name_posix (void) unsetenv ("LC_MESSAGES"); unsetenv ("LC_NUMERIC"); unsetenv ("LANG"); - setlocale (LC_ALL, ""); + /* Need also to unset all environment variables that specify standard or + non-standard locale categories. Otherwise, on glibc systems, when some + of these variables are set and reference a nonexistent locale, the + setlocale (LC_ALL, "") call below would fail. */ + unsetenv ("LC_COLLATE"); + unsetenv ("LC_MONETARY"); + unsetenv ("LC_TIME"); + unsetenv ("LC_ADDRESS"); + unsetenv ("LC_IDENTIFICATION"); + unsetenv ("LC_MEASUREMENT"); + unsetenv ("LC_NAME"); + unsetenv ("LC_PAPER"); + unsetenv ("LC_TELEPHONE"); + ret = setlocale (LC_ALL, ""); + ASSERT (ret != NULL); name = gl_locale_name_posix (LC_MESSAGES, "LC_MESSAGES"); ASSERT (name == NULL || strcmp (name, gl_locale_name_default ()) == 0); name = gl_locale_name_posix (LC_NUMERIC, "LC_NUMERIC");