14
14
"""
15
15
16
16
from io import StringIO
17
+ import os
18
+ import subprocess
19
+ import socket
17
20
import sys
21
+ import time
18
22
import unittest
19
- from uuid import uuid4
20
-
21
- from wsgi_intercept .interceptor import Urllib3Interceptor
22
23
23
24
from gabbi import exception
24
25
from gabbi .handlers import base
25
26
from gabbi .handlers .jsonhandler import JSONHandler
26
27
from gabbi import runner
27
- from gabbi .tests .simple_wsgi import SimpleWsgi
28
+
29
+
30
+ def get_free_port ():
31
+ sock = socket .socket ()
32
+ sock .bind (('' , 0 ))
33
+ return sock .getsockname ()[1 ]
34
+
35
+ class ForkedWSGIServer :
36
+
37
+ def __init__ (self , port ):
38
+ self .port = port
39
+
40
+ def start (self ):
41
+ self .process = subprocess .Popen ([
42
+ "python" , "gabbi/tests/external_server.py" , str (self .port )],
43
+ env = os .environ .update ({"PYTHONPATH" : "." }),
44
+ close_fds = True )
45
+ # We need to sleep a bit to let the wsgi server start.
46
+ time .sleep (.2 )
47
+
48
+ def stop (self ):
49
+ self .process .terminate ()
28
50
29
51
30
52
class RunnerTest (unittest .TestCase ):
31
53
54
+ port = get_free_port ()
55
+
32
56
def setUp (self ):
33
57
super (RunnerTest , self ).setUp ()
34
58
35
- # NB: random host ensures that we're not accidentally connecting to an
36
- # actual server
37
- host , port = (str (uuid4 ()), 8000 )
38
- self .host = host
39
- self .port = port
40
- self .server = lambda : Urllib3Interceptor (
41
- SimpleWsgi , host = host , port = port )
59
+ self .host = "localhost"
60
+ self .resolved_host = "1.0.0.127.in-addr.arpa"
61
+ self .server = ForkedWSGIServer (self .port )
62
+ self .server .start ()
42
63
43
64
self ._stdin = sys .stdin
44
65
@@ -49,41 +70,39 @@ def setUp(self):
49
70
sys .stderr = StringIO () # swallow output to avoid confusion
50
71
51
72
self ._argv = sys .argv
52
- sys .argv = ['gabbi-run' , '%s:%s' % (host , port )]
73
+ sys .argv = ['gabbi-run' , '%s:%s' % (self . host , self . port )]
53
74
54
75
def tearDown (self ):
55
76
sys .stdin = self ._stdin
56
77
sys .stdout = self ._stdout
57
78
sys .stderr = self ._stderr
58
79
sys .argv = self ._argv
80
+ self .server .stop ()
59
81
60
82
def test_input_files (self ):
61
83
sys .argv = ['gabbi-run' , 'http://%s:%s/foo' % (self .host , self .port )]
62
84
63
85
sys .argv .append ('--' )
64
86
sys .argv .append ('gabbi/tests/gabbits_runner/success.yaml' )
65
87
66
- with self .server ():
67
- try :
68
- runner .run ()
69
- except SystemExit as err :
70
- self .assertSuccess (err )
88
+ try :
89
+ runner .run ()
90
+ except SystemExit as err :
91
+ self .assertSuccess (err )
71
92
72
93
sys .argv .append ('gabbi/tests/gabbits_runner/failure.yaml' )
73
94
74
- with self .server ():
75
- try :
76
- runner .run ()
77
- except SystemExit as err :
78
- self .assertFailure (err )
95
+ try :
96
+ runner .run ()
97
+ except SystemExit as err :
98
+ self .assertFailure (err )
79
99
80
100
sys .argv .append ('gabbi/tests/gabbits_runner/success_alt.yaml' )
81
101
82
- with self .server ():
83
- try :
84
- runner .run ()
85
- except SystemExit as err :
86
- self .assertFailure (err )
102
+ try :
103
+ runner .run ()
104
+ except SystemExit as err :
105
+ self .assertFailure (err )
87
106
88
107
def test_unsafe_yaml (self ):
89
108
sys .argv = ['gabbi-run' , 'http://%s:%s/nan' % (self .host , self .port )]
@@ -92,11 +111,10 @@ def test_unsafe_yaml(self):
92
111
sys .argv .append ('--' )
93
112
sys .argv .append ('gabbi/tests/gabbits_runner/nan.yaml' )
94
113
95
- with self .server ():
96
- try :
97
- runner .run ()
98
- except SystemExit as err :
99
- self .assertSuccess (err )
114
+ try :
115
+ runner .run ()
116
+ except SystemExit as err :
117
+ self .assertSuccess (err )
100
118
101
119
def test_target_url_parsing (self ):
102
120
sys .argv = ['gabbi-run' , 'http://%s:%s/foo' % (self .host , self .port )]
@@ -108,36 +126,11 @@ def test_target_url_parsing(self):
108
126
status: 200
109
127
response_headers:
110
128
x-gabbi-url: http://%s:%s/foo/baz
111
- """ % (self .host , self .port ))
112
- with self .server ():
113
- try :
114
- runner .run ()
115
- except SystemExit as err :
116
- self .assertSuccess (err )
117
-
118
- def test_target_url_parsing_standard_port (self ):
119
- # NOTE(cdent): For reasons unclear this regularly fails in
120
- # py.test and sometimes fails with testr. So there is
121
- # some state that is not being properly cleard somewhere.
122
- # Within SimpleWsgi, the environ thinks url_scheme is
123
- # 'https'.
124
- self .server = lambda : Urllib3Interceptor (
125
- SimpleWsgi , host = self .host , port = 80 )
126
- sys .argv = ['gabbi-run' , 'http://%s/foo' % self .host ]
127
-
128
- sys .stdin = StringIO ("""
129
- tests:
130
- - name: expected success
131
- GET: /baz
132
- status: 200
133
- response_headers:
134
- x-gabbi-url: http://%s/foo/baz
135
- """ % self .host )
136
- with self .server ():
137
- try :
138
- runner .run ()
139
- except SystemExit as err :
140
- self .assertSuccess (err )
129
+ """ % (self .resolved_host , self .port ))
130
+ try :
131
+ runner .run ()
132
+ except SystemExit as err :
133
+ self .assertSuccess (err )
141
134
142
135
def test_custom_response_handler (self ):
143
136
sys .stdin = StringIO ("""
@@ -160,11 +153,11 @@ def test_custom_response_handler(self):
160
153
h1: Hello World
161
154
p: lorem ipsum dolor sit amet
162
155
""" )
163
- with self . server ():
164
- try :
165
- runner .run ()
166
- except SystemExit as err :
167
- self .assertSuccess (err )
156
+
157
+ try :
158
+ runner .run ()
159
+ except SystemExit as err :
160
+ self .assertSuccess (err )
168
161
169
162
sys .stdin = StringIO ("""
170
163
tests:
@@ -173,11 +166,11 @@ def test_custom_response_handler(self):
173
166
response_html:
174
167
h1: lipsum
175
168
""" )
176
- with self . server ():
177
- try :
178
- runner .run ()
179
- except SystemExit as err :
180
- self .assertFailure (err )
169
+
170
+ try :
171
+ runner .run ()
172
+ except SystemExit as err :
173
+ self .assertFailure (err )
181
174
182
175
sys .argv .insert (3 , "-r" )
183
176
sys .argv .insert (4 , "gabbi.tests.test_intercept:StubResponseHandler" )
@@ -191,11 +184,11 @@ def test_custom_response_handler(self):
191
184
response_test:
192
185
- COWAnother line
193
186
""" )
194
- with self . server ():
195
- try :
196
- runner .run ()
197
- except SystemExit as err :
198
- self .assertSuccess (err )
187
+
188
+ try :
189
+ runner .run ()
190
+ except SystemExit as err :
191
+ self .assertSuccess (err )
199
192
200
193
sys .argv .insert (5 , "-r" )
201
194
sys .argv .insert (6 , "gabbi.tests.custom_response_handler" )
@@ -208,11 +201,11 @@ def test_custom_response_handler(self):
208
201
- Hello World
209
202
- lorem ipsum dolor sit amet
210
203
""" )
211
- with self . server ():
212
- try :
213
- runner .run ()
214
- except SystemExit as err :
215
- self .assertSuccess (err )
204
+
205
+ try :
206
+ runner .run ()
207
+ except SystemExit as err :
208
+ self .assertSuccess (err )
216
209
217
210
def test_exit_code (self ):
218
211
sys .stdin = StringIO ()
@@ -225,6 +218,7 @@ def test_exit_code(self):
225
218
GET: /
226
219
status: 666
227
220
""" )
221
+
228
222
try :
229
223
runner .run ()
230
224
except SystemExit as err :
@@ -236,23 +230,23 @@ def test_exit_code(self):
236
230
GET: /
237
231
status: 200
238
232
""" )
239
- with self . server ():
240
- try :
241
- runner .run ()
242
- except SystemExit as err :
243
- self .assertSuccess (err )
233
+
234
+ try :
235
+ runner .run ()
236
+ except SystemExit as err :
237
+ self .assertSuccess (err )
244
238
245
239
def test_verbose_output_formatting (self ):
246
240
"""Confirm that a verbose test handles output properly."""
247
241
sys .argv = ['gabbi-run' , 'http://%s:%s/foo' % (self .host , self .port )]
248
242
249
243
sys .argv .append ('--' )
250
244
sys .argv .append ('gabbi/tests/gabbits_runner/test_verbose.yaml' )
251
- with self . server ():
252
- try :
253
- runner .run ()
254
- except SystemExit as err :
255
- self .assertSuccess (err )
245
+
246
+ try :
247
+ runner .run ()
248
+ except SystemExit as err :
249
+ self .assertSuccess (err )
256
250
257
251
sys .stdout .seek (0 )
258
252
output = sys .stdout .read ()
@@ -270,11 +264,10 @@ def test_data_dir_good(self):
270
264
sys .argv .append ('--' )
271
265
sys .argv .append ('gabbi/tests/gabbits_runner/test_data.yaml' )
272
266
273
- with self .server ():
274
- try :
275
- runner .run ()
276
- except SystemExit as err :
277
- self .assertSuccess (err )
267
+ try :
268
+ runner .run ()
269
+ except SystemExit as err :
270
+ self .assertSuccess (err )
278
271
279
272
# Compare the verbose output of tests with pretty printed
280
273
# data.
@@ -298,21 +291,20 @@ def test_stdin_data_dir(self):
298
291
response_json_paths:
299
292
$.items.house: blue
300
293
""" )
301
- with self . server ():
302
- try :
303
- runner .run ()
304
- except SystemExit as err :
305
- self .assertSuccess (err )
294
+
295
+ try :
296
+ runner .run ()
297
+ except SystemExit as err :
298
+ self .assertSuccess (err )
306
299
307
300
def _run_verbosity_arg (self ):
308
301
sys .argv .append ('--' )
309
302
sys .argv .append ('gabbi/tests/gabbits_runner/verbosity.yaml' )
310
303
311
- with self .server ():
312
- try :
313
- runner .run ()
314
- except SystemExit as err :
315
- self .assertSuccess (err )
304
+ try :
305
+ runner .run ()
306
+ except SystemExit as err :
307
+ self .assertSuccess (err )
316
308
317
309
sys .stdout .seek (0 )
318
310
output = sys .stdout .read ()
@@ -365,11 +357,12 @@ def test_quiet_is_quiet(self):
365
357
response_headers:
366
358
x-gabbi-url: http://%s:%s/foo/baz
367
359
""" % (self .host , self .port ))
368
- with self .server ():
369
- try :
370
- runner .run ()
371
- except SystemExit as err :
372
- self .assertSuccess (err )
360
+
361
+ try :
362
+ runner .run ()
363
+ except SystemExit as err :
364
+ self .assertSuccess (err )
365
+
373
366
sys .stdout .seek (0 )
374
367
sys .stderr .seek (0 )
375
368
stdoutput = sys .stdout .read ()
0 commit comments