]> granicus.if.org Git - transmission/commitdiff
(libT) #5249 'error parsing json in some locales': add unit tests to test for this...
authorJordan Lee <jordan@transmissionbt.com>
Thu, 24 Jan 2013 16:04:09 +0000 (16:04 +0000)
committerJordan Lee <jordan@transmissionbt.com>
Thu, 24 Jan 2013 16:04:09 +0000 (16:04 +0000)
libtransmission/json-test.c
libtransmission/variant.c

index 694e17de99ae48e38414935be2da1f4f7b7f14ea..0ed1bce223148d9a973ce80890cc91d46ccfba4b 100644 (file)
@@ -1,5 +1,7 @@
 #include <string.h> /* strlen () */
 
+#include <locale.h> /* setlocale() */
+
 #define __LIBTRANSMISSION_VARIANT_MODULE___
 #include "transmission.h"
 #include "utils.h" /* tr_free */
@@ -221,12 +223,36 @@ test_unescape (void)
 int
 main (void)
 {
-    const testFunc tests[] = { test_elements,
-                               test_utf8,
-                               test1,
-                               test2,
-                               test3,
-                               test_unescape };
-
-    return runTests (tests, NUM_TESTS (tests));
+  int i;
+  int n;
+  int rv;
+  char lc_numeric[128];
+  const char * comma_locales[] = { "da_DK.UTF-8", "fr_FR.UTF-8", "ru_RU.UTF-8"};
+
+  const testFunc tests[] = { test_elements,
+                             test_utf8,
+                             test1,
+                             test2,
+                             test3,
+                             test_unescape };
+
+  /* run the tests in a locale with a decimal point of '.' */
+  tr_strlcpy (lc_numeric, setlocale (LC_NUMERIC, NULL), sizeof (lc_numeric));
+  setlocale (LC_NUMERIC, "C");
+  if ((rv = runTests (tests, NUM_TESTS (tests))))
+    return rv;
+
+  /* run the tests in a locale with a decimal point of ',' */
+  n = sizeof(comma_locales) / sizeof(comma_locales[0]);
+  for (i=0; i<n; ++i)
+    if (setlocale (LC_NUMERIC, comma_locales[i]) != NULL)
+      break;
+  if (i==n)
+    fprintf (stderr, "WARNING: unable to run locale-specific json tests.\n");
+  else if ((rv = runTests (tests, NUM_TESTS(tests))))
+    return rv;
+  setlocale (LC_NUMERIC, lc_numeric);
+
+  /* success */
+  return 0;
 }
index b7e58d5070eb33fccf269c6970c58fee273b7127..dc92d101fb34ff1bfc370652533687238d727f39 100644 (file)
@@ -806,7 +806,7 @@ tr_variantWalk (const tr_variant               * v,
 
   /* always use a '.' decimal point s.t. locale-hopping doesn't bite us */
   tr_strlcpy (lc_numeric, setlocale (LC_NUMERIC, NULL), sizeof (lc_numeric));
-  setlocale (LC_NUMERIC, "POSIX");
+  setlocale (LC_NUMERIC, "C");
 
   nodeConstruct (&stack[stackSize++], v, sort_dicts);