diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rwxr-xr-x | test/c_glib/Makefile.am | 17 | ||||
-rw-r--r-- | test/c_glib/src/test_client.c | 157 | ||||
-rw-r--r-- | test/c_glib/src/test_server.c | 207 | ||||
-rw-r--r-- | test/c_glib/src/thrift_test_handler.c | 838 | ||||
-rw-r--r-- | test/c_glib/src/thrift_test_handler.h | 237 | ||||
-rwxr-xr-x | test/test.sh | 167 |
7 files changed, 1547 insertions, 77 deletions
diff --git a/.gitignore b/.gitignore index a3344b7eb..e0b36f2c2 100644 --- a/.gitignore +++ b/.gitignore @@ -207,6 +207,7 @@ test-driver /stamp-h1 /test/status.html /test/c_glib/test_client +/test/c_glib/test_server /test/cpp/StressTest /test/cpp/StressTestNonBlocking /test/cpp/TestClient 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 */ diff --git a/test/test.sh b/test/test.sh index f7e119d23..edb22373d 100755 --- a/test/test.sh +++ b/test/test.sh @@ -288,6 +288,23 @@ for proto in $(intersection "${cpp_protocols}" "${java_protocols}"); do done done +######### c_glib client - c_glib server ############## +for proto in ${c_glib_protocols}; do + for trans in ${c_glib_transports}; do + for sock in ${c_glib_sockets}; do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + "domain" ) extraparam="--domain-socket=/tmp/ThriftTest.thrift";; + esac + do_test "c_glib-c_glib" "${proto}" "${trans}-${sock}" \ + "c_glib/test_client --protocol=${proto} --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "c_glib/test_server --protocol=${proto} --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "2" "0.1" + done + done +done + ######### c_glib client - cpp server ############## for proto in $(intersection "${c_glib_protocols}" "${cpp_protocols}"); do for trans in $(intersection "${c_glib_transports}" "${cpp_transports}"); do @@ -305,6 +322,23 @@ for proto in $(intersection "${c_glib_protocols}" "${cpp_protocols}"); do done done +######### cpp client - c_glib server ############## +for proto in $(intersection "${cpp_protocols}" "${c_glib_protocols}"); do + for trans in $(intersection "${cpp_transports}" "${c_glib_transports}"); do + for sock in $(intersection "${cpp_sockets}" "${c_glib_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + "domain" ) extraparam="--domain-socket=/tmp/ThriftTest.thrift";; + esac + do_test "cpp-c_glib" "${proto}" "${trans}-${sock}" \ + "cpp/TestClient --protocol=${proto} --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}"\ + "c_glib/test_server --protocol=${proto} --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "2" "0.1" + done + done +done + ######### c_glib client - java server ############## for proto in $(intersection "${c_glib_protocols}" "${java_protocols}"); do for trans in $(intersection "${c_glib_transports}" "${java_server_transports}"); do @@ -321,6 +355,22 @@ for proto in $(intersection "${c_glib_protocols}" "${java_protocols}"); do done done +######### java client - c_glib server ############## +for proto in $(intersection "${java_protocols}" "${c_glib_protocols}"); do + for trans in $(intersection "${java_client_transports}" "${c_glib_transports}"); do + for sock in $(intersection "${java_sockets}" "${c_glib_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + esac + do_test "java-c_glib" "${proto}" "${trans}-${sock}" \ + "ant -f ../lib/java/build.xml -Dno-gen-thrift=\"\" -Dtestargs \"--protocol=${proto} --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}\" run-testclient" \ + "c_glib/test_server --protocol=${proto} --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "5" "0.1" + done + done +done + NODE_TEST_DIR=${BASEDIR}/../lib/nodejs/test export NODE_PATH=${NODE_TEST_DIR}:${NODE_TEST_DIR}/../lib:${NODE_PATH} @@ -404,6 +454,22 @@ for proto in $(intersection "${nodejs_protocols}" "${java_protocols}"); do done done +######### nodejs client - c_glib server ############## +for proto in $(intersection "${nodejs_protocols}" "${c_glib_protocols}"); do + for trans in $(intersection "${nodejs_transports}" "${c_glib_transports}"); do + for sock in $(intersection "${nodejs_sockets}" "${c_glib_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + esac + do_test "nodejs-c_glib" "${proto}" "${trans}-${sock}" \ + "node ${NODE_TEST_DIR}/client.js -p ${proto} -t ${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "c_glib/test_server --protocol=${proto} --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "5" "0.1" + done + done +done + ######### c_glib client - nodejs server ############## for proto in $(intersection "${c_glib_protocols}" "${nodejs_protocols}"); do for trans in $(intersection "${c_glib_transports}" "${nodejs_transports}"); do @@ -569,6 +635,35 @@ for trans in $(intersection "${py_transports}" "${java_client_transports}"); do done done +######### py client - c_glib server ############## +for proto in $(intersection "${py_protocols}" "${c_glib_protocols}"); do + for trans in $(intersection "${py_transports}" "${c_glib_transports}"); do + for sock in $(intersection "${py_sockets}" "${c_glib_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + esac + do_test "py-c_glib" "${proto}" "${trans}-${sock}" \ + "py/TestClient.py --protocol=${proto} --transport=${trans} --port=${THRIFT_TEST_PORT} --host=localhost --genpydir=gen-py ${extraparam}" \ + "c_glib/test_server --protocol=${proto} --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "10" "0.1" + done + done +done + +for trans in $(intersection "${py_transports}" "${c_glib_transports}"); do + for sock in $(intersection "${py_sockets}" "${c_glib_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + esac + do_test "py-c_glib" "accel-binary" "${trans}-${sock}" \ + "py/TestClient.py --protocol=accel --transport=${trans} --port=${THRIFT_TEST_PORT} --host=localhost --genpydir=gen-py ${extraparam}" \ + "c_glib/test_server --protocol=binary --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "10" "0.1" + done + done + ######### c_glib client - py server ############## for proto in $(intersection "${c_glib_protocols}" "${py_protocols}"); do for trans in $(intersection "${c_glib_transports}" "${py_transports}"); do @@ -585,6 +680,19 @@ for proto in $(intersection "${c_glib_protocols}" "${py_protocols}"); do done done +for trans in $(intersection "${c_glib_transports}" "${py_transports}"); do + for sock in $(intersection "${c_glib_sockets}" "${py_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + esac + do_test "c_glib-py" "binary-accel" "${trans}-${sock}" \ + "c_glib/test_client --protocol=binary --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "py/TestServer.py --protocol=accel --transport=${trans} --port=${THRIFT_TEST_PORT} --genpydir=gen-py TSimpleServer ${extraparam}" \ + "10" "2" + done + done + ######### py client - nodejs server ############## for proto in $(intersection "${py_protocols}" "${nodejs_protocols}"); do for trans in $(intersection "${py_transports}" "${nodejs_transports}"); do @@ -792,6 +900,35 @@ for trans in $(intersection "${ruby_transports}" "${java_client_transports}"); d done done +######### ruby client - c_glib server ############## +for proto in $(intersection "${ruby_protocols}" "${c_glib_protocols}"); do + for trans in $(intersection "${ruby_transports}" "${c_glib_transports}"); do + for sock in $(intersection "${ruby_sockets}" "${c_glib_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + esac + do_test "ruby-c_glib" "${proto}" "${trans}-${sock}" \ + "ruby rb/integration/TestClient.rb --protocol=${proto} --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "c_glib/test_server --protocol=${proto} --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "5" "0.1" + done + done +done + +for trans in $(intersection "${ruby_transports}" "${c_glib_transports}"); do + for sock in $(intersection "${ruby_sockets}" "${c_glib_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + esac + do_test "ruby-c_glib" "accel-binary" "${trans}-${sock}" \ + "ruby rb/integration/TestClient.rb --protocol=accel --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "c_glib/test_server --protocol=binary --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "5" "0.1" + done + done + ######### c_glib client - ruby server ############## for proto in $(intersection "${c_glib_protocols}" "${ruby_protocols}"); do for trans in $(intersection "${c_glib_transports}" "${ruby_transports}"); do @@ -808,6 +945,19 @@ for proto in $(intersection "${c_glib_protocols}" "${ruby_protocols}"); do done done +for trans in $(intersection "${c_glib_transports}" "${ruby_transports}"); do + for sock in $(intersection "${c_glib_sockets}" "${ruby_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + esac + do_test "c_glib-ruby" "binary-accel" "${trans}-${sock}" \ + "c_glib/test_client --protocol=binary --transport=${trans} --port=${THRIFT_TEST_PORT} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "ruby rb/integration/TestServer.rb --protocol=accel --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "5" "5" + done + done + ######### ruby client - nodejs server ############## for proto in $(intersection "${ruby_protocols}" "${nodejs_protocols}"); do for trans in $(intersection "${ruby_transports}" "${nodejs_transports}"); do @@ -1017,6 +1167,23 @@ for proto in $(intersection "${hs_protocols}" "${java_protocols}"); do done done +######### hs client - c_glib server ############### +for proto in $(intersection "${hs_protocols}" "${c_glib_protocols}"); do + for trans in $(intersection "${hs_transports}" "${c_glib_transports}"); do + for sock in $(intersection "${hs_sockets}" "${c_glib_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + "domain" ) extraparam="--domain-socket=/tmp/ThriftTest.thrift";; + esac + do_test "hs-c_glib" "${proto}" "${trans}-${sock}" \ + "hs/TestClient --protocol=${proto} --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "c_glib/test_server --protocol=${proto} --transport=${trans} --port=${THRIFT_TEST_PORT} ${extraparam}" \ + "2" "0.1" + done + done +done + ######### c_glib client - hs server ############### for proto in $(intersection "${c_glib_protocols}" "${hs_protocols}"); do for trans in $(intersection "${c_glib_transports}" "${hs_transports}"); do |