aboutsummaryrefslogtreecommitdiff
path: root/src/service/arm/test_gnunet_service_arm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/service/arm/test_gnunet_service_arm.c')
-rw-r--r--src/service/arm/test_gnunet_service_arm.c266
1 files changed, 266 insertions, 0 deletions
diff --git a/src/service/arm/test_gnunet_service_arm.c b/src/service/arm/test_gnunet_service_arm.c
new file mode 100644
index 000000000..df4ad95c2
--- /dev/null
+++ b/src/service/arm/test_gnunet_service_arm.c
@@ -0,0 +1,266 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2009, 2014 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20/**
21 * @file arm/test_gnunet_service_arm.c
22 * @brief testcase for gnunet-service-arm.c; tests ARM by making it start the resolver
23 * @author Safey
24 * @author Christian Grothoff
25 */
26#include "platform.h"
27#include "gnunet_arm_service.h"
28#include "gnunet_resolver_service.h"
29#include "gnunet_util_lib.h"
30
31/**
32 * Timeout for starting services, very short because of the strange way start works
33 * (by checking if running before starting, so really this time is always waited on
34 * startup (annoying)).
35 */
36#define START_TIMEOUT GNUNET_TIME_relative_multiply ( \
37 GNUNET_TIME_UNIT_MILLISECONDS, 50)
38
39#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
40
41
42static int ret = 1;
43
44static int resolved_ok;
45
46static int asked_for_a_list;
47
48static struct GNUNET_ARM_Handle *arm;
49
50static const char hostname[] = "www.gnu.org"; /* any domain should do */
51
52
53static void
54trigger_disconnect (void *cls)
55{
56 GNUNET_ARM_disconnect (arm);
57 arm = NULL;
58}
59
60
61static void
62arm_stop_cb (void *cls,
63 enum GNUNET_ARM_RequestStatus status,
64 enum GNUNET_ARM_Result result)
65{
66 GNUNET_break (status == GNUNET_ARM_REQUEST_SENT_OK);
67 GNUNET_break (result == GNUNET_ARM_RESULT_STOPPED);
68 if (result != GNUNET_ARM_RESULT_STOPPED)
69 {
70 GNUNET_break (0);
71 ret = 4;
72 }
73 GNUNET_SCHEDULER_add_now (&trigger_disconnect, NULL);
74}
75
76
77static void
78service_list (void *cls,
79 enum GNUNET_ARM_RequestStatus rs,
80 unsigned int count,
81 const struct GNUNET_ARM_ServiceInfo *list)
82{
83 unsigned int i;
84
85 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
86 "%u services are are currently running\n",
87 count);
88 if (GNUNET_ARM_REQUEST_SENT_OK != rs)
89 goto stop_arm;
90 for (i = 0; i < count; i++)
91 {
92 if ((0 == strcasecmp (list[i].name, "resolver")) &&
93 (0 == strcasecmp (list[i].binary, "gnunet-service-resolver")))
94 {
95 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
96 "Got service list, now stopping arm\n");
97 ret = 0;
98 }
99 }
100
101stop_arm:
102 GNUNET_ARM_request_service_stop (arm,
103 "arm",
104 &arm_stop_cb,
105 NULL);
106}
107
108
109static void
110hostname_resolve_cb (void *cls,
111 const struct sockaddr *addr,
112 socklen_t addrlen)
113{
114 if ((0 == ret) || (4 == ret) || (1 == resolved_ok))
115 return;
116 if (NULL == addr)
117 {
118 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
119 "Failed to resolve hostname!\n");
120 GNUNET_break (0);
121 ret = 3;
122 GNUNET_ARM_request_service_stop (arm,
123 "arm",
124 &arm_stop_cb,
125 NULL);
126 return;
127 }
128 if (0 == asked_for_a_list)
129 {
130 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
131 "Resolved hostname, now checking the service list\n");
132 GNUNET_ARM_request_service_list (arm,
133 &service_list,
134 NULL);
135 asked_for_a_list = 1;
136 resolved_ok = 1;
137 }
138}
139
140
141static void
142arm_start_cb (void *cls,
143 enum GNUNET_ARM_RequestStatus status,
144 enum GNUNET_ARM_Result result)
145{
146 GNUNET_break (status == GNUNET_ARM_REQUEST_SENT_OK);
147 GNUNET_break (result == GNUNET_ARM_RESULT_STARTING);
148 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
149 "Trying to resolve a hostname via the resolver service!\n");
150 /* connect to the resolver service */
151 if (NULL ==
152 GNUNET_RESOLVER_ip_get (hostname,
153 AF_UNSPEC,
154 TIMEOUT,
155 &hostname_resolve_cb,
156 NULL))
157 {
158 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
159 "Unable initiate connection to resolver service\n");
160 GNUNET_break (0);
161 ret = 2;
162 GNUNET_ARM_request_service_stop (arm,
163 "arm",
164 &arm_stop_cb,
165 NULL);
166 }
167}
168
169
170static void
171run (void *cls,
172 char *const *args,
173 const char *cfgfile,
174 const struct GNUNET_CONFIGURATION_Handle *c)
175{
176 arm = GNUNET_ARM_connect (c,
177 NULL,
178 NULL);
179 GNUNET_ARM_request_service_start (arm,
180 "arm",
181 GNUNET_OS_INHERIT_STD_OUT_AND_ERR,
182 &arm_start_cb,
183 NULL);
184}
185
186
187int
188main (int argc, char *av[])
189{
190 static char *const argv[] = {
191 "test-gnunet-service-arm",
192 "-c",
193 "test_arm_api_data.conf",
194 NULL
195 };
196 static struct GNUNET_GETOPT_CommandLineOption options[] = {
197 GNUNET_GETOPT_OPTION_END
198 };
199
200 /* trigger DNS lookup */
201#if HAVE_GETADDRINFO
202 {
203 struct addrinfo *ai;
204 int ret;
205
206 if (0 != (ret = getaddrinfo (hostname, NULL, NULL, &ai)))
207 {
208 fprintf (stderr,
209 "Failed to resolve `%s', testcase not run.\n",
210 hostname);
211 return 77;
212 }
213 freeaddrinfo (ai);
214 }
215#elif HAVE_GETHOSTBYNAME2
216 {
217 struct hostent *host;
218
219 host = gethostbyname2 (hostname, AF_INET);
220 if (NULL == host)
221 host = gethostbyname2 (hostname, AF_INET6);
222 if (NULL == host)
223 {
224 fprintf (stderr,
225 "Failed to resolve `%s', testcase not run.\n",
226 hostname);
227 return 77;
228 }
229 }
230#elif HAVE_GETHOSTBYNAME
231 {
232 struct hostent *host;
233
234 host = gethostbyname (hostname);
235 if (NULL == host)
236 {
237 fprintf (stderr,
238 "Failed to resolve `%s', testcase not run.\n",
239 hostname);
240 return 77;
241 }
242 }
243#else
244 fprintf (stderr,
245 "libc fails to have resolver function, testcase not run.\n");
246 return 77;
247#endif
248 GNUNET_log_setup ("test-gnunet-service-arm",
249 "WARNING",
250 NULL);
251 GNUNET_break (GNUNET_OK ==
252 GNUNET_PROGRAM_run ((sizeof(argv) / sizeof(char *)) - 1,
253 argv, "test-gnunet-service-arm",
254 "nohelp", options,
255 &run, NULL));
256 if (0 != ret)
257 {
258 fprintf (stderr,
259 "Test failed with error code %d\n",
260 ret);
261 }
262 return ret;
263}
264
265
266/* end of test_gnunet_service_arm.c */