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