fixes and more tests for marshalling of arrays of gvariants
authorMikkel Kamstrup Erlandsen <mikkel.kamstrup@canonical.com>
Tue, 4 Oct 2011 10:01:42 +0000 (12:01 +0200)
committerMartin Pitt <martin.pitt@ubuntu.com>
Tue, 25 Oct 2011 06:41:16 +0000 (08:41 +0200)
Fix return type annotation for gi_marshalling_tests_array_gvariant_in()

Add function variations of gi_marshalling_tests_array_gvariant_i() with
different transfer modes.

Make gi_marshalling_tests_array_gvariant_none_in() actually respect
the transfer none  annotation on the return value.

https://bugzilla.gnome.org/show_bug.cgi?id=638915

Signed-off-by: Martin Pitt <martin.pitt@ubuntu.com>
tests/gimarshallingtests.c
tests/gimarshallingtests.h

index 637c7d5..073d153 100644 (file)
@@ -1578,18 +1578,77 @@ gi_marshalling_tests_array_zero_terminated_inout (gchar ***utf8s)
 }
 
 /**
- * gi_marshalling_tests_array_gvariant_in:
+ * gi_marshalling_tests_array_gvariant_none_in:
  * @variants: (array zero-terminated=1) (transfer none):
+ * Returns: (array zero-terminated=1) (transfer none):
+ */
+GVariant **
+gi_marshalling_tests_array_gvariant_none_in (GVariant **variants)
+{
+    /* Use a static container to detect if someone tries to free it */
+    static GVariant *private_container[3] = { NULL, NULL, NULL };
+    
+    if (private_container[0] == NULL) {
+      private_container[0] = g_variant_new_int32 (27);
+      private_container[1] = g_variant_new_string ("Hello");
+    }
+
+    g_assert (variants != NULL);
+    g_assert_cmpint (g_variant_get_int32 (variants[0]), ==, 27);
+    g_assert_cmpstr (g_variant_get_string (variants[1], NULL), ==, "Hello");
+    g_assert (variants[2] == NULL);
+
+    return private_container;
+}
+
+/**
+ * gi_marshalling_tests_array_gvariant_container_in:
+ * @variants: (array zero-terminated=1) (transfer container):
+ * Returns: (array zero-terminated=1) (transfer container):
  */
 GVariant **
-gi_marshalling_tests_array_gvariant_in (GVariant **variants)
+gi_marshalling_tests_array_gvariant_container_in (GVariant **variants)
 {
+    GVariant **container;
+
     g_assert (variants != NULL);
     g_assert_cmpint (g_variant_get_int32 (variants[0]), ==, 27);
     g_assert_cmpstr (g_variant_get_string (variants[1], NULL), ==, "Hello");
     g_assert (variants[2] == NULL);
+    
+    container = g_new0 (GVariant*, 3);
+    container[0] = variants[0];
+    container[1] = variants[1];
+    g_free (variants);
+    
+    return container;
+}
+
+/**
+ * gi_marshalling_tests_array_gvariant_full_in:
+ * @variants: (array zero-terminated=1) (transfer full):
+ * Returns: (array zero-terminated=1) (transfer full):
+ */
+GVariant **
+gi_marshalling_tests_array_gvariant_full_in (GVariant **variants)
+{
+    GVariant **container;
 
-    return variants;
+    g_assert (variants != NULL);
+    g_assert_cmpint (g_variant_get_int32 (variants[0]), ==, 27);
+    g_assert_cmpstr (g_variant_get_string (variants[1], NULL), ==, "Hello");
+    g_assert (variants[2] == NULL);
+    
+    /* To catch different behaviors we reconstruct one variant from scratch,
+     * while leaving the other untouched. Both approaches are legal with full
+     * transfer in and out */
+    container = g_new0 (GVariant*, 3);
+    container[0] = g_variant_new_int32 (g_variant_get_int32 (variants[0]));
+    g_variant_unref (variants[0]);
+    container[1] = variants[1];
+    g_free (variants);
+
+    return container;
 }
 
 /**
index 81c3a50..388ee05 100644 (file)
@@ -403,7 +403,11 @@ void gi_marshalling_tests_array_zero_terminated_out (gchar ***utf8s);
 
 void gi_marshalling_tests_array_zero_terminated_inout (gchar ***utf8s);
 
-GVariant **gi_marshalling_tests_array_gvariant_in (GVariant **variants);
+GVariant **gi_marshalling_tests_array_gvariant_none_in (GVariant **variants);
+
+GVariant **gi_marshalling_tests_array_gvariant_container_in (GVariant **variants);
+
+GVariant **gi_marshalling_tests_array_gvariant_full_in (GVariant **variants);
 
 
 /* GArray */