diff --git a/tests/server_test.py b/tests/server_test.py index 16a2501..6f3f961 100644 --- a/tests/server_test.py +++ b/tests/server_test.py @@ -1,40 +1,35 @@ -# Import RangeHTTPServer from this project, not the global install. -import sys -sys.path = ['.'] + sys.path -from RangeHTTPServer import RangeRequestHandler +from http.server import HTTPServer +import socket +import threading +import time import pytest +import requests -try: - # Python 3 - from http.server import HTTPServer +from RangeHTTPServer import RangeRequestHandler -except ImportError: - # Python2 - from BaseHTTPServer import HTTPServer -import requests -import threading -import time +def get_free_port() -> int: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind(('', 0)) + return s.getsockname()[1] -httpd = None -server_thread = None -def setup(): +@pytest.fixture(scope="module") +def http_server(): + port = get_free_port() def start_server(): global httpd RangeRequestHandler.protocol_version = 'HTTP/1.0' - # TODO(danvk): pick a random, available port - httpd = HTTPServer(('', 8712), RangeRequestHandler) + httpd = HTTPServer(('', port), RangeRequestHandler) httpd.serve_forever() - global server_thread server_thread = threading.Thread(target=start_server) server_thread.start() time.sleep(1.0) + yield f'http://localhost:{port}' -def teardown(): httpd.shutdown() server_thread.join() @@ -48,15 +43,15 @@ def headers_of_note(response): 'Content-Length']} -def test_simple_request(): - r = requests.get('http://localhost:8712/tests/data.txt') +def test_simple_request(http_server): + r = requests.get(f'{http_server}/tests/data.txt') assert 200 == r.status_code assert '0123456789abcdef\n' == r.text assert 'text/plain' == r.headers['content-type'] -def test_range_request(): - r = requests.get('http://localhost:8712/tests/data.txt', +def test_range_request(http_server): + r = requests.get(f'{http_server}/tests/data.txt', headers={'Range': 'bytes=0-9'}) assert 206 == r.status_code assert '0123456789' == r.text @@ -68,8 +63,8 @@ def test_range_request(): } == headers_of_note(r) -def test_open_range_request(): - r = requests.get('http://localhost:8712/tests/data.txt', +def test_open_range_request(http_server): + r = requests.get(f'{http_server}/tests/data.txt', headers={'Range': 'bytes=10-'}) assert 206 == r.status_code assert 'abcdef\n' == r.text @@ -81,8 +76,8 @@ def test_open_range_request(): } == headers_of_note(r) -def test_mid_file_range_request(): - r = requests.get('http://localhost:8712/tests/data.txt', +def test_mid_file_range_request(http_server): + r = requests.get(f'{http_server}/tests/data.txt', headers={'Range': 'bytes=6-10'}) assert 206 == r.status_code assert '6789a' == r.text @@ -94,20 +89,20 @@ def test_mid_file_range_request(): } == headers_of_note(r) -def test_404(): - r = requests.get('http://localhost:8712/tests/nonexistent.txt', +def test_404(http_server): + r = requests.get(f'{http_server}/tests/nonexistent.txt', headers={'Range': 'bytes=6-10'}) assert 404 == r.status_code -def test_bad_range(): - r = requests.get('http://localhost:8712/tests/data.txt', +def test_bad_range(http_server): + r = requests.get(f'{http_server}/tests/data.txt', headers={'Range': 'bytes=abc'}) assert 400 == r.status_code -def test_range_past_eof(): - r = requests.get('http://localhost:8712/tests/data.txt', +def test_range_past_eof(http_server): + r = requests.get(f'{http_server}/tests/data.txt', headers={'Range': 'bytes=10-100'}) assert 206 == r.status_code assert 'abcdef\n' == r.text @@ -119,8 +114,8 @@ def test_range_past_eof(): } == headers_of_note(r) -def test_range_at_eof(): - r = requests.get('http://localhost:8712/tests/data.txt', +def test_range_at_eof(http_server): + r = requests.get(f'{http_server}/tests/data.txt', headers={'Range': 'bytes=16-'}) assert 206 == r.status_code assert '\n' == r.text @@ -132,7 +127,7 @@ def test_range_at_eof(): } == headers_of_note(r) -def test_range_starting_past_eof(): - r = requests.get('http://localhost:8712/tests/data.txt', +def test_range_starting_past_eof(http_server): + r = requests.get(f'{http_server}/tests/data.txt', headers={'Range': 'bytes=17-'}) assert 416 == r.status_code # "Requested Range Not Satisfiable"