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