use -Wl on -no-undefined as it is a linker option:
[oweals/gnunet.git] / src / integration-tests / test_integration_clique.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 #
22 # This test starts 3 peers (nated, server, no nat)and expects bootstrap 
23 # and a connected clique
24 #
25 # Conditions for successful exit:
26 # Both peers have 2 connected peers in transport, core, topology, fs and dht 
27
28 import sys
29 import signal
30 import os
31 import subprocess
32 import re
33 import shutil
34 import time
35 from gnunet_testing import Peer
36 from gnunet_testing import Test
37 from gnunet_testing import Check
38 from gnunet_testing import Condition
39 from gnunet_testing import * 
40  
41 if os.name == "nt":
42   tmp = os.getenv ("TEMP")
43 else:
44   tmp = "/tmp"
45
46 #definitions
47
48 testname = "test_integration_clique"
49 verbose = True
50 check_timeout = 180
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     retries = 10
74     path = os.path.join (tmp, "c_no_nat_client")  
75     test.p ("Removing " + path)      
76     while ((os.path.exists(path)) and (retries > 0)):
77         shutil.rmtree ((path), False, cleanup_onerror)
78         time.sleep (1)
79         retries -= 1
80     if (os.path.exists(path)):
81         test.p ("Failed to remove " + path)     
82         retries = 10
83     path = os.path.join (tmp, "c_nat_client")  
84     test.p ("Removing " + path)      
85     while ((os.path.exists(path)) and (retries > 0)):
86         shutil.rmtree ((path), False, cleanup_onerror)
87         time.sleep (1)
88         retries -= 1
89     if (os.path.exists(path)):
90         test.p ("Failed to remove " + path) 
91
92
93 def success_cont (check):
94     global success 
95     success = True;
96     print 'Connected clique successfully'
97
98 def fail_cont (check):    
99     global success 
100     success= False;
101     check.evaluate(True)
102     print 'Failed to connect clique'
103
104 def check_connect ():
105   check = Check (test)
106   check.add (StatisticsCondition (client, 'transport', '# peers connected',2))
107   check.add (StatisticsCondition (client, 'core', '# neighbour entries allocated',2))  
108   check.add (StatisticsCondition (client, 'core', '# peers connected',2))
109   check.add (StatisticsCondition (client, 'topology', '# peers connected',2))
110   check.add (StatisticsCondition (client, 'dht', '# peers connected',2))
111   check.add (StatisticsCondition (client, 'fs', '# peers connected',2))
112
113   check.add (StatisticsCondition (client_nat, 'transport', '# peers connected',2))
114   check.add (StatisticsCondition (client_nat, 'core', '# neighbour entries allocated',2))  
115   check.add (StatisticsCondition (client_nat, 'core', '# peers connected',2))
116   check.add (StatisticsCondition (client_nat, 'topology', '# peers connected',2))
117   check.add (StatisticsCondition (client_nat, 'dht', '# peers connected',2))
118   check.add (StatisticsCondition (client_nat, 'fs', '# peers connected',2))
119   
120   check.add (StatisticsCondition (server, 'transport', '# peers connected',2))
121   check.add (StatisticsCondition (server, 'core', '# neighbour entries allocated',2))  
122   check.add (StatisticsCondition (server, 'core', '# peers connected',2))
123   check.add (StatisticsCondition (server, 'topology', '# peers connected',2))
124   check.add (StatisticsCondition (server, 'dht', '# peers connected',2))
125   check.add (StatisticsCondition (server, 'fs', '# peers connected',2))  
126   
127   check.run_blocking (check_timeout, success_cont, fail_cont)
128
129
130 # Test execution
131
132
133 def SigHandler(signum = None, frame = None):
134         global success  
135         global server
136         global client
137         global client_nat    
138         
139         print 'Test was aborted!'
140         if (None != server):
141                 server.stop ()
142         if (None != client):            
143                 client.stop ()
144         if (None != client_nat):                
145                 client_nat.stop ()              
146         cleanup ()
147         sys.exit(success)
148
149 def run ():
150         global success
151         global test
152         global server
153         global client
154         global client_nat       
155         
156         success = False
157         server = None
158         client = None
159         client_nat = None
160         test = Test ('test_integration_clique', verbose)
161         cleanup ()
162         
163         server = Peer(test, './confs/c_bootstrap_server.conf');
164         if (True != server.start()):
165                 print 'Failed to start server'
166                 if (None != server):
167                         server.stop ()
168                 cleanup ()
169                 sys.exit(success)
170         
171         # Server has to settle down
172         time.sleep(5)
173         
174         client = Peer(test, './confs/c_no_nat_client.conf');
175         if (True != client.start()):
176                 print 'Failed to start client'
177                 if (None != server):
178                         server.stop ()
179                 if (None != client):
180                         client.stop ()                  
181                 cleanup ()
182                 sys.exit(success)
183         
184         # Server has to settle down
185         time.sleep(5)
186         
187         
188         client_nat = Peer(test, './confs/c_nat_client.conf');
189         if (True != client_nat.start()):
190                 print 'Failed to start client_nat'
191                 if (None != server):
192                         server.stop ()
193                 if (None != client):
194                         client.stop ()
195                 if (None != client_nat):
196                         client_nat.stop ()                                                              
197                 cleanup ()
198                 sys.exit(success)       
199         
200         if ((client.started == True) and (client_nat.started == True) and (server.started == True)):
201             test.p ('Peers started, running check')
202             check_connect ()
203             
204         server.stop ()    
205         client.stop ()
206         client_nat.stop ()
207         
208         cleanup ()
209         
210         if (success == False):
211                 print ('Test failed')
212                 return False 
213         else:
214                 return True
215
216     
217 try:
218     run ()
219 except (KeyboardInterrupt, SystemExit):    
220     print 'Test interrupted'
221     server.stop ()
222     client.stop ()
223     client_nat.stop ()
224     cleanup ()
225 if (success == False):
226         sys.exit(1)   
227 else:
228         sys.exit(0)    
229             
230