summaryrefslogtreecommitdiff
path: root/test/c_glib
diff options
context:
space:
mode:
authorRoger Meier <roger@apache.org>2014-09-29 20:50:56 +0200
committerRoger Meier <roger@apache.org>2014-09-29 20:50:56 +0200
commit15df0767d3ddeb87b5f1b2fa832e1502b9a6884f (patch)
treef5b5102a8d1bf514e9c4bd7fb540fd0fbfda15e6 /test/c_glib
parent63243c6a2923cfee1d7d7d3b74ba7ccfcd448dc0 (diff)
downloadthrift-15df0767d3ddeb87b5f1b2fa832e1502b9a6884f.tar.gz
THRIFT-2685 c_glib: Include in integration test suite
Patch: Simon South
Diffstat (limited to 'test/c_glib')
-rwxr-xr-xtest/c_glib/Makefile.am17
-rw-r--r--test/c_glib/src/test_client.c157
-rw-r--r--test/c_glib/src/test_server.c207
-rw-r--r--test/c_glib/src/thrift_test_handler.c838
-rw-r--r--test/c_glib/src/thrift_test_handler.h237
5 files changed, 1379 insertions, 77 deletions
diff --git a/test/c_glib/Makefile.am b/test/c_glib/Makefile.am
index 1dc8c167f..de23cb9d1 100755
--- a/test/c_glib/Makefile.am
+++ b/test/c_glib/Makefile.am
@@ -29,7 +29,8 @@ nodist_libtestcglib_la_SOURCES = \
libtestcglib_la_LIBADD = $(top_builddir)/lib/c_glib/libthrift_c_glib.la
check_PROGRAMS = \
- test_client
+ test_client \
+ test_server
test_client_SOURCES = \
src/test_client.c
@@ -38,6 +39,15 @@ test_client_LDADD = \
libtestcglib.la \
$(top_builddir)/lib/c_glib/libthrift_c_glib.la
+test_server_SOURCES = \
+ src/thrift_test_handler.c \
+ src/thrift_test_handler.h \
+ src/test_server.c
+
+test_server_LDADD = \
+ libtestcglib.la \
+ $(top_builddir)/lib/c_glib/libthrift_c_glib.la
+
#
# Common thrift code generation rules
#
@@ -55,4 +65,7 @@ clean-local:
$(RM) -r gen-c_glib
EXTRA_DIST = \
- src/test_client.c
+ src/test_client.c \
+ src/thrift_test_handler.c \
+ src/thrift_test_handler.h \
+ src/test_server.c
diff --git a/test/c_glib/src/test_client.c b/test/c_glib/src/test_client.c
index 2a667950b..59f4157a0 100644
--- a/test/c_glib/src/test_client.c
+++ b/test/c_glib/src/test_client.c
@@ -38,7 +38,8 @@
connection prematurely) by outputting an error message before
exiting. */
static void
-sigpipe_handler (int signal_number) {
+sigpipe_handler (int signal_number)
+{
THRIFT_UNUSED_VAR (signal_number);
/* Flush standard output to make sure the test results so far are
@@ -56,7 +57,8 @@ sigpipe_handler (int signal_number) {
/* Compare two gint32 values. Used for sorting and finding integer
values within a GList. */
static gint
-gint32_compare (gconstpointer a, gconstpointer b) {
+gint32_compare (gconstpointer a, gconstpointer b)
+{
gint32 int32_a = *(gint32 *)a;
gint32 int32_b = *(gint32 *)b;
int result = 0;
@@ -70,7 +72,8 @@ gint32_compare (gconstpointer a, gconstpointer b) {
}
int
-main (int argc, char **argv) {
+main (int argc, char **argv)
+{
static gchar *host = NULL;
static gint port = 9090;
static gchar *transport_option = NULL;
@@ -115,15 +118,19 @@ main (int argc, char **argv) {
int fail_count = 0;
GError *error = NULL;
+#if (!GLIB_CHECK_VERSION (2, 36, 0))
+ g_type_init ();
+#endif
+
/* Configure and parse our command-line options */
option_context = g_option_context_new (NULL);
g_option_context_add_main_entries (option_context,
option_entries,
NULL);
- if (g_option_context_parse (option_context,
- &argc,
- &argv,
- &error) == FALSE) {
+ if (!g_option_context_parse (option_context,
+ &argc,
+ &argv,
+ &error)) {
fprintf (stderr, "%s\n", error->message);
return 255;
}
@@ -151,7 +158,7 @@ main (int argc, char **argv) {
}
}
- if (options_valid == FALSE)
+ if (!options_valid)
return 254;
printf ("Connecting (%s/%s) to: %s:%d\n",
@@ -186,7 +193,7 @@ main (int argc, char **argv) {
/* Execute the actual tests */
for (test_num = 0; test_num < num_tests; ++test_num) {
- if (thrift_transport_open (transport, &error) == TRUE) {
+ if (thrift_transport_open (transport, &error)) {
gchar *string = NULL;
gint8 byte = 0;
gint32 int32 = 0;
@@ -258,7 +265,7 @@ main (int argc, char **argv) {
* VOID TEST
*/
printf ("testVoid()");
- if (t_test_thrift_test_if_test_void (test_client, &error) == TRUE) {
+ if (t_test_thrift_test_if_test_void (test_client, &error)) {
printf (" = void\n");
}
else {
@@ -276,7 +283,7 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_string (test_client,
&string,
"Test",
- &error) == TRUE) {
+ &error)) {
printf (" = \"%s\"\n", string);
if (strncmp (string, "Test", 5) != 0)
fail_count++;
@@ -299,7 +306,7 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_byte (test_client,
&byte,
1,
- &error) == TRUE) {
+ &error)) {
printf (" = %d\n", byte);
if (byte != 1)
fail_count++;
@@ -319,7 +326,7 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_i32 (test_client,
&int32,
-1,
- &error) == TRUE) {
+ &error)) {
printf (" = %d\n", int32);
if (int32 != -1)
fail_count++;
@@ -339,7 +346,7 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_i64 (test_client,
&int64,
(gint64)-34359738368,
- &error) == TRUE) {
+ &error)) {
printf (" = %" PRId64 "\n", int64);
if (int64 != (gint64)-34359738368)
fail_count++;
@@ -359,7 +366,7 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_double (test_client,
&dub,
-5.2098523,
- &error) == TRUE) {
+ &error)) {
printf (" = %f\n", dub);
if ((dub - (-5.2098523)) > 0.001)
fail_count++;
@@ -387,7 +394,7 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_struct (test_client,
&xtruct_in,
xtruct_out,
- &error) == TRUE) {
+ &error)) {
g_object_get (xtruct_in,
"string_thing", &string,
"byte_thing", &byte_thing,
@@ -429,7 +436,7 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_nest (test_client,
&xtruct2_in,
xtruct2_out,
- &error) == TRUE) {
+ &error)) {
g_object_get (xtruct2_in,
"byte_thing", &byte_thing,
"struct_thing", &xtruct_in,
@@ -491,8 +498,8 @@ main (int argc, char **argv) {
g_hash_table_iter_init (&hash_table_iter, map_out);
while (g_hash_table_iter_next (&hash_table_iter,
&key,
- &value) == TRUE) {
- if (first == TRUE)
+ &value)) {
+ if (first)
first = FALSE;
else
printf (", ");
@@ -509,14 +516,14 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_map (test_client,
&map_in,
map_out,
- &error) == TRUE) {
+ &error)) {
printf (" = {");
first = TRUE;
g_hash_table_iter_init (&hash_table_iter, map_in);
while (g_hash_table_iter_next (&hash_table_iter,
&key,
- &value) == TRUE) {
- if (first == TRUE)
+ &value)) {
+ if (first)
first = FALSE;
else
printf (", ");
@@ -531,7 +538,7 @@ main (int argc, char **argv) {
g_hash_table_iter_init (&hash_table_iter, map_out);
while (g_hash_table_iter_next (&hash_table_iter,
&key,
- &value) == TRUE) {
+ &value)) {
gpointer in_value = g_hash_table_lookup (map_in, key);
if (in_value == NULL ||
*(gint32 *)in_value != *(gint32 *)value) {
@@ -567,8 +574,8 @@ main (int argc, char **argv) {
g_hash_table_iter_init (&hash_table_iter, map_out);
while (g_hash_table_iter_next (&hash_table_iter,
&key,
- &value) == TRUE) {
- if (first == TRUE)
+ &value)) {
+ if (first)
first = FALSE;
else
printf (", ");
@@ -585,14 +592,14 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_string_map (test_client,
&map_in,
map_out,
- &error) == TRUE) {
+ &error)) {
printf (" = {");
first = TRUE;
g_hash_table_iter_init (&hash_table_iter, map_in);
while (g_hash_table_iter_next (&hash_table_iter,
&key,
- &value) == TRUE) {
- if (first == TRUE)
+ &value)) {
+ if (first)
first = FALSE;
else
printf (", ");
@@ -607,7 +614,7 @@ main (int argc, char **argv) {
g_hash_table_iter_init (&hash_table_iter, map_out);
while (g_hash_table_iter_next (&hash_table_iter,
&key,
- &value) == TRUE) {
+ &value)) {
gpointer in_value = g_hash_table_lookup (map_in, key);
if (in_value == NULL ||
strcmp ((gchar *)in_value, (gchar *)value) != 0) {
@@ -643,7 +650,7 @@ main (int argc, char **argv) {
keys_out = g_hash_table_get_keys (set_out);
keys_elem = keys_out;
while (keys_elem != NULL) {
- if (first == TRUE)
+ if (first)
first = FALSE;
else
printf (", ");
@@ -659,13 +666,13 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_set (test_client,
&set_in,
set_out,
- &error) == TRUE) {
+ &error)) {
printf(" = {");
first = TRUE;
keys_in = g_hash_table_get_keys (set_in);
keys_elem = keys_in;
while (keys_elem != NULL) {
- if (first == TRUE)
+ if (first)
first = FALSE;
else
printf (", ");
@@ -716,7 +723,7 @@ main (int argc, char **argv) {
printf ("testList({");
first = TRUE;
for (i = 0; i < (gint32)list_out->len; ++i) {
- if (first == TRUE)
+ if (first)
first = FALSE;
else
printf (", ");
@@ -730,11 +737,11 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_list (test_client,
&list_in,
list_out,
- &error) == TRUE) {
+ &error)) {
printf (" = {");
first = TRUE;
for (i = 0; i < (gint32)list_in->len; ++i) {
- if (first == TRUE)
+ if (first)
first = FALSE;
else
printf (", ");
@@ -767,7 +774,7 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_enum (test_client,
&numberz,
T_TEST_NUMBERZ_ONE,
- &error) == TRUE) {
+ &error)) {
printf(" = %d\n", numberz);
if (numberz != T_TEST_NUMBERZ_ONE)
fail_count++;
@@ -784,7 +791,7 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_enum (test_client,
&numberz,
T_TEST_NUMBERZ_TWO,
- &error) == TRUE) {
+ &error)) {
printf(" = %d\n", numberz);
if (numberz != T_TEST_NUMBERZ_TWO)
fail_count++;
@@ -801,7 +808,7 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_enum (test_client,
&numberz,
T_TEST_NUMBERZ_THREE,
- &error) == TRUE) {
+ &error)) {
printf(" = %d\n", numberz);
if (numberz != T_TEST_NUMBERZ_THREE)
fail_count++;
@@ -818,7 +825,7 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_enum (test_client,
&numberz,
T_TEST_NUMBERZ_FIVE,
- &error) == TRUE) {
+ &error)) {
printf(" = %d\n", numberz);
if (numberz != T_TEST_NUMBERZ_FIVE)
fail_count++;
@@ -835,7 +842,7 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_enum (test_client,
&numberz,
T_TEST_NUMBERZ_EIGHT,
- &error) == TRUE) {
+ &error)) {
printf(" = %d\n", numberz);
if (numberz != T_TEST_NUMBERZ_EIGHT)
fail_count++;
@@ -855,7 +862,7 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_typedef (test_client,
&user_id,
309858235082523LL,
- &error) == TRUE) {
+ &error)) {
printf(" = %" PRId64 "\n", user_id);
if (user_id != 309858235082523LL)
fail_count++;
@@ -879,20 +886,20 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_map_map (test_client,
&map_in,
1,
- &error) == TRUE) {
+ &error)) {
g_hash_table_iter_init (&hash_table_iter, map_in);
printf (" = {");
while (g_hash_table_iter_next (&hash_table_iter,
&key,
- &value) == TRUE) {
+ &value)) {
printf ("%d => {", *(gint32 *)key);
g_hash_table_iter_init (&inner_hash_table_iter,
(GHashTable *)value);
while (g_hash_table_iter_next (&inner_hash_table_iter,
&key,
- &value) == TRUE) {
+ &value)) {
printf ("%d => %d, ", *(gint32 *)key, *(gint32 *)value);
}
@@ -984,7 +991,7 @@ main (int argc, char **argv) {
"string_thing", "Truck",
"byte_thing", 8,
"i32_thing", 8,
- "i64_thing", 8,
+ "i64_thing", 8LL,
NULL);
g_ptr_array_add (xtructs, xtruct_out);
g_ptr_array_unref (xtructs);
@@ -998,19 +1005,19 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_insanity (test_client,
&map_in,
insanity_out,
- &error) == TRUE) {
+ &error)) {
printf (" = {");
g_hash_table_iter_init (&hash_table_iter, map_in);
while (g_hash_table_iter_next (&hash_table_iter,
&key,
- &value) == TRUE) {
+ &value)) {
printf ("%" PRId64 " => {", *(TTestUserId *)key);
g_hash_table_iter_init (&inner_hash_table_iter,
(GHashTable *)value);
while (g_hash_table_iter_next (&inner_hash_table_iter,
&key,
- &value) == TRUE) {
+ &value)) {
printf ("%d => {", (TTestNumberz)key);
g_object_get ((TTestInsanity *)value,
@@ -1022,7 +1029,7 @@ main (int argc, char **argv) {
g_hash_table_iter_init (&user_map_iter, user_map);
while (g_hash_table_iter_next (&user_map_iter,
&key,
- &value) == TRUE) {
+ &value)) {
printf ("%d => %" PRId64 ", ",
(TTestNumberz)key,
*(TTestUserId *)value);
@@ -1204,10 +1211,10 @@ main (int argc, char **argv) {
/* test exception */
printf ("testClient.testException(\"Xception\") =>");
- if (t_test_thrift_test_if_test_exception (test_client,
- "Xception",
- &xception,
- &error) == FALSE &&
+ if (!t_test_thrift_test_if_test_exception (test_client,
+ "Xception",
+ &xception,
+ &error) &&
xception != NULL) {
g_object_get (xception,
"errorCode", &int32,
@@ -1238,10 +1245,10 @@ main (int argc, char **argv) {
}
printf ("testClient.testException(\"TException\") =>");
- if (t_test_thrift_test_if_test_exception (test_client,
- "TException",
- &xception,
- &error) == FALSE &&
+ if (!t_test_thrift_test_if_test_exception (test_client,
+ "TException",
+ &xception,
+ &error) &&
xception == NULL &&
error != NULL) {
printf (" Caught TException\n");
@@ -1268,7 +1275,7 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_exception (test_client,
"success",
&xception,
- &error) == TRUE)
+ &error))
printf (" void\n");
else {
printf (" void\nFAILURE\n");
@@ -1288,13 +1295,13 @@ main (int argc, char **argv) {
/* test multi exception */
printf ("testClient.testMultiException(\"Xception\", \"test 1\") =>");
xtruct_in = g_object_new (T_TEST_TYPE_XTRUCT, NULL);
- if (t_test_thrift_test_if_test_multi_exception (test_client,
- &xtruct_in,
- "Xception",
- "test 1",
- &xception,
- &xception2,
- &error) == FALSE &&
+ if (!t_test_thrift_test_if_test_multi_exception (test_client,
+ &xtruct_in,
+ "Xception",
+ "test 1",
+ &xception,
+ &xception2,
+ &error) &&
xception != NULL &&
xception2 == NULL) {
g_object_get (xception,
@@ -1333,13 +1340,13 @@ main (int argc, char **argv) {
printf ("testClient.testMultiException(\"Xception2\", \"test 2\") =>");
xtruct_in = g_object_new (T_TEST_TYPE_XTRUCT, NULL);
- if (t_test_thrift_test_if_test_multi_exception (test_client,
- &xtruct_in,
- "Xception2",
- "test 2",
- &xception,
- &xception2,
- &error) == FALSE &&
+ if (!t_test_thrift_test_if_test_multi_exception (test_client,
+ &xtruct_in,
+ "Xception2",
+ "test 2",
+ &xception,
+ &xception2,
+ &error) &&
xception == NULL &&
xception2 != NULL) {
g_object_get (xception2,
@@ -1390,7 +1397,7 @@ main (int argc, char **argv) {
"test 3",
&xception,
&xception2,
- &error) == TRUE &&
+ &error) &&
xception == NULL &&
xception2 == NULL) {
g_object_get (xtruct_in,
@@ -1431,7 +1438,7 @@ main (int argc, char **argv) {
oneway_elapsed_usec =
oneway_elapsed.tv_sec * 1000 * 1000 + oneway_elapsed.tv_usec;
- if (oneway_result == TRUE) {
+ if (oneway_result) {
if (oneway_elapsed_usec > 200 * 1000) {
printf (" FAILURE - took %.2f ms\n",
(double)oneway_elapsed_usec / 1000.0);
@@ -1465,7 +1472,7 @@ main (int argc, char **argv) {
if (t_test_thrift_test_if_test_i32 (test_client,
&int32,
-1,
- &error) == TRUE) {
+ &error)) {
printf (" = %d\n", int32);
if (int32 != -1)
fail_count++;
diff --git a/test/c_glib/src/test_server.c b/test/c_glib/src/test_server.c
new file mode 100644
index 000000000..13eec277a
--- /dev/null
+++ b/test/c_glib/src/test_server.c
@@ -0,0 +1,207 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <glib-object.h>
+#include <signal.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <thrift/c_glib/thrift.h>
+#include <thrift/c_glib/protocol/thrift_binary_protocol_factory.h>
+#include <thrift/c_glib/server/thrift_server.h>
+#include <thrift/c_glib/server/thrift_simple_server.h>
+#include <thrift/c_glib/transport/thrift_buffered_transport.h>
+#include <thrift/c_glib/transport/thrift_buffered_transport_factory.h>
+#include <thrift/c_glib/transport/thrift_framed_transport.h>
+#include <thrift/c_glib/transport/thrift_framed_transport_factory.h>
+#include <thrift/c_glib/transport/thrift_server_socket.h>
+#include <thrift/c_glib/transport/thrift_server_transport.h>
+#include <thrift/c_glib/transport/thrift_transport.h>
+#include <thrift/c_glib/transport/thrift_transport_factory.h>
+
+#include "../gen-c_glib/t_test_thrift_test.h"
+
+#include "thrift_test_handler.h"
+
+/* Our server object, declared globally so it is accessible within the SIGINT
+ signal handler */
+ThriftServer *server = NULL;
+
+/* A flag that indicates whether the server was interrupted with SIGINT
+ (i.e. Ctrl-C) so we can tell whether its termination was abnormal */
+gboolean sigint_received = FALSE;
+
+/* Handle SIGINT ("Ctrl-C") signals by gracefully stopping the server */
+static void
+sigint_handler (int signal_number)
+{
+ THRIFT_UNUSED_VAR (signal_number);
+
+ /* Take note we were called */
+ sigint_received = TRUE;
+
+ /* Shut down the server gracefully */
+ if (server != NULL)
+ thrift_server_stop (server);
+}
+
+int
+main (int argc, char **argv)
+{
+ static gint port = 9090;
+ static gchar *server_type_option = NULL;
+ static gchar *transport_option = NULL;
+ static gchar *protocol_option = NULL;
+
+ static
+ GOptionEntry option_entries[] = {
+ { "port", 0, 0, G_OPTION_ARG_INT, &port,
+ "Port number to connect (=9090)", NULL },
+ { "server-type", 0, 0, G_OPTION_ARG_STRING, &server_type_option,
+ "Type of server: simple (=simple)", NULL },
+ { "transport", 0, 0, G_OPTION_ARG_STRING, &transport_option,
+ "Transport: buffered, framed (=buffered)", NULL },
+ { "protocol", 0, 0, G_OPTION_ARG_STRING, &protocol_option,
+ "Protocol: binary (=binary)", NULL },
+ { NULL }
+ };
+
+ gchar *server_name = "simple";
+ gchar *transport_name = "buffered";
+ GType transport_factory_type = THRIFT_TYPE_BUFFERED_TRANSPORT_FACTORY;
+ gchar *protocol_name = "binary";
+ GType protocol_factory_type = THRIFT_TYPE_BINARY_PROTOCOL_FACTORY;
+
+ TTestThriftTestHandler *handler;
+ ThriftProcessor *processor;
+ ThriftServerTransport *server_transport;
+ ThriftTransportFactory *transport_factory;
+ ThriftProtocolFactory *protocol_factory;
+
+ struct sigaction sigint_action;
+
+ GOptionContext *option_context;
+ gboolean options_valid = TRUE;
+
+ GError *error = NULL;
+
+#if (!GLIB_CHECK_VERSION (2, 36, 0))
+ g_type_init ();
+#endif
+
+ /* Configure and parse our command-line options */
+ option_context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (option_context,
+ option_entries,
+ NULL);
+ if (g_option_context_parse (option_context,
+ &argc,
+ &argv,
+ &error) == FALSE) {
+ fprintf (stderr, "%s\n", error->message);
+ return 255;
+ }
+ g_option_context_free (option_context);
+
+ /* Validate the parsed options */
+ if (server_type_option != NULL &&
+ strncmp (server_type_option, "simple", 7) != 0) {
+ fprintf (stderr, "Unknown server type %s\n", protocol_option);
+ options_valid = FALSE;
+ }
+
+ if (protocol_option != NULL &&
+ strncmp (protocol_option, "binary", 7) != 0) {
+ fprintf (stderr, "Unknown protocol type %s\n", protocol_option);
+ options_valid = FALSE;
+ }
+
+ if (transport_option != NULL) {
+ if (strncmp (transport_option, "framed", 7) == 0) {
+ transport_factory_type = THRIFT_TYPE_FRAMED_TRANSPORT_FACTORY;
+ transport_name = "framed";
+ }
+ else if (strncmp (transport_option, "buffered", 9) != 0) {
+ fprintf (stderr, "Unknown transport type %s\n", transport_option);
+ options_valid = FALSE;
+ }
+ }
+
+ if (!options_valid)
+ return 254;
+
+ /* Establish all our connection objects */
+ handler = g_object_new (TYPE_THRIFT_TEST_HANDLER,
+ NULL);
+ processor = g_object_new (T_TEST_TYPE_THRIFT_TEST_PROCESSOR,
+ "handler", handler,
+ NULL);
+ server_transport = g_object_new (THRIFT_TYPE_SERVER_SOCKET,
+ "port", port,
+ NULL);
+ transport_factory = g_object_new (transport_factory_type,
+ NULL);
+ protocol_factory = g_object_new (protocol_factory_type,
+ NULL);
+
+ server = g_object_new (THRIFT_TYPE_SIMPLE_SERVER,
+ "processor", processor,
+ "server_transport", server_transport,
+ "input_transport_factory", transport_factory,
+ "output_transport_factory", transport_factory,
+ "input_protocol_factory", protocol_factory,
+ "output_protocol_factory", protocol_factory,
+ NULL);
+
+ /* Install our SIGINT handler, which handles Ctrl-C being pressed by stopping
+ the server gracefully */
+ memset (&sigint_action, 0, sizeof (sigint_action));
+ sigint_action.sa_handler = sigint_handler;
+ sigint_action.sa_flags = SA_RESETHAND;
+ sigaction (SIGINT, &sigint_action, NULL);
+
+ printf ("Starting \"%s\" server (%s/%s) listen on: %d\n",
+ server_name,
+ transport_name,
+ protocol_name,
+ port);
+ fflush (stdout);
+
+ /* Serve clients until SIGINT is received (Ctrl-C is pressed) */
+ thrift_server_serve (server, &error);
+
+ /* If the server stopped for any reason other than being interrupted by the
+ user, report the error */
+ if (!sigint_received) {
+ g_message ("thrift_server_serve: %s",
+ error != NULL ? error->message : "(null)");
+ g_clear_error (&error);
+ }
+
+ puts ("done.");
+
+ g_object_unref (server);
+ g_object_unref (protocol_factory);
+ g_object_unref (transport_factory);
+ g_object_unref (server_transport);
+ g_object_unref (processor);
+ g_object_unref (handler);
+
+ return 0;
+}
diff --git a/test/c_glib/src/thrift_test_handler.c b/test/c_glib/src/thrift_test_handler.c
new file mode 100644
index 000000000..596e615a9
--- /dev/null
+++ b/test/c_glib/src/thrift_test_handler.c
@@ -0,0 +1,838 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <inttypes.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <thrift/c_glib/thrift.h>
+#include <thrift/c_glib/thrift_application_exception.h>
+
+#include "thrift_test_handler.h"
+
+/* A handler that implements the TTestThriftTestIf interface */
+
+G_DEFINE_TYPE (ThriftTestHandler,
+ thrift_test_handler,
+ T_TEST_TYPE_THRIFT_TEST_HANDLER);
+
+gboolean
+thrift_test_handler_test_void (TTestThriftTestIf *iface,
+ GError **error)
+{
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ printf ("testVoid()\n");
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_string (TTestThriftTestIf *iface,
+ gchar **_return,
+ const gchar *thing,
+ GError **error)
+{
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ printf ("testString(\"%s\")\n", thing);
+ *_return = g_strdup (thing);
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_byte (TTestThriftTestIf *iface,
+ gint8 *_return,
+ const gint8 thing,
+ GError **error)
+{
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ printf ("testByte(%d)\n", (gint)thing);
+ *_return = thing;
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_i32 (TTestThriftTestIf *iface,
+ gint32 *_return,
+ const gint32 thing,
+ GError **error)
+{
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ printf ("testI32(%d)\n", thing);
+ *_return = thing;
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_i64 (TTestThriftTestIf *iface,
+ gint64 *_return,
+ const gint64 thing,
+ GError **error)
+{
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ printf ("testI64(%" PRId64 ")\n", thing);
+ *_return = thing;
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_double (TTestThriftTestIf *iface,
+ gdouble *_return,
+ const gdouble thing,
+ GError **error)
+{
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ printf ("testDouble(%f)\n", thing);
+ *_return = thing;
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_struct (TTestThriftTestIf *iface,
+ TTestXtruct **_return,
+ const TTestXtruct *thing,
+ GError **error)
+{
+ gchar *string_thing = NULL;
+ gint byte_thing;
+ gint i32_thing;
+ gint64 i64_thing;
+
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ g_object_get ((TTestXtruct *)thing,
+ "string_thing", &string_thing,
+ "byte_thing", &byte_thing,
+ "i32_thing", &i32_thing,
+ "i64_thing", &i64_thing,
+ NULL);
+
+ printf ("testStruct({\"%s\", %d, %d, %" PRId64 "})\n",
+ string_thing,
+ (gint)byte_thing,
+ i32_thing,
+ i64_thing);
+
+ g_object_set (*_return,
+ "string_thing", string_thing,
+ "byte_thing", byte_thing,
+ "i32_thing", i32_thing,
+ "i64_thing", i64_thing,
+ NULL);
+
+ if (string_thing != NULL)
+ g_free (string_thing);
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_nest (TTestThriftTestIf *iface,
+ TTestXtruct2 **_return,
+ const TTestXtruct2 *thing,
+ GError **error)
+{
+ gchar *inner_string_thing = NULL;
+ gint byte_thing, inner_byte_thing;
+ gint i32_thing, inner_i32_thing;
+ gint64 inner_i64_thing;
+ TTestXtruct *struct_thing;
+
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ g_object_get ((TTestXtruct2 *)thing,
+ "byte_thing", &byte_thing,
+ "struct_thing", &struct_thing,
+ "i32_thing", &i32_thing,
+ NULL);
+ g_object_get (struct_thing,
+ "string_thing", &inner_string_thing,
+ "byte_thing", &inner_byte_thing,
+ "i32_thing", &inner_i32_thing,
+ "i64_thing", &inner_i64_thing,
+ NULL);
+
+ printf ("testNest({%d, {\"%s\", %d, %d, %" PRId64 "}, %d})\n",
+ byte_thing,
+ inner_string_thing,
+ inner_byte_thing,
+ inner_i32_thing,
+ inner_i64_thing,
+ i32_thing);
+
+ g_object_set (*_return,
+ "byte_thing", byte_thing,
+ "struct_thing", struct_thing,
+ "i32_thing", i32_thing,
+ NULL);
+
+ if (inner_string_thing != NULL)
+ g_free (inner_string_thing);
+ g_object_unref (struct_thing);
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_map (TTestThriftTestIf *iface,
+ GHashTable **_return,
+ const GHashTable *thing,
+ GError **error)
+{
+ GHashTableIter hash_table_iter;
+ gpointer key;
+ gpointer value;
+ gboolean first = TRUE;
+
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ printf ("testMap({");
+ g_hash_table_iter_init (&hash_table_iter, (GHashTable *)thing);
+ while (g_hash_table_iter_next (&hash_table_iter,
+ &key,
+ &value)) {
+ gint32 *new_key;
+ gint32 *new_value;
+
+ if (first)
+ first = FALSE;
+ else
+ printf (", ");
+
+ printf ("%d => %d", *(gint32 *)key, *(gint32 *)value);
+
+ new_key = g_malloc (sizeof *new_key);
+ *new_key = *(gint32 *)key;
+ new_value = g_malloc (sizeof *new_value);
+ *new_value = *(gint32 *)value;
+ g_hash_table_insert (*_return, new_key, new_value);
+ }
+ printf ("})\n");
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_string_map (TTestThriftTestIf *iface,
+ GHashTable **_return,
+ const GHashTable *thing,
+ GError **error)
+{
+ GHashTableIter hash_table_iter;
+ gpointer key;
+ gpointer value;
+ gboolean first = TRUE;
+
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ printf ("testStringMap({");
+ g_hash_table_iter_init (&hash_table_iter, (GHashTable *)thing);
+ while (g_hash_table_iter_next (&hash_table_iter,
+ &key,
+ &value)) {
+ gchar *new_key;
+ gchar *new_value;
+
+ if (first)
+ first = FALSE;
+ else
+ printf (", ");
+
+ printf ("%s => %s", (gchar *)key, (gchar *)value);
+
+ new_key = g_strdup ((gchar *)key);
+ new_value = g_strdup ((gchar *)value);
+ g_hash_table_insert (*_return, new_key, new_value);
+ }
+ printf ("})\n");
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_set (TTestThriftTestIf *iface,
+ GHashTable **_return,
+ const GHashTable *thing,
+ GError **error)
+{
+ GHashTableIter hash_table_iter;
+ gpointer key;
+ gboolean first = TRUE;
+
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ printf ("testSet({");
+ g_hash_table_iter_init (&hash_table_iter, (GHashTable *)thing);
+ while (g_hash_table_iter_next (&hash_table_iter,
+ &key,
+ NULL)) {
+ gint32 *new_key;
+
+ if (first)
+ first = FALSE;
+ else
+ printf (", ");
+
+ printf ("%d", *(gint32 *)key);
+
+ new_key = g_malloc (sizeof *new_key);
+ *new_key = *(gint32 *)key;
+ g_hash_table_insert (*_return, new_key, NULL);
+ }
+ printf ("})\n");
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_list (TTestThriftTestIf *iface,
+ GArray **_return,
+ const GArray *thing,
+ GError **error)
+{
+ guint i;
+ gboolean first = TRUE;
+
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ printf ("testList({");
+ for (i = 0; i < thing->len; i += 1) {
+ gint32 value;
+ gint32 *new_value;
+
+ if (first)
+ first = FALSE;
+ else
+ printf (", ");
+
+ value = g_array_index (thing, gint32, i);
+ printf ("%d", value);
+
+ new_value = g_malloc (sizeof *new_value);
+ *new_value = value;
+ g_array_append_val (*_return, *new_value);
+ }
+ printf ("})\n");
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_enum (TTestThriftTestIf *iface,
+ TTestNumberz *_return,
+ const TTestNumberz thing,
+ GError **error)
+{
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ printf ("testEnum(%d)\n", thing);
+ *_return = thing;
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_typedef (TTestThriftTestIf *iface,
+ TTestUserId *_return,
+ const TTestUserId thing,
+ GError **error)
+{
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ printf ("testTypedef(%" PRId64 ")\n", thing);
+ *_return = thing;
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_map_map (TTestThriftTestIf *iface,
+ GHashTable **_return,
+ const gint32 hello,
+ GError **error)
+{
+ GHashTable *positive;
+ GHashTable *negative;
+ gint32 *key;
+ gint32 *value;
+ guint i;
+
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ printf ("testMapMap(%d)\n", hello);
+
+ positive = g_hash_table_new_full (g_int_hash,
+ g_int_equal,
+ g_free,
+ g_free);
+ negative = g_hash_table_new_full (g_int_hash,
+ g_int_equal,
+ g_free,
+ g_free);
+
+ for (i = 1; i < 5; i += 1) {
+ key = g_malloc (sizeof *key);
+ value = g_malloc (sizeof *value);
+ *key = i;
+ *value = i;
+ g_hash_table_insert (positive, key, value);
+
+ key = g_malloc (sizeof *key);
+ value = g_malloc (sizeof *value);
+ *key = -i;
+ *value = -i;
+ g_hash_table_insert (negative, key, value);
+ }
+
+ key = g_malloc (sizeof *key);
+ *key = 4;
+ g_hash_table_insert (*_return, key, positive);
+
+ key = g_malloc (sizeof *key);
+ *key = -4;
+ g_hash_table_insert (*_return, key, negative);
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_insanity (TTestThriftTestIf *iface,
+ GHashTable **_return,
+ const TTestInsanity *argument,
+ GError **error)
+{
+ TTestXtruct *hello;
+ TTestXtruct *goodbye;
+ TTestXtruct *xtruct_in;
+
+ gchar *string_thing = NULL;
+ gint byte_thing;
+ gint i32_thing;
+ gint64 i64_thing;
+
+ GPtrArray *xtructs;
+
+ TTestInsanity *crazy;
+ TTestInsanity *looney;
+
+ GHashTable *user_map;
+ GHashTable *first_map;
+ GHashTable *second_map;
+
+ GHashTableIter hash_table_iter;
+ GHashTableIter inner_hash_table_iter;
+ GHashTableIter user_map_iter;
+
+ gpointer key;
+ gpointer value;
+
+ TTestUserId *user_id;
+
+ guint i;
+
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (argument);
+ THRIFT_UNUSED_VAR (error);
+
+ printf ("testInsanity()\n");
+
+ hello = g_object_new (T_TEST_TYPE_XTRUCT,
+ "string_thing", "Hello2",
+ "byte_thing", 2,
+ "i32_thing", 2,
+ "i64_thing", 2,
+ NULL);
+
+ goodbye = g_object_new (T_TEST_TYPE_XTRUCT,
+ "string_thing", "Goodbye4",
+ "byte_thing", 4,
+ "i32_thing", 4,
+ "i64_thing", 4,
+ NULL);
+
+ crazy = g_object_new (T_TEST_TYPE_INSANITY, NULL);
+ g_object_get (crazy,
+ "userMap", &user_map,
+ "xtructs", &xtructs,
+ NULL);
+
+ user_id = g_malloc(sizeof *user_id);
+ *user_id = 8;
+ g_hash_table_insert (user_map,
+ GINT_TO_POINTER (T_TEST_NUMBERZ_EIGHT),
+ user_id);
+
+ g_ptr_array_add (xtructs, goodbye);
+
+ user_id = g_malloc(sizeof *user_id);
+ *user_id = 5;
+ g_hash_table_insert (user_map,
+ GINT_TO_POINTER (T_TEST_NUMBERZ_FIVE),
+ user_id);
+
+ g_ptr_array_add (xtructs, hello);
+
+ g_hash_table_unref (user_map);
+ g_ptr_array_unref (xtructs);
+
+ first_map = g_hash_table_new_full (g_direct_hash,
+ g_direct_equal,
+ NULL,
+ g_object_unref);
+ second_map = g_hash_table_new_full (g_direct_hash,
+ g_direct_equal,
+ NULL,
+ g_object_unref);
+
+ g_hash_table_insert (first_map,
+ GINT_TO_POINTER (T_TEST_NUMBERZ_TWO),
+ crazy);
+ g_hash_table_insert (first_map,
+ GINT_TO_POINTER (T_TEST_NUMBERZ_THREE),
+ crazy);
+
+ /* Increment crazy's ref count since first_map now holds two
+ references to it and would otherwise attempt to deallocate it
+ twice during destruction. We do this instead of creating a copy
+ of crazy in order to mimic the C++ implementation (and since,
+ frankly, the world needs less crazy, not more). */
+ g_object_ref (crazy);
+
+ looney = g_object_new (T_TEST_TYPE_INSANITY, NULL);
+ g_hash_table_insert (second_map,
+ GINT_TO_POINTER (T_TEST_NUMBERZ_SIX),
+ looney);
+
+ user_id = g_malloc (sizeof *user_id);
+ *user_id = 1;
+ g_hash_table_insert (*_return, user_id, first_map);
+
+ user_id = g_malloc (sizeof *user_id);
+ *user_id = 2;
+ g_hash_table_insert (*_return, user_id, second_map);
+
+ printf ("return");
+ printf (" = {");
+ g_hash_table_iter_init (&hash_table_iter, *_return);
+ while (g_hash_table_iter_next (&hash_table_iter,
+ &key,
+ &value)) {
+ printf ("%" PRId64 " => {", *(TTestUserId *)key);
+
+ g_hash_table_iter_init (&inner_hash_table_iter,
+ (GHashTable *)value);
+ while (g_hash_table_iter_next (&inner_hash_table_iter,
+ &key,
+ &value)) {
+ printf ("%d => {", (TTestNumberz)key);
+
+ g_object_get ((TTestInsanity *)value,
+ "userMap", &user_map,
+ "xtructs", &xtructs,
+ NULL);
+
+ printf ("{");
+ g_hash_table_iter_init (&user_map_iter, user_map);
+ while (g_hash_table_iter_next (&user_map_iter,
+ &key,
+ &value)) {
+ printf ("%d => %" PRId64 ", ",
+ (TTestNumberz)key,
+ *(TTestUserId *)value);
+ }
+ printf ("}, ");
+ g_hash_table_unref (user_map);
+
+ printf ("{");
+ for (i = 0; i < xtructs->len; ++i) {
+ xtruct_in = g_ptr_array_index (xtructs, i);
+ g_object_get (xtruct_in,
+ "string_thing", &string_thing,
+ "byte_thing", &byte_thing,
+ "i32_thing", &i32_thing,
+ "i64_thing", &i64_thing,
+ NULL);
+
+ printf ("{\"%s\", %d, %d, %" PRId64 "}, ",
+ string_thing,
+ byte_thing,
+ i32_thing,
+ i64_thing);
+ }
+ printf ("}");
+ g_ptr_array_unref (xtructs);
+
+ printf ("}, ");
+ }
+ printf ("}, ");
+ }
+ printf ("}\n");
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_multi (TTestThriftTestIf *iface,
+ TTestXtruct **_return,
+ const gint8 arg0,
+ const gint32 arg1,
+ const gint64 arg2,
+ const GHashTable *arg3,
+ const TTestNumberz arg4,
+ const TTestUserId arg5,
+ GError **error)
+{
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+ THRIFT_UNUSED_VAR (arg3);
+ THRIFT_UNUSED_VAR (arg4);
+ THRIFT_UNUSED_VAR (arg5);
+
+ printf ("testMulti()\n");
+
+ g_object_set (*_return,
+ "string_thing", g_strdup ("Hello2"),
+ "byte_thing", arg0,
+ "i32_thing", arg1,
+ "i64_thing", arg2,
+ NULL);
+
+ return TRUE;
+}
+
+gboolean
+thrift_test_handler_test_exception (TTestThriftTestIf *iface,
+ const gchar *arg,
+ TTestXception **err1,
+ GError **error)
+{
+ THRIFT_UNUSED_VAR (iface);
+
+ TTestXtruct *xtruct;
+ gboolean result;
+
+ printf ("testException(%s)\n", arg);
+
+ /* Unlike argument objects, exception objects are not pre-created */
+ g_assert (*err1 == NULL);
+
+ if (strncmp (arg, "Xception", 9) == 0) {
+ /* "Throw" a custom exception: Set the corresponding exception
+ argument, set *error to NULL and return FALSE */
+ *err1 = g_object_new (T_TEST_TYPE_XCEPTION,
+ "errorCode", 1001,
+ "message", g_strdup (arg),
+ NULL);
+ *error = NULL;
+ result = FALSE;
+ }
+ else if (strncmp (arg, "TException", 11) == 0) {
+ /* "Throw" a generic TException (ThriftApplicationException): Set
+ all exception arguments to NULL, set *error and return FALSE */
+ *err1 = NULL;
+ g_set_error (error,
+ thrift_application_exception_error_quark (),
+ THRIFT_APPLICATION_EXCEPTION_ERROR_UNKNOWN,
+ "Default TException.");
+ result = FALSE;
+ }
+ else {
+ *err1 = NULL;
+ *error = NULL;
+
+ /* This code is duplicated from the C++ test suite, though it
+ appears to serve no purpose */
+ xtruct = g_object_new (T_TEST_TYPE_XTRUCT,
+ "string_thing", g_strdup (arg),
+ NULL);
+ g_object_unref (xtruct);
+
+ result = TRUE;
+ }
+
+ return result;
+}
+
+gboolean
+thrift_test_handler_test_multi_exception (TTestThriftTestIf *iface,
+ TTestXtruct **_return,
+ const gchar *arg0,
+ const gchar *arg1,
+ TTestXception **err1,
+ TTestXception2 **err2,
+ GError **error)
+{
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ TTestXtruct *struct_thing;
+ gboolean result;
+
+ printf ("testMultiException(%s, %s)\n", arg0, arg1);
+
+ g_assert (*err1 == NULL);
+ g_assert (*err2 == NULL);
+
+ if (strncmp (arg0, "Xception", 9) == 0) {
+ *err1 = g_object_new (T_TEST_TYPE_XCEPTION,
+ "errorCode", 1001,
+ "message", g_strdup ("This is an Xception"),
+ NULL);
+ result = FALSE;
+ }
+ else if (strncmp (arg0, "Xception2", 10) == 0) {
+ *err2 = g_object_new (T_TEST_TYPE_XCEPTION2,
+ "errorCode", 2002);
+
+ g_object_get (*err2,
+ "struct_thing", &struct_thing,
+ NULL);
+ g_object_set (struct_thing,
+ "string_thing", g_strdup ("This is an Xception2"),
+ NULL);
+ g_object_set (*err2,
+ "struct_thing", struct_thing,
+ NULL);
+ g_object_unref (struct_thing);
+
+ result = FALSE;
+ }
+ else {
+ g_object_set (*_return,
+ "string_thing", g_strdup (arg1),
+ NULL);
+ result = TRUE;
+ }
+
+ return result;
+}
+
+gboolean
+thrift_test_handler_test_oneway (TTestThriftTestIf *iface,
+ const gint32 secondsToSleep,
+ GError **error)
+{
+ THRIFT_UNUSED_VAR (iface);
+ THRIFT_UNUSED_VAR (error);
+
+ printf ("testOneway(%d): Sleeping...\n", secondsToSleep);
+ sleep (secondsToSleep);
+ printf ("testOneway(%d): done sleeping!\n", secondsToSleep);
+
+ return TRUE;
+}
+
+static void
+thrift_test_handler_init (ThriftTestHandler *self)
+{
+ THRIFT_UNUSED_VAR (self);
+}
+
+static void
+thrift_test_handler_class_init (ThriftTestHandlerClass *klass)
+{
+ TTestThriftTestHandlerClass *base_class =
+ T_TEST_THRIFT_TEST_HANDLER_CLASS (klass);
+
+ base_class->test_void =
+ klass->test_void =
+ thrift_test_handler_test_void;
+ base_class->test_string =
+ klass->test_string =
+ thrift_test_handler_test_string;
+ base_class->test_byte =
+ klass->test_byte =
+ thrift_test_handler_test_byte;
+ base_class->test_i32 =
+ klass->test_i32 =
+ thrift_test_handler_test_i32;
+ base_class->test_i64 =
+ klass->test_i64 =
+ thrift_test_handler_test_i64;
+ base_class->test_double =
+ klass->test_double =
+ thrift_test_handler_test_double;
+ base_class->test_struct =
+ klass->test_struct =
+ thrift_test_handler_test_struct;
+ base_class->test_nest =
+ klass->test_nest =
+ thrift_test_handler_test_nest;
+ base_class->test_map =
+ klass->test_map =
+ thrift_test_handler_test_map;
+ base_class->test_string_map =
+ klass->test_string_map =
+ thrift_test_handler_test_string_map;
+ base_class->test_set =
+ klass->test_set =
+ thrift_test_handler_test_set;
+ base_class->test_list =
+ klass->test_list =
+ thrift_test_handler_test_list;
+ base_class->test_enum =
+ klass->test_enum =
+ thrift_test_handler_test_enum;
+ base_class->test_typedef =
+ klass->test_typedef =
+ thrift_test_handler_test_typedef;
+ base_class->test_map_map =
+ klass->test_map_map =
+ thrift_test_handler_test_map_map;
+ base_class->test_insanity =
+ klass->test_insanity =
+ thrift_test_handler_test_insanity;
+ base_class->test_multi =
+ klass->test_multi =
+ thrift_test_handler_test_multi;
+ base_class->test_exception =
+ klass->test_exception =
+ thrift_test_handler_test_exception;
+ base_class->test_multi_exception =
+ klass->test_multi_exception =
+ thrift_test_handler_test_multi_exception;
+ base_class->test_oneway =
+ klass->test_oneway =
+ thrift_test_handler_test_oneway;
+}
diff --git a/test/c_glib/src/thrift_test_handler.h b/test/c_glib/src/thrift_test_handler.h
new file mode 100644
index 000000000..a34f90aa9
--- /dev/null
+++ b/test/c_glib/src/thrift_test_handler.h
@@ -0,0 +1,237 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef _THRIFT_TEST_HANDLER_H
+#define _THRIFT_TEST_HANDLER_H
+
+#include <glib-object.h>
+#include <stdio.h>
+
+#include "../gen-c_glib/t_test_thrift_test.h"
+
+G_BEGIN_DECLS
+
+/* A handler that implements the TTestThriftTestIf interface */
+
+#define TYPE_THRIFT_TEST_HANDLER (thrift_test_handler_get_type ())
+
+#define THRIFT_TEST_HANDLER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ TYPE_THRIFT_TEST_HANDLER, \
+ ThriftTestHandler))
+#define IS_THRIFT_TEST_HANDLER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ TYPE_THRIFT_TEST_HANDLER))
+#define THRIFT_TEST_HANDLER_CLASS(c) \
+ (G_TYPE_CHECK_CLASS_CAST ((c), \
+ TYPE_THRIFT_TEST_HANDLER, \
+ ThriftTestHandlerClass))
+#define IS_THRIFT_TEST_HANDLER_CLASS(c) \
+ (G_TYPE_CHECK_CLASS_TYPE ((c), \
+ TYPE_THRIFT_TEST_HANDLER))
+#define THRIFT_TEST_HANDLER_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ TYPE_THRIFT_TEST_HANDLER, \
+ ThriftTestHandlerClass))
+
+typedef struct _ThriftTestHandler ThriftTestHandler;
+typedef struct _ThriftTestHandlerClass ThriftTestHandlerClass;
+
+struct _ThriftTestHandler {
+ TTestThriftTestHandler parent;
+};
+
+struct _ThriftTestHandlerClass {
+ TTestThriftTestHandlerClass parent;
+
+ gboolean (*test_void) (TTestThriftTestIf *iface,
+ GError **error);
+ gboolean (*test_string) (TTestThriftTestIf *iface,
+ gchar **_return,
+ const gchar *thing,
+ GError **error);
+ gboolean (*test_byte) (TTestThriftTestIf *iface,
+ gint8*_return,
+ const gint8 thing,
+ GError **error);
+ gboolean (*test_i32) (TTestThriftTestIf *iface,
+ gint32*_return,
+ const gint32 thing,
+ GError **error);
+ gboolean (*test_i64) (TTestThriftTestIf *iface,
+ gint64*_return,
+ const gint64 thing,
+ GError **error);
+ gboolean (*test_double) (TTestThriftTestIf *iface,
+ gdouble*_return,
+ const gdouble thing,
+ GError **error);
+ gboolean (*test_struct) (TTestThriftTestIf *iface,
+ TTestXtruct **_return,
+ const TTestXtruct *thing,
+ GError **error);
+ gboolean (*test_nest) (TTestThriftTestIf *iface,
+ TTestXtruct2 **_return,
+ const TTestXtruct2 *thing,
+ GError **error);
+ gboolean (*test_map) (TTestThriftTestIf *iface,
+ GHashTable **_return,
+ const GHashTable *thing,
+ GError **error);
+ gboolean (*test_string_map) (TTestThriftTestIf *iface,
+ GHashTable **_return,
+ const GHashTable *thing,
+ GError **error);
+ gboolean (*test_set) (TTestThriftTestIf *iface,
+ GHashTable **_return,
+ const GHashTable *thing,
+ GError **error);
+ gboolean (*test_list) (TTestThriftTestIf *iface,
+ GArray **_return,
+ const GArray *thing,
+ GError **error);
+ gboolean (*test_enum) (TTestThriftTestIf *iface,
+ TTestNumberz*_return,
+ const TTestNumberz thing,
+ GError **error);
+ gboolean (*test_typedef) (TTestThriftTestIf *iface,
+ TTestUserId*_return,
+ const TTestUserId thing,
+ GError **error);
+ gboolean (*test_map_map) (TTestThriftTestIf *iface,
+ GHashTable **_return,
+ const gint32 hello,
+ GError **error);
+ gboolean (*test_insanity) (TTestThriftTestIf *iface,
+ GHashTable **_return,
+ const TTestInsanity *argument,
+ GError **error);
+ gboolean (*test_multi) (TTestThriftTestIf *iface,
+ TTestXtruct **_return,
+ const gint8 arg0,
+ const gint32 arg1,
+ const gint64 arg2,
+ const GHashTable *arg3,
+ const TTestNumberz arg4,
+ const TTestUserId arg5,
+ GError **error);
+ gboolean (*test_exception) (TTestThriftTestIf *iface,
+ const gchar *arg,
+ TTestXception **err1,
+ GError **error);
+ gboolean (*test_multi_exception) (TTestThriftTestIf *iface,
+ TTestXtruct **_return,
+ const gchar *arg0,
+ const gchar *arg1,
+ TTestXception **err1,
+ TTestXception2 **err2,
+ GError **error);
+ gboolean (*test_oneway) (TTestThriftTestIf *iface,
+ const gint32 secondsToSleep,
+ GError **error);
+};
+
+/* Used by THRIFT_TEST_HANDLER_GET_TYPE */
+GType thrift_test_handler_get_type (void);
+
+gboolean thrift_test_handler_test_void (TTestThriftTestIf *iface,
+ GError **error);
+gboolean thrift_test_handler_test_string (TTestThriftTestIf *iface,
+ gchar **_return,
+ const gchar *thing,
+ GError **error);
+gboolean thrift_test_handler_test_byte (TTestThriftTestIf *iface,
+ gint8*_return,
+ const gint8 thing,
+ GError **error);
+gboolean t_test_thrift_test_if_test_i32 (TTestThriftTestIf *iface,
+ gint32*_return,
+ const gint32 thing,
+ GError **error);
+gboolean thrift_test_handler_test_i64 (TTestThriftTestIf *iface,
+ gint64*_return,
+ const gint64 thing,
+ GError **error);
+gboolean thrift_test_handler_test_double (TTestThriftTestIf *iface,
+ gdouble*_return,
+ const gdouble thing,
+ GError **error);
+gboolean thrift_test_handler_test_struct (TTestThriftTestIf *iface,
+ TTestXtruct **_return,
+ const TTestXtruct *thing,
+ GError **error);
+gboolean thrift_test_handler_test_nest (TTestThriftTestIf *iface,
+ TTestXtruct2 **_return,
+ const TTestXtruct2 *thing,
+ GError **error);
+gboolean thrift_test_handler_test_map (TTestThriftTestIf *iface,
+ GHashTable **_return,
+ const GHashTable *thing,
+ GError **error);
+gboolean thrift_test_handler_test_string_map (TTestThriftTestIf *iface,
+ GHashTable **_return,
+ const GHashTable *thing,
+ GError **error);
+gboolean thrift_test_handler_test_set (TTestThriftTestIf *iface,
+ GHashTable **_return,
+ const GHashTable *thing,
+ GError **error);
+gboolean thrift_test_handler_test_list (TTestThriftTestIf *iface,
+ GArray **_return,
+ const GArray *thing,
+ GError **error);
+gboolean thrift_test_handler_test_typedef (TTestThriftTestIf *iface,
+ TTestUserId*_return,
+ const TTestUserId thing,
+ GError **error);
+gboolean thrift_test_handler_test_map_map (TTestThriftTestIf *iface,
+ GHashTable **_return,
+ const gint32 hello,
+ GError **error);
+gboolean thrift_test_handler_test_insanity (TTestThriftTestIf *iface,
+ GHashTable **_return,
+ const TTestInsanity *argument,
+ GError **error);
+gboolean thrift_test_handler_test_multi (TTestThriftTestIf *iface,
+ TTestXtruct **_return,
+ const gint8 arg0,
+ const gint32 arg1,
+ const gint64 arg2,
+ const GHashTable *arg3,
+ const TTestNumberz arg4,
+ const TTestUserId arg5,
+ GError **error);
+gboolean thrift_test_handler_test_exception (TTestThriftTestIf *iface,
+ const gchar *arg,
+ TTestXception **err1,
+ GError **error);
+gboolean thrift_test_handler_test_multi_exception (TTestThriftTestIf *iface,
+ TTestXtruct **_return,
+ const gchar *arg0,
+ const gchar *arg1,
+ TTestXception **err1,
+ TTestXception2 **err2,
+ GError **error);
+gboolean thrift_test_handler_test_oneway (TTestThriftTestIf *iface,
+ const gint32 secondsToSleep,
+ GError **error);
+
+G_END_DECLS
+
+#endif /* _THRIFT_TEST_HANDLER_H */