paragraph for gnunet devs that don't know how to use the web
[oweals/gnunet.git] / src / integration-tests / test_integration_disconnect_nat.py.in
1 #!@PYTHON@
2 #    This file is part of GNUnet.
3 #    (C) 2010, 2018 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
55 def cleanup_onerror(function, path, excinfo):
56     import stat
57     if not os.path.exists(path):
58         pass
59     elif not os.access(path, os.W_OK):
60         # Is the error an access error ?
61         os.chmod(path, stat.S_IWUSR)
62         function(path)
63     else:
64         raise
65
66
67 def cleanup():
68     shutil.rmtree(os.path.join(tmp, "c_bootstrap_server"), False, cleanup_onerror)
69     shutil.rmtree(os.path.join(tmp, "c_nat_client"), False, cleanup_onerror)
70
71
72 def success_disconnect_cont(check):
73     print('Peers disconnected successfully')
74     global success
75     success = True
76
77
78 def fail_disconnect_cont(check):
79     global success
80     success = False;
81     print('Peers failed to disconnect')
82     check.evaluate(True)
83
84
85 def check_disconnect():
86     global server
87     global nat_client
88     test.p('Shutting down nat client')
89     nat_client.stop()
90     check = Check(test)
91     check.add(StatisticsCondition(server, 'transport', '# peers connected', 0))
92     check.add(StatisticsCondition(server, 'core', '# peers connected', 0))
93     check.add(StatisticsCondition(server, 'topology', '# peers connected', 0))
94     check.add(StatisticsCondition(server, 'dht', '# peers connected', 0))
95     check.add(StatisticsCondition(server, 'fs', '# peers connected', 0))
96     check.run_blocking(check_timeout, success_disconnect_cont, fail_disconnect_cont)
97
98
99 def success_connect_cont(check):
100     print('Peers connected successfully')
101     check_disconnect()
102
103
104 def fail_connect_cont(check):
105     global success
106     success = False
107     print('Peers failed to connected!')
108     check.evaluate(True)
109
110
111 def check_connect():
112     global server
113     global nat_client
114     check = Check(test)
115     check.add(StatisticsCondition(nat_client, 'transport', '# peers connected', 1))
116     check.add(StatisticsCondition(nat_client, 'core', '# peers connected', 1))
117     check.add(StatisticsCondition(nat_client, 'topology', '# peers connected', 1))
118     check.add(StatisticsCondition(nat_client, 'dht', '# peers connected', 1))
119     check.add(StatisticsCondition(nat_client, 'fs', '# peers connected', 1))
120
121     check.add(StatisticsCondition(server, 'transport', '# peers connected', 1))
122     check.add(StatisticsCondition(server, 'core', '# peers connected', 1))
123     check.add(StatisticsCondition(server, 'topology', '# peers connected', 1))
124     check.add(StatisticsCondition(server, 'dht', '# peers connected', 1))
125     check.add(StatisticsCondition(server, 'fs', '# peers connected', 1))
126
127     check.run_blocking(check_timeout, success_connect_cont, fail_connect_cont)
128
129
130 #
131 # Test execution
132 #
133
134 def SigHandler(signum=None, frame=None):
135     global success
136     global server
137     global nat_client
138
139     print('Test was aborted!')
140     if (None != server):
141         server.stop()
142     if (None != nat_client):
143         nat_client.stop()
144     cleanup()
145     sys.exit(success)
146
147
148 def run():
149     global success
150     global test
151     global server
152     global nat_client
153
154     server = None
155     nat_client = None
156     success = False
157
158     for sig in signals:
159         signal.signal(sig, SigHandler)
160
161     test = Test('test_integration_bootstrap_and_connect.py', verbose)
162     cleanup()
163
164     server = Peer(test, './confs/c_bootstrap_server.conf')
165     nat_client = Peer(test, './confs/c_nat_client.conf')
166
167     if (True != server.start()):
168         print('Failed to start server')
169         if (None != server):
170             server.stop()
171         cleanup()
172         sys.exit(success)
173
174     # Give the server time to start
175     time.sleep(5)
176
177     if (True != nat_client.start()):
178         print('Failed to start nat_client')
179         if (None != server):
180             server.stop()
181         if (None != nat_client):
182             nat_client.stop()
183         cleanup()
184         sys.exit(success)
185
186     if ((nat_client.started == True) and (server.started == True)):
187         test.p('Peers started, running check')
188         time.sleep(5)
189         check_connect()
190     server.stop()
191     nat_client.stop()
192
193     cleanup()
194
195     if (success == False):
196         print('Test failed')
197         return False
198     else:
199         return True
200
201
202 try:
203     run()
204 except(KeyboardInterrupt, SystemExit):
205     print('Test interrupted')
206     server.stop()
207     nat_client.stop()
208     cleanup()
209 if (success == False):
210     sys.exit(1)
211 else:
212     sys.exit(0)