added ATS addresstype information to unix
[oweals/gnunet.git] / src / integration-tests / test_integration_clique.py.in
1 #!@PYTHON@
2 #    This file is part of GNUnet.
3 #    (C) 2010 Christian Grothoff (and other contributing authors)
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 2, 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., 59 Temple Place - Suite 330,
18 #    Boston, MA 02111-1307, USA.
19 #
20
21 #
22 # This test starts 3 peers and expects bootstrap and a connected clique
23 #
24 # Conditions for successful exit:
25 # Both peers have 1 connected peer in transport, core, topology, fs 
26
27 import sys
28 import os
29 import subprocess
30 import re
31 import shutil
32 import time
33 import pexpect
34
35 #definitions
36
37 testname = "test_integration_clique"
38 verbose = False
39 gnunetarm = ""
40 gnunetstatistics = ""
41 success = False
42 timeout = 10
43
44 #test conditions
45
46
47 def vprintf (msg):
48     if verbose == True:
49         print msg
50
51 def setup ():
52   srcdir = "../.."
53   gnunet_pyexpect_dir = os.path.join (srcdir, "contrib")
54   if gnunet_pyexpect_dir not in sys.path:
55     sys.path.append (gnunet_pyexpect_dir)
56   from gnunet_pyexpect import pexpect
57   global gnunetarm      
58   global gnunetstatistics
59   if os.name == 'posix':
60     gnunetarm = 'gnunet-arm'
61     gnunetstatistics = 'gnunet-statistics'
62   elif os.name == 'nt':
63     gnunetarm = 'gnunet-arm.exe'
64     gnunetstatistics = 'gnunet-statistics.exe'    
65   if os.name == "nt":
66     shutil.rmtree (os.path.join (os.getenv ("TEMP"), testname), True)
67   else:
68     shutil.rmtree ("/tmp/" + testname, True)
69
70 def start ():
71         vprintf ("Starting bootstrap server & client")
72         try:
73             server = subprocess.Popen ([gnunetarm, '-sq', '-c', './confs/c_bootstrap_server.conf'])
74             server.communicate ()    
75         except OSError:
76             print "Can not start bootstrap server, exiting..."
77             exit (1)
78         try:
79             client = subprocess.Popen ([gnunetarm, '-sq', '-c', 'confs/c_no_nat_client.conf'])
80             client.communicate ()    
81         except OSError:
82             print "Can not start bootstrap client, exiting..."
83             exit (1)
84         try:
85             client = subprocess.Popen ([gnunetarm, '-sq', '-c', 'confs/c_no_nat_client_2.conf'])
86             client.communicate ()    
87         except OSError:
88             print "Can not start bootstrap client 2, exiting..."
89             exit (1)                        
90         vprintf ("Bootstrap server & client started")
91
92 def stop ():
93         try:
94             client = subprocess.Popen ([gnunetarm, '-eq', '-c', 'confs/c_no_nat_client.conf'])
95             client.communicate ()    
96         except OSError:
97             print "Can not stop bootstrap client 1, exiting..."
98             exit (1)        
99         vprintf ("Bootstrap client stopped")
100
101
102 def cleanup ():
103         if os.name == "nt":
104             shutil.rmtree (os.path.join (os.getenv ("TEMP"), "gnunet-test-fs-py-ns"), True)
105             shutil.rmtree (os.path.join (os.getenv ("TEMP"), "c_no_nat_client"), True)
106             shutil.rmtree (os.path.join (os.getenv ("TEMP"), "c_no_nat_client_2"), True)
107         else:
108             shutil.rmtree ("/tmp/c_bootstrap_server/", True)
109             shutil.rmtree ("/tmp/c_no_nat_client/", True)
110             shutil.rmtree ("/tmp/c_no_nat_client_2/", True)
111
112 def check_statistics (conf, subsystem, name, value):
113     from gnunet_pyexpect import pexpect
114     server = pexpect ()
115     server.spawn (None, [gnunetstatistics, '-c', conf ,'-q','-n', name, '-s', subsystem ], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
116     #server.expect ("stdout", re.compile (r""))
117     test = server.read("stdout", 10240)
118     if (test.find(str(value)) == -1): 
119         return False
120     else:
121         return True 
122     
123     
124
125 def check_connect ():
126   server_transport_connected = False
127   server_topology_connected = False
128   server_core_connected = False
129   server_core_session_map = False
130   server_fs_connected = False
131   client_transport_connected = False
132   client_topology_connected = False
133   client_core_connected = False
134   client_core_session_map = False
135   client_fs_connected = False
136   
137   client2_transport_connected = False
138   client2_topology_connected = False
139   client2_core_connected = False
140   client2_core_session_map = False
141   client2_fs_connected = False
142   
143   connected = False
144   count = 1
145   while ((connected == False) and (count <= timeout)):
146         # Perform TRANSPORT     
147         if ((False == server_transport_connected) and (True == check_statistics ('./confs/c_bootstrap_server.conf', 'transport', '# peers connected',2))):
148           server_transport_connected = True
149           vprintf ('Server transport services is connected')
150           
151         if ((False == client_transport_connected) and (True == check_statistics ('./confs/c_no_nat_client.conf', 'transport', '# peers connected',2))):
152           client_transport_connected = True
153           vprintf ('Client transport services is connected')
154           
155         if ((False == client2_transport_connected) and (True == check_statistics ('./confs/c_no_nat_client_2.conf', 'transport', '# peers connected',2))):
156           client2_transport_connected = True
157           vprintf ('Client 2 transport services is connected')    
158
159         # Perform TRANSPORT
160         if ((False == server_core_connected) and (True == check_statistics ('./confs/c_bootstrap_server.conf', 'core', '# neighbour entries allocated',2))):
161           server_core_connected = True
162           vprintf ('Server core services is connected')
163           
164         if ((False == client_core_connected) and (True == check_statistics ('./confs/c_no_nat_client.conf', 'core', '# neighbour entries allocated',2))):
165           client_core_connected = True
166           vprintf ('Client core services is connected')
167
168         if ((False == client2_core_connected) and (True == check_statistics ('./confs/c_no_nat_client_2.conf', 'core', '# neighbour entries allocated',2))):
169           client2_core_connected = True
170           vprintf ('Client2 core services is connected')                  
171           
172         # Perform TRANSPORT
173         if ((False == server_core_session_map) and (True == check_statistics ('./confs/c_bootstrap_server.conf', 'core', '# entries in session map',2))):
174           server_core_session_map = True
175           vprintf ('Server core services is connected')
176           
177         if ((False == client_core_session_map) and (True == check_statistics ('./confs/c_no_nat_client.conf', 'core', '# entries in session map',2))):
178           client_core_session_map = True
179           vprintf ('Client core notifies about connected')
180
181         if ((False == client2_core_session_map) and (True == check_statistics ('./confs/c_no_nat_client_2.conf', 'core', '# entries in session map',2))):
182           client2_core_session_map = True
183           vprintf ('Client2 core notifies about connected')       
184
185         # Perform TRANSPORT
186         if ((False == server_topology_connected) and (True == check_statistics ('./confs/c_bootstrap_server.conf', 'topology', '# peers connected',2))):
187           server_topology_connected = True
188           vprintf ('Server topology services is connected')
189           
190         if ((False == client_topology_connected) and (True == check_statistics ('./confs/c_no_nat_client.conf', 'topology', '# peers connected',2))):
191           client_topology_connected = True
192           vprintf ('Client topology services is connected')
193
194         if ((False == client2_topology_connected) and (True == check_statistics ('./confs/c_no_nat_client_2.conf', 'topology', '# peers connected',2))):
195           client2_topology_connected = True
196           vprintf ('Client2 topology services is connected')      
197           
198         # Perform TRANSPORT      
199         if ((False == server_fs_connected) and (True == check_statistics ('./confs/c_bootstrap_server.conf', 'fs', '# peers connected',2))):
200           server_fs_connected = True
201           vprintf ('Server fs services is connected')
202
203         if ((False == client_fs_connected) and (True == check_statistics ('./confs/c_no_nat_client.conf', 'fs', '# peers connected',2))):
204           client_fs_connected = True
205           vprintf ('Client fs services is connected')                    
206
207         if ((False == client2_fs_connected) and (True == check_statistics ('./confs/c_no_nat_client_2.conf', 'fs', '# peers connected',2))):
208           client2_fs_connected = True
209           vprintf ('Client2 fs services is connected')                   
210                     
211         # Check if conditions fulfilled
212         if ((True == client_transport_connected) and (True == client2_transport_connected) and (True == server_transport_connected) and 
213         (True == client_topology_connected) and (True == client2_topology_connected) and (True == server_topology_connected) and 
214         (True == client_core_connected) and (True == client2_core_connected) and (True == server_core_connected) and
215         (True == client_core_session_map) and (True == client2_core_session_map) and (True == server_core_session_map) and
216         (True == client_fs_connected) and (True == client2_fs_connected) and (True == server_fs_connected)):
217                 connected = True
218                 break 
219         print '.',
220         time.sleep(1)
221         count += 1
222   if (connected == False):
223                 print ''
224                 if (server_transport_connected == False):
225                         print ('Server transport was NOT connected')
226                 if (server_topology_connected == False):
227                         print ('Server topology was NOT connected')
228                 if (server_core_connected == False):
229                         print ('Server core was NOT connected')
230                 if (server_core_session_map == False):
231                         print ('Server core sessions did NOT increase') 
232                                         
233                 if (client_transport_connected == False):
234                         print ('Client transport was NOT connected')                    
235                 if (client_topology_connected == False):
236                         print ('Client topology was NOT connected')
237                 if (client_core_connected == False):
238                         print ('Client core was NOT connected')
239                 if (client_core_session_map == False):
240                         print ('Client core sessions did NOT increase')
241                         
242                 if (client2_transport_connected == False):
243                         print ('Client2 transport was NOT connected')                   
244                 if (client2_topology_connected == False):
245                         print ('Client2 topology was NOT connected')
246                 if (client2_core_connected == False):
247                         print ('Client2 core was NOT connected')
248                 if (client2_core_session_map == False):
249                         print ('Client2 core sessions did NOT increase')                        
250                 return False
251   else:
252         return True
253
254 def check_disconnect_client ():
255         vprintf ("Shutting down client 2")
256         try:
257             server = subprocess.Popen ([gnunetarm, '-eq', '-c', './confs/c_no_nat_client_2.conf'])
258             server.communicate ()    
259         except OSError:
260             print "Can not stop client 2, exiting..."
261             exit (1)
262             
263         client_transport_disconnected = False
264         client_topology_disconnected = False
265         client_core_disconnected = False
266         client_core_session_map = False
267         client_fs_disconnected = False
268             
269         disconnected = False
270         count = 1
271         while ((disconnected == False) and (count <= timeout)):                   
272                 if ((False == client_transport_disconnected) and (True == check_statistics ('./confs/c_no_nat_client.conf', 'transport', '# peers connected',0))):
273                   client_transport_disconnected = True
274                   vprintf ('Client transport services is disconnected')
275                   
276                 if ((False == client_core_disconnected) and (True == check_statistics ('./confs/c_no_nat_client.conf', 'core', '# neighbour entries allocated',0))):
277                   client_core_disconnected = True
278                   vprintf ('Client core services is disconnected')
279                   
280                 if ((False == client_core_session_map) and (True == check_statistics ('./confs/c_no_nat_client.conf', 'core', '# entries in session map',0))):
281                   client_core_session_map = True
282                   vprintf ('Client core notifies about disconnected')
283                   
284                 if ((False == client_topology_disconnected) and (True == check_statistics ('./confs/c_no_nat_client.conf', 'topology', '# peers connected',0))):
285                   client_topology_disconnected = True
286                   vprintf ('Client topology services is disconnected')
287                   
288                 if ((False == client_fs_disconnected) and (True == check_statistics ('./confs/c_no_nat_client.conf', 'fs', '# peers connected',0))):
289                   client_fs_disconnected = True
290                   vprintf ('Client fs services is disconnected')
291                     
292                 # Check if conditions fulfilled
293                 if ((True == client_transport_disconnected) and
294                 (True == client_topology_disconnected) and 
295                 (True == client_core_disconnected) and 
296                 (True == client_core_session_map) and 
297                 (True == client_fs_disconnected)):
298                         disconnected = True
299                         break 
300                 print '.',
301                 time.sleep(1)
302                 count += 1
303         if (disconnected == False):
304                 print ''
305                 if (client_transport_disconnected == False):
306                         print ('Client transport was NOT disconnected')
307                 if (client_topology_disconnected == False):
308                         print ('Client topology was NOT disconnected')
309                 if (client_core_disconnected == False):
310                         print ('Client core was NOT disconnected')
311                 if (server_core_session_map == False):
312                         print ('Server core sessions did NOT increase')
313                 return False
314         else:
315                 return True         
316                 
317 def check_disconnect_server ():
318         vprintf ("Shutting down bootstrap server")
319         try:
320             server = subprocess.Popen ([gnunetarm, '-eq', '-c', './confs/c_bootstrap_server.conf'])
321             server.communicate ()    
322         except OSError:
323             print "Can not stop bootstrap server, exiting..."
324             exit (1)
325             
326         client_transport_disconnected = False
327         client_topology_disconnected = False
328         client_core_disconnected = False
329         client_core_session_map = False
330         client_fs_disconnected = False
331
332         client2_transport_disconnected = False
333         client2_topology_disconnected = False
334         client2_core_disconnected = False
335         client2_core_session_map = False
336         client2_fs_disconnected = False
337                     
338         disconnected = False
339         count = 1
340         while ((disconnected == False) and (count <= timeout)):                   
341                 if ((False == client_transport_disconnected) and (True == check_statistics ('./confs/c_no_nat_client.conf', 'transport', '# peers connected',1))):
342                   client_transport_disconnected = True
343                   vprintf ('Client transport services is disconnected')
344                   
345                 if ((False == client_core_disconnected) and (True == check_statistics ('./confs/c_no_nat_client.conf', 'core', '# neighbour entries allocated',1))):
346                   client_core_disconnected = True
347                   vprintf ('Client core services is disconnected')
348                   
349                 if ((False == client_core_session_map) and (True == check_statistics ('./confs/c_no_nat_client.conf', 'core', '# entries in session map',1))):
350                   client_core_session_map = True
351                   vprintf ('Client core notifies about disconnected')
352                   
353                 if ((False == client_topology_disconnected) and (True == check_statistics ('./confs/c_no_nat_client.conf', 'topology', '# peers connected',1))):
354                   client_topology_disconnected = True
355                   vprintf ('Client topology services is disconnected')
356                   
357                 if ((False == client_fs_disconnected) and (True == check_statistics ('./confs/c_no_nat_client.conf', 'fs', '# peers connected',1))):
358                   client_fs_disconnected = True
359                   vprintf ('Client fs services is disconnected')
360
361                 if ((False == client2_transport_disconnected) and (True == check_statistics ('./confs/c_no_nat_client_2.conf', 'transport', '# peers connected',1))):
362                   client2_transport_disconnected = True
363                   vprintf ('Client2 transport services is disconnected')
364                   
365                 if ((False == client2_core_disconnected) and (True == check_statistics ('./confs/c_no_nat_client_2.conf', 'core', '# neighbour entries allocated',1))):
366                   client2_core_disconnected = True
367                   vprintf ('Client2 core services is disconnected')
368                   
369                 if ((False == client2_core_session_map) and (True == check_statistics ('./confs/c_no_nat_client_2.conf', 'core', '# entries in session map',1))):
370                   client2_core_session_map = True
371                   vprintf ('Client2 core notifies about disconnected')
372                   
373                 if ((False == client2_topology_disconnected) and (True == check_statistics ('./confs/c_no_nat_client_2.conf', 'topology', '# peers connected',1))):
374                   client2_topology_disconnected = True
375                   vprintf ('Client2 topology services is disconnected')
376                   
377                 if ((False == client2_fs_disconnected) and (True == check_statistics ('./confs/c_no_nat_client_2.conf', 'fs', '# peers connected',1))):
378                   client2_fs_disconnected = True
379                   vprintf ('Client2 fs services is disconnected')
380                     
381                     
382                 # Check if conditions fulfilled
383                 if ((True == client_transport_disconnected) and
384                 (True == client_topology_disconnected) and 
385                 (True == client_core_disconnected) and 
386                 (True == client_core_session_map) and 
387                 (True == client_fs_disconnected) and
388                 (True == client2_transport_disconnected) and
389                 (True == client2_topology_disconnected) and 
390                 (True == client2_core_disconnected) and 
391                 (True == client2_core_session_map) and 
392                 (True == client2_fs_disconnected)):
393                         disconnected = True
394                         #break 
395                 print '.'
396                 time.sleep(1)
397                 count += 1
398         if (disconnected == False):
399                 print ''
400                 if (client_transport_disconnected == False):
401                         print ('Client transport was NOT disconnected')
402                 if (client_topology_disconnected == False):
403                         print ('Client topology was NOT disconnected')
404                 if (client_core_disconnected == False):
405                         print ('Client core was NOT disconnected')
406                 if (client_core_session_map == False):
407                         print ('Client core sessions did NOT decrease')
408                 if (client2_transport_disconnected == False):
409                         print ('Client2 transport was NOT disconnected')
410                 if (client2_topology_disconnected == False):
411                         print ('Client2 topology was NOT disconnected')
412                 if (client2_core_disconnected == False):
413                         print ('Client2 core was NOT disconnected')
414                 if (client2_core_session_map == False):
415                         print ('Client2 core sessions did NOT decrease')                        
416                 return False
417         else:
418                 return True                     
419
420
421 # Test execution
422
423
424 vprintf ("Running " + testname)
425 setup ()
426 start ()
427
428 ret = check_connect ()
429 if (ret == True):
430         vprintf ('Peers connected')
431         if (True == check_disconnect_server ()):
432                 if (True == check_disconnect_client ()):
433                         success = True
434
435 stop ()
436 cleanup ()
437
438 if (success == False):
439         print ('Test failed')
440         exit (1)
441 else:
442         exit (0)
443