diff options
author | Ned Deily <nad@acm.org> | 2011-10-06 14:17:34 -0700 |
---|---|---|
committer | Ned Deily <nad@acm.org> | 2011-10-06 14:17:34 -0700 |
commit | 1a96f8de79e7aaa64fc398b90ea27873e969bf7a (patch) | |
tree | 13947844c98f766cd7c20f2d9c057bf380631ca6 /Lib/test/test_pydoc.py | |
parent | 9ffcbf71a52bcca74022fb58f56b145ff6af7f97 (diff) | |
download | cpython-git-1a96f8de79e7aaa64fc398b90ea27873e969bf7a.tar.gz |
Issue #7425: Refactor test_pydoc test case for '-k' behavior and add
new test cases for importing bad packages and unreadable packages dirs.
Diffstat (limited to 'Lib/test/test_pydoc.py')
-rw-r--r-- | Lib/test/test_pydoc.py | 112 |
1 files changed, 63 insertions, 49 deletions
diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index d98faecfef..b433850fcd 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -1,7 +1,6 @@ import os import sys import difflib -import subprocess import __builtin__ import re import pydoc @@ -10,10 +9,10 @@ import keyword import unittest import xml.etree import test.test_support -from contextlib import contextmanager from collections import namedtuple +from test.script_helper import assert_python_ok from test.test_support import ( - TESTFN, forget, rmtree, EnvironmentVarGuard, reap_children, captured_stdout) + TESTFN, rmtree, reap_children, captured_stdout) from test import pydoc_mod @@ -176,17 +175,15 @@ missing_pattern = "no Python documentation found for '%s'" # output pattern for module with bad imports badimport_pattern = "problem in %s - <type 'exceptions.ImportError'>: No module named %s" -def run_pydoc(module_name, *args): +def run_pydoc(module_name, *args, **env): """ Runs pydoc on the specified module. Returns the stripped output of pydoc. """ - cmd = [sys.executable, pydoc.__file__, " ".join(args), module_name] - try: - output = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0] - return output.strip() - finally: - reap_children() + args = args + (module_name,) + # do not write bytecode files to avoid caching errors + rc, out, err = assert_python_ok('-B', pydoc.__file__, *args, **env) + return out.strip() def get_pydoc_html(module): "Returns pydoc generated output as html" @@ -259,42 +256,6 @@ class PyDocDocTest(unittest.TestCase): self.assertEqual(expected, result, "documentation for missing module found") - def test_badimport(self): - # This tests the fix for issue 5230, where if pydoc found the module - # but the module had an internal import error pydoc would report no doc - # found. - modname = 'testmod_xyzzy' - testpairs = ( - ('i_am_not_here', 'i_am_not_here'), - ('test.i_am_not_here_either', 'i_am_not_here_either'), - ('test.i_am_not_here.neither_am_i', 'i_am_not_here.neither_am_i'), - ('i_am_not_here.{}'.format(modname), 'i_am_not_here.{}'.format(modname)), - ('test.{}'.format(modname), modname), - ) - - @contextmanager - def newdirinpath(dir): - os.mkdir(dir) - sys.path.insert(0, dir) - yield - sys.path.pop(0) - rmtree(dir) - - with newdirinpath(TESTFN), EnvironmentVarGuard() as env: - env['PYTHONPATH'] = TESTFN - fullmodname = os.path.join(TESTFN, modname) - sourcefn = fullmodname + os.extsep + "py" - for importstring, expectedinmsg in testpairs: - f = open(sourcefn, 'w') - f.write("import {}\n".format(importstring)) - f.close() - try: - result = run_pydoc(modname) - finally: - forget(modname) - expected = badimport_pattern % (modname, expectedinmsg) - self.assertEqual(expected, result) - def test_input_strip(self): missing_module = " test.i_am_not_here " result = run_pydoc(missing_module) @@ -317,6 +278,55 @@ class PyDocDocTest(unittest.TestCase): "<type 'exceptions.Exception'>") +class PydocImportTest(unittest.TestCase): + + def setUp(self): + self.test_dir = os.mkdir(TESTFN) + self.addCleanup(rmtree, TESTFN) + + def test_badimport(self): + # This tests the fix for issue 5230, where if pydoc found the module + # but the module had an internal import error pydoc would report no doc + # found. + modname = 'testmod_xyzzy' + testpairs = ( + ('i_am_not_here', 'i_am_not_here'), + ('test.i_am_not_here_either', 'i_am_not_here_either'), + ('test.i_am_not_here.neither_am_i', 'i_am_not_here.neither_am_i'), + ('i_am_not_here.{}'.format(modname), + 'i_am_not_here.{}'.format(modname)), + ('test.{}'.format(modname), modname), + ) + + sourcefn = os.path.join(TESTFN, modname) + os.extsep + "py" + for importstring, expectedinmsg in testpairs: + with open(sourcefn, 'w') as f: + f.write("import {}\n".format(importstring)) + result = run_pydoc(modname, PYTHONPATH=TESTFN) + expected = badimport_pattern % (modname, expectedinmsg) + self.assertEqual(expected, result) + + def test_apropos_with_bad_package(self): + # Issue 7425 - pydoc -k failed when bad package on path + pkgdir = os.path.join(TESTFN, "syntaxerr") + os.mkdir(pkgdir) + 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('nothing', '-k', PYTHONPATH=TESTFN) + self.assertEqual('', result) + + def test_apropos_with_unreadable_dir(self): + # Issue 7367 - pydoc -k failed when unreadable dir on path + self.unreadable_dir = os.path.join(TESTFN, "unreadable") + os.mkdir(self.unreadable_dir, 0) + 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('nothing', '-k', PYTHONPATH=TESTFN) + self.assertEqual('', result) + + class TestDescriptions(unittest.TestCase): def test_module(self): @@ -376,9 +386,13 @@ class TestHelper(unittest.TestCase): def test_main(): - test.test_support.run_unittest(PyDocDocTest, - TestDescriptions, - TestHelper) + try: + test.test_support.run_unittest(PyDocDocTest, + PydocImportTest, + TestDescriptions, + TestHelper) + finally: + reap_children() if __name__ == "__main__": test_main() |