-handle partial writes and IO errors, even on stdout
[oweals/gnunet.git] / src / integration-tests / test_integration_disconnect_nat.py.in
1 #!@PYTHON@
2 #    This file is part of GNUnet.
3 #    (C) 2010 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., 59 Temple Place - Suite 330,
18 #    Boston, MA 02111-1307, USA.
19 #
20
21 import sys
22 import signal
23 import os
24 import subprocess
25 import re
26 import shutil
27 import time
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, the server is shutdown
39 #
40 # Conditions for successful exit:
41 # Client peer has 0 connected peer in transport, core, topology, dht, fs
42
43 #definitions
44
45 testname = "test_integration_disconnect"
46 verbose = True
47 check_timeout = 180
48
49 if os.name == "nt":
50   tmp = os.getenv ("TEMP")
51 else:
52   tmp = "/tmp"
53
54 def cleanup ():
55   shutil.rmtree (os.path.join (tmp, "c_bootstrap_server"), True)
56   shutil.rmtree (os.path.join (tmp, "c_nat_client"), True)
57
58
59 def success_disconnect_cont (check):
60         print 'Peers disconnected successfully'
61         global success 
62         success = True;
63
64
65 def fail_disconnect_cont (check):    
66         global success 
67         success = False;
68         print 'Peers failed to disconnect'
69         check.evaluate(True)   
70   
71 def check_disconnect ():
72   global server
73   global nat_client  
74   test.p ('Shutting down nat client')
75   nat_client.stop ()
76   check = Check (test)
77   check.add (StatisticsCondition (server, 'transport', '# peers connected',0))
78   check.add (StatisticsCondition (server, 'core', '# neighbour entries allocated',0))  
79   check.add (StatisticsCondition (server, 'core', '# peers connected',0))
80   check.add (StatisticsCondition (server, 'topology', '# peers connected',0))
81   check.add (StatisticsCondition (server, 'dht', '# peers connected',0))
82   check.add (StatisticsCondition (server, 'fs', '# peers connected',0))
83   check.run_blocking (check_timeout, success_disconnect_cont, fail_disconnect_cont)
84
85
86 def success_connect_cont (check):
87         print 'Peers connected successfully'
88         check_disconnect ()
89
90
91 def fail_connect_cont (check):    
92   global success 
93   success= False
94   print 'Peers failed to connected!'    
95   check.evaluate(True)
96
97
98 def check_connect ():
99   global server
100   global nat_client  
101   check = Check (test)
102   check.add (StatisticsCondition (nat_client, 'transport', '# peers connected',1))
103   check.add (StatisticsCondition (nat_client, 'core', '# neighbour entries allocated',1))  
104   check.add (StatisticsCondition (nat_client, 'core', '# peers connected',1))
105   check.add (StatisticsCondition (nat_client, 'topology', '# peers connected',1))
106   check.add (StatisticsCondition (nat_client, 'dht', '# peers connected',1))
107   check.add (StatisticsCondition (nat_client, 'fs', '# peers connected',1))
108   
109   check.add (StatisticsCondition (server, 'transport', '# peers connected',1))
110   check.add (StatisticsCondition (server, 'core', '# neighbour entries allocated',1))  
111   check.add (StatisticsCondition (server, 'core', '# peers connected',1))
112   check.add (StatisticsCondition (server, 'topology', '# peers connected',1))
113   check.add (StatisticsCondition (server, 'dht', '# peers connected',1))
114   check.add (StatisticsCondition (server, 'fs', '# peers connected',1))  
115   
116   check.run_blocking (check_timeout, success_connect_cont, fail_connect_cont)
117
118
119 # Test execution
120
121
122 def SigHandler(signum = None, frame = None):
123         global success  
124         global server
125         global nat_client  
126         
127         print 'Test was aborted!'
128         if (None != server):
129                 server.stop ()
130         if (None != nat_client):                
131                 nat_client.stop ()
132         cleanup ()
133         sys.exit(success)
134
135 def run ():
136         global success
137         global test
138         global server
139         global nat_client    
140         
141         server = None
142         nat_client = None
143         success = False  
144         
145         for sig in [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT]:
146                 signal.signal(sig, SigHandler)
147
148         test = Test ('test_integration_bootstrap_and_connect.py', verbose)
149         cleanup ()
150         
151         server = Peer(test, './confs/c_bootstrap_server.conf');
152         nat_client = Peer(test, './confs/c_nat_client.conf');
153         
154         if (True != server.start()):
155                 print 'Failed to start server'
156                 if (None != server):
157                         server.stop ()
158                 cleanup ()
159                 sys.exit(success)
160                 
161         # Give the server time to start
162         time.sleep(5)
163                 
164         if (True != nat_client.start()):
165                 print 'Failed to start nat_client'
166                 if (None != server):
167                         server.stop ()
168                 if (None != nat_client):                
169                         nat_client.stop ()
170                 cleanup ()
171                 sys.exit(success)
172         
173         if ((nat_client.started == True) and (server.started == True)):
174                 test.p ('Peers started, running check')
175                 time.sleep(5)
176                 check_connect ()
177         server.stop ()
178         nat_client.stop ()
179         
180         cleanup ()
181         
182         if (success == False):
183                 print ('Test failed')
184                 return False 
185         else:
186                 return True
187
188 try:
189         run ()
190 except (KeyboardInterrupt, SystemExit):    
191         print 'Test interrupted'
192         server.stop ()
193         nat_client.stop ()
194         cleanup ()
195 if (success == False):
196         sys.exit(1)   
197 else:
198         sys.exit(0)    
199      
200         
201      
202