1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
20 #include <glib.h>
21 #include <stdlib.h>
22 #include <unistd.h>
23 #include <sys/types.h>
24 #include <sys/wait.h>
25
26 #include <thrift/c_glib/thrift.h>
27 #include <thrift/c_glib/processor/thrift_processor.h>
28 #include <thrift/c_glib/transport/thrift_server_socket.h>
29
30 #define TEST_PORT 51199
31
32 #include <thrift/c_glib/server/thrift_simple_server.c>
33
34 /* create a rudimentary processor */
35 #define TEST_PROCESSOR_TYPE (test_processor_get_type ())
36
37 struct _TestProcessor
38 {
39 ThriftProcessor parent;
40 };
41 typedef struct _TestProcessor TestProcessor;
42
43 struct _TestProcessorClass
44 {
45 ThriftProcessorClass parent;
46 };
47 typedef struct _TestProcessorClass TestProcessorClass;
48
G_DEFINE_TYPE(TestProcessor,test_processor,THRIFT_TYPE_PROCESSOR)49 G_DEFINE_TYPE(TestProcessor, test_processor, THRIFT_TYPE_PROCESSOR)
50
51 gboolean
52 test_processor_process (ThriftProcessor *processor, ThriftProtocol *in,
53 ThriftProtocol *out, GError **error)
54 {
55 THRIFT_UNUSED_VAR (processor);
56 THRIFT_UNUSED_VAR (in);
57 THRIFT_UNUSED_VAR (out);
58 THRIFT_UNUSED_VAR (error);
59
60 return FALSE;
61 }
62
63 static void
test_processor_init(TestProcessor * p)64 test_processor_init (TestProcessor *p)
65 {
66 THRIFT_UNUSED_VAR (p);
67 }
68
69 static void
test_processor_class_init(TestProcessorClass * proc)70 test_processor_class_init (TestProcessorClass *proc)
71 {
72 (THRIFT_PROCESSOR_CLASS(proc))->process = test_processor_process;
73 }
74
75 static void
test_server(void)76 test_server (void)
77 {
78 int status;
79 pid_t pid;
80 TestProcessor *p = NULL;
81 ThriftServerSocket *tss = NULL;
82 ThriftSimpleServer *ss = NULL;
83
84 p = g_object_new (TEST_PROCESSOR_TYPE, NULL);
85 tss = g_object_new (THRIFT_TYPE_SERVER_SOCKET, "port", TEST_PORT, NULL);
86 ss = g_object_new (THRIFT_TYPE_SIMPLE_SERVER, "processor", p,
87 "server_transport", THRIFT_SERVER_TRANSPORT (tss), NULL);
88
89 /* run the server in a child process */
90 pid = fork ();
91 g_assert (pid >= 0);
92
93 if (pid == 0)
94 {
95 THRIFT_SERVER_GET_CLASS (THRIFT_SERVER (ss))->serve (THRIFT_SERVER (ss),
96 NULL);
97 exit (0);
98 } else {
99 sleep (5);
100 kill (pid, SIGINT);
101
102 g_object_unref (ss);
103 g_object_unref (tss);
104 g_object_unref (p);
105 g_assert (wait (&status) == pid);
106 g_assert (status == SIGINT);
107 }
108 }
109
110 int
main(int argc,char * argv[])111 main(int argc, char *argv[])
112 {
113 #if (!GLIB_CHECK_VERSION (2, 36, 0))
114 g_type_init();
115 #endif
116
117 g_test_init (&argc, &argv, NULL);
118
119 g_test_add_func ("/testsimpleserver/SimpleServer", test_server);
120
121 return g_test_run ();
122 }
123