Merge branch 'master' of gnunet.org:gnunet
[oweals/gnunet.git] / src / integration-tests / test_integration_disconnect.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
19 import sys
20 import signal
21 import os
22 import subprocess
23 import re
24 import shutil
25 import time
26 from gnunet_testing import Peer
27 from gnunet_testing import Test
28 from gnunet_testing import Check
29 from gnunet_testing import Condition
30 from gnunet_testing import * 
31  
32
33 #
34 # This test tests if a fresh peer bootstraps from a hostlist server and then
35 # successfully connects to the server. When both peers are connected
36 # in transport, core, topology, fs, the server is shutdown
37 #
38 # Conditions for successful exit:
39 # Client peer has 0 connected peer in transport, core, topology, dht, fs
40
41 #definitions
42
43 testname = "test_integration_disconnect"
44 verbose = True
45 check_timeout = 180
46
47 if os.name == "nt":
48   tmp = os.getenv ("TEMP")
49   signals = [signal.SIGTERM, signal.SIGINT]
50 else:
51   tmp = "/tmp"
52   signals = [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT]
53
54 def cleanup_onerror (function, path, excinfo):
55   import stat
56   if not os.path.exists (path):
57     pass
58   elif not os.access(path, os.W_OK):
59     # Is the error an access error ?
60     os.chmod (path, stat.S_IWUSR)
61     function (path)
62   else:
63     raise
64
65 def cleanup ():
66   shutil.rmtree (os.path.join (tmp, "c_bootstrap_server"), False, cleanup_onerror)
67   shutil.rmtree (os.path.join (tmp, "c_no_nat_client"), False, cleanup_onerror)
68
69
70 def success_disconnect_cont (check):
71         print('Peers disconnected successfully')
72         global success 
73         success = True;
74
75
76 def fail_disconnect_cont (check):    
77         global success 
78         success = False;
79         print('Peers failed to disconnect')
80         check.evaluate(True)   
81   
82 def check_disconnect ():
83   test.p ('Shutting down bootstrap server')
84   server.stop ()
85   check = Check (test)
86   check.add (StatisticsCondition (client, 'transport', '# peers connected',0))
87   check.add (StatisticsCondition (client, 'core', '# peers connected',0))
88   check.add (StatisticsCondition (client, 'topology', '# peers connected',0))
89   check.add (StatisticsCondition (client, 'dht', '# peers connected',0))
90   check.add (StatisticsCondition (client, 'fs', '# peers connected',0))
91   check.run_blocking (check_timeout, success_disconnect_cont, fail_disconnect_cont)
92
93
94 def success_connect_cont (check):
95         print('Peers connected successfully')
96         check_disconnect ()
97
98
99 def fail_connect_cont (check):    
100   global success 
101   success= False
102   print('Peers failed to connected!')
103   check.evaluate(True)
104
105
106 def check_connect ():
107   check = Check (test)
108   check.add (StatisticsCondition (client, 'transport', '# peers connected',1))
109   check.add (StatisticsCondition (client, 'core', '# peers connected',1))
110   check.add (StatisticsCondition (client, 'topology', '# peers connected',1))
111   check.add (StatisticsCondition (client, 'dht', '# peers connected',1))
112   check.add (StatisticsCondition (client, 'fs', '# peers connected',1))
113   
114   check.add (StatisticsCondition (server, 'transport', '# peers connected',1))
115   check.add (StatisticsCondition (server, 'core', '# peers connected',1))
116   check.add (StatisticsCondition (server, 'topology', '# peers connected',1))
117   check.add (StatisticsCondition (server, 'dht', '# peers connected',1))
118   check.add (StatisticsCondition (server, 'fs', '# peers connected',1))  
119   
120   check.run_blocking (check_timeout, success_connect_cont, fail_connect_cont)
121
122
123 # Test execution
124
125
126 def SigHandler(signum = None, frame = None):
127         global success  
128         global server
129         global client  
130         
131         print('Test was aborted!')
132         if (None != server):
133                 server.stop ()
134         if (None != client):            
135                 client.stop ()
136         cleanup ()
137         sys.exit(success)
138
139 def run ():
140         global success
141         global test
142         global server
143         global client    
144         
145         server = None
146         client = None
147         success = False  
148         
149         for sig in signals:
150                 signal.signal(sig, SigHandler)
151
152         test = Test ('test_integration_bootstrap_and_connect.py', verbose)
153         cleanup ()
154         
155         server = Peer(test, './confs/c_bootstrap_server.conf');
156         client = Peer(test, './confs/c_no_nat_client.conf');
157         
158         if (True != server.start()):
159                 print('Failed to start server')
160                 if (None != server):
161                         server.stop ()
162                 cleanup ()
163                 sys.exit(success)
164                 
165         # Give the server time to start
166         time.sleep(5)           
167                 
168         if (True != client.start()):
169                 print('Failed to start client')
170                 if (None != server):
171                         server.stop ()
172                 if (None != client):            
173                         client.stop ()
174                 cleanup ()
175                 sys.exit(success)
176         
177         if ((client.started == True) and (server.started == True)):
178                 test.p ('Peers started, running check')
179                 time.sleep(5)
180                 check_connect ()
181         server.stop ()
182         client.stop ()
183         
184         cleanup ()
185         
186         if (success == False):
187                 print ('Test failed')
188                 return False 
189         else:
190                 return True
191
192 try:
193         run ()
194 except (KeyboardInterrupt, SystemExit):    
195         print('Test interrupted')
196         server.stop ()
197         client.stop ()
198         cleanup ()
199 if (success == False):
200         sys.exit(1)   
201 else:
202         sys.exit(0)    
203      
204         
205      
206