bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

localename: Avoid test failure on some glibc systems


From: Bruno Haible
Subject: localename: Avoid test failure on some glibc systems
Date: Sun, 16 Dec 2018 21:42:08 +0100
User-agent: KMail/5.1.3 (Linux/4.4.0-139-generic; KDE/5.18.0; x86_64; ; )

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  <address@hidden>

        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");




reply via email to

[Prev in Thread] Current Thread [Next in Thread]