bpo-37421: urllib.request tests call urlcleanup() (GH-14529)

urllib.request tests now call urlcleanup() to remove temporary files
created by urlretrieve() tests and to clear the _opener global
variable set by urlopen() and functions calling indirectly urlopen().

regrtest now checks if urllib.request._url_tempfiles and
urllib.request._opener are changed by tests.
This commit is contained in:
Victor Stinner 2019-07-02 14:50:19 +02:00 committed by GitHub
parent 039fb49c18
commit 7cb9204ee1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 62 additions and 0 deletions

View File

@ -7,6 +7,7 @@ import shutil
import sys import sys
import sysconfig import sysconfig
import threading import threading
import urllib.request
import warnings import warnings
from test import support from test import support
from test.libregrtest.utils import print_warning from test.libregrtest.utils import print_warning
@ -68,8 +69,20 @@ class saved_test_environment:
'files', 'locale', 'warnings.showwarning', 'files', 'locale', 'warnings.showwarning',
'shutil_archive_formats', 'shutil_unpack_formats', 'shutil_archive_formats', 'shutil_unpack_formats',
'asyncio.events._event_loop_policy', 'asyncio.events._event_loop_policy',
'urllib.requests._url_tempfiles', 'urllib.requests._opener',
) )
def get_urllib_requests__url_tempfiles(self):
return list(urllib.request._url_tempfiles)
def restore_urllib_requests__url_tempfiles(self, tempfiles):
for filename in tempfiles:
support.unlink(filename)
def get_urllib_requests__opener(self):
return urllib.request._opener
def restore_urllib_requests__opener(self, opener):
urllib.request._opener = opener
def get_asyncio_events__event_loop_policy(self): def get_asyncio_events__event_loop_policy(self):
return support.maybe_get_event_loop_policy() return support.maybe_get_event_loop_policy()
def restore_asyncio_events__event_loop_policy(self, policy): def restore_asyncio_events__event_loop_policy(self, policy):

View File

