make some functions static, ensure shutdown tasks could be run repeatedly if 1st...
[oweals/gnunet.git] / src / integration-tests / test_integration_clique.py.in
1 #!@PYTHON@
2 #    This file is part of GNUnet.
3 #    (C) 2010, 2018 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., 51 Franklin Street, Fifth Floor,
18 #    Boston, MA 02110-1301, USA.
19 #
20
21 #
22 # This test starts 3 peers (nated, server, no nat)and expects bootstrap 
23 # and a connected clique
24 #
25 # Conditions for successful exit:
26 # Both peers have 2 connected peers in transport, core, topology, fs and dht 
27
28 import sys
29 import signal
30 import os
31 import subprocess
32 import re
33 import shutil
34 import time
35 from gnunet_testing import Peer
36 from gnunet_testing import Test
37 from gnunet_testing import Check
38 from gnunet_testing import Condition
39 from gnunet_testing import * 
40  
41 if os.name == "nt":
42   tmp = os.getenv ("TEMP")
43 else:
44   tmp = "/tmp"
45
46 #definitions
47
48 testname = "test_integration_clique"
49 verbose = True
50 check_timeout = 180
51
52 def cleanup_onerror (function, path, excinfo):
53   import stat
54   if not os.path.exists (path):
55     pass
56   elif not os.access(path, os.W_OK):
57     # Is the error an access error ?
58     os.chmod (path, stat.S_IWUSR)
59     function (path)
60   else:
61     raise
62
63 def cleanup ():
64     retries = 10
65     path = os.path.join (tmp, "c_bootstrap_server")  
66     test.p ("Removing " + path)      
67     while ((os.path.exists(path)) and (retries > 0)):
68         shutil.rmtree ((path), False, cleanup_onerror)
69         time.sleep (1)
70         retries -= 1
71     if (os.path.exists(path)):
72         test.p ("Failed to remove " + path) 
73     retries = 10
74     path = os.path.join (tmp, "c_no_nat_client")  
75     test.p ("Removing " + path)      
76     while ((os.path.exists(path)) and (retries > 0)):
77         shutil.rmtree ((path), False, cleanup_onerror)
78         time.sleep (1)
79         retries -= 1
80     if (os.path.exists(path)):
81         test.p ("Failed to remove " + path)     
82         retries = 10
83     path = os.path.join (tmp, "c_nat_client")  
84     test.p ("Removing " + path)      
85     while ((os.path.exists(path)) and (retries > 0)):
86         shutil.rmtree ((path), False, cleanup_onerror)
87         time.sleep (1)
88         retries -= 1
89     if (os.path.exists(path)):
90         test.p ("Failed to remove " + path) 
91
92
93 def success_cont (check):
94     global success 
95     success = True;
96     print('Connected clique successfully')
97
98 def fail_cont (check):    
99     global success 
100     success= False;
101     check.evaluate(True)
102     print('Failed to connect clique')
103
104 def check_connect ():
105   check = Check (test)
106   check.add (StatisticsCondition (client, 'transport', '# peers connected',2))
107   check.add (StatisticsCondition (client, 'core', '# peers connected',2))
108   check.add (StatisticsCondition (client, 'topology', '# peers connected',2))
109   check.add (StatisticsCondition (client, 'dht', '# peers connected',2))
110   check.add (StatisticsCondition (client, 'fs', '# peers connected',2))
111
112   check.add (StatisticsCondition (client_nat, 'transport', '# peers connected',2))
113   check.add (StatisticsCondition (client_nat, 'core', '# peers connected',2))
114   check.add (StatisticsCondition (client_nat, 'topology', '# peers connected',2))
115   check.add (StatisticsCondition (client_nat, 'dht', '# peers connected',2))
116   check.add (StatisticsCondition (client_nat, 'fs', '# peers connected',2))
117   
118   check.add (StatisticsCondition (server, 'transport', '# peers connected',2))
119   check.add (StatisticsCondition (server, 'core', '# peers connected',2))
120   check.add (StatisticsCondition (server, 'topology', '# peers connected',2))
121   check.add (StatisticsCondition (server, 'dht', '# peers connected',2))
122   check.add (StatisticsCondition (server, 'fs', '# peers connected',2))  
123   
124   check.run_blocking (check_timeout, success_cont, fail_cont)
125
126
127 # Test execution
128
129
130 def SigHandler(signum = None, frame = None):
131         global success  
132         global server
133         global client
134         global client_nat    
135         
136         print('Test was aborted!')
137         if (None != server):
138                 server.stop ()
139         if (None != client):            
140                 client.stop ()
141         if (None != client_nat):                
142                 client_nat.stop ()              
143         cleanup ()
144         sys.exit(success)
145
146 def run ():
147         global success
148         global test
149         global server
150         global client
151         global client_nat       
152         
153         success = False
154         server = None
155         client = None
156         client_nat = None
157         test = Test ('test_integration_clique', verbose)
158         cleanup ()
159         
160         server = Peer(test, './confs/c_bootstrap_server.conf');
161         if (True != server.start()):
162                 print('Failed to start server')
163                 if (None != server):
164                         server.stop ()
165                 cleanup ()
166                 sys.exit(success)
167         
168         # Server has to settle down
169         time.sleep(5)
170         
171         client = Peer(test, './confs/c_no_nat_client.conf');
172         if (True != client.start()):
173                 print('Failed to start client')
174                 if (None != server):
175                         server.stop ()
176                 if (None != client):
177                         client.stop ()                  
178                 cleanup ()
179                 sys.exit(success)
180         
181         # Server has to settle down
182         time.sleep(5)
183         
184         
185         client_nat = Peer(test, './confs/c_nat_client.conf');
186         if (True != client_nat.start()):
187                 print('Failed to start client_nat')
188                 if (None != server):
189                         server.stop ()
190                 if (None != client):
191                         client.stop ()
192                 if (None != client_nat):
193                         client_nat.stop ()                                                              
194                 cleanup ()
195                 sys.exit(success)       
196         
197         if ((client.started == True) and (client_nat.started == True) and (server.started == True)):
198             test.p ('Peers started, running check')
199             check_connect ()
200             
201         server.stop ()    
202         client.stop ()
203         client_nat.stop ()
204         
205         cleanup ()
206         
207         if (success == False):
208                 print ('Test failed')
209                 return False 
210         else:
211                 return True
212
213     
214 try:
215     run ()
216 except (KeyboardInterrupt, SystemExit):    
217     print('Test interrupted')
218     server.stop ()
219     client.stop ()
220     client_nat.stop ()
221     cleanup ()
222 if (success == False):
223         sys.exit(1)   
224 else:
225         sys.exit(0)    
226             
227