clean up python logic a bit, remove duplicate print() calls when we have log calls
[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 #    SPDX-License-Identifier: AGPL3.0-or-later
19 #
20 #
21 from __future__ import print_function
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 #
37 # This test tests if a fresh peer bootstraps from a hostlist server and then
38 # successfully connects to the server. When both peers are connected
39 # in transport, core, topology, fs, the server is shutdown
40 #
41 # Conditions for successful exit:
42 # Client peer has 0 connected peer in transport, core, topology, dht, fs
43
44 # definitions
45
46 testname = "test_integration_disconnect"
47 verbose = True
48 check_timeout = 180
49
50 if os.name == "nt":
51     tmp = os.getenv("TEMP")
52     signals = [signal.SIGTERM, signal.SIGINT]
53 else:
54     tmp = "/tmp"
55     signals = [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT]
56
57
58 def cleanup_onerror(function, path, excinfo):
59     import stat
60     if not os.path.exists(path):
61         pass
62     elif not os.access(path, os.W_OK):
63         # Is the error an access error ?
64         os.chmod(path, stat.S_IWUSR)
65         function(path)
66     else:
67         raise
68
69
70 def cleanup():
71     shutil.rmtree(os.path.join(tmp, "c_bootstrap_server"), False, cleanup_onerror)
72     shutil.rmtree(os.path.join(tmp, "c_nat_client"), False, cleanup_onerror)
73
74
75 def success_disconnect_cont(check):
76     print('Peers disconnected successfully')
77     global success
78     success = True
79
80
81 def fail_disconnect_cont(check):
82     global success
83     success = False;
84     print('Peers failed to disconnect')
85     check.evaluate(True)
86
87
88 def check_disconnect():
89     global server
90     global nat_client
91     test.p('Shutting down nat client')
92     nat_client.stop()
93     check = Check(test)
94     check.add(StatisticsCondition(server, 'transport', '# peers connected', 0))
95     check.add(StatisticsCondition(server, 'core', '# peers connected', 0))
96     check.add(StatisticsCondition(server, 'topology', '# peers connected', 0))
97     check.add(StatisticsCondition(server, 'dht', '# peers connected', 0))
98     check.add(StatisticsCondition(server, 'fs', '# peers connected', 0))
99     check.run_blocking(check_timeout, success_disconnect_cont, fail_disconnect_cont)
100
101
102 def success_connect_cont(check):
103     print('Peers connected successfully')
104     check_disconnect()
105
106
107 def fail_connect_cont(check):
108     global success
109     success = False
110     print('Peers failed to connected!')
111     check.evaluate(True)
112
113
114 def check_connect():
115     global server
116     global nat_client
117     check = Check(test)
118     check.add(StatisticsCondition(nat_client, 'transport', '# peers connected', 1))
119     check.add(StatisticsCondition(nat_client, 'core', '# peers connected', 1))
120     check.add(StatisticsCondition(nat_client, 'topology', '# peers connected', 1))
121     check.add(StatisticsCondition(nat_client, 'dht', '# peers connected', 1))
122     check.add(StatisticsCondition(nat_client, 'fs', '# peers connected', 1))
123
124     check.add(StatisticsCondition(server, 'transport', '# peers connected', 1))
125     check.add(StatisticsCondition(server, 'core', '# peers connected', 1))
126     check.add(StatisticsCondition(server, 'topology', '# peers connected', 1))
127     check.add(StatisticsCondition(server, 'dht', '# peers connected', 1))
128     check.add(StatisticsCondition(server, 'fs', '# peers connected', 1))
129
130     check.run_blocking(check_timeout, success_connect_cont, fail_connect_cont)
131
132
133 #
134 # Test execution
135 #
136
137 def SigHandler(signum=None, frame=None):
138     global success
139     global server
140     global nat_client
141
142     print('Test was aborted!')
143     if (None != server):
144         server.stop()
145     if (None != nat_client):
146         nat_client.stop()
147     cleanup()
148     sys.exit(success)
149
150
151 def run():
152     global success
153     global test
154     global server
155     global nat_client
156
157     server = None
158     nat_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     nat_client = Peer(test, './confs/c_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 != nat_client.start()):
181         print('Failed to start nat_client')
182         if (None != server):
183             server.stop()
184         if (None != nat_client):
185             nat_client.stop()
186         cleanup()
187         sys.exit(success)
188
189     if ((nat_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     nat_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     nat_client.stop()
211     cleanup()
212 if (success == False):
213     sys.exit(1)
214 else:
215     sys.exit(0)