diff --git a/gio/tests/.gitignore b/gio/tests/.gitignore index 0652ff768..d6908fcbd 100644 --- a/gio/tests/.gitignore +++ b/gio/tests/.gitignore @@ -16,6 +16,7 @@ data-output-stream de/ desktop-app-info echo-server +encoder file fileattributematcher filter-cat @@ -94,6 +95,7 @@ readwrite resolver resources send-data +serializable services/org.gtk.GDBus.Examples.ObjectManager.service simple-async-result simple-proxy diff --git a/gio/tests/Makefile.am b/gio/tests/Makefile.am index 7697ccbe3..edbe491ba 100644 --- a/gio/tests/Makefile.am +++ b/gio/tests/Makefile.am @@ -70,6 +70,8 @@ test_progs = \ permission \ task \ credentials \ + encoder \ + serializable \ $(NULL) if HAVE_DBUS_DAEMON diff --git a/gio/tests/encoder.c b/gio/tests/encoder.c new file mode 100644 index 000000000..698f23bb7 --- /dev/null +++ b/gio/tests/encoder.c @@ -0,0 +1,93 @@ +#include + +static void +encoder_binary (void) +{ + GEncoder *encoder = g_binary_encoder_new (); + GError *error = NULL; + GBytes *buffer; + gboolean bool_value; + char *str_value; + + g_object_add_weak_pointer (G_OBJECT (encoder), (gpointer *) &encoder); + + g_encoder_add_key_bool (encoder, "BoolValue", TRUE); + g_encoder_add_key_string (encoder, "StringValue", "Hello"); + + buffer = g_encoder_write_to_bytes (encoder, &error); + g_assert_no_error (error); + g_assert (buffer != NULL); + + g_object_unref (encoder); + g_assert (encoder == NULL); + + if (g_test_verbose ()) + g_print ("*** buffer (len: %d) = ***\n%s\n", + (int) g_bytes_get_size (buffer), + (const char *) g_bytes_get_data (buffer, NULL)); + + encoder = g_binary_encoder_new (); + + g_object_add_weak_pointer (G_OBJECT (encoder), (gpointer *) &encoder); + + g_encoder_read_from_bytes (encoder, buffer, &error); + g_assert_no_error (error); + + g_encoder_get_key_bool (encoder, "BoolValue", &bool_value); + g_assert (bool_value); + + g_encoder_get_key_string (encoder, "StringValue", &str_value); + g_assert_cmpstr (str_value, ==, "Hello"); + g_free (str_value); + + g_bytes_unref (buffer); + + g_object_unref (encoder); + g_assert (encoder == NULL); +} + +static void +encoder_keyfile (void) +{ + GEncoder *encoder = g_keyfile_encoder_new (); + GError *error = NULL; + GBytes *buffer; + gboolean res; + + g_keyfile_encoder_set_section_name (G_KEYFILE_ENCODER (encoder), "Test"); + g_encoder_add_key_bool (encoder, "BoolValue", TRUE); + + buffer = g_encoder_write_to_bytes (encoder, &error); + g_assert_no_error (error); + g_assert (buffer != NULL); + + g_object_unref (encoder); + + if (g_test_verbose ()) + g_print ("*** buffer (len: %d) = ***\n%s", + (int) g_bytes_get_size (buffer), + (const char *) g_bytes_get_data (buffer, NULL)); + + encoder = g_keyfile_encoder_new (); + g_keyfile_encoder_set_section_name (G_KEYFILE_ENCODER (encoder), "Test"); + + g_encoder_read_from_bytes (encoder, buffer, &error); + g_assert_no_error (error); + + g_encoder_get_key_bool (encoder, "BoolValue", &res); + g_assert (res); + + g_bytes_unref (buffer); + g_object_unref (encoder); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/encoder/binary", encoder_binary); + g_test_add_func ("/encoder/key-file", encoder_keyfile); + + return g_test_run (); +} diff --git a/gio/tests/serializable.c b/gio/tests/serializable.c new file mode 100644 index 000000000..fd6cf3ae6 --- /dev/null +++ b/gio/tests/serializable.c @@ -0,0 +1,177 @@ +#include + +typedef struct { + GObject parent_instance; + + gboolean bool_value; + char *str_value; + gdouble double_value; +} TestObject; + +typedef struct { + GObjectClass parent_class; +} TestObjectClass; + +GType test_object_get_type (void); + +static void test_object_serializable_init (GSerializableInterface *iface); + +G_DEFINE_TYPE_WITH_CODE (TestObject, test_object, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_SERIALIZABLE, test_object_serializable_init)) + +static void +test_object_serialize (GSerializable *serializable, + GEncoder *encoder) +{ + TestObject *self = (TestObject *) serializable; + + g_encoder_add_key_bool (encoder, "bool-value", self->bool_value); + g_encoder_add_key_string (encoder, "str-value", self->str_value); + g_encoder_add_key_double (encoder, "double-value", self->double_value); +} + +static gboolean +test_object_deserialize (GSerializable *serializable, + GEncoder *encoder, + GError **error) +{ + TestObject *self = (TestObject *) serializable; + + g_encoder_get_key_bool (encoder, "bool-value", &self->bool_value); + g_encoder_get_key_string (encoder, "str-value", &self->str_value); + g_encoder_get_key_double (encoder, "double-value", &self->double_value); + + return TRUE; +} + +static void +test_object_serializable_init (GSerializableInterface *iface) +{ + iface->serialize = test_object_serialize; + iface->deserialize = test_object_deserialize; +} + +static void +test_object_finalize (GObject *gobject) +{ + TestObject *self = (TestObject *) gobject; + + g_free (self->str_value); + + G_OBJECT_CLASS (test_object_parent_class)->finalize (gobject); +} + +static void +test_object_class_init (TestObjectClass *klass) +{ + G_OBJECT_CLASS (klass)->finalize = test_object_finalize; +} + +static void +test_object_init (TestObject *self) +{ +} + +static TestObject * +test_object_new (void) +{ + return g_object_new (test_object_get_type (), NULL); +} + +static void +test_object_set_bool_value (TestObject *obj, + gboolean value) +{ + value = !!value; + + obj->bool_value = value; +} + +static gboolean +test_object_get_bool_value (TestObject *obj) +{ + return obj->bool_value; +} + +static void +test_object_set_str_value (TestObject *obj, + const char *value) +{ + char *str_value = g_strdup (value); + + g_free (obj->str_value); + obj->str_value = str_value; +} + +static const char * +test_object_get_str_value (TestObject *obj) +{ + return obj->str_value; +} + +static void +test_object_set_double_value (TestObject *obj, + double value) +{ + obj->double_value = value; +} + +static gdouble +test_object_get_double_value (TestObject *obj) +{ + return obj->double_value; +} + +/* tests */ +static void +serializable_roundtrip (void) +{ + GEncoder *encoder; + TestObject *obj; + GError *error; + GBytes *buffer; + + obj = test_object_new (); + test_object_set_bool_value (obj, TRUE); + test_object_set_str_value (obj, "Hello, World"); + test_object_set_double_value (obj, 3.14159); + + encoder = g_binary_encoder_new (); + g_serializable_serialize (G_SERIALIZABLE (obj), encoder); + + error = NULL; + buffer = g_encoder_write_to_bytes (encoder, &error); + g_assert_no_error (error); + g_object_unref (encoder); + g_object_unref (obj); + + if (g_test_verbose ()) + g_print ("*** buffer: '%s' ***\n", + (const char *) g_bytes_get_data (buffer, NULL)); + + encoder = g_binary_encoder_new (); + g_encoder_read_from_bytes (encoder, buffer, &error); + g_assert_no_error (error); + + obj = test_object_new (); + g_serializable_deserialize (G_SERIALIZABLE (obj), encoder, &error); + g_assert_no_error (error); + + g_assert (test_object_get_bool_value (obj)); + g_assert_cmpstr (test_object_get_str_value (obj), ==, "Hello, World"); + g_assert_cmpfloat ((float) test_object_get_double_value (obj), ==, 3.14159f); + + g_bytes_unref (buffer); + g_object_unref (encoder); + g_object_unref (obj); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/serializable/roundtrip", serializable_roundtrip); + + return g_test_run (); +}