Skip to content

pydoc test_apropos_empty_doc test performs questionable chmod #136744

@freakboy3742

Description

@freakboy3742

The test for empty strings in calls to pydoc.apropos() uses a chmod call that seems non-sensical:

@os_helper.skip_unless_working_chmod
def test_apropos_empty_doc(self):
pkgdir = os.path.join(TESTFN, 'walkpkg')
os.mkdir(pkgdir)
self.addCleanup(rmtree, pkgdir)
init_path = os.path.join(pkgdir, '__init__.py')
with open(init_path, 'w') as fobj:
fobj.write("foo = 1")
current_mode = stat.S_IMODE(os.stat(pkgdir).st_mode)
try:
os.chmod(pkgdir, current_mode & ~stat.S_IEXEC)
with self.restrict_walk_packages(path=[TESTFN]), captured_stdout() as stdout:
pydoc.apropos('')
self.assertIn('walkpkg', stdout.getvalue())
finally:
os.chmod(pkgdir, current_mode)

(Line 1313 in particular)

This test was added as part of resolving #65747. Part of the triage of that issue included the observation that the problem could be reproduced by removing execute permissions from a directory. However, this appears to be unrelated to the reported problem.

By removing the x permission from the directory, the module is converted into a namespace package - at which point, it can't have a docstring. However, you can also validate this by... having a module without a docstring. Which the current test implements.

Adding to the confusion - the test only removes user execute permissions. Group and Global execute permissions are retained. The original report removed all execute permissions, not just user execute permissions; so the test isn't reproducing the triage example. The only explanation I can find for this is that the buildbots run with a umask of 0o77, which means removing user execute permissions is effectively equivalent to chmod a-x... but it won't be for anyone who isn't running under buildbot.

This was discovered in the process of developing #136740. This did reveal a bug in Emscripten's implementation of readdir() - but the actual test itself doesn't make any sense to me (or @hoodmane).

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    testsTests in the Lib/test dirtype-refactorCode refactoring (with no changes in behavior)

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions