f175554fbd8944a8dcc16d376fa57adc1d473494
[oweals/gnunet.git] / src / integration-tests / test_integration_reconnect_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 os
21 import subprocess
22 import re
23 import shutil
24 import time
25 import signal
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, botth peers are shutdown and restarted
37 #
38 # Conditions for successful exit:
39 # Both peers have 1 connected peer in transport, core, topology, fs after restart
40
41 # definitions
42
43
44 testname = "test_integration_restart"
45 verbose = True
46 check_timeout = 180
47
48 if os.name == "nt":
49     tmp = os.getenv("TEMP")
50     signals = [signal.SIGTERM, signal.SIGINT]
51 else:
52     tmp = "/tmp"
53     signals = [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT]
54
55
56 def cleanup_onerror(function, path, excinfo):
57     import stat
58     if not os.path.exists(path):
59         pass
60     elif not os.access(path, os.W_OK):
61         # Is the error an access error ?
62         os.chmod(path, stat.S_IWUSR)
63         function(path)
64     else:
65         raise
66
67
68 def cleanup():
69     retries = 10
70     path = os.path.join(tmp, "c_bootstrap_server")
71     test.p("Removing " + path)
72     while ((os.path.exists(path)) and (retries > 0)):
73         shutil.rmtree((path), False, cleanup_onerror)
74         time.sleep(1)
75         retries -= 1
76     if (os.path.exists(path)):
77         test.p("Failed to remove " + path)
78
79     retries = 10
80     path = os.path.join(tmp, "c_nat_client")
81     test.p("Removing " + path)
82     while((os.path.exists(path)) and(retries > 0)):
83         shutil.rmtree((path), False, cleanup_onerror)
84         time.sleep(1)
85         retries -= 1
86     if (os.path.exists(path)):
87         test.p("Failed to remove " + path)
88
89
90 def success_restart_cont(check):
91         global success
92         print('Peers connected successfully after restart')
93         server.stop()
94         client.stop()
95         success = True
96
97
98 def fail_restart_cont(check):
99         global success
100         success = False
101         print('Peers failed to connect after restart')
102         check.evaluate(True)
103
104
105 def success_connect_cont(check):
106     print('Peers connected successfully')
107     server.stop()
108     client.stop()
109
110     time.sleep(5)
111
112     test.p('Restarting client & server')
113     server.start()
114     client.start()
115
116     check = Check(test)
117     check.add(StatisticsCondition(client, 'transport', '# peers connected', 1))
118     check.add(StatisticsCondition(client, 'core', '# peers connected', 1))
119     check.add(StatisticsCondition(client, 'topology', '# peers connected', 1))
120     check.add(StatisticsCondition(client, 'fs', '# peers connected', 1))
121
122     check.add(StatisticsCondition(server, 'transport', '# peers connected', 1))
123     check.add(StatisticsCondition(server, 'core', '# peers connected', 1))
124     check.add(StatisticsCondition(server, 'topology', '# peers connected', 1))
125     check.add(StatisticsCondition(server, 'fs', '# peers connected', 1))
126
127     check.run_blocking(check_timeout, success_restart_cont, fail_restart_cont)
128
129
130 def fail_connect_cont(check):
131     global success
132     success = False
133     print('Peers failed to connect')
134     check.evaluate(True)
135
136
137 def check_connect():
138     check = Check(test)
139     check.add(StatisticsCondition(client, 'transport', '# peers connected', 1))
140     check.add(StatisticsCondition(client, 'core', '# peers connected', 1))
141     check.add(StatisticsCondition(client, 'topology', '# peers connected', 1))
142     check.add(StatisticsCondition(client, 'fs', '# peers connected', 1))
143
144     check.add(StatisticsCondition(server, 'transport', '# peers connected', 1))
145     check.add(StatisticsCondition(server, 'core', '# peers connected', 1))
146     check.add(StatisticsCondition(server, 'topology', '# peers connected', 1))
147     check.add(StatisticsCondition(server, 'fs', '# peers connected', 1))
148
149     check.run_blocking(check_timeout, success_connect_cont, fail_connect_cont)
150
151 #
152 # Test execution
153 #
154
155
156 def SigHandler(signum=None, frame=None):
157     global success
158     global server
159     global client
160
161     print('Test was aborted!')
162     if (None != server):
163         server.stop()
164     if (None != client):
165         client.stop()
166     cleanup()
167     sys.exit(success)
168
169
170 def run():
171     global success
172     global test
173     global server
174     global client
175
176     success = False
177     server = None
178     client = None
179
180     for sig in signals:
181         signal.signal(sig, SigHandler)
182
183     test = Test('test_integration_disconnect', verbose)
184     cleanup()
185     server = Peer(test, './confs/c_bootstrap_server.conf')
186     server.start()
187
188     client = Peer(test, './confs/c_nat_client.conf')
189     client.start()
190
191     if (True != server.start()):
192         print('Failed to start server')
193         if (None != server):
194             server.stop()
195         if (None != server):
196             client.stop()
197         cleanup()
198         sys.exit(success)
199
200     # Give the server time to start
201     time.sleep(5)
202
203     if (True != client.start()):
204         print('Failed to start client')
205         if (None != server):
206             server.stop()
207         if (None != server):
208             client.stop()
209         cleanup()
210         sys.exit(success)
211
212     check_connect()
213
214     server.stop()
215     client.stop()
216     cleanup()
217
218     if (success == False):
219         print('Test failed')
220         return True
221     else:
222         return False
223
224
225 try:
226     run()
227 except(KeyboardInterrupt, SystemExit):
228     print('Test interrupted')
229     server.stop()
230     client.stop()
231     cleanup()
232 if (success == False):
233     sys.exit(1)
234 else:
235     sys.exit(0)