add some logging
[oweals/gnunet.git] / src / ats / test_ats2_lib.c
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2010-2015 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 /**
19  * @file ats/test_ats2_lib.c
20  * @brief test ATS library with a generic interpreter for running ATS tests
21  * @author Julius Bünger
22  */
23 #include "platform.h"
24 #include "gnunet_util_lib.h"
25 #include "gnunet_ats_application_service.h"
26 #include "gnunet_ats_transport_service.h"
27 #include "gnunet_testing_lib.h"
28
29 /**
30  * @brief Indicates the success of the whole test
31  */
32 static int ret;
33
34 /**
35  * @brief The time available until the test shuts down
36  */
37 static struct GNUNET_TIME_Relative timeout;
38
39 /**
40  * @brief ATS Application Handle
41  *
42  * Handle to the application-side of ATS.
43  */
44 static struct GNUNET_ATS_ApplicationHandle *ah;
45
46 /**
47  * @brief ATS Transport Handle
48  *
49  * Handle to the transport-side of ATS.
50  */
51 static struct GNUNET_ATS_TransportHandle *th;
52
53 /**
54  * @brief Another (dummy) peer.
55  *
56  * Used as the peer ATS shall allocate bandwidth to.
57  */
58 static struct GNUNET_PeerIdentity other_peer;
59
60 /**
61  * @brief Handle to the session record
62  */
63 static struct GNUNET_ATS_SessionRecord *sr;
64
65
66 /**
67  * @brief Called whenever allocation changed
68  *
69  * Implements #GNUNET_ATS_AllocationCallback
70  *
71  * @param cls
72  * @param session
73  * @param bandwidth_out
74  * @param bandwidth_in
75  *
76  * @return
77  */
78 static void
79 allocation_cb (void *cls,
80                struct GNUNET_ATS_Session *session,
81                struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
82                struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
83 {
84   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "allocation_cb() called\n");
85 }
86
87
88 /**
89  * @brief Called whenever suggestion is made
90  *
91  * Implements #GNUNET_ATS_SuggestionCallback
92  *
93  * @param cls
94  * @param pid
95  * @param address
96  */
97 static void
98 suggestion_cb (void *cls,
99                const struct GNUNET_PeerIdentity *pid,
100                const char *address)
101 {
102   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "suggestion_cb() called\n");
103   ret = 0;
104 }
105
106
107 /**
108  * @brief Initialise both 'sides' of ATS
109  *
110  * Initialises the application and transportation side of ATS.
111  */
112 static void
113 init_both (const struct GNUNET_CONFIGURATION_Handle *cfg)
114 {
115   ah = GNUNET_ATS_application_init (cfg);
116   GNUNET_assert (NULL != ah);
117   th = GNUNET_ATS_transport_init (cfg,
118                                   &allocation_cb,
119                                   NULL,
120                                   &suggestion_cb,
121                                   NULL);
122   GNUNET_assert (NULL != ah);
123 }
124
125
126 /**
127  * @brief Disconnect both 'sides' of ATS
128  */
129 static void
130 finish_both (void)
131 {
132   GNUNET_ATS_application_done (ah);
133   ah = NULL;
134   GNUNET_ATS_transport_done (th);
135   th = NULL;
136 }
137
138
139 /**
140  * @brief Provide information about the start of an imaginary connection
141  */
142 static void
143 provide_info_start (void)
144 {
145   struct GNUNET_ATS_Properties prop =
146   {
147     .delay = GNUNET_TIME_UNIT_FOREVER_REL,
148     .goodput_out = 1048576,
149     .goodput_in = 1048576,
150     .utilization_out = 0,
151     .utilization_in = 0,
152     .distance = 0,
153     .mtu = UINT32_MAX,
154     .nt = GNUNET_NT_UNSPECIFIED,
155     .cc = GNUNET_TRANSPORT_CC_UNKNOWN,
156   };
157
158   sr = GNUNET_ATS_session_add (th,
159                                &other_peer,
160                                "test-address",
161                                NULL,
162                                &prop);
163   GNUNET_assert (NULL != sr);
164 }
165
166
167 /**
168  * @brief Provide information about the end of an imaginary connection
169  */
170 static void
171 provide_info_end (void)
172 {
173   GNUNET_ATS_session_del (sr);
174 }
175
176
177 /**
178  * @brief Inform ATS about the need of a connection towards a peer
179  */
180 static void
181 get_suggestion (void)
182 {
183   struct GNUNET_ATS_ApplicationSuggestHandle *ash;
184
185   ash = GNUNET_ATS_application_suggest (ah,
186                                         &other_peer,
187                                         GNUNET_MQ_PREFERENCE_NONE,
188                                         GNUNET_BANDWIDTH_VALUE_MAX);
189   GNUNET_assert (NULL != ash);
190 }
191
192
193 static void
194 on_shutdown (void *cls)
195 {
196   provide_info_end ();
197   finish_both ();
198   GNUNET_SCHEDULER_shutdown ();
199 }
200
201
202 /**
203  * Function run once the ATS service has been started.
204  *
205  * @param cls NULL
206  * @param cfg configuration for the testcase
207  * @param peer handle to the peer
208  */
209 static void
210 run (void *cls,
211      const struct GNUNET_CONFIGURATION_Handle *cfg,
212      struct GNUNET_TESTING_Peer *peer)
213 {
214   init_both (cfg);
215   provide_info_start ();
216   get_suggestion ();
217   (void) GNUNET_SCHEDULER_add_delayed (timeout,
218                                        &on_shutdown,
219                                        NULL);
220 }
221
222
223 /**
224  * @brief Starts the gnunet-testing peer
225  *
226  * @param argc
227  * @param argv[]
228  *
229  * @return
230  */
231 int
232 main (int argc,
233       char *argv[])
234 {
235   ret = 1;
236   memset (&other_peer, 0, sizeof (struct GNUNET_PeerIdentity));
237   timeout = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
238                                            2);
239   if (0 != GNUNET_TESTING_peer_run ("test-ats2-lib",
240                                     "test_ats2_lib.conf",
241                                     &run, NULL))
242   {
243     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Running the testing peer failed.\n");
244     return 1;
245   }
246   if (0 != ret)
247   {
248     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
249         "Global status indicates unsuccessful testrun - probably allocation_cb was not called.\n");
250   }
251   return ret;
252 }
253
254
255
256 /* end of test_ats2_lib.c */