Rework the handling of invalid keys/groups again. We are back to being
[platform/upstream/glib.git] / tests / keyfile-test.c
index df51d14..421ad03 100644 (file)
@@ -697,7 +697,11 @@ test_number (void)
     "key1=0xffff\n"
     "key2=0.5\n"
     "key3=1e37\n"
-    "key4=ten\n";
+    "key4=ten\n"
+    "key5=\n"
+    "key6=1.0.0\n"
+    "key7=2x2\n"
+    "key8=abc\n";
   
   keyfile = load_data (data, 0);
 
@@ -723,6 +727,18 @@ test_number (void)
   g_key_file_get_integer (keyfile, "invalid", "key4", &error);
   check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
 
+  g_key_file_get_double (keyfile, "invalid", "key5", &error);
+  check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
+  g_key_file_get_double (keyfile, "invalid", "key6", &error);
+  check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
+  g_key_file_get_double (keyfile, "invalid", "key7", &error);
+  check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
+  g_key_file_get_double (keyfile, "invalid", "key8", &error);
+  check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
+
   g_key_file_free (keyfile);
 }
 
@@ -731,8 +747,6 @@ static void
 test_locale_string (void)
 {
   GKeyFile *keyfile;
-  GError *error = NULL;
-  gchar *value;
 
   const gchar *data = 
     "[valid]\n"
@@ -742,10 +756,7 @@ test_locale_string (void)
     "key1[de_DE.UTF8]=v1-de_DE.UTF8\n"
     "key1[fr]=v1-fr\n"
     "key1[en] =v1-en\n"
-    "[invalid]\n"
-    "key1[de=v1\n"
-    "key1[fr]]=v2\n"
-    "key1 [en]=v3\n";  
+    "key1[sr@Latn]=v1-sr\n";
   
   keyfile = load_data (data, G_KEY_FILE_KEEP_TRANSLATIONS);
 
@@ -756,18 +767,7 @@ test_locale_string (void)
   check_locale_string_value (keyfile, "valid", "key1", "fr", "v1-fr");
   check_locale_string_value (keyfile, "valid", "key1", "fr_FR", "v1-fr");
   check_locale_string_value (keyfile, "valid", "key1", "en", "v1-en");
-  
-  value = g_key_file_get_locale_string (keyfile, "invalid", "key1", "de", &error);
-  check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND);
-  g_free (value);
-
-  value = g_key_file_get_locale_string (keyfile, "invalid", "key1", "fr", &error);
-  check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND);
-  g_free (value);
-
-  value = g_key_file_get_locale_string (keyfile, "invalid", "key1", "en", &error);
-  check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND);
-  g_free (value);
+  check_locale_string_value (keyfile, "valid", "key1", "sr@Latn", "v1-sr");
   
   g_key_file_free (keyfile);
 
@@ -959,6 +959,245 @@ test_groups (void)
 }
 
 static void