@ -309,6 +309,9 @@ class RobotHandler(BaseHTTPRequestHandler):
class PasswordProtectedSiteTestCase(unittest.TestCase): class PasswordProtectedSiteTestCase(unittest.TestCase):
def setUp(self): def setUp(self):
# clear _opener global variable
self.addCleanup(urllib.request.urlcleanup)
self.server = HTTPServer((support.HOST, 0), RobotHandler) self.server = HTTPServer((support.HOST, 0), RobotHandler)
self.t = threading.Thread( self.t = threading.Thread(

View File

@ -20,6 +20,7 @@ import codecs
import os.path import os.path
import shutil import shutil
from urllib.error import URLError from urllib.error import URLError
import urllib.request
from test import support from test import support
from test.support import findfile, run_unittest, FakePath, TESTFN from test.support import findfile, run_unittest, FakePath, TESTFN
@ -979,6 +980,9 @@ class ExpatReaderTest(XmlTestBase):
self.assertEqual(handler._entities, [("img", None, "expat.gif", "GIF")]) self.assertEqual(handler._entities, [("img", None, "expat.gif", "GIF")])
def test_expat_external_dtd_enabled(self): def test_expat_external_dtd_enabled(self):
# clear _opener global variable
self.addCleanup(urllib.request.urlcleanup)
parser = create_parser() parser = create_parser()
parser.setFeature(feature_external_ges, True) parser.setFeature(feature_external_ges, True)
resolver = self.TestEntityRecorder() resolver = self.TestEntityRecorder()

View File

@ -545,6 +545,9 @@ class urlopen_DataTests(unittest.TestCase):
"""Test urlopen() opening a data URL.""" """Test urlopen() opening a data URL."""
def setUp(self): def setUp(self):
# clear _opener global variable
self.addCleanup(urllib.request.urlcleanup)
# text containing URL special- and unicode-characters # text containing URL special- and unicode-characters
self.text = "test data URLs :;,%=& \u00f6 \u00c4 " self.text = "test data URLs :;,%=& \u00f6 \u00c4 "
# 2x1 pixel RGB PNG image with one black and one white pixel # 2x1 pixel RGB PNG image with one black and one white pixel
@ -619,6 +622,9 @@ class urlretrieve_FileTests(unittest.TestCase):
"""Test urllib.urlretrieve() on local files""" """Test urllib.urlretrieve() on local files"""
def setUp(self): def setUp(self):
# clear _opener global variable
self.addCleanup(urllib.request.urlcleanup)
# Create a list of temporary files. Each item in the list is a file # Create a list of temporary files. Each item in the list is a file
# name (absolute path or relative to the current working directory). # name (absolute path or relative to the current working directory).
# All files in this list will be deleted in the tearDown method. Note, # All files in this list will be deleted in the tearDown method. Note,
@ -759,6 +765,8 @@ class urlretrieve_HttpTests(unittest.TestCase, FakeHTTPMixin):
"""Test urllib.urlretrieve() using fake http connections""" """Test urllib.urlretrieve() using fake http connections"""
def test_short_content_raises_ContentTooShortError(self): def test_short_content_raises_ContentTooShortError(self):
self.addCleanup(urllib.request.urlcleanup)
self.fakehttp(b'''HTTP/1.1 200 OK self.fakehttp(b'''HTTP/1.1 200 OK
Date: Wed, 02 Jan 2008 03:03:54 GMT Date: Wed, 02 Jan 2008 03:03:54 GMT
Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e
@ -780,6 +788,8 @@ FF
self.unfakehttp() self.unfakehttp()
def test_short_content_raises_ContentTooShortError_without_reporthook(self): def test_short_content_raises_ContentTooShortError_without_reporthook(self):
self.addCleanup(urllib.request.urlcleanup)
self.fakehttp(b'''HTTP/1.1 200 OK self.fakehttp(b'''HTTP/1.1 200 OK
Date: Wed, 02 Jan 2008 03:03:54 GMT Date: Wed, 02 Jan 2008 03:03:54 GMT
Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e

View File

@ -47,6 +47,9 @@ class TrivialTests(unittest.TestCase):
def test_trivial(self): def test_trivial(self):
# A couple trivial tests # A couple trivial tests
# clear _opener global variable
self.addCleanup(urllib.request.urlcleanup)
self.assertRaises(ValueError, urllib.request.urlopen, 'bogus url') self.assertRaises(ValueError, urllib.request.urlopen, 'bogus url')
# XXX Name hacking to get this to work on Windows. # XXX Name hacking to get this to work on Windows.
@ -1290,6 +1293,10 @@ class HandlerTests(unittest.TestCase):
def test_redirect_no_path(self): def test_redirect_no_path(self):
# Issue 14132: Relative redirect strips original path # Issue 14132: Relative redirect strips original path
# clear _opener global variable
self.addCleanup(urllib.request.urlcleanup)
real_class = http.client.HTTPConnection real_class = http.client.HTTPConnection
response1 = b"HTTP/1.1 302 Found\r\nLocation: ?query\r\n\r\n" response1 = b"HTTP/1.1 302 Found\r\nLocation: ?query\r\n\r\n"
http.client.HTTPConnection = test_urllib.fakehttp(response1) http.client.HTTPConnection = test_urllib.fakehttp(response1)

View File

@ -447,6 +447,9 @@ class TestUrlopen(unittest.TestCase):
def setUp(self): def setUp(self):
super(TestUrlopen, self).setUp() super(TestUrlopen, self).setUp()
# clear _opener global variable
self.addCleanup(urllib.request.urlcleanup)
# Ignore proxies for localhost tests. # Ignore proxies for localhost tests.
def restore_environ(old_environ): def restore_environ(old_environ):
os.environ.clear() os.environ.clear()

View File

@ -82,6 +82,9 @@ class AuthTests(unittest.TestCase):
class CloseSocketTest(unittest.TestCase): class CloseSocketTest(unittest.TestCase):
def test_close(self): def test_close(self):
# clear _opener global variable
self.addCleanup(urllib.request.urlcleanup)
# calling .close() on urllib2's response objects should close the # calling .close() on urllib2's response objects should close the
# underlying socket # underlying socket
url = support.TEST_HTTP_URL url = support.TEST_HTTP_URL
@ -257,6 +260,10 @@ class OtherNetworkTests(unittest.TestCase):
class TimeoutTest(unittest.TestCase): class TimeoutTest(unittest.TestCase):
def setUp(self):
# clear _opener global variable
self.addCleanup(urllib.request.urlcleanup)
def test_http_basic(self): def test_http_basic(self):
self.assertIsNone(socket.getdefaulttimeout()) self.assertIsNone(socket.getdefaulttimeout())
url = support.TEST_HTTP_URL url = support.TEST_HTTP_URL

View File

@ -25,6 +25,9 @@ class URLTimeoutTest(unittest.TestCase):
socket.setdefaulttimeout(None) socket.setdefaulttimeout(None)
def testURLread(self): def testURLread(self):
# clear _opener global variable
self.addCleanup(urllib.request.urlcleanup)
domain = urllib.parse.urlparse(support.TEST_HTTP_URL).netloc domain = urllib.parse.urlparse(support.TEST_HTTP_URL).netloc
with support.transient_internet(domain): with support.transient_internet(domain):
f = urllib.request.urlopen(support.TEST_HTTP_URL) f = urllib.request.urlopen(support.TEST_HTTP_URL)
@ -48,6 +51,10 @@ class urlopenNetworkTests(unittest.TestCase):
url = 'http://www.pythontest.net/' url = 'http://www.pythontest.net/'
def setUp(self):
# clear _opener global variable
self.addCleanup(urllib.request.urlcleanup)
@contextlib.contextmanager @contextlib.contextmanager
def urlopen(self, *args, **kwargs): def urlopen(self, *args, **kwargs):
resource = args[0] resource = args[0]
@ -144,6 +151,10 @@ class urlopenNetworkTests(unittest.TestCase):
class urlretrieveNetworkTests(unittest.TestCase): class urlretrieveNetworkTests(unittest.TestCase):
"""Tests urllib.request.urlretrieve using the network.""" """Tests urllib.request.urlretrieve using the network."""
def setUp(self):
# remove temporary files created by urlretrieve()
self.addCleanup(urllib.request.urlcleanup)
@contextlib.contextmanager @contextlib.contextmanager
def urlretrieve(self, *args, **kwargs): def urlretrieve(self, *args, **kwargs):
resource = args[0] resource = args[0]

View File

@ -0,0 +1,4 @@
urllib.request tests now call :func:`~urllib.request.urlcleanup` to remove
temporary files created by ``urlretrieve()`` tests and to clear the ``_opener``
global variable set by ``urlopen()`` and functions calling indirectly
``urlopen()``.