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