+test_group_names (void)
+{
+  GKeyFile *keyfile;
+  GError *error = NULL;
+  const gchar *data;
+  gchar *value;
+
+  /* [ in group name */
+  data = "[a[b]\n"
+         "key1=123\n";
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  g_key_file_free (keyfile);  
+  check_error (&error, 
+              G_KEY_FILE_ERROR,
+              G_KEY_FILE_ERROR_PARSE);
+
+  /* ] in group name */
+  data = "[a]b]\n"
+         "key1=123\n";
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  g_key_file_free (keyfile);  
+  check_error (&error, 
+              G_KEY_FILE_ERROR,
+              G_KEY_FILE_ERROR_PARSE);
+
+  /* control char in group name */
+  data = "[a\tb]\n"
+         "key1=123\n";
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  g_key_file_free (keyfile);  
+  check_error (&error, 
+              G_KEY_FILE_ERROR,
+              G_KEY_FILE_ERROR_PARSE);
+
+  /* empty group name */
+  data = "[]\n"
+         "key1=123\n";
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  g_key_file_free (keyfile);  
+  check_error (&error, 
+              G_KEY_FILE_ERROR,
+              G_KEY_FILE_ERROR_PARSE);
+
+  /* Unicode in group name */
+  data = "[\xc2\xbd]\n"
+         "key1=123\n";
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  g_key_file_free (keyfile);  
+  check_no_error (&error);
+
+  keyfile = g_key_file_new ();
+  g_key_file_set_string (keyfile, "a[b", "key1", "123");
+  value = g_key_file_get_string (keyfile, "a[b", "key1", &error);
+  check_error (&error, 
+               G_KEY_FILE_ERROR,
+               G_KEY_FILE_ERROR_GROUP_NOT_FOUND);  
+  g_key_file_free (keyfile);  
+
+  keyfile = g_key_file_new ();
+  g_key_file_set_string (keyfile, "a]b", "key1", "123");
+  value = g_key_file_get_string (keyfile, "a]b", "key1", &error);
+  check_error (&error, 
+               G_KEY_FILE_ERROR,
+               G_KEY_FILE_ERROR_GROUP_NOT_FOUND);  
+  g_key_file_free (keyfile);  
+
+  keyfile = g_key_file_new ();
+  g_key_file_set_string (keyfile, "a\tb", "key1", "123");
+  value = g_key_file_get_string (keyfile, "a\tb", "key1", &error);
+  check_error (&error, 
+               G_KEY_FILE_ERROR,
+               G_KEY_FILE_ERROR_GROUP_NOT_FOUND);  
+  g_key_file_free (keyfile);  
+
+  keyfile = g_key_file_new ();
+  g_key_file_set_string (keyfile, "\xc2\xbd", "key1", "123");
+  check_string_value (keyfile, "\xc2\xbd", "key1", "123");
+  g_key_file_free (keyfile);  
+}
+
+static void
+test_key_names (void)
+{
+  GKeyFile *keyfile;
+  GError *error = NULL;
+  const gchar *data;
+  gchar *value;
+
+  /* [ in key name */
+  data = "[a]\n"
+         "key[=123\n";
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  g_key_file_free (keyfile);  
+  check_error (&error, 
+              G_KEY_FILE_ERROR,
+              G_KEY_FILE_ERROR_PARSE);
+
+  /* empty key name */
+  data = "[a]\n"
+         " =123\n";
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  g_key_file_free (keyfile);  
+  check_error (&error, 
+              G_KEY_FILE_ERROR,
+              G_KEY_FILE_ERROR_PARSE);
+
+  /* empty key name */
+  data = "[a]\n"
+         " [de] =123\n";
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  g_key_file_free (keyfile);  
+  check_error (&error, 
+              G_KEY_FILE_ERROR,
+              G_KEY_FILE_ERROR_PARSE);
+
+  /* bad locale suffix */
+  data = "[a]\n"
+         "foo[@#!&%]=123\n";
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  g_key_file_free (keyfile);  
+  check_error (&error, 
+              G_KEY_FILE_ERROR,
+              G_KEY_FILE_ERROR_PARSE);
+
+  /* initial space */
+  data = "[a]\n"
+         " foo=123\n";
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  check_no_error (&error);
+  check_string_value (keyfile, "a", "foo", "123");
+  g_key_file_free (keyfile);  
+
+  /* final space */
+  data = "[a]\n"
+         "foo =123\n";
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  check_no_error (&error);
+  check_string_value (keyfile, "a", "foo", "123");
+  g_key_file_free (keyfile);  
+
+  /* inner space */
+  data = "[a]\n"
+         "foo bar=123\n";
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  check_no_error (&error);
+  check_string_value (keyfile, "a", "foo bar", "123");
+  g_key_file_free (keyfile);  
+
+  /* inner space */
+  data = "[a]\n"
+         "foo [de] =123\n";
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  check_error (&error, 
+              G_KEY_FILE_ERROR,
+              G_KEY_FILE_ERROR_PARSE);
+  g_key_file_free (keyfile);  
+
+  /* control char in key name */
+  data = "[a]\n"
+         "key\tfoo=123\n";
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  g_key_file_free (keyfile);  
+  check_no_error (&error);
+
+  /* Unicode in key name */
+  data = "[a]\n"
+         "\xc2\xbd=123\n";
+  keyfile = g_key_file_new ();
+  g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+  g_key_file_free (keyfile);  
+  check_no_error (&error); 
+
+  keyfile = g_key_file_new ();
+  g_key_file_set_string (keyfile, "a", "x", "123");
+  g_key_file_set_string (keyfile, "a", "key=", "123");
+  value = g_key_file_get_string (keyfile, "a", "key=", &error);
+  check_error (&error, 
+               G_KEY_FILE_ERROR,
+               G_KEY_FILE_ERROR_KEY_NOT_FOUND);  
+  g_key_file_free (keyfile);  
+
+  keyfile = g_key_file_new ();
+  g_key_file_set_string (keyfile, "a", "x", "123");
+  g_key_file_set_string (keyfile, "a", "key[", "123");
+  value = g_key_file_get_string (keyfile, "a", "key[", &error);
+  check_error (&error, 
+               G_KEY_FILE_ERROR,
+               G_KEY_FILE_ERROR_KEY_NOT_FOUND);  
+  g_key_file_free (keyfile);  
+
+  keyfile = g_key_file_new ();
+  g_key_file_set_string (keyfile, "a", "x", "123");
+  g_key_file_set_string (keyfile, "a", "key\tfoo", "123");
+  value = g_key_file_get_string (keyfile, "a", "key\tfoo", &error);
+  check_no_error (&error);
+  g_key_file_free (keyfile);  
+
+  keyfile = g_key_file_new ();
+  g_key_file_set_string (keyfile, "a", "x", "123");
+  g_key_file_set_string (keyfile, "a", " key", "123");
+  value = g_key_file_get_string (keyfile, "a", " key", &error);
+  check_error (&error, 
+               G_KEY_FILE_ERROR,
+               G_KEY_FILE_ERROR_KEY_NOT_FOUND);  
+  g_key_file_free (keyfile);  
+
+  keyfile = g_key_file_new ();
+  g_key_file_set_string (keyfile, "a", "x", "123");
+
+  /* Unicode key */
+  g_key_file_set_string (keyfile, "a", "\xc2\xbd", "123");
+  check_string_value (keyfile, "a", "\xc2\xbd", "123");
+
+  /* Keys with / + . (as used by the gnome-vfs mime cache) */
+  g_key_file_set_string (keyfile, "a", "foo/bar", "/");
+  check_string_value (keyfile, "a", "foo/bar", "/");
+  g_key_file_set_string (keyfile, "a", "foo+bar", "+");
+  check_string_value (keyfile, "a", "foo+bar", "+");
+  g_key_file_set_string (keyfile, "a", "foo.bar", ".");
+  check_string_value (keyfile, "a", "foo.bar", ".");
+
+  g_key_file_free (keyfile);  
+}
+
+static void
 test_duplicate_keys (void)
 {
   GKeyFile *keyfile;
@@ -985,14 +1224,45 @@ test_duplicate_groups (void)
     "key2=123\n";
   
   keyfile = load_data (data, 0);
+  check_string_value (keyfile, "Desktop Entry", "key1", "123");
+  check_string_value (keyfile, "Desktop Entry", "key2", "123");
 
   g_key_file_free (keyfile);  
 }
 
+/* http://bugzilla.gnome.org/show_bug.cgi?id=385910 */
+static void
+test_duplicate_groups2 (void)
+{
+  GKeyFile *keyfile;
+  const gchar *data = 
+    "[A]\n"
+    "foo=bar\n"
+    "[B]\n"
+    "foo=baz\n"
+    "[A]\n"
+    "foo=bang\n";
+  
+  keyfile = load_data (data, 0);
+  check_string_value (keyfile, "A", "foo", "bang");
+  check_string_value (keyfile, "B", "foo", "baz");
+
+  g_key_file_free (keyfile);  
+}
+
+static void 
+log_func (const gchar   *log_domain,
+          GLogLevelFlags log_level,
+          const gchar   *message,
+          gpointer       user_data)
+{
+}
 
 int
 main (int argc, char *argv[])
 {
+  g_log_set_default_handler (log_func, NULL);
+
   test_line_ends ();
   test_whitespace ();
   test_comments ();
@@ -1007,6 +1277,9 @@ main (int argc, char *argv[])
   test_groups ();
   test_duplicate_keys ();
   test_duplicate_groups ();
+  test_duplicate_groups2 ();
+  test_group_names ();
+  test_key_names ();
   
   return 0;
 }