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