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