Commit 916fc7bf authored by Antoine Pitrou's avatar Antoine Pitrou

Issue #11995: test_pydoc doesn't import all sys.path modules anymore.

parent 2c3f2f19
import os
import sys
import builtins
import contextlib
import difflib
import inspect
import pydoc
import keyword
import pkgutil
import re
import string
import test.support
......@@ -17,7 +19,8 @@ from collections import namedtuple
from test.script_helper import assert_python_ok
from test.support import (
TESTFN, rmtree,
reap_children, reap_threads, captured_output, captured_stdout, unlink
reap_children, reap_threads, captured_output, captured_stdout,
captured_stderr, unlink
)
from test import pydoc_mod
......@@ -259,6 +262,29 @@ def get_html_title(text):
return title
class PydocBaseTest(unittest.TestCase):
def _restricted_walk_packages(self, walk_packages, path=None):
"""
A version of pkgutil.walk_packages() that will restrict itself to
a given path.
"""
default_path = path or [os.path.dirname(__file__)]
def wrapper(path=None, prefix='', onerror=None):
return walk_packages(path or default_path, prefix, onerror)
return wrapper
@contextlib.contextmanager
def restrict_walk_packages(self, path=None):
walk_packages = pkgutil.walk_packages
pkgutil.walk_packages = self._restricted_walk_packages(walk_packages,
path)
try:
yield
finally:
pkgutil.walk_packages = walk_packages
class PydocDocTest(unittest.TestCase):
@unittest.skipIf(sys.flags.optimize >= 2,
......@@ -420,7 +446,7 @@ class PydocDocTest(unittest.TestCase):
self.assertDictEqual(methods, expected)
class PydocImportTest(unittest.TestCase):
class PydocImportTest(PydocBaseTest):
def setUp(self):
self.test_dir = os.mkdir(TESTFN)
......@@ -454,8 +480,19 @@ class PydocImportTest(unittest.TestCase):
badsyntax = os.path.join(pkgdir, "__init__") + os.extsep + "py"
with open(badsyntax, 'w') as f:
f.write("invalid python syntax = $1\n")
result = run_pydoc('zqwykjv', '-k', PYTHONPATH=TESTFN)
self.assertEqual(b'', result)
with self.restrict_walk_packages(path=[TESTFN]):
with captured_stdout() as out:
with captured_stderr() as err:
pydoc.apropos('xyzzy')
# No result, no error
self.assertEqual(out.getvalue(), '')
self.assertEqual(err.getvalue(), '')
# The package name is still matched
with captured_stdout() as out:
with captured_stderr() as err:
pydoc.apropos('syntaxerr')
self.assertEqual(out.getvalue().strip(), 'syntaxerr')
self.assertEqual(err.getvalue(), '')
def test_apropos_with_unreadable_dir(self):
# Issue 7367 - pydoc -k failed when unreadable dir on path
......@@ -464,8 +501,13 @@ class PydocImportTest(unittest.TestCase):
self.addCleanup(os.rmdir, self.unreadable_dir)
# Note, on Windows the directory appears to be still
# readable so this is not really testing the issue there
result = run_pydoc('zqwykjv', '-k', PYTHONPATH=TESTFN)
self.assertEqual(b'', result)
with self.restrict_walk_packages(path=[TESTFN]):
with captured_stdout() as out:
with captured_stderr() as err:
pydoc.apropos('SOMEKEY')
# No result, no error
self.assertEqual(out.getvalue(), '')
self.assertEqual(err.getvalue(), '')
class TestDescriptions(unittest.TestCase):
......@@ -527,7 +569,7 @@ class PydocServerTest(unittest.TestCase):
self.assertEqual(serverthread.error, None)
class PydocUrlHandlerTest(unittest.TestCase):
class PydocUrlHandlerTest(PydocBaseTest):
"""Tests for pydoc._url_handler"""
def test_content_type_err(self):
......@@ -554,18 +596,19 @@ class PydocUrlHandlerTest(unittest.TestCase):
("getfile?key=foobar", "Pydoc: Error - getfile?key=foobar"),
]
for url, title in requests:
with self.restrict_walk_packages():
for url, title in requests:
text = pydoc._url_handler(url, "text/html")
result = get_html_title(text)
self.assertEqual(result, title, text)
path = string.__file__
title = "Pydoc: getfile " + path
url = "getfile?key=" + path
text = pydoc._url_handler(url, "text/html")
result = get_html_title(text)
self.assertEqual(result, title)
path = string.__file__
title = "Pydoc: getfile " + path
url = "getfile?key=" + path
text = pydoc._url_handler(url, "text/html")
result = get_html_title(text)
self.assertEqual(result, title)
class TestHelper(unittest.TestCase):
def test_keywords(self):
......
......@@ -37,6 +37,11 @@ Library
- Issue #17968: Fix memory leak in os.listxattr().
Tests
-----
- Issue #11995: test_pydoc doesn't import all sys.path modules anymore.
Documentation
-------------
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment