b3d6f2a2bd7f3b822ff474b69758503a4958523b
[oweals/gnunet.git] / src / transport / transport-testing.h
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2006, 2009, 2015 GNUnet e.V.
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      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      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18      Boston, MA 02110-1301, USA.
19 */
20
21 /**
22  * @file transport-testing.h
23  * @brief testing lib for transport service
24  *
25  * @author Matthias Wachs
26  */
27 #include "platform.h"
28 #include "gnunet_util_lib.h"
29 #include "gnunet_hello_lib.h"
30 #include "gnunet_transport_service.h"
31 #include "gnunet_testing_lib.h"
32
33
34 struct GNUNET_TRANSPORT_TESTING_ConnectRequest;
35
36
37 /**
38  * Context for a single peer
39  */
40 struct PeerContext;
41
42 /**
43  * Callback when two peers are connected and both have called the connect callback
44  * to notify clients about a new peer
45  */
46 typedef void
47 (*GNUNET_TRANSPORT_TESTING_start_cb) (struct PeerContext *p,
48                                       void *cls);
49
50 /**
51  * Callback when two peers are connected and both have called the connect callback
52  * to notify clients about a new peer
53  */
54 typedef void
55 (*GNUNET_TRANSPORT_TESTING_connect_cb) (struct PeerContext *p1,
56                                         struct PeerContext *p2,
57                                         void *cls);
58
59
60 /**
61  * Definition for a transport testing handle
62  */
63 struct GNUNET_TRANSPORT_TESTING_handle;
64
65 /**
66  * Context for a single peer
67  */
68 struct PeerContext
69 {
70   /**
71    * Next element in the DLL
72    */
73   struct PeerContext *next;
74
75   /**
76    * Previous element in the DLL
77    */
78   struct PeerContext *prev;
79
80   /**
81    * Transport testing handle this peer belongs to
82    */
83   struct GNUNET_TRANSPORT_TESTING_handle *tth;
84
85   /**
86    * Peer's configuration
87    */
88   struct GNUNET_CONFIGURATION_Handle *cfg;
89
90   /**
91    * Peer's transport service handle
92    */
93   struct GNUNET_TRANSPORT_Handle *th;
94
95   /**
96    * Peer's ATS handle.
97    */
98   struct GNUNET_ATS_ConnectivityHandle *ats;
99
100   /**
101    * Peer's transport get hello handle to retrieve peer's HELLO message
102    */
103   struct GNUNET_TRANSPORT_GetHelloHandle *ghh;
104
105   /**
106    * Peer's testing handle
107    */
108   struct GNUNET_TESTING_Peer *peer;
109
110   /**
111    * Peer identity
112    */
113   struct GNUNET_PeerIdentity id;
114
115   /**
116    * Handle for the peer's ARM process
117    */
118   struct GNUNET_OS_Process *arm_proc;
119
120   /**
121    * Receive callback
122    */
123   GNUNET_TRANSPORT_ReceiveCallback rec;
124
125   /**
126    * Notify connect callback
127    */
128   GNUNET_TRANSPORT_NotifyConnect nc;
129
130   /**
131    * Notify disconnect callback
132    */
133   GNUNET_TRANSPORT_NotifyDisconnect nd;
134
135   /**
136    * Startup completed callback
137    */
138   GNUNET_TRANSPORT_TESTING_start_cb start_cb;
139
140   /**
141    * Peers HELLO Message
142    */
143   struct GNUNET_HELLO_Message *hello;
144
145   /**
146    * Closure for the callbacks
147    */
148   void *cb_cls;
149
150   /**
151    * An unique number to identify the peer
152    */
153   unsigned int no;
154 };
155
156
157 struct GNUNET_TRANSPORT_TESTING_ConnectRequest
158 {
159   struct GNUNET_TRANSPORT_TESTING_ConnectRequest *next;
160   struct GNUNET_TRANSPORT_TESTING_ConnectRequest *prev;
161   struct PeerContext *p1;
162   struct PeerContext *p2;
163   struct GNUNET_SCHEDULER_Task *tct;
164   struct GNUNET_ATS_ConnectivitySuggestHandle *ats_sh;
165   struct GNUNET_TRANSPORT_OfferHelloHandle *oh;
166   GNUNET_TRANSPORT_TESTING_connect_cb cb;
167   void *cb_cls;
168   int p1_c;
169   int p2_c;
170 };
171
172
173 struct GNUNET_TRANSPORT_TESTING_handle
174 {
175   /**
176    * Testing library system handle
177    */
178   struct GNUNET_TESTING_System *tl_system;
179
180   /**
181    * head DLL of connect contexts
182    */
183   struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc_head;
184
185   /**
186    * head DLL of connect contexts
187    */
188   struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc_tail;
189
190   /**
191    * head DLL of peers
192    */
193   struct PeerContext *p_head;
194
195   /**
196    * tail DLL of peers
197    */
198   struct PeerContext *p_tail;
199 };
200
201
202 /**
203  * Start a peer with the given configuration
204  *
205  * @param tth the testing handle
206  * @param cfgname configuration file
207  * @param peer_id the peer_id
208  * @param rec receive callback
209  * @param nc connect callback
210  * @param nd disconnect callback
211  * @param start_cb start callback
212  * @param cb_cls closure for callback
213  * @return the peer context
214  */
215 struct PeerContext *
216 GNUNET_TRANSPORT_TESTING_start_peer (struct GNUNET_TRANSPORT_TESTING_handle *tth,
217                                      const char *cfgname,
218                                      int peer_id,
219                                      GNUNET_TRANSPORT_ReceiveCallback rec,
220                                      GNUNET_TRANSPORT_NotifyConnect nc,
221                                      GNUNET_TRANSPORT_NotifyDisconnect nd,
222                                      GNUNET_TRANSPORT_TESTING_start_cb start_cb,
223                                      void *cb_cls);
224
225
226 /**
227  * shutdown the given peer
228  *
229  * @param tth the testing handle
230  * @param p the peer
231  */
232 void
233 GNUNET_TRANSPORT_TESTING_stop_peer (struct GNUNET_TRANSPORT_TESTING_handle *tth,
234                                     struct PeerContext *pc);
235
236
237 /**
238  * Restart the given peer
239  *
240  * @param p the peer
241  * @param cfgname the cfg file used to restart
242  * @param restart_cb restart callback
243  * @param cb_cls callback closure
244  * @return #GNUNET_OK in success otherwise #GNUNET_SYSERR
245  */
246 int
247 GNUNET_TRANSPORT_TESTING_restart_peer (struct PeerContext *p,
248                                        const char *cfgname,
249                                        GNUNET_TRANSPORT_TESTING_start_cb restart_cb,
250                                        void *cb_cls);
251
252
253 /**
254  * Connect the given peers and call the callback when both peers report the
255  * inbound connection. Remarks: start_peer's notify_connect callback can be called
256  * before.
257  *
258  * @param tth transport testing handle
259  * @param p1 peer 1
260  * @param p2 peer 2
261  * @param cb the callback to call when both peers notified that they are connected
262  * @param cls callback cls
263  * @return a connect request handle
264  */
265 struct GNUNET_TRANSPORT_TESTING_ConnectRequest *
266 GNUNET_TRANSPORT_TESTING_connect_peers (struct GNUNET_TRANSPORT_TESTING_handle *tth,
267                                         struct PeerContext *p1,
268                                         struct PeerContext *p2,
269                                         GNUNET_TRANSPORT_TESTING_connect_cb cb,
270                                         void *cls);
271
272
273 /**
274  * Cancel the request to connect two peers
275  * Tou MUST cancel the request if you stop the peers before the peers connected succesfully
276  * @param tth testing
277  * @param cc a connect request handle
278  */
279 void
280 GNUNET_TRANSPORT_TESTING_connect_peers_cancel (struct GNUNET_TRANSPORT_TESTING_handle *tth,
281                                                struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc);
282
283
284 /**
285  * Clean up the transport testing
286  * @param tth transport testing handle
287  */
288 void
289 GNUNET_TRANSPORT_TESTING_done (struct GNUNET_TRANSPORT_TESTING_handle *tth);
290
291
292 /**
293  * Initialize the transport testing
294  * @return transport testing handle
295  */
296 struct GNUNET_TRANSPORT_TESTING_handle *
297 GNUNET_TRANSPORT_TESTING_init (void);
298
299
300 /**
301  * Extracts the test filename from an absolute file name and removes the extension
302  * @param file absolute file name
303  * @param dest where to store result
304  */
305 void
306 GNUNET_TRANSPORT_TESTING_get_test_name (const char *file,
307                                         char **dest);
308
309
310 /**
311  * This function takes the filename (e.g. argv[0), removes a "lt-"-prefix and
312  * if existing ".exe"-prefix and adds the peer-number
313  *
314  * @param file filename of the test, e.g. argv[0]
315  * @param dest where to write the filename
316  * @param count peer number
317  */
318 void
319 GNUNET_TRANSPORT_TESTING_get_config_name (const char *file,
320                                           char **dest,
321                                           int count);
322
323
324 /**
325  * Extracts the plugin anme from an absolute file name and the test name
326  * @param file absolute file name
327  * @param test test name
328  * @param dest where to store result
329  */
330 void
331 GNUNET_TRANSPORT_TESTING_get_test_plugin_name (const char *executable,
332                                                const char *testname,
333                                                char **pluginname);
334
335
336 /**
337  * Extracts the filename from an absolute file name and removes the extenstion
338  * @param file absolute file name
339  * @param dest where to store result
340  */
341 void
342 GNUNET_TRANSPORT_TESTING_get_test_source_name (const char *file,
343                                                char **testname);
344
345 /* end of transport_testing.h */