2003-02-17 14:17:05 -04:00
|
|
|
"Test posix functions"
|
|
|
|
|
2008-05-20 18:35:26 -03:00
|
|
|
from test import support
|
2017-05-27 12:50:54 -03:00
|
|
|
from test.support.script_helper import assert_python_ok
|
2009-04-21 23:24:39 -03:00
|
|
|
|
|
|
|
# Skip these tests if there is no posix module.
|
|
|
|
posix = support.import_module('posix')
|
2003-02-17 14:17:05 -04:00
|
|
|
|
2009-12-02 16:46:48 -04:00
|
|
|
import errno
|
2010-07-23 10:53:51 -03:00
|
|
|
import sys
|
2018-09-07 12:44:24 -03:00
|
|
|
import signal
|
2003-02-17 14:17:05 -04:00
|
|
|
import time
|
|
|
|
import os
|
2012-04-17 14:48:35 -03:00
|
|
|
import platform
|
Merged revisions 61538-61540,61556,61559-61560,61563,61565,61571,61575-61576,61580-61582,61586,61591,61593,61595,61605-61606,61613-61616,61618,61621-61623,61625,61627,61631-61634 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r61538 | steven.bethard | 2008-03-18 20:03:50 +0100 (Di, 18 Mär 2008) | 1 line
cell_compare needs to return -2 instead of NULL.
........
r61539 | steven.bethard | 2008-03-18 20:04:32 +0100 (Di, 18 Mär 2008) | 1 line
_have_soundcard() is a bad check for winsound.Beep, since you can have a soundcard but have the beep driver disabled. This revision basically disables the beep tests by wrapping them in a try/except. The Right Way To Do It is to come up with a _have_enabled_beep_driver() and use that.
........
r61540 | gregory.p.smith | 2008-03-18 20:05:32 +0100 (Di, 18 Mär 2008) | 8 lines
Fix chown on 64-bit linux. It needed to take a long (64-bit on 64bit linux) as
uid and gid input to accept values >=2**31 as valid while still accepting
negative numbers to pass -1 to chown for "no change".
Fixes issue1747858.
This should be backported to release25-maint.
........
r61556 | steven.bethard | 2008-03-18 20:59:14 +0100 (Di, 18 Mär 2008) | 1 line
Fix test_atexit so that it still passes when -3 is supplied. (It was catching the warning messages on stdio from using the reload() function.)
........
r61559 | neal.norwitz | 2008-03-18 21:30:38 +0100 (Di, 18 Mär 2008) | 1 line
Import the test properly. This is especially important for py3k.
........
r61560 | gregory.p.smith | 2008-03-18 21:40:01 +0100 (Di, 18 Mär 2008) | 2 lines
news entry for the chown fix
........
r61563 | brett.cannon | 2008-03-18 22:12:42 +0100 (Di, 18 Mär 2008) | 2 lines
Ignore BIG5HKSCS-2004.TXT which is downloaded as part of a test.
........
r61565 | steven.bethard | 2008-03-18 22:30:13 +0100 (Di, 18 Mär 2008) | 1 line
Have regrtest skip test_py3kwarn when the -3 flag is missing.
........
r61571 | gregory.p.smith | 2008-03-18 23:27:41 +0100 (Di, 18 Mär 2008) | 4 lines
Add a test to make sure zlib.crc32 and binascii.crc32 return the same thing.
Fix a buglet in binascii.crc32, the second optional argument could previously
have a signedness mismatch with the C variable its going into.
........
r61575 | raymond.hettinger | 2008-03-19 00:22:29 +0100 (Mi, 19 Mär 2008) | 1 line
Speed-up isinstance() for one easy case.
........
r61576 | raymond.hettinger | 2008-03-19 00:33:08 +0100 (Mi, 19 Mär 2008) | 1 line
Issue: 2354: Add 3K warning for the cmp argument to list.sort() and sorted().
........
r61580 | andrew.kuchling | 2008-03-19 02:05:35 +0100 (Mi, 19 Mär 2008) | 1 line
Add Jeff Rush
........
r61581 | gregory.p.smith | 2008-03-19 02:38:35 +0100 (Mi, 19 Mär 2008) | 3 lines
Mention that crc32 and adler32 are available in a different module (zlib).
Some people look for them in hashlib.
........
r61582 | gregory.p.smith | 2008-03-19 02:46:10 +0100 (Mi, 19 Mär 2008) | 3 lines
Use zlib's crc32 routine instead of binascii when available. zlib's is faster
when compiled properly optimized and about the same speed otherwise.
........
r61586 | david.wolever | 2008-03-19 03:26:57 +0100 (Mi, 19 Mär 2008) | 1 line
Added my name to ACKS
........
r61591 | gregory.p.smith | 2008-03-19 04:14:41 +0100 (Mi, 19 Mär 2008) | 5 lines
Fix the struct module DeprecationWarnings that zipfile was triggering by
removing all use of signed struct values.
test_zipfile and test_zipfile64 pass. no more warnings.
........
r61593 | raymond.hettinger | 2008-03-19 04:56:59 +0100 (Mi, 19 Mär 2008) | 1 line
Fix compiler warning.
........
r61595 | martin.v.loewis | 2008-03-19 05:39:13 +0100 (Mi, 19 Mär 2008) | 2 lines
Issue #2400: Allow relative imports to "import *".
........
r61605 | martin.v.loewis | 2008-03-19 07:00:28 +0100 (Mi, 19 Mär 2008) | 2 lines
Import relimport using a relative import.
........
r61606 | trent.nelson | 2008-03-19 07:28:24 +0100 (Mi, 19 Mär 2008) | 1 line
Issue2290: Support x64 Windows builds that live in pcbuild/amd64. Without it, sysutils._python_build() returns the wrong directory, which causes the test_get_config_h_filename method in Lib/distutils/tests/test_sysconfig.py to fail.
........
r61613 | trent.nelson | 2008-03-19 08:45:19 +0100 (Mi, 19 Mär 2008) | 3 lines
Refine the Visual Studio 2008 build solution in order to improve how we deal with external components, as well as fixing outstanding issues with Windows x64 build support. Introduce two new .vcproj files, _bsddb44.vcproj and sqlite3.vcproj, which replace the previous pre-link event scripts for _bsddb and _sqlite3 respectively. The new project files inherit from our property files as if they were any other Python module. This has numerous benefits. First, the components get built with exactly the same compiler flags and settings as the rest of Python. Second, it makes it much easier to debug problems in the external components when they're part of the build system. Third, they'll benefit from profile guided optimisation in the release builds, just like the rest of Python core.
I've also introduced a slightly new pattern for managing externals in subversion. New components get checked in as <name>-<version>.x, where <version> matches the exact vendor version string. After the initial import of the external component, the .x is tagged as .0 (i.e. tcl-8.4.18.x -> tcl-8.4.18.0). Some components may not need any tweaking, whereas there are others that might (tcl/tk fall into this bucket). In that case, the relevant modifications are made to the .x branch, which will be subsequently tagged as .1 (and then n+1 going forward) when they build successfully and all tests pass. Buildbots will be converted to rely on these explicit tags only, which makes it easy for us to switch them over to a new version as and when required. (Simple change to external(-amd64).bat: if we've bumped tcl to 8.4.18.1, change the .bat to rmdir 8.4.18.0 if it exists and check out a new .1 copy.)
........
r61614 | trent.nelson | 2008-03-19 08:56:39 +0100 (Mi, 19 Mär 2008) | 1 line
Remove extraneous apostrophe and semi-colon from AdditionalIncludeDirectories.
........
r61615 | georg.brandl | 2008-03-19 08:56:40 +0100 (Mi, 19 Mär 2008) | 2 lines
Remove footnote from versionchanged as it upsets LaTeX.
........
r61616 | georg.brandl | 2008-03-19 08:57:57 +0100 (Mi, 19 Mär 2008) | 2 lines
Another one.
........
r61618 | trent.nelson | 2008-03-19 09:06:03 +0100 (Mi, 19 Mär 2008) | 1 line
Fix the tcl-8.4.18.1 path and make sure we cd into the right directory when building tcl/tk.
........
r61621 | trent.nelson | 2008-03-19 10:23:08 +0100 (Mi, 19 Mär 2008) | 1 line
Lets have another try at getting the Windows buildbots in a consistent state before rebuilding using the new process.
........
r61622 | eric.smith | 2008-03-19 13:09:55 +0100 (Mi, 19 Mär 2008) | 2 lines
Use test.test_support.captured_stdout instead of a custom contextmanager.
Thanks Nick Coghlan.
........
r61623 | eric.smith | 2008-03-19 13:15:10 +0100 (Mi, 19 Mär 2008) | 1 line
Trivial typo.
........
r61625 | thomas.heller | 2008-03-19 17:10:57 +0100 (Mi, 19 Mär 2008) | 2 lines
Checkout sqlite-source when it is not there.
........
r61627 | brett.cannon | 2008-03-19 17:50:13 +0100 (Mi, 19 Mär 2008) | 5 lines
test_nis would fail if test.test_support.verbose was true but NIS was not set
up on the machine.
Closes issue2411. Thanks Michael Bishop.
........
r61631 | brett.cannon | 2008-03-19 18:37:43 +0100 (Mi, 19 Mär 2008) | 2 lines
Use sys.py3kwarning instead of trying to trigger a Py3k-related warning.
........
r61632 | raymond.hettinger | 2008-03-19 18:45:19 +0100 (Mi, 19 Mär 2008) | 1 line
Issue 2354: Fix-up compare warning. Patch contributed by Jeff Balogh.
........
r61633 | raymond.hettinger | 2008-03-19 18:58:59 +0100 (Mi, 19 Mär 2008) | 1 line
The filter() function does support a None argument in Py3.0.
........
r61634 | raymond.hettinger | 2008-03-19 19:01:58 +0100 (Mi, 19 Mär 2008) | 1 line
Remove itertools warnings I had added before the 2-to-3 handled the migration.
........
2008-03-19 18:50:51 -03:00
|
|
|
import pwd
|
2010-08-16 22:27:09 -03:00
|
|
|
import stat
|
2011-07-26 17:53:55 -03:00
|
|
|
import tempfile
|
2003-02-17 14:17:05 -04:00
|
|
|
import unittest
|
|
|
|
import warnings
|
2018-09-07 12:44:24 -03:00
|
|
|
import textwrap
|
Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
........
r70734 | r.david.murray | 2009-03-30 15:04:00 -0400 (Mon, 30 Mar 2009) | 7 lines
Add import_function method to test.test_support, and modify a number of
tests that expect to be skipped if imports fail or functions don't
exist to use import_function and import_module. The ultimate goal is
to change regrtest to not skip automatically on ImportError. Checking
in now to make sure the buldbots don't show any errors on platforms
I can't direct test on.
........
r70775 | r.david.murray | 2009-03-30 19:05:48 -0400 (Mon, 30 Mar 2009) | 4 lines
Change more tests to use import_module for the modules that
should cause tests to be skipped. Also rename import_function
to the more descriptive get_attribute and add a docstring.
........
r70856 | r.david.murray | 2009-03-31 14:32:17 -0400 (Tue, 31 Mar 2009) | 7 lines
A few more test skips via import_module, and change import_module to
return the error message produced by importlib, so that if an import
in the package whose import is being wrapped is what failed the skip
message will contain the name of that module instead of the name of the
wrapped module. Also fixed formatting of some previous comments.
........
r70874 | r.david.murray | 2009-03-31 15:33:15 -0400 (Tue, 31 Mar 2009) | 5 lines
Improve test_support.import_module docstring, remove
deprecated flag from get_attribute since it isn't likely
to do anything useful.
........
r70876 | r.david.murray | 2009-03-31 15:49:15 -0400 (Tue, 31 Mar 2009) | 4 lines
Remove the regrtest check that turns any ImportError into a skipped test.
Hopefully all modules whose imports legitimately result in a skipped
test have been properly wrapped by the previous commits.
........
r70877 | r.david.murray | 2009-03-31 15:57:24 -0400 (Tue, 31 Mar 2009) | 2 lines
Add NEWS entry for regrtest change.
........
2009-03-31 20:16:50 -03:00
|
|
|
|
2011-07-26 17:53:55 -03:00
|
|
|
_DUMMY_SYMLINK = os.path.join(tempfile.gettempdir(),
|
|
|
|
support.TESTFN + '-dummy-symlink')
|
2003-02-17 14:17:05 -04:00
|
|
|
|
2018-07-31 04:24:54 -03:00
|
|
|
requires_32b = unittest.skipUnless(sys.maxsize < 2**32,
|
|
|
|
'test is only meaningful on 32-bit builds')
|
|
|
|
|
2018-09-12 19:12:24 -03:00
|
|
|
def _supports_sched():
|
|
|
|
if not hasattr(posix, 'sched_getscheduler'):
|
|
|
|
return False
|
|
|
|
try:
|
|
|
|
posix.sched_getscheduler(0)
|
|
|
|
except OSError as e:
|
|
|
|
if e.errno == errno.ENOSYS:
|
|
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
|
|
requires_sched = unittest.skipUnless(_supports_sched(), 'requires POSIX scheduler API')
|
|
|
|
|
2003-02-17 14:17:05 -04:00
|
|
|
class PosixTester(unittest.TestCase):
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
# create empty file
|
2008-05-20 18:35:26 -03:00
|
|
|
fp = open(support.TESTFN, 'w+')
|
2003-02-17 14:17:05 -04:00
|
|
|
fp.close()
|
2011-06-28 04:00:28 -03:00
|
|
|
self.teardown_files = [ support.TESTFN ]
|
2010-03-20 18:53:28 -03:00
|
|
|
self._warnings_manager = support.check_warnings()
|
|
|
|
self._warnings_manager.__enter__()
|
|
|
|
warnings.filterwarnings('ignore', '.* potential security risk .*',
|
|
|
|
RuntimeWarning)
|
2003-02-17 14:17:05 -04:00
|
|
|
|
|
|
|
def tearDown(self):
|
2011-06-28 04:00:28 -03:00
|
|
|
for teardown_file in self.teardown_files:
|
|
|
|
support.unlink(teardown_file)
|
2010-03-20 18:53:28 -03:00
|
|
|
self._warnings_manager.__exit__(None, None, None)
|
2003-02-17 14:17:05 -04:00
|
|
|
|
|
|
|
def testNoArgFunctions(self):
|
|
|
|
# test posix functions which take no arguments and have
|
|
|
|
# no side-effects which we need to cleanup (e.g., fork, wait, abort)
|
2008-10-02 15:55:37 -03:00
|
|
|
NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "uname",
|
2007-10-25 20:18:51 -03:00
|
|
|
"times", "getloadavg",
|
2003-02-17 14:17:05 -04:00
|
|
|
"getegid", "geteuid", "getgid", "getgroups",
|
2011-03-17 15:20:30 -03:00
|
|
|
"getpid", "getpgrp", "getppid", "getuid", "sync",
|
2003-02-17 14:17:05 -04:00
|
|
|
]
|
2003-02-23 18:12:24 -04:00
|
|
|
|
2003-02-17 14:17:05 -04:00
|
|
|
for name in NO_ARG_FUNCTIONS:
|
|
|
|
posix_func = getattr(posix, name, None)
|
|
|
|
if posix_func is not None:
|
|
|
|
posix_func()
|
2003-02-17 18:40:31 -04:00
|
|
|
self.assertRaises(TypeError, posix_func, 1)
|
2003-02-17 14:17:05 -04:00
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'getresuid'),
|
|
|
|
'test needs posix.getresuid()')
|
|
|
|
def test_getresuid(self):
|
|
|
|
user_ids = posix.getresuid()
|
|
|
|
self.assertEqual(len(user_ids), 3)
|
|
|
|
for val in user_ids:
|
|
|
|
self.assertGreaterEqual(val, 0)
|
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'getresgid'),
|
|
|
|
'test needs posix.getresgid()')
|
|
|
|
def test_getresgid(self):
|
|
|
|
group_ids = posix.getresgid()
|
|
|
|
self.assertEqual(len(group_ids), 3)
|
|
|
|
for val in group_ids:
|
|
|
|
self.assertGreaterEqual(val, 0)
|
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'setresuid'),
|
|
|
|
'test needs posix.setresuid()')
|
|
|
|
def test_setresuid(self):
|
|
|
|
current_user_ids = posix.getresuid()
|
|
|
|
self.assertIsNone(posix.setresuid(*current_user_ids))
|
|
|
|
# -1 means don't change that value.
|
|
|
|
self.assertIsNone(posix.setresuid(-1, -1, -1))
|
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'setresuid'),
|
|
|
|
'test needs posix.setresuid()')
|
|
|
|
def test_setresuid_exception(self):
|
|
|
|
# Don't do this test if someone is silly enough to run us as root.
|
|
|
|
current_user_ids = posix.getresuid()
|
|
|
|
if 0 not in current_user_ids:
|
|
|
|
new_user_ids = (current_user_ids[0]+1, -1, -1)
|
|
|
|
self.assertRaises(OSError, posix.setresuid, *new_user_ids)
|
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'setresgid'),
|
|
|
|
'test needs posix.setresgid()')
|
|
|
|
def test_setresgid(self):
|
|
|
|
current_group_ids = posix.getresgid()
|
|
|
|
self.assertIsNone(posix.setresgid(*current_group_ids))
|
|
|
|
# -1 means don't change that value.
|
|
|
|
self.assertIsNone(posix.setresgid(-1, -1, -1))
|
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'setresgid'),
|
|
|
|
'test needs posix.setresgid()')
|
|
|
|
def test_setresgid_exception(self):
|
|
|
|
# Don't do this test if someone is silly enough to run us as root.
|
|
|
|
current_group_ids = posix.getresgid()
|
|
|
|
if 0 not in current_group_ids:
|
|
|
|
new_group_ids = (current_group_ids[0]+1, -1, -1)
|
|
|
|
self.assertRaises(OSError, posix.setresgid, *new_group_ids)
|
2009-11-27 10:09:49 -04:00
|
|
|
|
2009-12-02 16:46:48 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'initgroups'),
|
|
|
|
"test needs os.initgroups()")
|
|
|
|
def test_initgroups(self):
|
|
|
|
# It takes a string and an integer; check that it raises a TypeError
|
|
|
|
# for other argument lists.
|
|
|
|
self.assertRaises(TypeError, posix.initgroups)
|
|
|
|
self.assertRaises(TypeError, posix.initgroups, None)
|
|
|
|
self.assertRaises(TypeError, posix.initgroups, 3, "foo")
|
|
|
|
self.assertRaises(TypeError, posix.initgroups, "foo", 3, object())
|
|
|
|
|
|
|
|
# If a non-privileged user invokes it, it should fail with OSError
|
|
|
|
# EPERM.
|
|
|
|
if os.getuid() != 0:
|
2012-05-02 15:01:38 -03:00
|
|
|
try:
|
|
|
|
name = pwd.getpwuid(posix.getuid()).pw_name
|
|
|
|
except KeyError:
|
|
|
|
# the current UID may not have a pwd entry
|
|
|
|
raise unittest.SkipTest("need a pwd entry")
|
2009-12-02 16:46:48 -04:00
|
|
|
try:
|
|
|
|
posix.initgroups(name, 13)
|
|
|
|
except OSError as e:
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(e.errno, errno.EPERM)
|
2009-12-02 16:46:48 -04:00
|
|
|
else:
|
|
|
|
self.fail("Expected OSError to be raised by initgroups")
|
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'statvfs'),
|
|
|
|
'test needs posix.statvfs()')
|
2003-02-17 14:17:05 -04:00
|
|
|
def test_statvfs(self):
|
2013-11-03 15:31:38 -04:00
|
|
|
self.assertTrue(posix.statvfs(os.curdir))
|
2003-02-17 14:17:05 -04:00
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'fstatvfs'),
|
|
|
|
'test needs posix.fstatvfs()')
|
2003-02-17 14:17:05 -04:00
|
|
|
def test_fstatvfs(self):
|
2013-11-03 15:31:38 -04:00
|
|
|
fp = open(support.TESTFN)
|
|
|
|
try:
|
|
|
|
self.assertTrue(posix.fstatvfs(fp.fileno()))
|
|
|
|
self.assertTrue(posix.statvfs(fp.fileno()))
|
|
|
|
finally:
|
|
|
|
fp.close()
|
2003-02-17 14:17:05 -04:00
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'ftruncate'),
|
|
|
|
'test needs posix.ftruncate()')
|
2003-02-17 14:17:05 -04:00
|
|
|
def test_ftruncate(self):
|
2013-11-03 15:31:38 -04:00
|
|
|
fp = open(support.TESTFN, 'w+')
|
|
|
|
try:
|
|
|
|
# we need to have some data to truncate
|
|
|
|
fp.write('test')
|
|
|
|
fp.flush()
|
|
|
|
posix.ftruncate(fp.fileno(), 0)
|
|
|
|
finally:
|
|
|
|
fp.close()
|
2003-02-17 14:17:05 -04:00
|
|
|
|
2011-03-17 15:20:30 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'truncate'), "test needs posix.truncate()")
|
|
|
|
def test_truncate(self):
|
|
|
|
with open(support.TESTFN, 'w') as fp:
|
|
|
|
fp.write('test')
|
|
|
|
fp.flush()
|
|
|
|
posix.truncate(support.TESTFN, 0)
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(getattr(os, 'execve', None) in os.supports_fd, "test needs execve() to support the fd parameter")
|
2011-03-17 15:20:30 -03:00
|
|
|
@unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
|
2011-03-20 13:27:05 -03:00
|
|
|
@unittest.skipUnless(hasattr(os, 'waitpid'), "test needs os.waitpid()")
|
2011-03-17 15:20:30 -03:00
|
|
|
def test_fexecve(self):
|
|
|
|
fp = os.open(sys.executable, os.O_RDONLY)
|
|
|
|
try:
|
|
|
|
pid = os.fork()
|
|
|
|
if pid == 0:
|
|
|
|
os.chdir(os.path.split(sys.executable)[0])
|
2012-06-22 20:30:09 -03:00
|
|
|
posix.execve(fp, [sys.executable, '-c', 'pass'], os.environ)
|
2011-03-17 15:20:30 -03:00
|
|
|
else:
|
2011-03-20 13:27:05 -03:00
|
|
|
self.assertEqual(os.waitpid(pid, 0), (pid, 0))
|
2011-03-17 15:20:30 -03:00
|
|
|
finally:
|
|
|
|
os.close(fp)
|
|
|
|
|
2018-01-28 21:56:10 -04:00
|
|
|
|
2011-03-17 15:20:30 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'waitid'), "test needs posix.waitid()")
|
|
|
|
@unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
|
|
|
|
def test_waitid(self):
|
|
|
|
pid = os.fork()
|
|
|
|
if pid == 0:
|
|
|
|
os.chdir(os.path.split(sys.executable)[0])
|
|
|
|
posix.execve(sys.executable, [sys.executable, '-c', 'pass'], os.environ)
|
|
|
|
else:
|
|
|
|
res = posix.waitid(posix.P_PID, pid, posix.WEXITED)
|
|
|
|
self.assertEqual(pid, res.si_pid)
|
|
|
|
|
2017-05-27 12:50:54 -03:00
|
|
|
@unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()")
|
2017-05-29 14:03:41 -03:00
|
|
|
def test_register_at_fork(self):
|
|
|
|
with self.assertRaises(TypeError, msg="Positional args not allowed"):
|
|
|
|
os.register_at_fork(lambda: None)
|
|
|
|
with self.assertRaises(TypeError, msg="Args must be callable"):
|
|
|
|
os.register_at_fork(before=2)
|
|
|
|
with self.assertRaises(TypeError, msg="Args must be callable"):
|
|
|
|
os.register_at_fork(after_in_child="three")
|
|
|
|
with self.assertRaises(TypeError, msg="Args must be callable"):
|
|
|
|
os.register_at_fork(after_in_parent=b"Five")
|
|
|
|
with self.assertRaises(TypeError, msg="Args must not be None"):
|
|
|
|
os.register_at_fork(before=None)
|
|
|
|
with self.assertRaises(TypeError, msg="Args must not be None"):
|
|
|
|
os.register_at_fork(after_in_child=None)
|
|
|
|
with self.assertRaises(TypeError, msg="Args must not be None"):
|
|
|
|
os.register_at_fork(after_in_parent=None)
|
|
|
|
with self.assertRaises(TypeError, msg="Invalid arg was allowed"):
|
|
|
|
# Ensure a combination of valid and invalid is an error.
|
|
|
|
os.register_at_fork(before=None, after_in_parent=lambda: 3)
|
|
|
|
with self.assertRaises(TypeError, msg="Invalid arg was allowed"):
|
|
|
|
# Ensure a combination of valid and invalid is an error.
|
|
|
|
os.register_at_fork(before=lambda: None, after_in_child='')
|
|
|
|
# We test actual registrations in their own process so as not to
|
|
|
|
# pollute this one. There is no way to unregister for cleanup.
|
2017-05-27 12:50:54 -03:00
|
|
|
code = """if 1:
|
|
|
|
import os
|
|
|
|
|
|
|
|
r, w = os.pipe()
|
|
|
|
fin_r, fin_w = os.pipe()
|
|
|
|
|
2017-05-29 14:03:41 -03:00
|
|
|
os.register_at_fork(before=lambda: os.write(w, b'A'))
|
|
|
|
os.register_at_fork(after_in_parent=lambda: os.write(w, b'C'))
|
|
|
|
os.register_at_fork(after_in_child=lambda: os.write(w, b'E'))
|
|
|
|
os.register_at_fork(before=lambda: os.write(w, b'B'),
|
|
|
|
after_in_parent=lambda: os.write(w, b'D'),
|
|
|
|
after_in_child=lambda: os.write(w, b'F'))
|
2017-05-27 12:50:54 -03:00
|
|
|
|
|
|
|
pid = os.fork()
|
|
|
|
if pid == 0:
|
|
|
|
# At this point, after-forkers have already been executed
|
|
|
|
os.close(w)
|
|
|
|
# Wait for parent to tell us to exit
|
|
|
|
os.read(fin_r, 1)
|
|
|
|
os._exit(0)
|
|
|
|
else:
|
|
|
|
try:
|
|
|
|
os.close(w)
|
|
|
|
with open(r, "rb") as f:
|
|
|
|
data = f.read()
|
|
|
|
assert len(data) == 6, data
|
|
|
|
# Check before-fork callbacks
|
|
|
|
assert data[:2] == b'BA', data
|
|
|
|
# Check after-fork callbacks
|
|
|
|
assert sorted(data[2:]) == list(b'CDEF'), data
|
|
|
|
assert data.index(b'C') < data.index(b'D'), data
|
|
|
|
assert data.index(b'E') < data.index(b'F'), data
|
|
|
|
finally:
|
|
|
|
os.write(fin_w, b'!')
|
|
|
|
"""
|
|
|
|
assert_python_ok('-c', code)
|
|
|
|
|
2011-03-17 15:20:30 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'lockf'), "test needs posix.lockf()")
|
|
|
|
def test_lockf(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
|
|
|
|
try:
|
|
|
|
os.write(fd, b'test')
|
|
|
|
os.lseek(fd, 0, os.SEEK_SET)
|
|
|
|
posix.lockf(fd, posix.F_LOCK, 4)
|
|
|
|
# section is locked
|
|
|
|
posix.lockf(fd, posix.F_ULOCK, 4)
|
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'pread'), "test needs posix.pread()")
|
|
|
|
def test_pread(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
|
|
|
|
try:
|
|
|
|
os.write(fd, b'test')
|
|
|
|
os.lseek(fd, 0, os.SEEK_SET)
|
|
|
|
self.assertEqual(b'es', posix.pread(fd, 2, 1))
|
2011-11-11 14:39:25 -04:00
|
|
|
# the first pread() shouldn't disturb the file offset
|
2011-03-17 15:20:30 -03:00
|
|
|
self.assertEqual(b'te', posix.read(fd, 2))
|
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
2018-01-27 12:16:37 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'preadv'), "test needs posix.preadv()")
|
|
|
|
def test_preadv(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
|
|
|
|
try:
|
|
|
|
os.write(fd, b'test1tt2t3t5t6t6t8')
|
|
|
|
buf = [bytearray(i) for i in [5, 3, 2]]
|
|
|
|
self.assertEqual(posix.preadv(fd, buf, 3), 10)
|
|
|
|
self.assertEqual([b't1tt2', b't3t', b'5t'], list(buf))
|
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
2018-07-31 04:24:54 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'preadv'), "test needs posix.preadv()")
|
2018-01-27 12:16:37 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'RWF_HIPRI'), "test needs posix.RWF_HIPRI")
|
|
|
|
def test_preadv_flags(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
|
|
|
|
try:
|
|
|
|
os.write(fd, b'test1tt2t3t5t6t6t8')
|
|
|
|
buf = [bytearray(i) for i in [5, 3, 2]]
|
|
|
|
self.assertEqual(posix.preadv(fd, buf, 3, os.RWF_HIPRI), 10)
|
|
|
|
self.assertEqual([b't1tt2', b't3t', b'5t'], list(buf))
|
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
2018-07-31 04:24:54 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'preadv'), "test needs posix.preadv()")
|
|
|
|
@requires_32b
|
|
|
|
def test_preadv_overflow_32bits(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
|
|
|
|
try:
|
|
|
|
buf = [bytearray(2**16)] * 2**15
|
|
|
|
with self.assertRaises(OSError) as cm:
|
|
|
|
os.preadv(fd, buf, 0)
|
|
|
|
self.assertEqual(cm.exception.errno, errno.EINVAL)
|
|
|
|
self.assertEqual(bytes(buf[0]), b'\0'* 2**16)
|
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
2011-03-17 15:20:30 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'pwrite'), "test needs posix.pwrite()")
|
|
|
|
def test_pwrite(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
|
|
|
|
try:
|
|
|
|
os.write(fd, b'test')
|
|
|
|
os.lseek(fd, 0, os.SEEK_SET)
|
|
|
|
posix.pwrite(fd, b'xx', 1)
|
|
|
|
self.assertEqual(b'txxt', posix.read(fd, 4))
|
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
2018-01-27 12:16:37 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'pwritev'), "test needs posix.pwritev()")
|
|
|
|
def test_pwritev(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
|
|
|
|
try:
|
|
|
|
os.write(fd, b"xx")
|
|
|
|
os.lseek(fd, 0, os.SEEK_SET)
|
|
|
|
n = os.pwritev(fd, [b'test1', b'tt2', b't3'], 2)
|
|
|
|
self.assertEqual(n, 10)
|
|
|
|
|
|
|
|
os.lseek(fd, 0, os.SEEK_SET)
|
|
|
|
self.assertEqual(b'xxtest1tt2t3', posix.read(fd, 100))
|
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
2018-07-31 04:24:54 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'pwritev'), "test needs posix.pwritev()")
|
2018-01-27 12:16:37 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'os.RWF_SYNC'), "test needs os.RWF_SYNC")
|
|
|
|
def test_pwritev_flags(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
|
|
|
|
try:
|
|
|
|
os.write(fd,b"xx")
|
|
|
|
os.lseek(fd, 0, os.SEEK_SET)
|
|
|
|
n = os.pwritev(fd, [b'test1', b'tt2', b't3'], 2, os.RWF_SYNC)
|
|
|
|
self.assertEqual(n, 10)
|
|
|
|
|
|
|
|
os.lseek(fd, 0, os.SEEK_SET)
|
|
|
|
self.assertEqual(b'xxtest1tt2', posix.read(fd, 100))
|
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
2018-07-31 04:24:54 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'pwritev'), "test needs posix.pwritev()")
|
|
|
|
@requires_32b
|
|
|
|
def test_pwritev_overflow_32bits(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
|
|
|
|
try:
|
|
|
|
with self.assertRaises(OSError) as cm:
|
|
|
|
os.pwritev(fd, [b"x" * 2**16] * 2**15, 0)
|
|
|
|
self.assertEqual(cm.exception.errno, errno.EINVAL)
|
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
2011-03-17 15:20:30 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'posix_fallocate'),
|
|
|
|
"test needs posix.posix_fallocate()")
|
|
|
|
def test_posix_fallocate(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT)
|
|
|
|
try:
|
|
|
|
posix.posix_fallocate(fd, 0, 10)
|
|
|
|
except OSError as inst:
|
|
|
|
# issue10812, ZFS doesn't appear to support posix_fallocate,
|
|
|
|
# so skip Solaris-based since they are likely to have ZFS.
|
2018-05-26 17:30:46 -03:00
|
|
|
# issue33655: Also ignore EINVAL on *BSD since ZFS is also
|
|
|
|
# often used there.
|
|
|
|
if inst.errno == errno.EINVAL and sys.platform.startswith(
|
|
|
|
('sunos', 'freebsd', 'netbsd', 'openbsd', 'gnukfreebsd')):
|
|
|
|
raise unittest.SkipTest("test may fail on ZFS filesystems")
|
|
|
|
else:
|
2011-03-17 15:20:30 -03:00
|
|
|
raise
|
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
2017-08-14 10:55:16 -03:00
|
|
|
# issue31106 - posix_fallocate() does not set error in errno.
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'posix_fallocate'),
|
|
|
|
"test needs posix.posix_fallocate()")
|
|
|
|
def test_posix_fallocate_errno(self):
|
|
|
|
try:
|
|
|
|
posix.posix_fallocate(-42, 0, 10)
|
|
|
|
except OSError as inst:
|
|
|
|
if inst.errno != errno.EBADF:
|
|
|
|
raise
|
|
|
|
|
2011-03-17 15:20:30 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'posix_fadvise'),
|
|
|
|
"test needs posix.posix_fadvise()")
|
|
|
|
def test_posix_fadvise(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_RDONLY)
|
|
|
|
try:
|
|
|
|
posix.posix_fadvise(fd, 0, 0, posix.POSIX_FADV_WILLNEED)
|
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
2017-08-14 10:55:16 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'posix_fadvise'),
|
|
|
|
"test needs posix.posix_fadvise()")
|
|
|
|
def test_posix_fadvise_errno(self):
|
|
|
|
try:
|
|
|
|
posix.posix_fadvise(-42, 0, 0, posix.POSIX_FADV_WILLNEED)
|
|
|
|
except OSError as inst:
|
|
|
|
if inst.errno != errno.EBADF:
|
|
|
|
raise
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(os.utime in os.supports_fd, "test needs fd support in os.utime")
|
|
|
|
def test_utime_with_fd(self):
|
2011-03-17 15:20:30 -03:00
|
|
|
now = time.time()
|
|
|
|
fd = os.open(support.TESTFN, os.O_RDONLY)
|
|
|
|
try:
|
2012-06-22 20:30:09 -03:00
|
|
|
posix.utime(fd)
|
|
|
|
posix.utime(fd, None)
|
|
|
|
self.assertRaises(TypeError, posix.utime, fd, (None, None))
|
|
|
|
self.assertRaises(TypeError, posix.utime, fd, (now, None))
|
|
|
|
self.assertRaises(TypeError, posix.utime, fd, (None, now))
|
|
|
|
posix.utime(fd, (int(now), int(now)))
|
|
|
|
posix.utime(fd, (now, now))
|
|
|
|
self.assertRaises(ValueError, posix.utime, fd, (now, now), ns=(now, now))
|
|
|
|
self.assertRaises(ValueError, posix.utime, fd, (now, 0), ns=(None, None))
|
|
|
|
self.assertRaises(ValueError, posix.utime, fd, (None, None), ns=(now, 0))
|
|
|
|
posix.utime(fd, (int(now), int((now - int(now)) * 1e9)))
|
|
|
|
posix.utime(fd, ns=(int(now), int((now - int(now)) * 1e9)))
|
|
|
|
|
2011-03-17 15:20:30 -03:00
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(os.utime in os.supports_follow_symlinks, "test needs follow_symlinks support in os.utime")
|
|
|
|
def test_utime_nofollow_symlinks(self):
|
2011-03-17 15:20:30 -03:00
|
|
|
now = time.time()
|
2012-06-22 20:30:09 -03:00
|
|
|
posix.utime(support.TESTFN, None, follow_symlinks=False)
|
|
|
|
self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), follow_symlinks=False)
|
|
|
|
self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), follow_symlinks=False)
|
|
|
|
self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), follow_symlinks=False)
|
|
|
|
posix.utime(support.TESTFN, (int(now), int(now)), follow_symlinks=False)
|
|
|
|
posix.utime(support.TESTFN, (now, now), follow_symlinks=False)
|
|
|
|
posix.utime(support.TESTFN, follow_symlinks=False)
|
2011-03-17 15:20:30 -03:00
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'writev'), "test needs posix.writev()")
|
|
|
|
def test_writev(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
|
|
|
|
try:
|
2014-01-08 10:21:28 -04:00
|
|
|
n = os.writev(fd, (b'test1', b'tt2', b't3'))
|
|
|
|
self.assertEqual(n, 10)
|
|
|
|
|
2011-03-17 15:20:30 -03:00
|
|
|
os.lseek(fd, 0, os.SEEK_SET)
|
|
|
|
self.assertEqual(b'test1tt2t3', posix.read(fd, 10))
|
2014-01-08 10:21:28 -04:00
|
|
|
|
|
|
|
# Issue #20113: empty list of buffers should not crash
|
2014-01-08 11:01:31 -04:00
|
|
|
try:
|
|
|
|
size = posix.writev(fd, [])
|
|
|
|
except OSError:
|
|
|
|
# writev(fd, []) raises OSError(22, "Invalid argument")
|
|
|
|
# on OpenIndiana
|
|
|
|
pass
|
|
|
|
else:
|
|
|
|
self.assertEqual(size, 0)
|
2011-03-17 15:20:30 -03:00
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
2018-07-31 04:24:54 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'writev'), "test needs posix.writev()")
|
|
|
|
@requires_32b
|
|
|
|
def test_writev_overflow_32bits(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
|
|
|
|
try:
|
|
|
|
with self.assertRaises(OSError) as cm:
|
|
|
|
os.writev(fd, [b"x" * 2**16] * 2**15)
|
|
|
|
self.assertEqual(cm.exception.errno, errno.EINVAL)
|
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
2011-03-17 15:20:30 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'readv'), "test needs posix.readv()")
|
|
|
|
def test_readv(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
|
|
|
|
try:
|
|
|
|
os.write(fd, b'test1tt2t3')
|
|
|
|
os.lseek(fd, 0, os.SEEK_SET)
|
|
|
|
buf = [bytearray(i) for i in [5, 3, 2]]
|
|
|
|
self.assertEqual(posix.readv(fd, buf), 10)
|
|
|
|
self.assertEqual([b'test1', b'tt2', b't3'], [bytes(i) for i in buf])
|
2014-01-08 10:21:28 -04:00
|
|
|
|
|
|
|
# Issue #20113: empty list of buffers should not crash
|
2014-01-08 11:01:31 -04:00
|
|
|
try:
|
|
|
|
size = posix.readv(fd, [])
|
|
|
|
except OSError:
|
|
|
|
# readv(fd, []) raises OSError(22, "Invalid argument")
|
|
|
|
# on OpenIndiana
|
|
|
|
pass
|
|
|
|
else:
|
|
|
|
self.assertEqual(size, 0)
|
2011-03-17 15:20:30 -03:00
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
2018-07-31 04:24:54 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'readv'), "test needs posix.readv()")
|
|
|
|
@requires_32b
|
|
|
|
def test_readv_overflow_32bits(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_RDWR | os.O_CREAT)
|
|
|
|
try:
|
|
|
|
buf = [bytearray(2**16)] * 2**15
|
|
|
|
with self.assertRaises(OSError) as cm:
|
|
|
|
os.readv(fd, buf)
|
|
|
|
self.assertEqual(cm.exception.errno, errno.EINVAL)
|
|
|
|
self.assertEqual(bytes(buf[0]), b'\0'* 2**16)
|
|
|
|
finally:
|
|
|
|
os.close(fd)
|
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'dup'),
|
|
|
|
'test needs posix.dup()')
|
2003-02-17 14:17:05 -04:00
|
|
|
def test_dup(self):
|
2013-11-03 15:31:38 -04:00
|
|
|
fp = open(support.TESTFN)
|
|
|
|
try:
|
|
|
|
fd = posix.dup(fp.fileno())
|
|
|
|
self.assertIsInstance(fd, int)
|
|
|
|
os.close(fd)
|
|
|
|
finally:
|
|
|
|
fp.close()
|
2003-02-17 14:17:05 -04:00
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'confstr'),
|
|
|
|
'test needs posix.confstr()')
|
2006-04-21 07:40:58 -03:00
|
|
|
def test_confstr(self):
|
2013-11-03 15:31:38 -04:00
|
|
|
self.assertRaises(ValueError, posix.confstr, "CS_garbage")
|
|
|
|
self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
|
2006-04-21 07:40:58 -03:00
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'dup2'),
|
|
|
|
'test needs posix.dup2()')
|
2003-02-17 14:17:05 -04:00
|
|
|
def test_dup2(self):
|
2013-11-03 15:31:38 -04:00
|
|
|
fp1 = open(support.TESTFN)
|
|
|
|
fp2 = open(support.TESTFN)
|
|
|
|
try:
|
|
|
|
posix.dup2(fp1.fileno(), fp2.fileno())
|
|
|
|
finally:
|
|
|
|
fp1.close()
|
|
|
|
fp2.close()
|
2003-02-17 14:17:05 -04:00
|
|
|
|
2011-05-22 15:42:32 -03:00
|
|
|
@unittest.skipUnless(hasattr(os, 'O_CLOEXEC'), "needs os.O_CLOEXEC")
|
2011-06-03 07:55:15 -03:00
|
|
|
@support.requires_linux_version(2, 6, 23)
|
2011-05-22 15:42:32 -03:00
|
|
|
def test_oscloexec(self):
|
|
|
|
fd = os.open(support.TESTFN, os.O_RDONLY|os.O_CLOEXEC)
|
|
|
|
self.addCleanup(os.close, fd)
|
2014-07-29 17:32:47 -03:00
|
|
|
self.assertFalse(os.get_inheritable(fd))
|
2011-05-22 15:42:32 -03:00
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'O_EXLOCK'),
|
|
|
|
'test needs posix.O_EXLOCK')
|
2005-06-16 22:14:49 -03:00
|
|
|
def test_osexlock(self):
|
2013-11-03 15:31:38 -04:00
|
|
|
fd = os.open(support.TESTFN,
|
|
|
|
os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
|
|
|
|
self.assertRaises(OSError, os.open, support.TESTFN,
|
|
|
|
os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
|
|
|
|
os.close(fd)
|
|
|
|
|
|
|
|
if hasattr(posix, "O_SHLOCK"):
|
2008-05-20 18:35:26 -03:00
|
|
|
fd = os.open(support.TESTFN,
|
2013-11-03 15:31:38 -04:00
|
|
|
os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
|
2008-05-20 18:35:26 -03:00
|
|
|
self.assertRaises(OSError, os.open, support.TESTFN,
|
2005-06-16 22:14:49 -03:00
|
|
|
os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
|
|
|
|
os.close(fd)
|
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'O_SHLOCK'),
|
|
|
|
'test needs posix.O_SHLOCK')
|
2005-06-16 22:14:49 -03:00
|
|
|
def test_osshlock(self):
|
2013-11-03 15:31:38 -04:00
|
|
|
fd1 = os.open(support.TESTFN,
|
|
|
|
os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
|
|
|
|
fd2 = os.open(support.TESTFN,
|
|
|
|
os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
|
|
|
|
os.close(fd2)
|
|
|
|
os.close(fd1)
|
|
|
|
|
|
|
|
if hasattr(posix, "O_EXLOCK"):
|
|
|
|
fd = os.open(support.TESTFN,
|
2005-06-16 22:14:49 -03:00
|
|
|
os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
|
2013-11-03 15:31:38 -04:00
|
|
|
self.assertRaises(OSError, os.open, support.TESTFN,
|
|
|
|
os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
|
|
|
|
os.close(fd)
|
2005-06-16 22:14:49 -03:00
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'fstat'),
|
|
|
|
'test needs posix.fstat()')
|
2003-02-17 14:17:05 -04:00
|
|
|
def test_fstat(self):
|
2013-11-03 15:31:38 -04:00
|
|
|
fp = open(support.TESTFN)
|
|
|
|
try:
|
|
|
|
self.assertTrue(posix.fstat(fp.fileno()))
|
|
|
|
self.assertTrue(posix.stat(fp.fileno()))
|
2013-01-07 17:13:46 -04:00
|
|
|
|
|
|
|
self.assertRaisesRegex(TypeError,
|
2016-08-26 18:44:48 -03:00
|
|
|
'should be string, bytes, os.PathLike or integer, not',
|
2013-11-03 15:31:38 -04:00
|
|
|
posix.stat, float(fp.fileno()))
|
|
|
|
finally:
|
|
|
|
fp.close()
|
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'stat'),
|
|
|
|
'test needs posix.stat()')
|
|
|
|
def test_stat(self):
|
|
|
|
self.assertTrue(posix.stat(support.TESTFN))
|
|
|
|
self.assertTrue(posix.stat(os.fsencode(support.TESTFN)))
|
|
|
|
|
2016-08-06 17:22:08 -03:00
|
|
|
self.assertWarnsRegex(DeprecationWarning,
|
2016-08-26 18:44:48 -03:00
|
|
|
'should be string, bytes, os.PathLike or integer, not',
|
2016-08-06 17:22:08 -03:00
|
|
|
posix.stat, bytearray(os.fsencode(support.TESTFN)))
|
2013-11-03 15:31:38 -04:00
|
|
|
self.assertRaisesRegex(TypeError,
|
2016-08-26 18:44:48 -03:00
|
|
|
'should be string, bytes, os.PathLike or integer, not',
|
2013-11-03 15:31:38 -04:00
|
|
|
posix.stat, None)
|
|
|
|
self.assertRaisesRegex(TypeError,
|
2016-08-26 18:44:48 -03:00
|
|
|
'should be string, bytes, os.PathLike or integer, not',
|
2013-11-03 15:31:38 -04:00
|
|
|
posix.stat, list(support.TESTFN))
|
|
|
|
self.assertRaisesRegex(TypeError,
|
2016-08-26 18:44:48 -03:00
|
|
|
'should be string, bytes, os.PathLike or integer, not',
|
2013-11-03 15:31:38 -04:00
|
|
|
posix.stat, list(os.fsencode(support.TESTFN)))
|
2003-02-17 14:17:05 -04:00
|
|
|
|
2010-08-16 22:27:09 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'mkfifo'), "don't have mkfifo()")
|
|
|
|
def test_mkfifo(self):
|
|
|
|
support.unlink(support.TESTFN)
|
2017-11-12 12:31:07 -04:00
|
|
|
try:
|
|
|
|
posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
|
|
|
|
except PermissionError as e:
|
|
|
|
self.skipTest('posix.mkfifo(): %s' % e)
|
2010-08-16 22:27:09 -03:00
|
|
|
self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
|
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'mknod') and hasattr(stat, 'S_IFIFO'),
|
|
|
|
"don't have mknod()/S_IFIFO")
|
|
|
|
def test_mknod(self):
|
|
|
|
# Test using mknod() to create a FIFO (the only use specified
|
|
|
|
# by POSIX).
|
|
|
|
support.unlink(support.TESTFN)
|
|
|
|
mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
|
|
|
|
try:
|
|
|
|
posix.mknod(support.TESTFN, mode, 0)
|
|
|
|
except OSError as e:
|
|
|
|
# Some old systems don't allow unprivileged users to use
|
|
|
|
# mknod(), or only support creating device nodes.
|
2017-11-12 12:31:07 -04:00
|
|
|
self.assertIn(e.errno, (errno.EPERM, errno.EINVAL, errno.EACCES))
|
2010-08-16 22:27:09 -03:00
|
|
|
else:
|
|
|
|
self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
|
|
|
|
|
2015-09-08 22:01:13 -03:00
|
|
|
# Keyword arguments are also supported
|
|
|
|
support.unlink(support.TESTFN)
|
|
|
|
try:
|
|
|
|
posix.mknod(path=support.TESTFN, mode=mode, device=0,
|
|
|
|
dir_fd=None)
|
|
|
|
except OSError as e:
|
2017-11-12 12:31:07 -04:00
|
|
|
self.assertIn(e.errno, (errno.EPERM, errno.EINVAL, errno.EACCES))
|
2015-09-08 22:01:13 -03:00
|
|
|
|
2015-04-20 03:22:13 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'stat'), 'test needs posix.stat()')
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'makedev'), 'test needs posix.makedev()')
|
|
|
|
def test_makedev(self):
|
|
|
|
st = posix.stat(support.TESTFN)
|
|
|
|
dev = st.st_dev
|
|
|
|
self.assertIsInstance(dev, int)
|
|
|
|
self.assertGreaterEqual(dev, 0)
|
|
|
|
|
|
|
|
major = posix.major(dev)
|
|
|
|
self.assertIsInstance(major, int)
|
|
|
|
self.assertGreaterEqual(major, 0)
|
|
|
|
self.assertEqual(posix.major(dev), major)
|
|
|
|
self.assertRaises(TypeError, posix.major, float(dev))
|
|
|
|
self.assertRaises(TypeError, posix.major)
|
|
|
|
self.assertRaises((ValueError, OverflowError), posix.major, -1)
|
|
|
|
|
|
|
|
minor = posix.minor(dev)
|
|
|
|
self.assertIsInstance(minor, int)
|
|
|
|
self.assertGreaterEqual(minor, 0)
|
|
|
|
self.assertEqual(posix.minor(dev), minor)
|
|
|
|
self.assertRaises(TypeError, posix.minor, float(dev))
|
|
|
|
self.assertRaises(TypeError, posix.minor)
|
|
|
|
self.assertRaises((ValueError, OverflowError), posix.minor, -1)
|
|
|
|
|
|
|
|
self.assertEqual(posix.makedev(major, minor), dev)
|
|
|
|
self.assertRaises(TypeError, posix.makedev, float(major), minor)
|
|
|
|
self.assertRaises(TypeError, posix.makedev, major, float(minor))
|
|
|
|
self.assertRaises(TypeError, posix.makedev, major)
|
|
|
|
self.assertRaises(TypeError, posix.makedev)
|
|
|
|
|
2013-02-10 15:56:49 -04:00
|
|
|
def _test_all_chown_common(self, chown_func, first_param, stat_func):
|
Merged revisions 76847,76851,76869,76882,76891-76892,76924,77007,77070,77092,77096,77120,77126,77155 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r76847 | benjamin.peterson | 2009-12-14 21:25:27 -0600 (Mon, 14 Dec 2009) | 1 line
adverb
........
r76851 | benjamin.peterson | 2009-12-15 21:28:52 -0600 (Tue, 15 Dec 2009) | 1 line
remove lib2to3 resource
........
r76869 | vinay.sajip | 2009-12-17 08:52:00 -0600 (Thu, 17 Dec 2009) | 1 line
Issue #7529: logging: Minor correction to documentation.
........
r76882 | georg.brandl | 2009-12-19 11:30:28 -0600 (Sat, 19 Dec 2009) | 1 line
#7527: use standard versionadded tags.
........
r76891 | georg.brandl | 2009-12-19 12:16:31 -0600 (Sat, 19 Dec 2009) | 1 line
#7479: add note about function availability on Unices.
........
r76892 | georg.brandl | 2009-12-19 12:20:18 -0600 (Sat, 19 Dec 2009) | 1 line
#7480: remove tautology.
........
r76924 | georg.brandl | 2009-12-20 08:28:05 -0600 (Sun, 20 Dec 2009) | 1 line
Small indentation fix.
........
r77007 | gregory.p.smith | 2009-12-23 03:31:11 -0600 (Wed, 23 Dec 2009) | 3 lines
Fix possible integer overflow in lchown and fchown functions. For issue1747858.
........
r77070 | amaury.forgeotdarc | 2009-12-27 14:06:44 -0600 (Sun, 27 Dec 2009) | 2 lines
Fix a typo in comment
........
r77092 | georg.brandl | 2009-12-28 02:48:24 -0600 (Mon, 28 Dec 2009) | 1 line
#7404: remove reference to non-existing example files.
........
r77096 | benjamin.peterson | 2009-12-28 14:51:17 -0600 (Mon, 28 Dec 2009) | 1 line
document new fix_callable behavior
........
r77120 | georg.brandl | 2009-12-29 15:09:17 -0600 (Tue, 29 Dec 2009) | 1 line
#7595: fix typo in argument default constant.
........
r77126 | amaury.forgeotdarc | 2009-12-29 17:06:17 -0600 (Tue, 29 Dec 2009) | 2 lines
#7579: Add docstrings to the msvcrt module
........
r77155 | georg.brandl | 2009-12-30 13:03:00 -0600 (Wed, 30 Dec 2009) | 1 line
We only support Windows NT derivatives now.
........
2009-12-30 23:11:23 -04:00
|
|
|
"""Common code for chown, fchown and lchown tests."""
|
2013-02-20 13:40:25 -04:00
|
|
|
def check_stat(uid, gid):
|
2013-02-10 15:56:49 -04:00
|
|
|
if stat_func is not None:
|
|
|
|
stat = stat_func(first_param)
|
2013-02-20 13:40:25 -04:00
|
|
|
self.assertEqual(stat.st_uid, uid)
|
|
|
|
self.assertEqual(stat.st_gid, gid)
|
|
|
|
uid = os.getuid()
|
|
|
|
gid = os.getgid()
|
2012-04-17 14:48:35 -03:00
|
|
|
# test a successful chown call
|
2013-02-20 13:40:25 -04:00
|
|
|
chown_func(first_param, uid, gid)
|
|
|
|
check_stat(uid, gid)
|
|
|
|
chown_func(first_param, -1, gid)
|
|
|
|
check_stat(uid, gid)
|
|
|
|
chown_func(first_param, uid, -1)
|
|
|
|
check_stat(uid, gid)
|
|
|
|
|
|
|
|
if uid == 0:
|
|
|
|
# Try an amusingly large uid/gid to make sure we handle
|
|
|
|
# large unsigned values. (chown lets you use any
|
|
|
|
# uid/gid you like, even if they aren't defined.)
|
|
|
|
#
|
|
|
|
# This problem keeps coming up:
|
|
|
|
# http://bugs.python.org/issue1747858
|
|
|
|
# http://bugs.python.org/issue4591
|
|
|
|
# http://bugs.python.org/issue15301
|
|
|
|
# Hopefully the fix in 4591 fixes it for good!
|
|
|
|
#
|
|
|
|
# This part of the test only runs when run as root.
|
|
|
|
# Only scary people run their tests as root.
|
|
|
|
|
|
|
|
big_value = 2**31
|
|
|
|
chown_func(first_param, big_value, big_value)
|
|
|
|
check_stat(big_value, big_value)
|
|
|
|
chown_func(first_param, -1, -1)
|
|
|
|
check_stat(big_value, big_value)
|
|
|
|
chown_func(first_param, uid, gid)
|
|
|
|
check_stat(uid, gid)
|
2012-04-17 14:48:35 -03:00
|
|
|
elif platform.system() in ('HP-UX', 'SunOS'):
|
|
|
|
# HP-UX and Solaris can allow a non-root user to chown() to root
|
|
|
|
# (issue #5113)
|
|
|
|
raise unittest.SkipTest("Skipping because of non-standard chown() "
|
|
|
|
"behavior")
|
Merged revisions 76847,76851,76869,76882,76891-76892,76924,77007,77070,77092,77096,77120,77126,77155 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r76847 | benjamin.peterson | 2009-12-14 21:25:27 -0600 (Mon, 14 Dec 2009) | 1 line
adverb
........
r76851 | benjamin.peterson | 2009-12-15 21:28:52 -0600 (Tue, 15 Dec 2009) | 1 line
remove lib2to3 resource
........
r76869 | vinay.sajip | 2009-12-17 08:52:00 -0600 (Thu, 17 Dec 2009) | 1 line
Issue #7529: logging: Minor correction to documentation.
........
r76882 | georg.brandl | 2009-12-19 11:30:28 -0600 (Sat, 19 Dec 2009) | 1 line
#7527: use standard versionadded tags.
........
r76891 | georg.brandl | 2009-12-19 12:16:31 -0600 (Sat, 19 Dec 2009) | 1 line
#7479: add note about function availability on Unices.
........
r76892 | georg.brandl | 2009-12-19 12:20:18 -0600 (Sat, 19 Dec 2009) | 1 line
#7480: remove tautology.
........
r76924 | georg.brandl | 2009-12-20 08:28:05 -0600 (Sun, 20 Dec 2009) | 1 line
Small indentation fix.
........
r77007 | gregory.p.smith | 2009-12-23 03:31:11 -0600 (Wed, 23 Dec 2009) | 3 lines
Fix possible integer overflow in lchown and fchown functions. For issue1747858.
........
r77070 | amaury.forgeotdarc | 2009-12-27 14:06:44 -0600 (Sun, 27 Dec 2009) | 2 lines
Fix a typo in comment
........
r77092 | georg.brandl | 2009-12-28 02:48:24 -0600 (Mon, 28 Dec 2009) | 1 line
#7404: remove reference to non-existing example files.
........
r77096 | benjamin.peterson | 2009-12-28 14:51:17 -0600 (Mon, 28 Dec 2009) | 1 line
document new fix_callable behavior
........
r77120 | georg.brandl | 2009-12-29 15:09:17 -0600 (Tue, 29 Dec 2009) | 1 line
#7595: fix typo in argument default constant.
........
r77126 | amaury.forgeotdarc | 2009-12-29 17:06:17 -0600 (Tue, 29 Dec 2009) | 2 lines
#7579: Add docstrings to the msvcrt module
........
r77155 | georg.brandl | 2009-12-30 13:03:00 -0600 (Wed, 30 Dec 2009) | 1 line
We only support Windows NT derivatives now.
........
2009-12-30 23:11:23 -04:00
|
|
|
else:
|
|
|
|
# non-root cannot chown to root, raises OSError
|
2013-02-10 15:56:49 -04:00
|
|
|
self.assertRaises(OSError, chown_func, first_param, 0, 0)
|
2013-02-20 13:40:25 -04:00
|
|
|
check_stat(uid, gid)
|
2013-02-10 15:56:49 -04:00
|
|
|
self.assertRaises(OSError, chown_func, first_param, 0, -1)
|
2013-02-20 13:40:25 -04:00
|
|
|
check_stat(uid, gid)
|
2013-02-21 08:34:36 -04:00
|
|
|
if 0 not in os.getgroups():
|
2013-02-20 13:48:22 -04:00
|
|
|
self.assertRaises(OSError, chown_func, first_param, -1, 0)
|
|
|
|
check_stat(uid, gid)
|
2013-02-20 13:40:25 -04:00
|
|
|
# test illegal types
|
|
|
|
for t in str, float:
|
|
|
|
self.assertRaises(TypeError, chown_func, first_param, t(uid), gid)
|
|
|
|
check_stat(uid, gid)
|
|
|
|
self.assertRaises(TypeError, chown_func, first_param, uid, t(gid))
|
|
|
|
check_stat(uid, gid)
|
Merged revisions 76847,76851,76869,76882,76891-76892,76924,77007,77070,77092,77096,77120,77126,77155 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r76847 | benjamin.peterson | 2009-12-14 21:25:27 -0600 (Mon, 14 Dec 2009) | 1 line
adverb
........
r76851 | benjamin.peterson | 2009-12-15 21:28:52 -0600 (Tue, 15 Dec 2009) | 1 line
remove lib2to3 resource
........
r76869 | vinay.sajip | 2009-12-17 08:52:00 -0600 (Thu, 17 Dec 2009) | 1 line
Issue #7529: logging: Minor correction to documentation.
........
r76882 | georg.brandl | 2009-12-19 11:30:28 -0600 (Sat, 19 Dec 2009) | 1 line
#7527: use standard versionadded tags.
........
r76891 | georg.brandl | 2009-12-19 12:16:31 -0600 (Sat, 19 Dec 2009) | 1 line
#7479: add note about function availability on Unices.
........
r76892 | georg.brandl | 2009-12-19 12:20:18 -0600 (Sat, 19 Dec 2009) | 1 line
#7480: remove tautology.
........
r76924 | georg.brandl | 2009-12-20 08:28:05 -0600 (Sun, 20 Dec 2009) | 1 line
Small indentation fix.
........
r77007 | gregory.p.smith | 2009-12-23 03:31:11 -0600 (Wed, 23 Dec 2009) | 3 lines
Fix possible integer overflow in lchown and fchown functions. For issue1747858.
........
r77070 | amaury.forgeotdarc | 2009-12-27 14:06:44 -0600 (Sun, 27 Dec 2009) | 2 lines
Fix a typo in comment
........
r77092 | georg.brandl | 2009-12-28 02:48:24 -0600 (Mon, 28 Dec 2009) | 1 line
#7404: remove reference to non-existing example files.
........
r77096 | benjamin.peterson | 2009-12-28 14:51:17 -0600 (Mon, 28 Dec 2009) | 1 line
document new fix_callable behavior
........
r77120 | georg.brandl | 2009-12-29 15:09:17 -0600 (Tue, 29 Dec 2009) | 1 line
#7595: fix typo in argument default constant.
........
r77126 | amaury.forgeotdarc | 2009-12-29 17:06:17 -0600 (Tue, 29 Dec 2009) | 2 lines
#7579: Add docstrings to the msvcrt module
........
r77155 | georg.brandl | 2009-12-30 13:03:00 -0600 (Wed, 30 Dec 2009) | 1 line
We only support Windows NT derivatives now.
........
2009-12-30 23:11:23 -04:00
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
|
|
|
|
def test_chown(self):
|
|
|
|
# raise an OSError if the file does not exist
|
|
|
|
os.unlink(support.TESTFN)
|
|
|
|
self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
|
|
|
|
|
|
|
|
# re-create the file
|
2011-06-30 18:25:47 -03:00
|
|
|
support.create_empty_file(support.TESTFN)
|
2013-02-10 15:56:49 -04:00
|
|
|
self._test_all_chown_common(posix.chown, support.TESTFN,
|
|
|
|
getattr(posix, 'stat', None))
|
Merged revisions 76847,76851,76869,76882,76891-76892,76924,77007,77070,77092,77096,77120,77126,77155 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r76847 | benjamin.peterson | 2009-12-14 21:25:27 -0600 (Mon, 14 Dec 2009) | 1 line
adverb
........
r76851 | benjamin.peterson | 2009-12-15 21:28:52 -0600 (Tue, 15 Dec 2009) | 1 line
remove lib2to3 resource
........
r76869 | vinay.sajip | 2009-12-17 08:52:00 -0600 (Thu, 17 Dec 2009) | 1 line
Issue #7529: logging: Minor correction to documentation.
........
r76882 | georg.brandl | 2009-12-19 11:30:28 -0600 (Sat, 19 Dec 2009) | 1 line
#7527: use standard versionadded tags.
........
r76891 | georg.brandl | 2009-12-19 12:16:31 -0600 (Sat, 19 Dec 2009) | 1 line
#7479: add note about function availability on Unices.
........
r76892 | georg.brandl | 2009-12-19 12:20:18 -0600 (Sat, 19 Dec 2009) | 1 line
#7480: remove tautology.
........
r76924 | georg.brandl | 2009-12-20 08:28:05 -0600 (Sun, 20 Dec 2009) | 1 line
Small indentation fix.
........
r77007 | gregory.p.smith | 2009-12-23 03:31:11 -0600 (Wed, 23 Dec 2009) | 3 lines
Fix possible integer overflow in lchown and fchown functions. For issue1747858.
........
r77070 | amaury.forgeotdarc | 2009-12-27 14:06:44 -0600 (Sun, 27 Dec 2009) | 2 lines
Fix a typo in comment
........
r77092 | georg.brandl | 2009-12-28 02:48:24 -0600 (Mon, 28 Dec 2009) | 1 line
#7404: remove reference to non-existing example files.
........
r77096 | benjamin.peterson | 2009-12-28 14:51:17 -0600 (Mon, 28 Dec 2009) | 1 line
document new fix_callable behavior
........
r77120 | georg.brandl | 2009-12-29 15:09:17 -0600 (Tue, 29 Dec 2009) | 1 line
#7595: fix typo in argument default constant.
........
r77126 | amaury.forgeotdarc | 2009-12-29 17:06:17 -0600 (Tue, 29 Dec 2009) | 2 lines
#7579: Add docstrings to the msvcrt module
........
r77155 | georg.brandl | 2009-12-30 13:03:00 -0600 (Wed, 30 Dec 2009) | 1 line
We only support Windows NT derivatives now.
........
2009-12-30 23:11:23 -04:00
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
|
|
|
|
def test_fchown(self):
|
|
|
|
os.unlink(support.TESTFN)
|
|
|
|
|
|
|
|
# re-create the file
|
|
|
|
test_file = open(support.TESTFN, 'w')
|
|
|
|
try:
|
|
|
|
fd = test_file.fileno()
|
2013-02-10 15:56:49 -04:00
|
|
|
self._test_all_chown_common(posix.fchown, fd,
|
|
|
|
getattr(posix, 'fstat', None))
|
Merged revisions 76847,76851,76869,76882,76891-76892,76924,77007,77070,77092,77096,77120,77126,77155 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r76847 | benjamin.peterson | 2009-12-14 21:25:27 -0600 (Mon, 14 Dec 2009) | 1 line
adverb
........
r76851 | benjamin.peterson | 2009-12-15 21:28:52 -0600 (Tue, 15 Dec 2009) | 1 line
remove lib2to3 resource
........
r76869 | vinay.sajip | 2009-12-17 08:52:00 -0600 (Thu, 17 Dec 2009) | 1 line
Issue #7529: logging: Minor correction to documentation.
........
r76882 | georg.brandl | 2009-12-19 11:30:28 -0600 (Sat, 19 Dec 2009) | 1 line
#7527: use standard versionadded tags.
........
r76891 | georg.brandl | 2009-12-19 12:16:31 -0600 (Sat, 19 Dec 2009) | 1 line
#7479: add note about function availability on Unices.
........
r76892 | georg.brandl | 2009-12-19 12:20:18 -0600 (Sat, 19 Dec 2009) | 1 line
#7480: remove tautology.
........
r76924 | georg.brandl | 2009-12-20 08:28:05 -0600 (Sun, 20 Dec 2009) | 1 line
Small indentation fix.
........
r77007 | gregory.p.smith | 2009-12-23 03:31:11 -0600 (Wed, 23 Dec 2009) | 3 lines
Fix possible integer overflow in lchown and fchown functions. For issue1747858.
........
r77070 | amaury.forgeotdarc | 2009-12-27 14:06:44 -0600 (Sun, 27 Dec 2009) | 2 lines
Fix a typo in comment
........
r77092 | georg.brandl | 2009-12-28 02:48:24 -0600 (Mon, 28 Dec 2009) | 1 line
#7404: remove reference to non-existing example files.
........
r77096 | benjamin.peterson | 2009-12-28 14:51:17 -0600 (Mon, 28 Dec 2009) | 1 line
document new fix_callable behavior
........
r77120 | georg.brandl | 2009-12-29 15:09:17 -0600 (Tue, 29 Dec 2009) | 1 line
#7595: fix typo in argument default constant.
........
r77126 | amaury.forgeotdarc | 2009-12-29 17:06:17 -0600 (Tue, 29 Dec 2009) | 2 lines
#7579: Add docstrings to the msvcrt module
........
r77155 | georg.brandl | 2009-12-30 13:03:00 -0600 (Wed, 30 Dec 2009) | 1 line
We only support Windows NT derivatives now.
........
2009-12-30 23:11:23 -04:00
|
|
|
finally:
|
|
|
|
test_file.close()
|
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
|
|
|
|
def test_lchown(self):
|
|
|
|
os.unlink(support.TESTFN)
|
|
|
|
# create a symlink
|
2011-06-28 04:00:28 -03:00
|
|
|
os.symlink(_DUMMY_SYMLINK, support.TESTFN)
|
2013-02-10 15:56:49 -04:00
|
|
|
self._test_all_chown_common(posix.lchown, support.TESTFN,
|
|
|
|
getattr(posix, 'lstat', None))
|
Merged revisions 61538-61540,61556,61559-61560,61563,61565,61571,61575-61576,61580-61582,61586,61591,61593,61595,61605-61606,61613-61616,61618,61621-61623,61625,61627,61631-61634 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r61538 | steven.bethard | 2008-03-18 20:03:50 +0100 (Di, 18 Mär 2008) | 1 line
cell_compare needs to return -2 instead of NULL.
........
r61539 | steven.bethard | 2008-03-18 20:04:32 +0100 (Di, 18 Mär 2008) | 1 line
_have_soundcard() is a bad check for winsound.Beep, since you can have a soundcard but have the beep driver disabled. This revision basically disables the beep tests by wrapping them in a try/except. The Right Way To Do It is to come up with a _have_enabled_beep_driver() and use that.
........
r61540 | gregory.p.smith | 2008-03-18 20:05:32 +0100 (Di, 18 Mär 2008) | 8 lines
Fix chown on 64-bit linux. It needed to take a long (64-bit on 64bit linux) as
uid and gid input to accept values >=2**31 as valid while still accepting
negative numbers to pass -1 to chown for "no change".
Fixes issue1747858.
This should be backported to release25-maint.
........
r61556 | steven.bethard | 2008-03-18 20:59:14 +0100 (Di, 18 Mär 2008) | 1 line
Fix test_atexit so that it still passes when -3 is supplied. (It was catching the warning messages on stdio from using the reload() function.)
........
r61559 | neal.norwitz | 2008-03-18 21:30:38 +0100 (Di, 18 Mär 2008) | 1 line
Import the test properly. This is especially important for py3k.
........
r61560 | gregory.p.smith | 2008-03-18 21:40:01 +0100 (Di, 18 Mär 2008) | 2 lines
news entry for the chown fix
........
r61563 | brett.cannon | 2008-03-18 22:12:42 +0100 (Di, 18 Mär 2008) | 2 lines
Ignore BIG5HKSCS-2004.TXT which is downloaded as part of a test.
........
r61565 | steven.bethard | 2008-03-18 22:30:13 +0100 (Di, 18 Mär 2008) | 1 line
Have regrtest skip test_py3kwarn when the -3 flag is missing.
........
r61571 | gregory.p.smith | 2008-03-18 23:27:41 +0100 (Di, 18 Mär 2008) | 4 lines
Add a test to make sure zlib.crc32 and binascii.crc32 return the same thing.
Fix a buglet in binascii.crc32, the second optional argument could previously
have a signedness mismatch with the C variable its going into.
........
r61575 | raymond.hettinger | 2008-03-19 00:22:29 +0100 (Mi, 19 Mär 2008) | 1 line
Speed-up isinstance() for one easy case.
........
r61576 | raymond.hettinger | 2008-03-19 00:33:08 +0100 (Mi, 19 Mär 2008) | 1 line
Issue: 2354: Add 3K warning for the cmp argument to list.sort() and sorted().
........
r61580 | andrew.kuchling | 2008-03-19 02:05:35 +0100 (Mi, 19 Mär 2008) | 1 line
Add Jeff Rush
........
r61581 | gregory.p.smith | 2008-03-19 02:38:35 +0100 (Mi, 19 Mär 2008) | 3 lines
Mention that crc32 and adler32 are available in a different module (zlib).
Some people look for them in hashlib.
........
r61582 | gregory.p.smith | 2008-03-19 02:46:10 +0100 (Mi, 19 Mär 2008) | 3 lines
Use zlib's crc32 routine instead of binascii when available. zlib's is faster
when compiled properly optimized and about the same speed otherwise.
........
r61586 | david.wolever | 2008-03-19 03:26:57 +0100 (Mi, 19 Mär 2008) | 1 line
Added my name to ACKS
........
r61591 | gregory.p.smith | 2008-03-19 04:14:41 +0100 (Mi, 19 Mär 2008) | 5 lines
Fix the struct module DeprecationWarnings that zipfile was triggering by
removing all use of signed struct values.
test_zipfile and test_zipfile64 pass. no more warnings.
........
r61593 | raymond.hettinger | 2008-03-19 04:56:59 +0100 (Mi, 19 Mär 2008) | 1 line
Fix compiler warning.
........
r61595 | martin.v.loewis | 2008-03-19 05:39:13 +0100 (Mi, 19 Mär 2008) | 2 lines
Issue #2400: Allow relative imports to "import *".
........
r61605 | martin.v.loewis | 2008-03-19 07:00:28 +0100 (Mi, 19 Mär 2008) | 2 lines
Import relimport using a relative import.
........
r61606 | trent.nelson | 2008-03-19 07:28:24 +0100 (Mi, 19 Mär 2008) | 1 line
Issue2290: Support x64 Windows builds that live in pcbuild/amd64. Without it, sysutils._python_build() returns the wrong directory, which causes the test_get_config_h_filename method in Lib/distutils/tests/test_sysconfig.py to fail.
........
r61613 | trent.nelson | 2008-03-19 08:45:19 +0100 (Mi, 19 Mär 2008) | 3 lines
Refine the Visual Studio 2008 build solution in order to improve how we deal with external components, as well as fixing outstanding issues with Windows x64 build support. Introduce two new .vcproj files, _bsddb44.vcproj and sqlite3.vcproj, which replace the previous pre-link event scripts for _bsddb and _sqlite3 respectively. The new project files inherit from our property files as if they were any other Python module. This has numerous benefits. First, the components get built with exactly the same compiler flags and settings as the rest of Python. Second, it makes it much easier to debug problems in the external components when they're part of the build system. Third, they'll benefit from profile guided optimisation in the release builds, just like the rest of Python core.
I've also introduced a slightly new pattern for managing externals in subversion. New components get checked in as <name>-<version>.x, where <version> matches the exact vendor version string. After the initial import of the external component, the .x is tagged as .0 (i.e. tcl-8.4.18.x -> tcl-8.4.18.0). Some components may not need any tweaking, whereas there are others that might (tcl/tk fall into this bucket). In that case, the relevant modifications are made to the .x branch, which will be subsequently tagged as .1 (and then n+1 going forward) when they build successfully and all tests pass. Buildbots will be converted to rely on these explicit tags only, which makes it easy for us to switch them over to a new version as and when required. (Simple change to external(-amd64).bat: if we've bumped tcl to 8.4.18.1, change the .bat to rmdir 8.4.18.0 if it exists and check out a new .1 copy.)
........
r61614 | trent.nelson | 2008-03-19 08:56:39 +0100 (Mi, 19 Mär 2008) | 1 line
Remove extraneous apostrophe and semi-colon from AdditionalIncludeDirectories.
........
r61615 | georg.brandl | 2008-03-19 08:56:40 +0100 (Mi, 19 Mär 2008) | 2 lines
Remove footnote from versionchanged as it upsets LaTeX.
........
r61616 | georg.brandl | 2008-03-19 08:57:57 +0100 (Mi, 19 Mär 2008) | 2 lines
Another one.
........
r61618 | trent.nelson | 2008-03-19 09:06:03 +0100 (Mi, 19 Mär 2008) | 1 line
Fix the tcl-8.4.18.1 path and make sure we cd into the right directory when building tcl/tk.
........
r61621 | trent.nelson | 2008-03-19 10:23:08 +0100 (Mi, 19 Mär 2008) | 1 line
Lets have another try at getting the Windows buildbots in a consistent state before rebuilding using the new process.
........
r61622 | eric.smith | 2008-03-19 13:09:55 +0100 (Mi, 19 Mär 2008) | 2 lines
Use test.test_support.captured_stdout instead of a custom contextmanager.
Thanks Nick Coghlan.
........
r61623 | eric.smith | 2008-03-19 13:15:10 +0100 (Mi, 19 Mär 2008) | 1 line
Trivial typo.
........
r61625 | thomas.heller | 2008-03-19 17:10:57 +0100 (Mi, 19 Mär 2008) | 2 lines
Checkout sqlite-source when it is not there.
........
r61627 | brett.cannon | 2008-03-19 17:50:13 +0100 (Mi, 19 Mär 2008) | 5 lines
test_nis would fail if test.test_support.verbose was true but NIS was not set
up on the machine.
Closes issue2411. Thanks Michael Bishop.
........
r61631 | brett.cannon | 2008-03-19 18:37:43 +0100 (Mi, 19 Mär 2008) | 2 lines
Use sys.py3kwarning instead of trying to trigger a Py3k-related warning.
........
r61632 | raymond.hettinger | 2008-03-19 18:45:19 +0100 (Mi, 19 Mär 2008) | 1 line
Issue 2354: Fix-up compare warning. Patch contributed by Jeff Balogh.
........
r61633 | raymond.hettinger | 2008-03-19 18:58:59 +0100 (Mi, 19 Mär 2008) | 1 line
The filter() function does support a None argument in Py3.0.
........
r61634 | raymond.hettinger | 2008-03-19 19:01:58 +0100 (Mi, 19 Mär 2008) | 1 line
Remove itertools warnings I had added before the 2-to-3 handled the migration.
........
2008-03-19 18:50:51 -03:00
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'chdir'), 'test needs posix.chdir()')
|
2003-02-17 14:17:05 -04:00
|
|
|
def test_chdir(self):
|
2013-11-03 15:31:38 -04:00
|
|
|
posix.chdir(os.curdir)
|
|
|
|
self.assertRaises(OSError, posix.chdir, support.TESTFN)
|
2003-02-17 14:17:05 -04:00
|
|
|
|
2010-07-23 09:16:41 -03:00
|
|
|
def test_listdir(self):
|
2017-07-11 00:36:46 -03:00
|
|
|
self.assertIn(support.TESTFN, posix.listdir(os.curdir))
|
2010-07-23 09:16:41 -03:00
|
|
|
|
|
|
|
def test_listdir_default(self):
|
2012-06-25 08:42:23 -03:00
|
|
|
# When listdir is called without argument,
|
|
|
|
# it's the same as listdir(os.curdir).
|
2017-07-11 00:36:46 -03:00
|
|
|
self.assertIn(support.TESTFN, posix.listdir())
|
2012-06-25 08:42:23 -03:00
|
|
|
|
|
|
|
def test_listdir_bytes(self):
|
|
|
|
# When listdir is called with a bytes object,
|
|
|
|
# the returned strings are of type bytes.
|
2017-07-11 00:36:46 -03:00
|
|
|
self.assertIn(os.fsencode(support.TESTFN), posix.listdir(b'.'))
|
|
|
|
|
|
|
|
def test_listdir_bytes_like(self):
|
|
|
|
for cls in bytearray, memoryview:
|
|
|
|
with self.assertWarns(DeprecationWarning):
|
|
|
|
names = posix.listdir(cls(b'.'))
|
|
|
|
self.assertIn(os.fsencode(support.TESTFN), names)
|
|
|
|
for name in names:
|
|
|
|
self.assertIs(type(name), bytes)
|
2012-06-25 08:42:23 -03:00
|
|
|
|
|
|
|
@unittest.skipUnless(posix.listdir in os.supports_fd,
|
|
|
|
"test needs fd support for posix.listdir()")
|
|
|
|
def test_listdir_fd(self):
|
2011-02-25 19:41:16 -04:00
|
|
|
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
2012-01-08 13:34:06 -04:00
|
|
|
self.addCleanup(posix.close, f)
|
2011-02-25 19:41:16 -04:00
|
|
|
self.assertEqual(
|
|
|
|
sorted(posix.listdir('.')),
|
2012-06-22 20:30:09 -03:00
|
|
|
sorted(posix.listdir(f))
|
2011-02-25 19:41:16 -04:00
|
|
|
)
|
2012-01-08 13:34:06 -04:00
|
|
|
# Check that the fd offset was reset (issue #13739)
|
|
|
|
self.assertEqual(
|
|
|
|
sorted(posix.listdir('.')),
|
2012-06-22 20:30:09 -03:00
|
|
|
sorted(posix.listdir(f))
|
2012-01-08 13:34:06 -04:00
|
|
|
)
|
2011-02-25 19:41:16 -04:00
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'access'), 'test needs posix.access()')
|
2003-02-17 14:17:05 -04:00
|
|
|
def test_access(self):
|
2013-11-03 15:31:38 -04:00
|
|
|
self.assertTrue(posix.access(support.TESTFN, os.R_OK))
|
2003-02-17 14:17:05 -04:00
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'umask'), 'test needs posix.umask()')
|
2003-02-17 14:17:05 -04:00
|
|
|
def test_umask(self):
|
2013-11-03 15:31:38 -04:00
|
|
|
old_mask = posix.umask(0)
|
|
|
|
self.assertIsInstance(old_mask, int)
|
|
|
|
posix.umask(old_mask)
|
2003-02-17 14:17:05 -04:00
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'strerror'),
|
|
|
|
'test needs posix.strerror()')
|
2003-02-17 14:17:05 -04:00
|
|
|
def test_strerror(self):
|
2013-11-03 15:31:38 -04:00
|
|
|
self.assertTrue(posix.strerror(0))
|
2003-02-17 14:17:05 -04:00
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'pipe'), 'test needs posix.pipe()')
|
2003-02-17 14:17:05 -04:00
|
|
|
def test_pipe(self):
|
2013-11-03 15:31:38 -04:00
|
|
|
reader, writer = posix.pipe()
|
|
|
|
os.close(reader)
|
|
|
|
os.close(writer)
|
2003-02-17 14:17:05 -04:00
|
|
|
|
2011-05-29 15:07:40 -03:00
|
|
|
@unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
|
2011-06-03 07:55:15 -03:00
|
|
|
@support.requires_linux_version(2, 6, 27)
|
2011-05-29 15:07:40 -03:00
|
|
|
def test_pipe2(self):
|
|
|
|
self.assertRaises(TypeError, os.pipe2, 'DEADBEEF')
|
|
|
|
self.assertRaises(TypeError, os.pipe2, 0, 0)
|
|
|
|
|
2011-06-06 14:49:47 -03:00
|
|
|
# try calling with flags = 0, like os.pipe()
|
|
|
|
r, w = os.pipe2(0)
|
2011-05-29 15:07:40 -03:00
|
|
|
os.close(r)
|
|
|
|
os.close(w)
|
|
|
|
|
|
|
|
# test flags
|
|
|
|
r, w = os.pipe2(os.O_CLOEXEC|os.O_NONBLOCK)
|
|
|
|
self.addCleanup(os.close, r)
|
|
|
|
self.addCleanup(os.close, w)
|
2013-08-28 07:25:40 -03:00
|
|
|
self.assertFalse(os.get_inheritable(r))
|
|
|
|
self.assertFalse(os.get_inheritable(w))
|
2014-07-29 17:32:47 -03:00
|
|
|
self.assertFalse(os.get_blocking(r))
|
|
|
|
self.assertFalse(os.get_blocking(w))
|
2011-05-29 15:07:40 -03:00
|
|
|
# try reading from an empty pipe: this should fail, not block
|
|
|
|
self.assertRaises(OSError, os.read, r, 1)
|
|
|
|
# try a write big enough to fill-up the pipe: this should either
|
|
|
|
# fail or perform a partial write, not block
|
|
|
|
try:
|
|
|
|
os.write(w, b'x' * support.PIPE_MAX_SIZE)
|
|
|
|
except OSError:
|
|
|
|
pass
|
|
|
|
|
2014-02-07 04:06:39 -04:00
|
|
|
@support.cpython_only
|
|
|
|
@unittest.skipUnless(hasattr(os, 'pipe2'), "test needs os.pipe2()")
|
|
|
|
@support.requires_linux_version(2, 6, 27)
|
|
|
|
def test_pipe2_c_limits(self):
|
2013-01-14 19:12:17 -04:00
|
|
|
# Issue 15989
|
2014-02-07 04:06:39 -04:00
|
|
|
import _testcapi
|
2013-01-14 19:12:17 -04:00
|
|
|
self.assertRaises(OverflowError, os.pipe2, _testcapi.INT_MAX + 1)
|
|
|
|
self.assertRaises(OverflowError, os.pipe2, _testcapi.UINT_MAX + 1)
|
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'utime'), 'test needs posix.utime()')
|
2003-02-17 14:17:05 -04:00
|
|
|
def test_utime(self):
|
2013-11-03 15:31:38 -04:00
|
|
|
now = time.time()
|
|
|
|
posix.utime(support.TESTFN, None)
|
|
|
|
self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
|
|
|
|
self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
|
|
|
|
self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
|
|
|
|
posix.utime(support.TESTFN, (int(now), int(now)))
|
|
|
|
posix.utime(support.TESTFN, (now, now))
|
2003-02-17 14:17:05 -04:00
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
def _test_chflags_regular_file(self, chflags_func, target_file, **kwargs):
|
2011-06-28 04:00:28 -03:00
|
|
|
st = os.stat(target_file)
|
|
|
|
self.assertTrue(hasattr(st, 'st_flags'))
|
2012-08-21 20:59:31 -03:00
|
|
|
|
|
|
|
# ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
|
|
|
|
flags = st.st_flags | stat.UF_IMMUTABLE
|
|
|
|
try:
|
|
|
|
chflags_func(target_file, flags, **kwargs)
|
|
|
|
except OSError as err:
|
|
|
|
if err.errno != errno.EOPNOTSUPP:
|
|
|
|
raise
|
|
|
|
msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
|
|
|
|
self.skipTest(msg)
|
|
|
|
|
2011-06-28 04:00:28 -03:00
|
|
|
try:
|
|
|
|
new_st = os.stat(target_file)
|
|
|
|
self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags)
|
|
|
|
try:
|
|
|
|
fd = open(target_file, 'w+')
|
2012-12-25 10:47:37 -04:00
|
|
|
except OSError as e:
|
2011-06-28 04:00:28 -03:00
|
|
|
self.assertEqual(e.errno, errno.EPERM)
|
|
|
|
finally:
|
|
|
|
posix.chflags(target_file, st.st_flags)
|
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()')
|
Merged revisions 53623-53858 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r53624 | peter.astrand | 2007-02-02 20:06:36 +0100 (Fri, 02 Feb 2007) | 1 line
We had several if statements checking the value of a fd. This is unsafe, since valid fds might be zero. We should check for not None instead.
........
r53635 | kurt.kaiser | 2007-02-05 07:03:18 +0100 (Mon, 05 Feb 2007) | 2 lines
Add 'raw' support to configHandler. Patch 1650174 Tal Einat.
........
r53641 | kurt.kaiser | 2007-02-06 00:02:16 +0100 (Tue, 06 Feb 2007) | 5 lines
1. Calltips now 'handle' tuples in the argument list (display '<tuple>' :)
Suggested solution by Christos Georgiou, Bug 791968.
2. Clean up tests, were not failing when they should have been.
4. Remove some camelcase and an unneeded try/except block.
........
r53644 | kurt.kaiser | 2007-02-06 04:21:40 +0100 (Tue, 06 Feb 2007) | 2 lines
Clean up ModifiedInterpreter.runcode() structure
........
r53646 | peter.astrand | 2007-02-06 16:37:50 +0100 (Tue, 06 Feb 2007) | 1 line
Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
........
r53648 | lars.gustaebel | 2007-02-06 19:38:13 +0100 (Tue, 06 Feb 2007) | 4 lines
Patch #1652681: create nonexistent files in append mode and
allow appending to empty files.
........
r53649 | kurt.kaiser | 2007-02-06 20:09:43 +0100 (Tue, 06 Feb 2007) | 4 lines
Updated patch (CodeContext.061217.patch) to
[ 1362975 ] CodeContext - Improved text indentation
Tal Einat 16Dec06
........
r53650 | kurt.kaiser | 2007-02-06 20:21:19 +0100 (Tue, 06 Feb 2007) | 2 lines
narrow exception per [ 1540849 ] except too broad
........
r53653 | kurt.kaiser | 2007-02-07 04:39:41 +0100 (Wed, 07 Feb 2007) | 4 lines
[ 1621265 ] Auto-completion list placement
Move AC window below input line unless not enough space, then put it above.
Patch: Tal Einat
........
r53654 | kurt.kaiser | 2007-02-07 09:07:13 +0100 (Wed, 07 Feb 2007) | 2 lines
Handle AttributeError during calltip lookup
........
r53656 | raymond.hettinger | 2007-02-07 21:08:22 +0100 (Wed, 07 Feb 2007) | 3 lines
SF #1615701: make d.update(m) honor __getitem__() and keys() in dict subclasses
........
r53658 | raymond.hettinger | 2007-02-07 22:04:20 +0100 (Wed, 07 Feb 2007) | 1 line
SF: 1397711 Set docs conflated immutable and hashable
........
r53660 | raymond.hettinger | 2007-02-07 22:42:17 +0100 (Wed, 07 Feb 2007) | 1 line
Check for a common user error with defaultdict().
........
r53662 | raymond.hettinger | 2007-02-07 23:24:07 +0100 (Wed, 07 Feb 2007) | 1 line
Bug #1575169: operator.isSequenceType() now returns False for subclasses of dict.
........
r53664 | raymond.hettinger | 2007-02-08 00:49:03 +0100 (Thu, 08 Feb 2007) | 1 line
Silence compiler warning
........
r53666 | raymond.hettinger | 2007-02-08 01:07:32 +0100 (Thu, 08 Feb 2007) | 1 line
Do not let overflows in enumerate() and count() pass silently.
........
r53668 | raymond.hettinger | 2007-02-08 01:50:39 +0100 (Thu, 08 Feb 2007) | 1 line
Bypass set specific optimizations for set and frozenset subclasses.
........
r53670 | raymond.hettinger | 2007-02-08 02:42:35 +0100 (Thu, 08 Feb 2007) | 1 line
Fix docstring bug
........
r53671 | martin.v.loewis | 2007-02-08 10:13:36 +0100 (Thu, 08 Feb 2007) | 3 lines
Bug #1653736: Complain about keyword arguments to time.isoformat.
Will backport to 2.5.
........
r53679 | kurt.kaiser | 2007-02-08 23:58:18 +0100 (Thu, 08 Feb 2007) | 6 lines
Corrected some bugs in AutoComplete. Also, Page Up/Down in ACW implemented;
mouse and cursor selection in ACWindow implemented; double Tab inserts current
selection and closes ACW (similar to double-click and Return); scroll wheel now
works in ACW. Added AutoComplete instructions to IDLE Help.
........
r53689 | martin.v.loewis | 2007-02-09 13:19:32 +0100 (Fri, 09 Feb 2007) | 3 lines
Bug #1653736: Properly discard third argument to slot_nb_inplace_power.
Will backport.
........
r53691 | martin.v.loewis | 2007-02-09 13:36:48 +0100 (Fri, 09 Feb 2007) | 4 lines
Bug #1600860: Search for shared python library in LIBDIR, not
lib/python/config, on "linux" and "gnu" systems.
Will backport.
........
r53693 | martin.v.loewis | 2007-02-09 13:58:49 +0100 (Fri, 09 Feb 2007) | 2 lines
Update broken link. Will backport to 2.5.
........
r53697 | georg.brandl | 2007-02-09 19:48:41 +0100 (Fri, 09 Feb 2007) | 2 lines
Bug #1656078: typo in in profile docs.
........
r53731 | brett.cannon | 2007-02-11 06:36:00 +0100 (Sun, 11 Feb 2007) | 3 lines
Change a very minor inconsistency (that is purely cosmetic) in the AST
definition.
........
r53735 | skip.montanaro | 2007-02-11 19:24:37 +0100 (Sun, 11 Feb 2007) | 1 line
fix trace.py --ignore-dir
........
r53741 | brett.cannon | 2007-02-11 20:44:41 +0100 (Sun, 11 Feb 2007) | 3 lines
Check in changed Python-ast.c from a cosmetic change to Python.asdl (in
r53731).
........
r53751 | brett.cannon | 2007-02-12 04:51:02 +0100 (Mon, 12 Feb 2007) | 5 lines
Modify Parser/asdl_c.py so that the __version__ number for Python/Python-ast.c
is specified at the top of the file. Also add a note that Python/Python-ast.c
needs to be committed separately after a change to the AST grammar to capture
the revision number of the change (which is what __version__ is set to).
........
r53752 | lars.gustaebel | 2007-02-12 10:25:53 +0100 (Mon, 12 Feb 2007) | 3 lines
Bug #1656581: Point out that external file objects are supposed to be
at position 0.
........
r53754 | martin.v.loewis | 2007-02-12 13:21:10 +0100 (Mon, 12 Feb 2007) | 3 lines
Patch 1463026: Support default namespace in XMLGenerator.
Fixes #847665. Will backport.
........
r53757 | armin.rigo | 2007-02-12 17:23:24 +0100 (Mon, 12 Feb 2007) | 4 lines
Fix the line to what is my guess at the original author's meaning.
(The line has no effect anyway, but is present because it's
customary call the base class __init__).
........
r53763 | martin.v.loewis | 2007-02-13 09:34:45 +0100 (Tue, 13 Feb 2007) | 3 lines
Patch #685268: Consider a package's __path__ in imputil.
Will backport.
........
r53765 | martin.v.loewis | 2007-02-13 10:49:38 +0100 (Tue, 13 Feb 2007) | 2 lines
Patch #698833: Support file decryption in zipfile.
........
r53766 | martin.v.loewis | 2007-02-13 11:10:39 +0100 (Tue, 13 Feb 2007) | 3 lines
Patch #1517891: Make 'a' create the file if it doesn't exist.
Fixes #1514451.
........
r53767 | martin.v.loewis | 2007-02-13 13:08:24 +0100 (Tue, 13 Feb 2007) | 3 lines
Bug #1658794: Remove extraneous 'this'.
Will backport to 2.5.
........
r53769 | martin.v.loewis | 2007-02-13 13:14:19 +0100 (Tue, 13 Feb 2007) | 3 lines
Patch #1657276: Make NETLINK_DNRTMSG conditional.
Will backport.
........
r53771 | lars.gustaebel | 2007-02-13 17:09:24 +0100 (Tue, 13 Feb 2007) | 4 lines
Patch #1647484: Renamed GzipFile's filename attribute to name. The
filename attribute is still accessible as a property that emits a
DeprecationWarning.
........
r53772 | lars.gustaebel | 2007-02-13 17:24:00 +0100 (Tue, 13 Feb 2007) | 3 lines
Strip the '.gz' extension from the filename that is written to the
gzip header.
........
r53774 | martin.v.loewis | 2007-02-14 11:07:37 +0100 (Wed, 14 Feb 2007) | 2 lines
Patch #1432399: Add HCI sockets.
........
r53775 | martin.v.loewis | 2007-02-14 12:30:07 +0100 (Wed, 14 Feb 2007) | 2 lines
Update 1432399 to removal of _BT_SOCKADDR_MEMB.
........
r53776 | martin.v.loewis | 2007-02-14 12:30:56 +0100 (Wed, 14 Feb 2007) | 3 lines
Ignore directory time stamps when considering
whether to rerun libffi configure.
........
r53778 | lars.gustaebel | 2007-02-14 15:45:12 +0100 (Wed, 14 Feb 2007) | 4 lines
A missing binary mode in AppendTest caused failures in Windows
Buildbot.
........
r53782 | martin.v.loewis | 2007-02-15 10:51:35 +0100 (Thu, 15 Feb 2007) | 2 lines
Patch #1397848: add the reasoning behind no-resize-on-shrinkage.
........
r53783 | georg.brandl | 2007-02-15 11:37:59 +0100 (Thu, 15 Feb 2007) | 2 lines
Make functools.wraps() docs a bit clearer.
........
r53785 | georg.brandl | 2007-02-15 12:29:04 +0100 (Thu, 15 Feb 2007) | 2 lines
Patch #1494140: Add documentation for the new struct.Struct object.
........
r53787 | georg.brandl | 2007-02-15 12:29:55 +0100 (Thu, 15 Feb 2007) | 2 lines
Add missing \versionadded.
........
r53800 | brett.cannon | 2007-02-15 23:54:39 +0100 (Thu, 15 Feb 2007) | 11 lines
Update the encoding package's search function to use absolute imports when
calling __import__. This helps make the expected search locations for encoding
modules be more explicit.
One could use an explicit value for __path__ when making the call to __import__
to force the exact location searched for encodings. This would give the most
strict search path possible if one is worried about malicious code being
imported. The unfortunate side-effect of that is that if __path__ was modified
on 'encodings' on purpose in a safe way it would not be picked up in future
__import__ calls.
........
r53801 | brett.cannon | 2007-02-16 20:33:01 +0100 (Fri, 16 Feb 2007) | 2 lines
Make the __import__ call in encodings.__init__ absolute with a level 0 call.
........
r53809 | vinay.sajip | 2007-02-16 23:36:24 +0100 (Fri, 16 Feb 2007) | 1 line
Minor fix for currentframe (SF #1652788).
........
r53818 | raymond.hettinger | 2007-02-19 03:03:19 +0100 (Mon, 19 Feb 2007) | 3 lines
Extend work on revision 52962: Eliminate redundant calls to PyObject_Hash().
........
r53820 | raymond.hettinger | 2007-02-19 05:08:43 +0100 (Mon, 19 Feb 2007) | 1 line
Add merge() function to heapq.
........
r53821 | raymond.hettinger | 2007-02-19 06:28:28 +0100 (Mon, 19 Feb 2007) | 1 line
Add tie-breaker count to preserve sort stability.
........
r53822 | raymond.hettinger | 2007-02-19 07:59:32 +0100 (Mon, 19 Feb 2007) | 1 line
Use C heapreplace() instead of slower _siftup() in pure python.
........
r53823 | raymond.hettinger | 2007-02-19 08:30:21 +0100 (Mon, 19 Feb 2007) | 1 line
Add test for merge stability
........
r53824 | raymond.hettinger | 2007-02-19 10:14:10 +0100 (Mon, 19 Feb 2007) | 1 line
Provide an example of defaultdict with non-zero constant factory function.
........
r53825 | lars.gustaebel | 2007-02-19 10:54:47 +0100 (Mon, 19 Feb 2007) | 2 lines
Moved misplaced news item.
........
r53826 | martin.v.loewis | 2007-02-19 11:55:19 +0100 (Mon, 19 Feb 2007) | 3 lines
Patch #1490190: posixmodule now includes os.chflags() and os.lchflags()
functions on platforms where the underlying system calls are available.
........
r53827 | raymond.hettinger | 2007-02-19 19:15:04 +0100 (Mon, 19 Feb 2007) | 1 line
Fixup docstrings for merge().
........
r53829 | raymond.hettinger | 2007-02-19 21:44:04 +0100 (Mon, 19 Feb 2007) | 1 line
Fixup set/dict interoperability.
........
r53837 | raymond.hettinger | 2007-02-21 06:20:38 +0100 (Wed, 21 Feb 2007) | 1 line
Add itertools.izip_longest().
........
r53838 | raymond.hettinger | 2007-02-21 18:22:05 +0100 (Wed, 21 Feb 2007) | 1 line
Remove filler struct item and fix leak.
........
2007-02-23 11:07:44 -04:00
|
|
|
def test_chflags(self):
|
2011-06-28 04:00:28 -03:00
|
|
|
self._test_chflags_regular_file(posix.chflags, support.TESTFN)
|
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
|
|
|
|
def test_lchflags_regular_file(self):
|
|
|
|
self._test_chflags_regular_file(posix.lchflags, support.TESTFN)
|
2012-06-22 20:30:09 -03:00
|
|
|
self._test_chflags_regular_file(posix.chflags, support.TESTFN, follow_symlinks=False)
|
2011-06-28 04:00:28 -03:00
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()')
|
|
|
|
def test_lchflags_symlink(self):
|
|
|
|
testfn_st = os.stat(support.TESTFN)
|
|
|
|
|
|
|
|
self.assertTrue(hasattr(testfn_st, 'st_flags'))
|
|
|
|
|
|
|
|
os.symlink(support.TESTFN, _DUMMY_SYMLINK)
|
|
|
|
self.teardown_files.append(_DUMMY_SYMLINK)
|
|
|
|
dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
def chflags_nofollow(path, flags):
|
|
|
|
return posix.chflags(path, flags, follow_symlinks=False)
|
2011-06-28 04:00:28 -03:00
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
for fn in (posix.lchflags, chflags_nofollow):
|
2012-08-21 20:59:31 -03:00
|
|
|
# ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE.
|
|
|
|
flags = dummy_symlink_st.st_flags | stat.UF_IMMUTABLE
|
|
|
|
try:
|
|
|
|
fn(_DUMMY_SYMLINK, flags)
|
|
|
|
except OSError as err:
|
|
|
|
if err.errno != errno.EOPNOTSUPP:
|
|
|
|
raise
|
|
|
|
msg = 'chflag UF_IMMUTABLE not supported by underlying fs'
|
|
|
|
self.skipTest(msg)
|
2012-06-22 20:30:09 -03:00
|
|
|
try:
|
|
|
|
new_testfn_st = os.stat(support.TESTFN)
|
|
|
|
new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK)
|
|
|
|
|
|
|
|
self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags)
|
|
|
|
self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE,
|
|
|
|
new_dummy_symlink_st.st_flags)
|
|
|
|
finally:
|
|
|
|
fn(_DUMMY_SYMLINK, dummy_symlink_st.st_flags)
|
Merged revisions 53623-53858 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r53624 | peter.astrand | 2007-02-02 20:06:36 +0100 (Fri, 02 Feb 2007) | 1 line
We had several if statements checking the value of a fd. This is unsafe, since valid fds might be zero. We should check for not None instead.
........
r53635 | kurt.kaiser | 2007-02-05 07:03:18 +0100 (Mon, 05 Feb 2007) | 2 lines
Add 'raw' support to configHandler. Patch 1650174 Tal Einat.
........
r53641 | kurt.kaiser | 2007-02-06 00:02:16 +0100 (Tue, 06 Feb 2007) | 5 lines
1. Calltips now 'handle' tuples in the argument list (display '<tuple>' :)
Suggested solution by Christos Georgiou, Bug 791968.
2. Clean up tests, were not failing when they should have been.
4. Remove some camelcase and an unneeded try/except block.
........
r53644 | kurt.kaiser | 2007-02-06 04:21:40 +0100 (Tue, 06 Feb 2007) | 2 lines
Clean up ModifiedInterpreter.runcode() structure
........
r53646 | peter.astrand | 2007-02-06 16:37:50 +0100 (Tue, 06 Feb 2007) | 1 line
Applied patch 1124861.3.patch to solve bug #1124861: Automatically create pipes on Windows, if GetStdHandle fails. Will backport.
........
r53648 | lars.gustaebel | 2007-02-06 19:38:13 +0100 (Tue, 06 Feb 2007) | 4 lines
Patch #1652681: create nonexistent files in append mode and
allow appending to empty files.
........
r53649 | kurt.kaiser | 2007-02-06 20:09:43 +0100 (Tue, 06 Feb 2007) | 4 lines
Updated patch (CodeContext.061217.patch) to
[ 1362975 ] CodeContext - Improved text indentation
Tal Einat 16Dec06
........
r53650 | kurt.kaiser | 2007-02-06 20:21:19 +0100 (Tue, 06 Feb 2007) | 2 lines
narrow exception per [ 1540849 ] except too broad
........
r53653 | kurt.kaiser | 2007-02-07 04:39:41 +0100 (Wed, 07 Feb 2007) | 4 lines
[ 1621265 ] Auto-completion list placement
Move AC window below input line unless not enough space, then put it above.
Patch: Tal Einat
........
r53654 | kurt.kaiser | 2007-02-07 09:07:13 +0100 (Wed, 07 Feb 2007) | 2 lines
Handle AttributeError during calltip lookup
........
r53656 | raymond.hettinger | 2007-02-07 21:08:22 +0100 (Wed, 07 Feb 2007) | 3 lines
SF #1615701: make d.update(m) honor __getitem__() and keys() in dict subclasses
........
r53658 | raymond.hettinger | 2007-02-07 22:04:20 +0100 (Wed, 07 Feb 2007) | 1 line
SF: 1397711 Set docs conflated immutable and hashable
........
r53660 | raymond.hettinger | 2007-02-07 22:42:17 +0100 (Wed, 07 Feb 2007) | 1 line
Check for a common user error with defaultdict().
........
r53662 | raymond.hettinger | 2007-02-07 23:24:07 +0100 (Wed, 07 Feb 2007) | 1 line
Bug #1575169: operator.isSequenceType() now returns False for subclasses of dict.
........
r53664 | raymond.hettinger | 2007-02-08 00:49:03 +0100 (Thu, 08 Feb 2007) | 1 line
Silence compiler warning
........
r53666 | raymond.hettinger | 2007-02-08 01:07:32 +0100 (Thu, 08 Feb 2007) | 1 line
Do not let overflows in enumerate() and count() pass silently.
........
r53668 | raymond.hettinger | 2007-02-08 01:50:39 +0100 (Thu, 08 Feb 2007) | 1 line
Bypass set specific optimizations for set and frozenset subclasses.
........
r53670 | raymond.hettinger | 2007-02-08 02:42:35 +0100 (Thu, 08 Feb 2007) | 1 line
Fix docstring bug
........
r53671 | martin.v.loewis | 2007-02-08 10:13:36 +0100 (Thu, 08 Feb 2007) | 3 lines
Bug #1653736: Complain about keyword arguments to time.isoformat.
Will backport to 2.5.
........
r53679 | kurt.kaiser | 2007-02-08 23:58:18 +0100 (Thu, 08 Feb 2007) | 6 lines
Corrected some bugs in AutoComplete. Also, Page Up/Down in ACW implemented;
mouse and cursor selection in ACWindow implemented; double Tab inserts current
selection and closes ACW (similar to double-click and Return); scroll wheel now
works in ACW. Added AutoComplete instructions to IDLE Help.
........
r53689 | martin.v.loewis | 2007-02-09 13:19:32 +0100 (Fri, 09 Feb 2007) | 3 lines
Bug #1653736: Properly discard third argument to slot_nb_inplace_power.
Will backport.
........
r53691 | martin.v.loewis | 2007-02-09 13:36:48 +0100 (Fri, 09 Feb 2007) | 4 lines
Bug #1600860: Search for shared python library in LIBDIR, not
lib/python/config, on "linux" and "gnu" systems.
Will backport.
........
r53693 | martin.v.loewis | 2007-02-09 13:58:49 +0100 (Fri, 09 Feb 2007) | 2 lines
Update broken link. Will backport to 2.5.
........
r53697 | georg.brandl | 2007-02-09 19:48:41 +0100 (Fri, 09 Feb 2007) | 2 lines
Bug #1656078: typo in in profile docs.
........
r53731 | brett.cannon | 2007-02-11 06:36:00 +0100 (Sun, 11 Feb 2007) | 3 lines
Change a very minor inconsistency (that is purely cosmetic) in the AST
definition.
........
r53735 | skip.montanaro | 2007-02-11 19:24:37 +0100 (Sun, 11 Feb 2007) | 1 line
fix trace.py --ignore-dir
........
r53741 | brett.cannon | 2007-02-11 20:44:41 +0100 (Sun, 11 Feb 2007) | 3 lines
Check in changed Python-ast.c from a cosmetic change to Python.asdl (in
r53731).
........
r53751 | brett.cannon | 2007-02-12 04:51:02 +0100 (Mon, 12 Feb 2007) | 5 lines
Modify Parser/asdl_c.py so that the __version__ number for Python/Python-ast.c
is specified at the top of the file. Also add a note that Python/Python-ast.c
needs to be committed separately after a change to the AST grammar to capture
the revision number of the change (which is what __version__ is set to).
........
r53752 | lars.gustaebel | 2007-02-12 10:25:53 +0100 (Mon, 12 Feb 2007) | 3 lines
Bug #1656581: Point out that external file objects are supposed to be
at position 0.
........
r53754 | martin.v.loewis | 2007-02-12 13:21:10 +0100 (Mon, 12 Feb 2007) | 3 lines
Patch 1463026: Support default namespace in XMLGenerator.
Fixes #847665. Will backport.
........
r53757 | armin.rigo | 2007-02-12 17:23:24 +0100 (Mon, 12 Feb 2007) | 4 lines
Fix the line to what is my guess at the original author's meaning.
(The line has no effect anyway, but is present because it's
customary call the base class __init__).
........
r53763 | martin.v.loewis | 2007-02-13 09:34:45 +0100 (Tue, 13 Feb 2007) | 3 lines
Patch #685268: Consider a package's __path__ in imputil.
Will backport.
........
r53765 | martin.v.loewis | 2007-02-13 10:49:38 +0100 (Tue, 13 Feb 2007) | 2 lines
Patch #698833: Support file decryption in zipfile.
........
r53766 | martin.v.loewis | 2007-02-13 11:10:39 +0100 (Tue, 13 Feb 2007) | 3 lines
Patch #1517891: Make 'a' create the file if it doesn't exist.
Fixes #1514451.
........
r53767 | martin.v.loewis | 2007-02-13 13:08:24 +0100 (Tue, 13 Feb 2007) | 3 lines
Bug #1658794: Remove extraneous 'this'.
Will backport to 2.5.
........
r53769 | martin.v.loewis | 2007-02-13 13:14:19 +0100 (Tue, 13 Feb 2007) | 3 lines
Patch #1657276: Make NETLINK_DNRTMSG conditional.
Will backport.
........
r53771 | lars.gustaebel | 2007-02-13 17:09:24 +0100 (Tue, 13 Feb 2007) | 4 lines
Patch #1647484: Renamed GzipFile's filename attribute to name. The
filename attribute is still accessible as a property that emits a
DeprecationWarning.
........
r53772 | lars.gustaebel | 2007-02-13 17:24:00 +0100 (Tue, 13 Feb 2007) | 3 lines
Strip the '.gz' extension from the filename that is written to the
gzip header.
........
r53774 | martin.v.loewis | 2007-02-14 11:07:37 +0100 (Wed, 14 Feb 2007) | 2 lines
Patch #1432399: Add HCI sockets.
........
r53775 | martin.v.loewis | 2007-02-14 12:30:07 +0100 (Wed, 14 Feb 2007) | 2 lines
Update 1432399 to removal of _BT_SOCKADDR_MEMB.
........
r53776 | martin.v.loewis | 2007-02-14 12:30:56 +0100 (Wed, 14 Feb 2007) | 3 lines
Ignore directory time stamps when considering
whether to rerun libffi configure.
........
r53778 | lars.gustaebel | 2007-02-14 15:45:12 +0100 (Wed, 14 Feb 2007) | 4 lines
A missing binary mode in AppendTest caused failures in Windows
Buildbot.
........
r53782 | martin.v.loewis | 2007-02-15 10:51:35 +0100 (Thu, 15 Feb 2007) | 2 lines
Patch #1397848: add the reasoning behind no-resize-on-shrinkage.
........
r53783 | georg.brandl | 2007-02-15 11:37:59 +0100 (Thu, 15 Feb 2007) | 2 lines
Make functools.wraps() docs a bit clearer.
........
r53785 | georg.brandl | 2007-02-15 12:29:04 +0100 (Thu, 15 Feb 2007) | 2 lines
Patch #1494140: Add documentation for the new struct.Struct object.
........
r53787 | georg.brandl | 2007-02-15 12:29:55 +0100 (Thu, 15 Feb 2007) | 2 lines
Add missing \versionadded.
........
r53800 | brett.cannon | 2007-02-15 23:54:39 +0100 (Thu, 15 Feb 2007) | 11 lines
Update the encoding package's search function to use absolute imports when
calling __import__. This helps make the expected search locations for encoding
modules be more explicit.
One could use an explicit value for __path__ when making the call to __import__
to force the exact location searched for encodings. This would give the most
strict search path possible if one is worried about malicious code being
imported. The unfortunate side-effect of that is that if __path__ was modified
on 'encodings' on purpose in a safe way it would not be picked up in future
__import__ calls.
........
r53801 | brett.cannon | 2007-02-16 20:33:01 +0100 (Fri, 16 Feb 2007) | 2 lines
Make the __import__ call in encodings.__init__ absolute with a level 0 call.
........
r53809 | vinay.sajip | 2007-02-16 23:36:24 +0100 (Fri, 16 Feb 2007) | 1 line
Minor fix for currentframe (SF #1652788).
........
r53818 | raymond.hettinger | 2007-02-19 03:03:19 +0100 (Mon, 19 Feb 2007) | 3 lines
Extend work on revision 52962: Eliminate redundant calls to PyObject_Hash().
........
r53820 | raymond.hettinger | 2007-02-19 05:08:43 +0100 (Mon, 19 Feb 2007) | 1 line
Add merge() function to heapq.
........
r53821 | raymond.hettinger | 2007-02-19 06:28:28 +0100 (Mon, 19 Feb 2007) | 1 line
Add tie-breaker count to preserve sort stability.
........
r53822 | raymond.hettinger | 2007-02-19 07:59:32 +0100 (Mon, 19 Feb 2007) | 1 line
Use C heapreplace() instead of slower _siftup() in pure python.
........
r53823 | raymond.hettinger | 2007-02-19 08:30:21 +0100 (Mon, 19 Feb 2007) | 1 line
Add test for merge stability
........
r53824 | raymond.hettinger | 2007-02-19 10:14:10 +0100 (Mon, 19 Feb 2007) | 1 line
Provide an example of defaultdict with non-zero constant factory function.
........
r53825 | lars.gustaebel | 2007-02-19 10:54:47 +0100 (Mon, 19 Feb 2007) | 2 lines
Moved misplaced news item.
........
r53826 | martin.v.loewis | 2007-02-19 11:55:19 +0100 (Mon, 19 Feb 2007) | 3 lines
Patch #1490190: posixmodule now includes os.chflags() and os.lchflags()
functions on platforms where the underlying system calls are available.
........
r53827 | raymond.hettinger | 2007-02-19 19:15:04 +0100 (Mon, 19 Feb 2007) | 1 line
Fixup docstrings for merge().
........
r53829 | raymond.hettinger | 2007-02-19 21:44:04 +0100 (Mon, 19 Feb 2007) | 1 line
Fixup set/dict interoperability.
........
r53837 | raymond.hettinger | 2007-02-21 06:20:38 +0100 (Wed, 21 Feb 2007) | 1 line
Add itertools.izip_longest().
........
r53838 | raymond.hettinger | 2007-02-21 18:22:05 +0100 (Wed, 21 Feb 2007) | 1 line
Remove filler struct item and fix leak.
........
2007-02-23 11:07:44 -04:00
|
|
|
|
2007-11-06 17:34:58 -04:00
|
|
|
def test_environ(self):
|
2010-05-06 19:19:30 -03:00
|
|
|
if os.name == "nt":
|
|
|
|
item_type = str
|
|
|
|
else:
|
|
|
|
item_type = bytes
|
2007-11-06 17:34:58 -04:00
|
|
|
for k, v in posix.environ.items():
|
2010-05-06 19:19:30 -03:00
|
|
|
self.assertEqual(type(k), item_type)
|
|
|
|
self.assertEqual(type(v), item_type)
|
2007-11-06 17:34:58 -04:00
|
|
|
|
2017-06-25 01:33:01 -03:00
|
|
|
@unittest.skipUnless(hasattr(os, "putenv"), "requires os.putenv()")
|
|
|
|
def test_putenv(self):
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
os.putenv('FRUIT\0VEGETABLE', 'cabbage')
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
os.putenv(b'FRUIT\0VEGETABLE', b'cabbage')
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
os.putenv('FRUIT', 'orange\0VEGETABLE=cabbage')
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
os.putenv(b'FRUIT', b'orange\0VEGETABLE=cabbage')
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
os.putenv('FRUIT=ORANGE', 'lemon')
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
os.putenv(b'FRUIT=ORANGE', b'lemon')
|
|
|
|
|
2013-11-03 15:31:38 -04:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'getcwd'), 'test needs posix.getcwd()')
|
Merged revisions 64434-64435,64440-64443,64445,64447-64448,64450,64452,64455,64461,64464,64466,64468 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r64434 | andrew.kuchling | 2008-06-20 18:13:58 -0500 (Fri, 20 Jun 2008) | 1 line
Remove request for e-mail; it's unlikely these classes will be saved
........
r64435 | andrew.kuchling | 2008-06-20 18:14:32 -0500 (Fri, 20 Jun 2008) | 1 line
Grammar fixes
........
r64440 | andrew.kuchling | 2008-06-21 08:29:12 -0500 (Sat, 21 Jun 2008) | 1 line
Docstring typo
........
r64441 | andrew.kuchling | 2008-06-21 08:47:20 -0500 (Sat, 21 Jun 2008) | 1 line
Use repr() for bad input strings; this makes the empty string or binary characters more visible
........
r64442 | andrew.kuchling | 2008-06-21 08:48:38 -0500 (Sat, 21 Jun 2008) | 1 line
Docstring correction
........
r64443 | georg.brandl | 2008-06-21 09:26:19 -0500 (Sat, 21 Jun 2008) | 2 lines
Documentation fix.
........
r64445 | facundo.batista | 2008-06-21 12:30:06 -0500 (Sat, 21 Jun 2008) | 3 lines
Reviewed and updated the documentation. Fixes #3017.
........
r64447 | facundo.batista | 2008-06-21 13:58:04 -0500 (Sat, 21 Jun 2008) | 6 lines
Now a from submitted via POST that also has a query string
will contain both FieldStorage and MiniFieldStorage items.
Fixes #1817.
........
r64448 | facundo.batista | 2008-06-21 14:48:19 -0500 (Sat, 21 Jun 2008) | 5 lines
In the deprecated functions I added an alert to review
specially a section of the subprocess documentation
that helps with the replacing of those functionss.
........
r64450 | georg.brandl | 2008-06-22 04:05:29 -0500 (Sun, 22 Jun 2008) | 2 lines
Turn section references into proper cross-references.
........
r64452 | facundo.batista | 2008-06-22 08:36:20 -0500 (Sun, 22 Jun 2008) | 5 lines
Issue #2722. Now the char buffer to support the path string has
not fixed length, it mallocs memory if needed. As a result, we
don't have a maximum for the getcwd() method.
........
r64455 | facundo.batista | 2008-06-22 10:27:10 -0500 (Sun, 22 Jun 2008) | 4 lines
Issue 3164. Small fix to don't repeat a comparation
without necessity.
........
r64461 | georg.brandl | 2008-06-22 13:11:52 -0500 (Sun, 22 Jun 2008) | 2 lines
#3085: Fix syntax error.
........
r64464 | georg.brandl | 2008-06-22 13:31:54 -0500 (Sun, 22 Jun 2008) | 2 lines
Expand docstrings of sqlite3 functions.
........
r64466 | georg.brandl | 2008-06-22 14:07:59 -0500 (Sun, 22 Jun 2008) | 2 lines
Write out "phi" consistently.
........
r64468 | facundo.batista | 2008-06-22 14:35:24 -0500 (Sun, 22 Jun 2008) | 4 lines
Just returning nothing instead of rising TestSkipped, because
it makes the test fail in the trunk.loewis-sun buildbot.
........
2008-07-02 14:30:14 -03:00
|
|
|
def test_getcwd_long_pathnames(self):
|
2013-08-23 23:01:48 -03:00
|
|
|
dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
|
|
|
|
curdir = os.getcwd()
|
|
|
|
base_path = os.path.abspath(support.TESTFN) + '.getcwd'
|
Merged revisions 64434-64435,64440-64443,64445,64447-64448,64450,64452,64455,64461,64464,64466,64468 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r64434 | andrew.kuchling | 2008-06-20 18:13:58 -0500 (Fri, 20 Jun 2008) | 1 line
Remove request for e-mail; it's unlikely these classes will be saved
........
r64435 | andrew.kuchling | 2008-06-20 18:14:32 -0500 (Fri, 20 Jun 2008) | 1 line
Grammar fixes
........
r64440 | andrew.kuchling | 2008-06-21 08:29:12 -0500 (Sat, 21 Jun 2008) | 1 line
Docstring typo
........
r64441 | andrew.kuchling | 2008-06-21 08:47:20 -0500 (Sat, 21 Jun 2008) | 1 line
Use repr() for bad input strings; this makes the empty string or binary characters more visible
........
r64442 | andrew.kuchling | 2008-06-21 08:48:38 -0500 (Sat, 21 Jun 2008) | 1 line
Docstring correction
........
r64443 | georg.brandl | 2008-06-21 09:26:19 -0500 (Sat, 21 Jun 2008) | 2 lines
Documentation fix.
........
r64445 | facundo.batista | 2008-06-21 12:30:06 -0500 (Sat, 21 Jun 2008) | 3 lines
Reviewed and updated the documentation. Fixes #3017.
........
r64447 | facundo.batista | 2008-06-21 13:58:04 -0500 (Sat, 21 Jun 2008) | 6 lines
Now a from submitted via POST that also has a query string
will contain both FieldStorage and MiniFieldStorage items.
Fixes #1817.
........
r64448 | facundo.batista | 2008-06-21 14:48:19 -0500 (Sat, 21 Jun 2008) | 5 lines
In the deprecated functions I added an alert to review
specially a section of the subprocess documentation
that helps with the replacing of those functionss.
........
r64450 | georg.brandl | 2008-06-22 04:05:29 -0500 (Sun, 22 Jun 2008) | 2 lines
Turn section references into proper cross-references.
........
r64452 | facundo.batista | 2008-06-22 08:36:20 -0500 (Sun, 22 Jun 2008) | 5 lines
Issue #2722. Now the char buffer to support the path string has
not fixed length, it mallocs memory if needed. As a result, we
don't have a maximum for the getcwd() method.
........
r64455 | facundo.batista | 2008-06-22 10:27:10 -0500 (Sun, 22 Jun 2008) | 4 lines
Issue 3164. Small fix to don't repeat a comparation
without necessity.
........
r64461 | georg.brandl | 2008-06-22 13:11:52 -0500 (Sun, 22 Jun 2008) | 2 lines
#3085: Fix syntax error.
........
r64464 | georg.brandl | 2008-06-22 13:31:54 -0500 (Sun, 22 Jun 2008) | 2 lines
Expand docstrings of sqlite3 functions.
........
r64466 | georg.brandl | 2008-06-22 14:07:59 -0500 (Sun, 22 Jun 2008) | 2 lines
Write out "phi" consistently.
........
r64468 | facundo.batista | 2008-06-22 14:35:24 -0500 (Sun, 22 Jun 2008) | 4 lines
Just returning nothing instead of rising TestSkipped, because
it makes the test fail in the trunk.loewis-sun buildbot.
........
2008-07-02 14:30:14 -03:00
|
|
|
|
2013-08-23 23:01:48 -03:00
|
|
|
try:
|
|
|
|
os.mkdir(base_path)
|
|
|
|
os.chdir(base_path)
|
|
|
|
except:
|
|
|
|
# Just returning nothing instead of the SkipTest exception, because
|
|
|
|
# the test results in Error in that case. Is that ok?
|
|
|
|
# raise unittest.SkipTest("cannot create directory for testing")
|
|
|
|
return
|
|
|
|
|
|
|
|
def _create_and_do_getcwd(dirname, current_path_length = 0):
|
|
|
|
try:
|
|
|
|
os.mkdir(dirname)
|
|
|
|
except:
|
|
|
|
raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
|
|
|
|
|
|
|
|
os.chdir(dirname)
|
|
|
|
try:
|
|
|
|
os.getcwd()
|
|
|
|
if current_path_length < 1027:
|
|
|
|
_create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
|
|
|
|
finally:
|
|
|
|
os.chdir('..')
|
|
|
|
os.rmdir(dirname)
|
|
|
|
|
|
|
|
_create_and_do_getcwd(dirname)
|
Merged revisions 64434-64435,64440-64443,64445,64447-64448,64450,64452,64455,64461,64464,64466,64468 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r64434 | andrew.kuchling | 2008-06-20 18:13:58 -0500 (Fri, 20 Jun 2008) | 1 line
Remove request for e-mail; it's unlikely these classes will be saved
........
r64435 | andrew.kuchling | 2008-06-20 18:14:32 -0500 (Fri, 20 Jun 2008) | 1 line
Grammar fixes
........
r64440 | andrew.kuchling | 2008-06-21 08:29:12 -0500 (Sat, 21 Jun 2008) | 1 line
Docstring typo
........
r64441 | andrew.kuchling | 2008-06-21 08:47:20 -0500 (Sat, 21 Jun 2008) | 1 line
Use repr() for bad input strings; this makes the empty string or binary characters more visible
........
r64442 | andrew.kuchling | 2008-06-21 08:48:38 -0500 (Sat, 21 Jun 2008) | 1 line
Docstring correction
........
r64443 | georg.brandl | 2008-06-21 09:26:19 -0500 (Sat, 21 Jun 2008) | 2 lines
Documentation fix.
........
r64445 | facundo.batista | 2008-06-21 12:30:06 -0500 (Sat, 21 Jun 2008) | 3 lines
Reviewed and updated the documentation. Fixes #3017.
........
r64447 | facundo.batista | 2008-06-21 13:58:04 -0500 (Sat, 21 Jun 2008) | 6 lines
Now a from submitted via POST that also has a query string
will contain both FieldStorage and MiniFieldStorage items.
Fixes #1817.
........
r64448 | facundo.batista | 2008-06-21 14:48:19 -0500 (Sat, 21 Jun 2008) | 5 lines
In the deprecated functions I added an alert to review
specially a section of the subprocess documentation
that helps with the replacing of those functionss.
........
r64450 | georg.brandl | 2008-06-22 04:05:29 -0500 (Sun, 22 Jun 2008) | 2 lines
Turn section references into proper cross-references.
........
r64452 | facundo.batista | 2008-06-22 08:36:20 -0500 (Sun, 22 Jun 2008) | 5 lines
Issue #2722. Now the char buffer to support the path string has
not fixed length, it mallocs memory if needed. As a result, we
don't have a maximum for the getcwd() method.
........
r64455 | facundo.batista | 2008-06-22 10:27:10 -0500 (Sun, 22 Jun 2008) | 4 lines
Issue 3164. Small fix to don't repeat a comparation
without necessity.
........
r64461 | georg.brandl | 2008-06-22 13:11:52 -0500 (Sun, 22 Jun 2008) | 2 lines
#3085: Fix syntax error.
........
r64464 | georg.brandl | 2008-06-22 13:31:54 -0500 (Sun, 22 Jun 2008) | 2 lines
Expand docstrings of sqlite3 functions.
........
r64466 | georg.brandl | 2008-06-22 14:07:59 -0500 (Sun, 22 Jun 2008) | 2 lines
Write out "phi" consistently.
........
r64468 | facundo.batista | 2008-06-22 14:35:24 -0500 (Sun, 22 Jun 2008) | 4 lines
Just returning nothing instead of rising TestSkipped, because
it makes the test fail in the trunk.loewis-sun buildbot.
........
2008-07-02 14:30:14 -03:00
|
|
|
|
2013-08-23 23:01:48 -03:00
|
|
|
finally:
|
|
|
|
os.chdir(curdir)
|
|
|
|
support.rmtree(base_path)
|
Merged revisions 64434-64435,64440-64443,64445,64447-64448,64450,64452,64455,64461,64464,64466,64468 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r64434 | andrew.kuchling | 2008-06-20 18:13:58 -0500 (Fri, 20 Jun 2008) | 1 line
Remove request for e-mail; it's unlikely these classes will be saved
........
r64435 | andrew.kuchling | 2008-06-20 18:14:32 -0500 (Fri, 20 Jun 2008) | 1 line
Grammar fixes
........
r64440 | andrew.kuchling | 2008-06-21 08:29:12 -0500 (Sat, 21 Jun 2008) | 1 line
Docstring typo
........
r64441 | andrew.kuchling | 2008-06-21 08:47:20 -0500 (Sat, 21 Jun 2008) | 1 line
Use repr() for bad input strings; this makes the empty string or binary characters more visible
........
r64442 | andrew.kuchling | 2008-06-21 08:48:38 -0500 (Sat, 21 Jun 2008) | 1 line
Docstring correction
........
r64443 | georg.brandl | 2008-06-21 09:26:19 -0500 (Sat, 21 Jun 2008) | 2 lines
Documentation fix.
........
r64445 | facundo.batista | 2008-06-21 12:30:06 -0500 (Sat, 21 Jun 2008) | 3 lines
Reviewed and updated the documentation. Fixes #3017.
........
r64447 | facundo.batista | 2008-06-21 13:58:04 -0500 (Sat, 21 Jun 2008) | 6 lines
Now a from submitted via POST that also has a query string
will contain both FieldStorage and MiniFieldStorage items.
Fixes #1817.
........
r64448 | facundo.batista | 2008-06-21 14:48:19 -0500 (Sat, 21 Jun 2008) | 5 lines
In the deprecated functions I added an alert to review
specially a section of the subprocess documentation
that helps with the replacing of those functionss.
........
r64450 | georg.brandl | 2008-06-22 04:05:29 -0500 (Sun, 22 Jun 2008) | 2 lines
Turn section references into proper cross-references.
........
r64452 | facundo.batista | 2008-06-22 08:36:20 -0500 (Sun, 22 Jun 2008) | 5 lines
Issue #2722. Now the char buffer to support the path string has
not fixed length, it mallocs memory if needed. As a result, we
don't have a maximum for the getcwd() method.
........
r64455 | facundo.batista | 2008-06-22 10:27:10 -0500 (Sun, 22 Jun 2008) | 4 lines
Issue 3164. Small fix to don't repeat a comparation
without necessity.
........
r64461 | georg.brandl | 2008-06-22 13:11:52 -0500 (Sun, 22 Jun 2008) | 2 lines
#3085: Fix syntax error.
........
r64464 | georg.brandl | 2008-06-22 13:31:54 -0500 (Sun, 22 Jun 2008) | 2 lines
Expand docstrings of sqlite3 functions.
........
r64466 | georg.brandl | 2008-06-22 14:07:59 -0500 (Sun, 22 Jun 2008) | 2 lines
Write out "phi" consistently.
........
r64468 | facundo.batista | 2008-06-22 14:35:24 -0500 (Sun, 22 Jun 2008) | 4 lines
Just returning nothing instead of rising TestSkipped, because
it makes the test fail in the trunk.loewis-sun buildbot.
........
2008-07-02 14:30:14 -03:00
|
|
|
|
2011-06-10 02:30:30 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'getgrouplist'), "test needs posix.getgrouplist()")
|
|
|
|
@unittest.skipUnless(hasattr(pwd, 'getpwuid'), "test needs pwd.getpwuid()")
|
|
|
|
@unittest.skipUnless(hasattr(os, 'getuid'), "test needs os.getuid()")
|
|
|
|
def test_getgrouplist(self):
|
2012-12-13 11:20:26 -04:00
|
|
|
user = pwd.getpwuid(os.getuid())[0]
|
|
|
|
group = pwd.getpwuid(os.getuid())[3]
|
|
|
|
self.assertIn(group, posix.getgrouplist(user, group))
|
2011-06-10 02:30:30 -03:00
|
|
|
|
|
|
|
|
2011-01-12 14:45:27 -04:00
|
|
|
@unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
|
2010-07-23 10:53:51 -03:00
|
|
|
def test_getgroups(self):
|
2014-06-28 13:39:35 -03:00
|
|
|
with os.popen('id -G 2>/dev/null') as idg:
|
2010-07-23 10:53:51 -03:00
|
|
|
groups = idg.read().strip()
|
2012-05-02 15:01:38 -03:00
|
|
|
ret = idg.close()
|
2010-07-23 10:53:51 -03:00
|
|
|
|
2016-10-19 06:00:26 -03:00
|
|
|
try:
|
|
|
|
idg_groups = set(int(g) for g in groups.split())
|
|
|
|
except ValueError:
|
|
|
|
idg_groups = set()
|
|
|
|
if ret is not None or not idg_groups:
|
2010-07-23 10:53:51 -03:00
|
|
|
raise unittest.SkipTest("need working 'id -G'")
|
|
|
|
|
2013-02-02 19:08:52 -04:00
|
|
|
# Issues 16698: OS X ABIs prior to 10.6 have limits on getgroups()
|
|
|
|
if sys.platform == 'darwin':
|
|
|
|
import sysconfig
|
|
|
|
dt = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') or '10.0'
|
2014-06-25 17:36:14 -03:00
|
|
|
if tuple(int(n) for n in dt.split('.')[0:2]) < (10, 6):
|
2013-02-02 19:08:52 -04:00
|
|
|
raise unittest.SkipTest("getgroups(2) is broken prior to 10.6")
|
|
|
|
|
2010-08-01 16:18:13 -03:00
|
|
|
# 'id -G' and 'os.getgroups()' should return the same
|
2016-10-19 06:00:26 -03:00
|
|
|
# groups, ignoring order, duplicates, and the effective gid.
|
|
|
|
# #10822/#26944 - It is implementation defined whether
|
|
|
|
# posix.getgroups() includes the effective gid.
|
|
|
|
symdiff = idg_groups.symmetric_difference(posix.getgroups())
|
|
|
|
self.assertTrue(not symdiff or symdiff == {posix.getegid()})
|
2010-07-23 10:53:51 -03:00
|
|
|
|
2011-02-25 19:25:17 -04:00
|
|
|
# tests for the posix *at functions follow
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(os.access in os.supports_dir_fd, "test needs dir_fd support for os.access()")
|
|
|
|
def test_access_dir_fd(self):
|
2011-02-25 19:25:17 -04:00
|
|
|
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
|
|
|
try:
|
2012-06-22 20:30:09 -03:00
|
|
|
self.assertTrue(posix.access(support.TESTFN, os.R_OK, dir_fd=f))
|
2011-02-25 19:25:17 -04:00
|
|
|
finally:
|
|
|
|
posix.close(f)
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(os.chmod in os.supports_dir_fd, "test needs dir_fd support in os.chmod()")
|
|
|
|
def test_chmod_dir_fd(self):
|
2011-02-25 19:25:17 -04:00
|
|
|
os.chmod(support.TESTFN, stat.S_IRUSR)
|
|
|
|
|
|
|
|
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
|
|
|
try:
|
2012-06-22 20:30:09 -03:00
|
|
|
posix.chmod(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
|
2011-02-25 19:25:17 -04:00
|
|
|
|
|
|
|
s = posix.stat(support.TESTFN)
|
|
|
|
self.assertEqual(s[0] & stat.S_IRWXU, stat.S_IRUSR | stat.S_IWUSR)
|
|
|
|
finally:
|
|
|
|
posix.close(f)
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(os.chown in os.supports_dir_fd, "test needs dir_fd support in os.chown()")
|
|
|
|
def test_chown_dir_fd(self):
|
2011-02-25 19:25:17 -04:00
|
|
|
support.unlink(support.TESTFN)
|
2011-06-30 18:25:47 -03:00
|
|
|
support.create_empty_file(support.TESTFN)
|
2011-02-25 19:25:17 -04:00
|
|
|
|
|
|
|
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
|
|
|
try:
|
2012-06-22 20:30:09 -03:00
|
|
|
posix.chown(support.TESTFN, os.getuid(), os.getgid(), dir_fd=f)
|
2011-02-25 19:25:17 -04:00
|
|
|
finally:
|
|
|
|
posix.close(f)
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(os.stat in os.supports_dir_fd, "test needs dir_fd support in os.stat()")
|
|
|
|
def test_stat_dir_fd(self):
|
2011-02-25 19:25:17 -04:00
|
|
|
support.unlink(support.TESTFN)
|
|
|
|
with open(support.TESTFN, 'w') as outfile:
|
|
|
|
outfile.write("testline\n")
|
|
|
|
|
|
|
|
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
|
|
|
try:
|
|
|
|
s1 = posix.stat(support.TESTFN)
|
2012-06-22 20:30:09 -03:00
|
|
|
s2 = posix.stat(support.TESTFN, dir_fd=f)
|
2011-02-25 19:25:17 -04:00
|
|
|
self.assertEqual(s1, s2)
|
2013-01-07 17:13:46 -04:00
|
|
|
s2 = posix.stat(support.TESTFN, dir_fd=None)
|
|
|
|
self.assertEqual(s1, s2)
|
2016-04-08 02:48:20 -03:00
|
|
|
self.assertRaisesRegex(TypeError, 'should be integer or None, not',
|
2013-01-07 17:13:46 -04:00
|
|
|
posix.stat, support.TESTFN, dir_fd=posix.getcwd())
|
2016-04-08 02:48:20 -03:00
|
|
|
self.assertRaisesRegex(TypeError, 'should be integer or None, not',
|
2013-01-07 17:13:46 -04:00
|
|
|
posix.stat, support.TESTFN, dir_fd=float(f))
|
|
|
|
self.assertRaises(OverflowError,
|
|
|
|
posix.stat, support.TESTFN, dir_fd=10**20)
|
2011-02-25 19:25:17 -04:00
|
|
|
finally:
|
|
|
|
posix.close(f)
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(os.utime in os.supports_dir_fd, "test needs dir_fd support in os.utime()")
|
|
|
|
def test_utime_dir_fd(self):
|
2011-02-25 19:25:17 -04:00
|
|
|
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
|
|
|
try:
|
|
|
|
now = time.time()
|
2012-06-22 20:30:09 -03:00
|
|
|
posix.utime(support.TESTFN, None, dir_fd=f)
|
|
|
|
posix.utime(support.TESTFN, dir_fd=f)
|
|
|
|
self.assertRaises(TypeError, posix.utime, support.TESTFN, now, dir_fd=f)
|
|
|
|
self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None), dir_fd=f)
|
|
|
|
self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None), dir_fd=f)
|
|
|
|
self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now), dir_fd=f)
|
|
|
|
self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, "x"), dir_fd=f)
|
|
|
|
posix.utime(support.TESTFN, (int(now), int(now)), dir_fd=f)
|
|
|
|
posix.utime(support.TESTFN, (now, now), dir_fd=f)
|
|
|
|
posix.utime(support.TESTFN,
|
|
|
|
(int(now), int((now - int(now)) * 1e9)), dir_fd=f)
|
|
|
|
posix.utime(support.TESTFN, dir_fd=f,
|
|
|
|
times=(int(now), int((now - int(now)) * 1e9)))
|
|
|
|
|
2012-06-22 21:01:41 -03:00
|
|
|
# try dir_fd and follow_symlinks together
|
2012-06-22 20:30:09 -03:00
|
|
|
if os.utime in os.supports_follow_symlinks:
|
2012-06-22 21:01:41 -03:00
|
|
|
try:
|
|
|
|
posix.utime(support.TESTFN, follow_symlinks=False, dir_fd=f)
|
2012-06-26 04:25:44 -03:00
|
|
|
except ValueError:
|
2012-06-22 21:01:41 -03:00
|
|
|
# whoops! using both together not supported on this platform.
|
|
|
|
pass
|
2012-06-22 20:30:09 -03:00
|
|
|
|
2011-02-25 19:25:17 -04:00
|
|
|
finally:
|
|
|
|
posix.close(f)
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(os.link in os.supports_dir_fd, "test needs dir_fd support in os.link()")
|
|
|
|
def test_link_dir_fd(self):
|
2011-02-25 19:25:17 -04:00
|
|
|
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
|
|
|
try:
|
2012-06-22 20:30:09 -03:00
|
|
|
posix.link(support.TESTFN, support.TESTFN + 'link', src_dir_fd=f, dst_dir_fd=f)
|
2017-11-12 12:31:07 -04:00
|
|
|
except PermissionError as e:
|
|
|
|
self.skipTest('posix.link(): %s' % e)
|
|
|
|
else:
|
2011-02-25 19:25:17 -04:00
|
|
|
# should have same inodes
|
|
|
|
self.assertEqual(posix.stat(support.TESTFN)[1],
|
|
|
|
posix.stat(support.TESTFN + 'link')[1])
|
|
|
|
finally:
|
|
|
|
posix.close(f)
|
|
|
|
support.unlink(support.TESTFN + 'link')
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(os.mkdir in os.supports_dir_fd, "test needs dir_fd support in os.mkdir()")
|
|
|
|
def test_mkdir_dir_fd(self):
|
2011-02-25 19:25:17 -04:00
|
|
|
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
|
|
|
try:
|
2012-06-22 20:30:09 -03:00
|
|
|
posix.mkdir(support.TESTFN + 'dir', dir_fd=f)
|
2011-02-25 19:25:17 -04:00
|
|
|
posix.stat(support.TESTFN + 'dir') # should not raise exception
|
|
|
|
finally:
|
|
|
|
posix.close(f)
|
|
|
|
support.rmtree(support.TESTFN + 'dir')
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless((os.mknod in os.supports_dir_fd) and hasattr(stat, 'S_IFIFO'),
|
|
|
|
"test requires both stat.S_IFIFO and dir_fd support for os.mknod()")
|
|
|
|
def test_mknod_dir_fd(self):
|
2011-02-25 19:25:17 -04:00
|
|
|
# Test using mknodat() to create a FIFO (the only use specified
|
|
|
|
# by POSIX).
|
|
|
|
support.unlink(support.TESTFN)
|
|
|
|
mode = stat.S_IFIFO | stat.S_IRUSR | stat.S_IWUSR
|
|
|
|
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
|
|
|
try:
|
2012-06-22 20:30:09 -03:00
|
|
|
posix.mknod(support.TESTFN, mode, 0, dir_fd=f)
|
2011-02-25 19:25:17 -04:00
|
|
|
except OSError as e:
|
|
|
|
# Some old systems don't allow unprivileged users to use
|
|
|
|
# mknod(), or only support creating device nodes.
|
2017-11-12 12:31:07 -04:00
|
|
|
self.assertIn(e.errno, (errno.EPERM, errno.EINVAL, errno.EACCES))
|
2011-02-25 19:25:17 -04:00
|
|
|
else:
|
|
|
|
self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
|
|
|
|
finally:
|
|
|
|
posix.close(f)
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(os.open in os.supports_dir_fd, "test needs dir_fd support in os.open()")
|
|
|
|
def test_open_dir_fd(self):
|
2011-02-25 19:25:17 -04:00
|
|
|
support.unlink(support.TESTFN)
|
|
|
|
with open(support.TESTFN, 'w') as outfile:
|
|
|
|
outfile.write("testline\n")
|
|
|
|
a = posix.open(posix.getcwd(), posix.O_RDONLY)
|
2012-06-22 20:30:09 -03:00
|
|
|
b = posix.open(support.TESTFN, posix.O_RDONLY, dir_fd=a)
|
2011-02-25 19:25:17 -04:00
|
|
|
try:
|
|
|
|
res = posix.read(b, 9).decode(encoding="utf-8")
|
|
|
|
self.assertEqual("testline\n", res)
|
|
|
|
finally:
|
|
|
|
posix.close(a)
|
|
|
|
posix.close(b)
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(os.readlink in os.supports_dir_fd, "test needs dir_fd support in os.readlink()")
|
|
|
|
def test_readlink_dir_fd(self):
|
2011-02-25 19:25:17 -04:00
|
|
|
os.symlink(support.TESTFN, support.TESTFN + 'link')
|
|
|
|
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
|
|
|
try:
|
|
|
|
self.assertEqual(posix.readlink(support.TESTFN + 'link'),
|
2012-06-22 20:30:09 -03:00
|
|
|
posix.readlink(support.TESTFN + 'link', dir_fd=f))
|
2011-02-25 19:25:17 -04:00
|
|
|
finally:
|
|
|
|
support.unlink(support.TESTFN + 'link')
|
|
|
|
posix.close(f)
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(os.rename in os.supports_dir_fd, "test needs dir_fd support in os.rename()")
|
|
|
|
def test_rename_dir_fd(self):
|
2011-02-25 19:25:17 -04:00
|
|
|
support.unlink(support.TESTFN)
|
2011-06-30 18:25:47 -03:00
|
|
|
support.create_empty_file(support.TESTFN + 'ren')
|
2011-02-25 19:25:17 -04:00
|
|
|
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
|
|
|
try:
|
2012-06-22 20:30:09 -03:00
|
|
|
posix.rename(support.TESTFN + 'ren', support.TESTFN, src_dir_fd=f, dst_dir_fd=f)
|
2011-02-25 19:25:17 -04:00
|
|
|
except:
|
|
|
|
posix.rename(support.TESTFN + 'ren', support.TESTFN)
|
|
|
|
raise
|
|
|
|
else:
|
2012-12-18 15:26:36 -04:00
|
|
|
posix.stat(support.TESTFN) # should not raise exception
|
2011-02-25 19:25:17 -04:00
|
|
|
finally:
|
|
|
|
posix.close(f)
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(os.symlink in os.supports_dir_fd, "test needs dir_fd support in os.symlink()")
|
|
|
|
def test_symlink_dir_fd(self):
|
2011-02-25 19:25:17 -04:00
|
|
|
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
|
|
|
try:
|
2012-06-22 20:30:09 -03:00
|
|
|
posix.symlink(support.TESTFN, support.TESTFN + 'link', dir_fd=f)
|
2011-02-25 19:25:17 -04:00
|
|
|
self.assertEqual(posix.readlink(support.TESTFN + 'link'), support.TESTFN)
|
|
|
|
finally:
|
|
|
|
posix.close(f)
|
|
|
|
support.unlink(support.TESTFN + 'link')
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(os.unlink in os.supports_dir_fd, "test needs dir_fd support in os.unlink()")
|
|
|
|
def test_unlink_dir_fd(self):
|
2011-02-25 19:25:17 -04:00
|
|
|
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
2011-06-30 18:25:47 -03:00
|
|
|
support.create_empty_file(support.TESTFN + 'del')
|
2012-12-18 15:26:36 -04:00
|
|
|
posix.stat(support.TESTFN + 'del') # should not raise exception
|
2011-02-25 19:25:17 -04:00
|
|
|
try:
|
2012-06-22 20:30:09 -03:00
|
|
|
posix.unlink(support.TESTFN + 'del', dir_fd=f)
|
2011-02-25 19:25:17 -04:00
|
|
|
except:
|
|
|
|
support.unlink(support.TESTFN + 'del')
|
|
|
|
raise
|
|
|
|
else:
|
|
|
|
self.assertRaises(OSError, posix.stat, support.TESTFN + 'link')
|
|
|
|
finally:
|
|
|
|
posix.close(f)
|
|
|
|
|
2012-06-22 20:30:09 -03:00
|
|
|
@unittest.skipUnless(os.mkfifo in os.supports_dir_fd, "test needs dir_fd support in os.mkfifo()")
|
|
|
|
def test_mkfifo_dir_fd(self):
|
2011-02-25 19:25:17 -04:00
|
|
|
support.unlink(support.TESTFN)
|
|
|
|
f = posix.open(posix.getcwd(), posix.O_RDONLY)
|
|
|
|
try:
|
2017-11-12 12:31:07 -04:00
|
|
|
try:
|
|
|
|
posix.mkfifo(support.TESTFN,
|
|
|
|
stat.S_IRUSR | stat.S_IWUSR, dir_fd=f)
|
|
|
|
except PermissionError as e:
|
|
|
|
self.skipTest('posix.mkfifo(): %s' % e)
|
2011-02-25 19:25:17 -04:00
|
|
|
self.assertTrue(stat.S_ISFIFO(posix.stat(support.TESTFN).st_mode))
|
|
|
|
finally:
|
|
|
|
posix.close(f)
|
|
|
|
|
2011-08-02 19:30:04 -03:00
|
|
|
requires_sched_h = unittest.skipUnless(hasattr(posix, 'sched_yield'),
|
|
|
|
"don't have scheduling support")
|
2012-08-04 11:16:35 -03:00
|
|
|
requires_sched_affinity = unittest.skipUnless(hasattr(posix, 'sched_setaffinity'),
|
2011-08-03 00:15:40 -03:00
|
|
|
"don't have sched affinity support")
|
2011-08-02 19:30:04 -03:00
|
|
|
|
|
|
|
@requires_sched_h
|
|
|
|
def test_sched_yield(self):
|
|
|
|
# This has no error conditions (at least on Linux).
|
|
|
|
posix.sched_yield()
|
|
|
|
|
|
|
|
@requires_sched_h
|
2011-09-06 14:03:35 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, 'sched_get_priority_max'),
|
|
|
|
"requires sched_get_priority_max()")
|
2011-08-02 19:30:04 -03:00
|
|
|
def test_sched_priority(self):
|
|
|
|
# Round-robin usually has interesting priorities.
|
|
|
|
pol = posix.SCHED_RR
|
|
|
|
lo = posix.sched_get_priority_min(pol)
|
|
|
|
hi = posix.sched_get_priority_max(pol)
|
|
|
|
self.assertIsInstance(lo, int)
|
|
|
|
self.assertIsInstance(hi, int)
|
|
|
|
self.assertGreaterEqual(hi, lo)
|
2011-08-03 00:09:37 -03:00
|
|
|
# OSX evidently just returns 15 without checking the argument.
|
|
|
|
if sys.platform != "darwin":
|
2011-08-03 00:10:55 -03:00
|
|
|
self.assertRaises(OSError, posix.sched_get_priority_min, -23)
|
|
|
|
self.assertRaises(OSError, posix.sched_get_priority_max, -23)
|
2011-08-02 19:30:04 -03:00
|
|
|
|
2018-09-12 19:12:24 -03:00
|
|
|
@requires_sched
|
2011-08-02 19:30:04 -03:00
|
|
|
def test_get_and_set_scheduler_and_param(self):
|
|
|
|
possible_schedulers = [sched for name, sched in posix.__dict__.items()
|
|
|
|
if name.startswith("SCHED_")]
|
|
|
|
mine = posix.sched_getscheduler(0)
|
|
|
|
self.assertIn(mine, possible_schedulers)
|
|
|
|
try:
|
2011-09-09 20:16:55 -03:00
|
|
|
parent = posix.sched_getscheduler(os.getppid())
|
2011-08-02 19:30:04 -03:00
|
|
|
except OSError as e:
|
2011-09-09 20:16:55 -03:00
|
|
|
if e.errno != errno.EPERM:
|
2011-08-02 19:30:04 -03:00
|
|
|
raise
|
|
|
|
else:
|
2011-09-09 20:16:55 -03:00
|
|
|
self.assertIn(parent, possible_schedulers)
|
2011-08-02 19:30:04 -03:00
|
|
|
self.assertRaises(OSError, posix.sched_getscheduler, -1)
|
|
|
|
self.assertRaises(OSError, posix.sched_getparam, -1)
|
|
|
|
param = posix.sched_getparam(0)
|
|
|
|
self.assertIsInstance(param.sched_priority, int)
|
2011-08-21 07:41:43 -03:00
|
|
|
|
2013-01-13 09:13:25 -04:00
|
|
|
# POSIX states that calling sched_setparam() or sched_setscheduler() on
|
|
|
|
# a process with a scheduling policy other than SCHED_FIFO or SCHED_RR
|
|
|
|
# is implementation-defined: NetBSD and FreeBSD can return EINVAL.
|
|
|
|
if not sys.platform.startswith(('freebsd', 'netbsd')):
|
|
|
|
try:
|
|
|
|
posix.sched_setscheduler(0, mine, param)
|
|
|
|
posix.sched_setparam(0, param)
|
|
|
|
except OSError as e:
|
|
|
|
if e.errno != errno.EPERM:
|
|
|
|
raise
|
2011-08-21 07:41:43 -03:00
|
|
|
self.assertRaises(OSError, posix.sched_setparam, -1, param)
|
|
|
|
|
2011-08-02 19:30:04 -03:00
|
|
|
self.assertRaises(OSError, posix.sched_setscheduler, -1, mine, param)
|
|
|
|
self.assertRaises(TypeError, posix.sched_setscheduler, 0, mine, None)
|
|
|
|
self.assertRaises(TypeError, posix.sched_setparam, 0, 43)
|
|
|
|
param = posix.sched_param(None)
|
|
|
|
self.assertRaises(TypeError, posix.sched_setparam, 0, param)
|
|
|
|
large = 214748364700
|
|
|
|
param = posix.sched_param(large)
|
|
|
|
self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
|
|
|
|
param = posix.sched_param(sched_priority=-large)
|
|
|
|
self.assertRaises(OverflowError, posix.sched_setparam, 0, param)
|
|
|
|
|
2011-08-02 20:07:32 -03:00
|
|
|
@unittest.skipUnless(hasattr(posix, "sched_rr_get_interval"), "no function")
|
2011-08-02 19:30:04 -03:00
|
|
|
def test_sched_rr_get_interval(self):
|
2011-08-03 00:19:14 -03:00
|
|
|
try:
|
|
|
|
interval = posix.sched_rr_get_interval(0)
|
|
|
|
except OSError as e:
|
|
|
|
# This likely means that sched_rr_get_interval is only valid for
|
|
|
|
# processes with the SCHED_RR scheduler in effect.
|
|
|
|
if e.errno != errno.EINVAL:
|
|
|
|
raise
|
|
|
|
self.skipTest("only works on SCHED_RR processes")
|
2011-08-02 19:30:04 -03:00
|
|
|
self.assertIsInstance(interval, float)
|
|
|
|
# Reasonable constraints, I think.
|
|
|
|
self.assertGreaterEqual(interval, 0.)
|
|
|
|
self.assertLess(interval, 1.)
|
|
|
|
|
2011-08-02 19:41:34 -03:00
|
|
|
@requires_sched_affinity
|
2012-08-04 11:16:35 -03:00
|
|
|
def test_sched_getaffinity(self):
|
|
|
|
mask = posix.sched_getaffinity(0)
|
|
|
|
self.assertIsInstance(mask, set)
|
|
|
|
self.assertGreaterEqual(len(mask), 1)
|
|
|
|
self.assertRaises(OSError, posix.sched_getaffinity, -1)
|
|
|
|
for cpu in mask:
|
|
|
|
self.assertIsInstance(cpu, int)
|
|
|
|
self.assertGreaterEqual(cpu, 0)
|
|
|
|
self.assertLess(cpu, 1 << 32)
|
2011-08-02 19:30:04 -03:00
|
|
|
|
2012-08-03 09:18:11 -03:00
|
|
|
@requires_sched_affinity
|
2012-08-04 11:16:35 -03:00
|
|
|
def test_sched_setaffinity(self):
|
|
|
|
mask = posix.sched_getaffinity(0)
|
|
|
|
if len(mask) > 1:
|
|
|
|
# Empty masks are forbidden
|
|
|
|
mask.pop()
|
|
|
|
posix.sched_setaffinity(0, mask)
|
|
|
|
self.assertEqual(posix.sched_getaffinity(0), mask)
|
|
|
|
self.assertRaises(OSError, posix.sched_setaffinity, 0, [])
|
|
|
|
self.assertRaises(ValueError, posix.sched_setaffinity, 0, [-10])
|
|
|
|
self.assertRaises(OverflowError, posix.sched_setaffinity, 0, [1<<128])
|
|
|
|
self.assertRaises(OSError, posix.sched_setaffinity, -1, mask)
|
2012-08-03 09:18:11 -03:00
|
|
|
|
2011-10-25 08:34:04 -03:00
|
|
|
def test_rtld_constants(self):
|
|
|
|
# check presence of major RTLD_* constants
|
|
|
|
posix.RTLD_LAZY
|
|
|
|
posix.RTLD_NOW
|
|
|
|
posix.RTLD_GLOBAL
|
|
|
|
posix.RTLD_LOCAL
|
|
|
|
|
2012-06-22 21:58:14 -03:00
|
|
|
@unittest.skipUnless(hasattr(os, 'SEEK_HOLE'),
|
|
|
|
"test needs an OS that reports file holes")
|
2012-06-24 04:51:46 -03:00
|
|
|
def test_fs_holes(self):
|
2012-06-22 13:32:07 -03:00
|
|
|
# Even if the filesystem doesn't report holes,
|
|
|
|
# if the OS supports it the SEEK_* constants
|
|
|
|
# will be defined and will have a consistent
|
|
|
|
# behaviour:
|
|
|
|
# os.SEEK_DATA = current position
|
|
|
|
# os.SEEK_HOLE = end of file position
|
2012-06-24 04:51:46 -03:00
|
|
|
with open(support.TESTFN, 'r+b') as fp:
|
2012-06-22 13:32:07 -03:00
|
|
|
fp.write(b"hello")
|
|
|
|
fp.flush()
|
|
|
|
size = fp.tell()
|
|
|
|
fno = fp.fileno()
|
2012-07-07 09:56:04 -03:00
|
|
|
try :
|
|
|
|
for i in range(size):
|
|
|
|
self.assertEqual(i, os.lseek(fno, i, os.SEEK_DATA))
|
|
|
|
self.assertLessEqual(size, os.lseek(fno, i, os.SEEK_HOLE))
|
|
|
|
self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_DATA)
|
|
|
|
self.assertRaises(OSError, os.lseek, fno, size, os.SEEK_HOLE)
|
|
|
|
except OSError :
|
|
|
|
# Some OSs claim to support SEEK_HOLE/SEEK_DATA
|
|
|
|
# but it is not true.
|
|
|
|
# For instance:
|
|
|
|
# http://lists.freebsd.org/pipermail/freebsd-amd64/2012-January/014332.html
|
|
|
|
raise unittest.SkipTest("OSError raised!")
|
2012-06-22 13:32:07 -03:00
|
|
|
|
2014-02-10 02:05:19 -04:00
|
|
|
def test_path_error2(self):
|
|
|
|
"""
|
|
|
|
Test functions that call path_error2(), providing two filenames in their exceptions.
|
|
|
|
"""
|
2014-10-05 12:37:41 -03:00
|
|
|
for name in ("rename", "replace", "link"):
|
2014-02-10 02:05:19 -04:00
|
|
|
function = getattr(os, name, None)
|
2014-10-05 12:37:59 -03:00
|
|
|
if function is None:
|
|
|
|
continue
|
2014-02-10 02:05:19 -04:00
|
|
|
|
2014-10-05 12:37:59 -03:00
|
|
|
for dst in ("noodly2", support.TESTFN):
|
|
|
|
try:
|
|
|
|
function('doesnotexistfilename', dst)
|
|
|
|
except OSError as e:
|
|
|
|
self.assertIn("'doesnotexistfilename' -> '{}'".format(dst), str(e))
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
self.fail("No valid path_error2() test for os." + name)
|
2014-02-10 02:05:19 -04:00
|
|
|
|
2015-04-20 03:53:58 -03:00
|
|
|
def test_path_with_null_character(self):
|
|
|
|
fn = support.TESTFN
|
|
|
|
fn_with_NUL = fn + '\0'
|
|
|
|
self.addCleanup(support.unlink, fn)
|
|
|
|
support.unlink(fn)
|
|
|
|
fd = None
|
|
|
|
try:
|
2015-04-20 04:12:28 -03:00
|
|
|
with self.assertRaises(ValueError):
|
2015-04-20 03:53:58 -03:00
|
|
|
fd = os.open(fn_with_NUL, os.O_WRONLY | os.O_CREAT) # raises
|
|
|
|
finally:
|
|
|
|
if fd is not None:
|
|
|
|
os.close(fd)
|
|
|
|
self.assertFalse(os.path.exists(fn))
|
2015-04-20 04:12:28 -03:00
|
|
|
self.assertRaises(ValueError, os.mkdir, fn_with_NUL)
|
2015-04-20 03:53:58 -03:00
|
|
|
self.assertFalse(os.path.exists(fn))
|
|
|
|
open(fn, 'wb').close()
|
2015-04-20 04:12:28 -03:00
|
|
|
self.assertRaises(ValueError, os.stat, fn_with_NUL)
|
2015-04-20 03:53:58 -03:00
|
|
|
|
|
|
|
def test_path_with_null_byte(self):
|
|
|
|
fn = os.fsencode(support.TESTFN)
|
|
|
|
fn_with_NUL = fn + b'\0'
|
|
|
|
self.addCleanup(support.unlink, fn)
|
|
|
|
support.unlink(fn)
|
|
|
|
fd = None
|
|
|
|
try:
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
fd = os.open(fn_with_NUL, os.O_WRONLY | os.O_CREAT) # raises
|
|
|
|
finally:
|
|
|
|
if fd is not None:
|
|
|
|
os.close(fd)
|
|
|
|
self.assertFalse(os.path.exists(fn))
|
|
|
|
self.assertRaises(ValueError, os.mkdir, fn_with_NUL)
|
|
|
|
self.assertFalse(os.path.exists(fn))
|
|
|
|
open(fn, 'wb').close()
|
|
|
|
self.assertRaises(ValueError, os.stat, fn_with_NUL)
|
|
|
|
|
2010-07-23 10:53:51 -03:00
|
|
|
class PosixGroupsTester(unittest.TestCase):
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
if posix.getuid() != 0:
|
|
|
|
raise unittest.SkipTest("not enough privileges")
|
|
|
|
if not hasattr(posix, 'getgroups'):
|
|
|
|
raise unittest.SkipTest("need posix.getgroups")
|
|
|
|
if sys.platform == 'darwin':
|
|
|
|
raise unittest.SkipTest("getgroups(2) is broken on OSX")
|
|
|
|
self.saved_groups = posix.getgroups()
|
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
if hasattr(posix, 'setgroups'):
|
|
|
|
posix.setgroups(self.saved_groups)
|
|
|
|
elif hasattr(posix, 'initgroups'):
|
|
|
|
name = pwd.getpwuid(posix.getuid()).pw_name
|
|
|
|
posix.initgroups(name, self.saved_groups[0])
|
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'initgroups'),
|
|
|
|
"test needs posix.initgroups()")
|
|
|
|
def test_initgroups(self):
|
|
|
|
# find missing group
|
|
|
|
|
2014-03-01 20:14:12 -04:00
|
|
|
g = max(self.saved_groups or [0]) + 1
|
2010-07-23 10:53:51 -03:00
|
|
|
name = pwd.getpwuid(posix.getuid()).pw_name
|
|
|
|
posix.initgroups(name, g)
|
|
|
|
self.assertIn(g, posix.getgroups())
|
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(posix, 'setgroups'),
|
|
|
|
"test needs posix.setgroups()")
|
|
|
|
def test_setgroups(self):
|
2010-09-04 14:32:06 -03:00
|
|
|
for groups in [[0], list(range(16))]:
|
2010-07-23 10:53:51 -03:00
|
|
|
posix.setgroups(groups)
|
|
|
|
self.assertListEqual(groups, posix.getgroups())
|
|
|
|
|
2018-05-01 10:45:04 -03:00
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(os, 'posix_spawn'), "test needs os.posix_spawn")
|
|
|
|
class TestPosixSpawn(unittest.TestCase):
|
2018-08-29 20:21:11 -03:00
|
|
|
# Program which does nothing and exit with status 0 (success)
|
|
|
|
NOOP_PROGRAM = (sys.executable, '-I', '-S', '-c', 'pass')
|
|
|
|
|
|
|
|
def python_args(self, *args):
|
|
|
|
# Disable site module to avoid side effects. For example,
|
|
|
|
# on Fedora 28, if the HOME environment variable is not set,
|
|
|
|
# site._getuserbase() calls pwd.getpwuid() which opens
|
|
|
|
# /var/lib/sss/mc/passwd but then leaves the file open which makes
|
|
|
|
# test_close_file() to fail.
|
|
|
|
return (sys.executable, '-I', '-S', *args)
|
|
|
|
|
2018-05-01 10:45:04 -03:00
|
|
|
def test_returns_pid(self):
|
|
|
|
pidfile = support.TESTFN
|
|
|
|
self.addCleanup(support.unlink, pidfile)
|
|
|
|
script = f"""if 1:
|
|
|
|
import os
|
|
|
|
with open({pidfile!r}, "w") as pidfile:
|
|
|
|
pidfile.write(str(os.getpid()))
|
|
|
|
"""
|
2018-08-29 20:21:11 -03:00
|
|
|
args = self.python_args('-c', script)
|
2018-09-08 08:48:18 -03:00
|
|
|
pid = posix.posix_spawn(args[0], args, os.environ)
|
2018-05-01 10:45:04 -03:00
|
|
|
self.assertEqual(os.waitpid(pid, 0), (pid, 0))
|
|
|
|
with open(pidfile) as f:
|
|
|
|
self.assertEqual(f.read(), str(pid))
|
|
|
|
|
|
|
|
def test_no_such_executable(self):
|
|
|
|
no_such_executable = 'no_such_executable'
|
|
|
|
try:
|
|
|
|
pid = posix.posix_spawn(no_such_executable,
|
|
|
|
[no_such_executable],
|
|
|
|
os.environ)
|
|
|
|
except FileNotFoundError as exc:
|
|
|
|
self.assertEqual(exc.filename, no_such_executable)
|
|
|
|
else:
|
|
|
|
pid2, status = os.waitpid(pid, 0)
|
|
|
|
self.assertEqual(pid2, pid)
|
|
|
|
self.assertNotEqual(status, 0)
|
|
|
|
|
|
|
|
def test_specify_environment(self):
|
|
|
|
envfile = support.TESTFN
|
|
|
|
self.addCleanup(support.unlink, envfile)
|
|
|
|
script = f"""if 1:
|
|
|
|
import os
|
|
|
|
with open({envfile!r}, "w") as envfile:
|
|
|
|
envfile.write(os.environ['foo'])
|
|
|
|
"""
|
2018-08-29 20:21:11 -03:00
|
|
|
args = self.python_args('-c', script)
|
|
|
|
pid = posix.posix_spawn(args[0], args,
|
2018-05-11 02:40:43 -03:00
|
|
|
{**os.environ, 'foo': 'bar'})
|
2018-05-01 10:45:04 -03:00
|
|
|
self.assertEqual(os.waitpid(pid, 0), (pid, 0))
|
|
|
|
with open(envfile) as f:
|
|
|
|
self.assertEqual(f.read(), 'bar')
|
|
|
|
|
|
|
|
def test_empty_file_actions(self):
|
|
|
|
pid = posix.posix_spawn(
|
2018-08-29 20:21:11 -03:00
|
|
|
self.NOOP_PROGRAM[0],
|
|
|
|
self.NOOP_PROGRAM,
|
2018-05-01 10:45:04 -03:00
|
|
|
os.environ,
|
2018-09-08 08:48:18 -03:00
|
|
|
file_actions=[]
|
2018-05-01 10:45:04 -03:00
|
|
|
)
|
|
|
|
self.assertEqual(os.waitpid(pid, 0), (pid, 0))
|
|
|
|
|
2018-09-07 12:44:24 -03:00
|
|
|
def test_resetids_explicit_default(self):
|
|
|
|
pid = posix.posix_spawn(
|
|
|
|
sys.executable,
|
|
|
|
[sys.executable, '-c', 'pass'],
|
|
|
|
os.environ,
|
|
|
|
resetids=False
|
|
|
|
)
|
|
|
|
self.assertEqual(os.waitpid(pid, 0), (pid, 0))
|
|
|
|
|
|
|
|
def test_resetids(self):
|
|
|
|
pid = posix.posix_spawn(
|
|
|
|
sys.executable,
|
|
|
|
[sys.executable, '-c', 'pass'],
|
|
|
|
os.environ,
|
|
|
|
resetids=True
|
|
|
|
)
|
|
|
|
self.assertEqual(os.waitpid(pid, 0), (pid, 0))
|
|
|
|
|
|
|
|
def test_resetids_wrong_type(self):
|
|
|
|
with self.assertRaises(TypeError):
|
|
|
|
posix.posix_spawn(sys.executable,
|
|
|
|
[sys.executable, "-c", "pass"],
|
|
|
|
os.environ, resetids=None)
|
|
|
|
|
|
|
|
def test_setpgroup(self):
|
|
|
|
pid = posix.posix_spawn(
|
|
|
|
sys.executable,
|
|
|
|
[sys.executable, '-c', 'pass'],
|
|
|
|
os.environ,
|
|
|
|
setpgroup=os.getpgrp()
|
|
|
|
)
|
|
|
|
self.assertEqual(os.waitpid(pid, 0), (pid, 0))
|
|
|
|
|
|
|
|
def test_setpgroup_wrong_type(self):
|
|
|
|
with self.assertRaises(TypeError):
|
|
|
|
posix.posix_spawn(sys.executable,
|
|
|
|
[sys.executable, "-c", "pass"],
|
|
|
|
os.environ, setpgroup="023")
|
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(signal, 'pthread_sigmask'),
|
|
|
|
'need signal.pthread_sigmask()')
|
|
|
|
def test_setsigmask(self):
|
|
|
|
code = textwrap.dedent("""\
|
2019-01-08 05:58:25 -04:00
|
|
|
import signal
|
|
|
|
signal.raise_signal(signal.SIGUSR1)""")
|
2018-09-07 12:44:24 -03:00
|
|
|
|
|
|
|
pid = posix.posix_spawn(
|
|
|
|
sys.executable,
|
|
|
|
[sys.executable, '-c', code],
|
|
|
|
os.environ,
|
|
|
|
setsigmask=[signal.SIGUSR1]
|
|
|
|
)
|
|
|
|
self.assertEqual(os.waitpid(pid, 0), (pid, 0))
|
|
|
|
|
|
|
|
def test_setsigmask_wrong_type(self):
|
|
|
|
with self.assertRaises(TypeError):
|
|
|
|
posix.posix_spawn(sys.executable,
|
|
|
|
[sys.executable, "-c", "pass"],
|
|
|
|
os.environ, setsigmask=34)
|
|
|
|
with self.assertRaises(TypeError):
|
|
|
|
posix.posix_spawn(sys.executable,
|
|
|
|
[sys.executable, "-c", "pass"],
|
|
|
|
os.environ, setsigmask=["j"])
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
posix.posix_spawn(sys.executable,
|
|
|
|
[sys.executable, "-c", "pass"],
|
|
|
|
os.environ, setsigmask=[signal.NSIG,
|
|
|
|
signal.NSIG+1])
|
|
|
|
|
|
|
|
@unittest.skipUnless(hasattr(signal, 'pthread_sigmask'),
|
|
|
|
'need signal.pthread_sigmask()')
|
|
|
|
def test_setsigdef(self):
|
|
|
|
original_handler = signal.signal(signal.SIGUSR1, signal.SIG_IGN)
|
|
|
|
code = textwrap.dedent("""\
|
2019-01-08 05:58:25 -04:00
|
|
|
import signal
|
|
|
|
signal.raise_signal(signal.SIGUSR1)""")
|
2018-09-07 12:44:24 -03:00
|
|
|
try:
|
|
|
|
pid = posix.posix_spawn(
|
|
|
|
sys.executable,
|
|
|
|
[sys.executable, '-c', code],
|
|
|
|
os.environ,
|
|
|
|
setsigdef=[signal.SIGUSR1]
|
|
|
|
)
|
|
|
|
finally:
|
|
|
|
signal.signal(signal.SIGUSR1, original_handler)
|
|
|
|
|
|
|
|
pid2, status = os.waitpid(pid, 0)
|
|
|
|
self.assertEqual(pid2, pid)
|
|
|
|
self.assertTrue(os.WIFSIGNALED(status), status)
|
|
|
|
self.assertEqual(os.WTERMSIG(status), signal.SIGUSR1)
|
|
|
|
|
|
|
|
def test_setsigdef_wrong_type(self):
|
|
|
|
with self.assertRaises(TypeError):
|
|
|
|
posix.posix_spawn(sys.executable,
|
|
|
|
[sys.executable, "-c", "pass"],
|
|
|
|
os.environ, setsigdef=34)
|
|
|
|
with self.assertRaises(TypeError):
|
|
|
|
posix.posix_spawn(sys.executable,
|
|
|
|
[sys.executable, "-c", "pass"],
|
|
|
|
os.environ, setsigdef=["j"])
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
posix.posix_spawn(sys.executable,
|
|
|
|
[sys.executable, "-c", "pass"],
|
|
|
|
os.environ, setsigdef=[signal.NSIG, signal.NSIG+1])
|
|
|
|
|
2018-09-12 19:12:24 -03:00
|
|
|
@requires_sched
|
2018-09-14 19:12:22 -03:00
|
|
|
@unittest.skipIf(sys.platform.startswith(('freebsd', 'netbsd')),
|
|
|
|
"bpo-34685: test can fail on BSD")
|
2018-09-07 12:44:24 -03:00
|
|
|
def test_setscheduler_only_param(self):
|
|
|
|
policy = os.sched_getscheduler(0)
|
|
|
|
priority = os.sched_get_priority_min(policy)
|
|
|
|
code = textwrap.dedent(f"""\
|
2018-09-14 19:12:22 -03:00
|
|
|
import os, sys
|
2018-09-07 12:44:24 -03:00
|
|
|
if os.sched_getscheduler(0) != {policy}:
|
2018-09-14 19:12:22 -03:00
|
|
|
sys.exit(101)
|
2018-09-07 12:44:24 -03:00
|
|
|
if os.sched_getparam(0).sched_priority != {priority}:
|
2018-09-14 19:12:22 -03:00
|
|
|
sys.exit(102)""")
|
2018-09-07 12:44:24 -03:00
|
|
|
pid = posix.posix_spawn(
|
|
|
|
sys.executable,
|
|
|
|
[sys.executable, '-c', code],
|
|
|
|
os.environ,
|
|
|
|
scheduler=(None, os.sched_param(priority))
|
|
|
|
)
|
|
|
|
self.assertEqual(os.waitpid(pid, 0), (pid, 0))
|
|
|
|
|
2018-09-12 19:12:24 -03:00
|
|
|
@requires_sched
|
2018-09-14 19:12:22 -03:00
|
|
|
@unittest.skipIf(sys.platform.startswith(('freebsd', 'netbsd')),
|
|
|
|
"bpo-34685: test can fail on BSD")
|
2018-09-07 12:44:24 -03:00
|
|
|
def test_setscheduler_with_policy(self):
|
|
|
|
policy = os.sched_getscheduler(0)
|
|
|
|
priority = os.sched_get_priority_min(policy)
|
|
|
|
code = textwrap.dedent(f"""\
|
2018-09-14 19:12:22 -03:00
|
|
|
import os, sys
|
2018-09-07 12:44:24 -03:00
|
|
|
if os.sched_getscheduler(0) != {policy}:
|
2018-09-14 19:12:22 -03:00
|
|
|
sys.exit(101)
|
2018-09-07 12:44:24 -03:00
|
|
|
if os.sched_getparam(0).sched_priority != {priority}:
|
2018-09-14 19:12:22 -03:00
|
|
|
sys.exit(102)""")
|
2018-09-07 12:44:24 -03:00
|
|
|
pid = posix.posix_spawn(
|
|
|
|
sys.executable,
|
|
|
|
[sys.executable, '-c', code],
|
|
|
|
os.environ,
|
|
|
|
scheduler=(policy, os.sched_param(priority))
|
|
|
|
)
|
|
|
|
self.assertEqual(os.waitpid(pid, 0), (pid, 0))
|
|
|
|
|
2018-05-01 10:45:04 -03:00
|
|
|
def test_multiple_file_actions(self):
|
|
|
|
file_actions = [
|
|
|
|
(os.POSIX_SPAWN_OPEN, 3, os.path.realpath(__file__), os.O_RDONLY, 0),
|
|
|
|
(os.POSIX_SPAWN_CLOSE, 0),
|
|
|
|
(os.POSIX_SPAWN_DUP2, 1, 4),
|
|
|
|
]
|
2018-08-29 20:21:11 -03:00
|
|
|
pid = posix.posix_spawn(self.NOOP_PROGRAM[0],
|
|
|
|
self.NOOP_PROGRAM,
|
2018-09-08 08:48:18 -03:00
|
|
|
os.environ,
|
|
|
|
file_actions=file_actions)
|
2018-05-01 10:45:04 -03:00
|
|
|
self.assertEqual(os.waitpid(pid, 0), (pid, 0))
|
|
|
|
|
|
|
|
def test_bad_file_actions(self):
|
2018-08-29 20:21:11 -03:00
|
|
|
args = self.NOOP_PROGRAM
|
2018-05-01 10:45:04 -03:00
|
|
|
with self.assertRaises(TypeError):
|
2018-09-08 08:48:18 -03:00
|
|
|
posix.posix_spawn(args[0], args, os.environ,
|
|
|
|
file_actions=[None])
|
2018-05-01 10:45:04 -03:00
|
|
|
with self.assertRaises(TypeError):
|
2018-09-08 08:48:18 -03:00
|
|
|
posix.posix_spawn(args[0], args, os.environ,
|
|
|
|
file_actions=[()])
|
2018-05-01 10:45:04 -03:00
|
|
|
with self.assertRaises(TypeError):
|
2018-09-08 08:48:18 -03:00
|
|
|
posix.posix_spawn(args[0], args, os.environ,
|
|
|
|
file_actions=[(None,)])
|
2018-05-01 10:45:04 -03:00
|
|
|
with self.assertRaises(TypeError):
|
2018-09-08 08:48:18 -03:00
|
|
|
posix.posix_spawn(args[0], args, os.environ,
|
|
|
|
file_actions=[(12345,)])
|
2018-05-01 10:45:04 -03:00
|
|
|
with self.assertRaises(TypeError):
|
2018-09-08 08:48:18 -03:00
|
|
|
posix.posix_spawn(args[0], args, os.environ,
|
|
|
|
file_actions=[(os.POSIX_SPAWN_CLOSE,)])
|
2018-05-01 10:45:04 -03:00
|
|
|
with self.assertRaises(TypeError):
|
2018-09-08 08:48:18 -03:00
|
|
|
posix.posix_spawn(args[0], args, os.environ,
|
|
|
|
file_actions=[(os.POSIX_SPAWN_CLOSE, 1, 2)])
|
2018-05-01 10:45:04 -03:00
|
|
|
with self.assertRaises(TypeError):
|
2018-09-08 08:48:18 -03:00
|
|
|
posix.posix_spawn(args[0], args, os.environ,
|
|
|
|
file_actions=[(os.POSIX_SPAWN_CLOSE, None)])
|
2018-05-01 10:45:04 -03:00
|
|
|
with self.assertRaises(ValueError):
|
2018-09-08 08:48:18 -03:00
|
|
|
posix.posix_spawn(args[0], args, os.environ,
|
|
|
|
file_actions=[(os.POSIX_SPAWN_OPEN,
|
|
|
|
3, __file__ + '\0',
|
|
|
|
os.O_RDONLY, 0)])
|
2018-05-01 10:45:04 -03:00
|
|
|
|
|
|
|
def test_open_file(self):
|
|
|
|
outfile = support.TESTFN
|
|
|
|
self.addCleanup(support.unlink, outfile)
|
|
|
|
script = """if 1:
|
|
|
|
import sys
|
|
|
|
sys.stdout.write("hello")
|
|
|
|
"""
|
|
|
|
file_actions = [
|
|
|
|
(os.POSIX_SPAWN_OPEN, 1, outfile,
|
|
|
|
os.O_WRONLY | os.O_CREAT | os.O_TRUNC,
|
|
|
|
stat.S_IRUSR | stat.S_IWUSR),
|
|
|
|
]
|
2018-08-29 20:21:11 -03:00
|
|
|
args = self.python_args('-c', script)
|
2018-09-08 08:48:18 -03:00
|
|
|
pid = posix.posix_spawn(args[0], args, os.environ,
|
|
|
|
file_actions=file_actions)
|
2018-05-01 10:45:04 -03:00
|
|
|
self.assertEqual(os.waitpid(pid, 0), (pid, 0))
|
|
|
|
with open(outfile) as f:
|
|
|
|
self.assertEqual(f.read(), 'hello')
|
|
|
|
|
|
|
|
def test_close_file(self):
|
|
|
|
closefile = support.TESTFN
|
|
|
|
self.addCleanup(support.unlink, closefile)
|
|
|
|
script = f"""if 1:
|
|
|
|
import os
|
|
|
|
try:
|
|
|
|
os.fstat(0)
|
|
|
|
except OSError as e:
|
|
|
|
with open({closefile!r}, 'w') as closefile:
|
|
|
|
closefile.write('is closed %d' % e.errno)
|
|
|
|
"""
|
2018-08-29 20:21:11 -03:00
|
|
|
args = self.python_args('-c', script)
|
2018-09-08 08:48:18 -03:00
|
|
|
pid = posix.posix_spawn(args[0], args, os.environ,
|
|
|
|
file_actions=[(os.POSIX_SPAWN_CLOSE, 0),])
|
2018-05-01 10:45:04 -03:00
|
|
|
self.assertEqual(os.waitpid(pid, 0), (pid, 0))
|
|
|
|
with open(closefile) as f:
|
|
|
|
self.assertEqual(f.read(), 'is closed %d' % errno.EBADF)
|
|
|
|
|
|
|
|
def test_dup2(self):
|
|
|
|
dupfile = support.TESTFN
|
|
|
|
self.addCleanup(support.unlink, dupfile)
|
|
|
|
script = """if 1:
|
|
|
|
import sys
|
|
|
|
sys.stdout.write("hello")
|
|
|
|
"""
|
|
|
|
with open(dupfile, "wb") as childfile:
|
|
|
|
file_actions = [
|
|
|
|
(os.POSIX_SPAWN_DUP2, childfile.fileno(), 1),
|
|
|
|
]
|
2018-08-29 20:21:11 -03:00
|
|
|
args = self.python_args('-c', script)
|
2018-09-08 08:48:18 -03:00
|
|
|
pid = posix.posix_spawn(args[0], args, os.environ,
|
|
|
|
file_actions=file_actions)
|
2018-05-01 10:45:04 -03:00
|
|
|
self.assertEqual(os.waitpid(pid, 0), (pid, 0))
|
|
|
|
with open(dupfile) as f:
|
|
|
|
self.assertEqual(f.read(), 'hello')
|
|
|
|
|
|
|
|
|
2003-02-17 14:17:05 -04:00
|
|
|
def test_main():
|
2011-03-20 13:33:57 -03:00
|
|
|
try:
|
2018-05-01 10:45:04 -03:00
|
|
|
support.run_unittest(PosixTester, PosixGroupsTester, TestPosixSpawn)
|
2011-03-20 13:33:57 -03:00
|
|
|
finally:
|
|
|
|
support.reap_children()
|
2003-02-17 14:17:05 -04:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
test_main()
|