reduce loop counters to more practical levels
[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
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., 51 Franklin Street, Fifth Floor,
18 #    Boston, MA 02110-1301, USA.
19 #
20 #
21 import sys
22 import signal
23 import os
24 import subprocess
25 import re
26 import shutil
27 import time
28 from gnunet_testing import Peer
29 from gnunet_testing import Test
30 from gnunet_testing import Check
31 from gnunet_testing import Condition
32 from gnunet_testing import *
33
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(os.path.join(tmp, "c_bootstrap_server"), False, cleanup_onerror)
71     shutil.rmtree(os.path.join(tmp, "c_nat_client"), False, cleanup_onerror)
72
73
74 def success_disconnect_cont(check):
75     print('Peers disconnected successfully')
76     global success
77     success = True
78
79
80 def fail_disconnect_cont(check):
81     global success
82     success = False;
83     print('Peers failed to disconnect')
84     check.evaluate(True)
85
86
87 def check_disconnect():
88     global server
89     global nat_client
90     test.p('Shutting down nat client')
91     nat_client.stop()
92     check = Check(test)
93     check.add(StatisticsCondition(server, 'transport', '# peers connected', 0))
94     check.add(StatisticsCondition(server, 'core', '# peers connected', 0))
95     check.add(StatisticsCondition(server, 'topology', '# peers connected', 0))
96     check.add(StatisticsCondition(server, 'dht', '# peers connected', 0))
97     check.add(StatisticsCondition(server, 'fs', '# peers connected', 0))
98     check.run_blocking(check_timeout, success_disconnect_cont, fail_disconnect_cont)
99
100
101 def success_connect_cont(check):
102     print('Peers connected successfully')
103     check_disconnect()
104
105
106 def fail_connect_cont(check):
107     global success
108     success = False
109     print('Peers failed to connected!')
110     check.evaluate(True)
111
112
113 def check_connect():
114     global server
115     global nat_client
116     check = Check(test)
117     check.add(StatisticsCondition(nat_client, 'transport', '# peers connected', 1))
118     check.add(StatisticsCondition(nat_client, 'core', '# peers connected', 1))
119     check.add(StatisticsCondition(nat_client, 'topology', '# peers connected', 1))
120     check.add(StatisticsCondition(nat_client, 'dht', '# peers connected', 1))
121     check.add(StatisticsCondition(nat_client, 'fs', '# peers connected', 1))
122
123     check.add(StatisticsCondition(server, 'transport', '# peers connected', 1))
124     check.add(StatisticsCondition(server, 'core', '# peers connected', 1))
125     check.add(StatisticsCondition(server, 'topology', '# peers connected', 1))
126     check.add(StatisticsCondition(server, 'dht', '# peers connected', 1))
127     check.add(StatisticsCondition(server, '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 def SigHandler(signum=None, frame=None):
137     global success
138     global server
139     global nat_client
140
141     print('Test was aborted!')
142     if (None != server):
143         server.stop()
144     if (None != nat_client):
145         nat_client.stop()
146     cleanup()
147     sys.exit(success)
148
149
150 def run():
151     global success
152     global test
153     global server
154     global nat_client
155
156     server = None
157     nat_client = None
158     success = False
159
160     for sig in signals:
161         signal.signal(sig, SigHandler)
162
163     test = Test('test_integration_bootstrap_and_connect.py', verbose)
164     cleanup()
165
166     server = Peer(test, './confs/c_bootstrap_server.conf')
167     nat_client = Peer(test, './confs/c_nat_client.conf')
168
169     if (True != server.start()):
170         print('Failed to start server')
171         if (None != server):
172             server.stop()
173         cleanup()
174         sys.exit(success)
175
176     # Give the server time to start
177     time.sleep(5)
178
179     if (True != nat_client.start()):
180         print('Failed to start nat_client')
181         if (None != server):
182             server.stop()
183         if (None != nat_client):
184             nat_client.stop()
185         cleanup()
186         sys.exit(success)
187
188     if ((nat_client.started == True) and (server.started == True)):
189         test.p('Peers started, running check')
190         time.sleep(5)
191         check_connect()
192     server.stop()
193     nat_client.stop()
194
195     cleanup()
196
197     if (success == False):
198         print('Test failed')
199         return False
200     else:
201         return True
202
203
204 try:
205     run()
206 except(KeyboardInterrupt, SystemExit):
207     print('Test interrupted')
208     server.stop()
209     nat_client.stop()
210     cleanup()
211 if (success == False):
212     sys.exit(1)
213 else:
214     sys.exit(0)