PageRenderTime 27ms CodeModel.GetById 16ms app.highlight 9ms RepoModel.GetById 1ms app.codeStats 0ms

/Lib/test/test_fcntl.py

http://unladen-swallow.googlecode.com/
Python | 105 lines | 85 code | 4 blank | 16 comment | 2 complexity | 2d418ecc5f6702d42f37fa33d7d6c25c MD5 | raw file
  1"""Test program for the fcntl C module.
  2
  3OS/2+EMX doesn't support the file locking operations.
  4
  5"""
  6import fcntl
  7import os
  8import struct
  9import sys
 10import unittest
 11from test.test_support import verbose, TESTFN, unlink, run_unittest
 12
 13# TODO - Write tests for flock() and lockf().
 14
 15def get_lockdata():
 16    if sys.platform.startswith('atheos'):
 17        start_len = "qq"
 18    else:
 19        try:
 20            os.O_LARGEFILE
 21        except AttributeError:
 22            start_len = "ll"
 23        else:
 24            start_len = "qq"
 25
 26    if sys.platform in ('netbsd1', 'netbsd2', 'netbsd3',
 27                        'Darwin1.2', 'darwin',
 28                        'freebsd2', 'freebsd3', 'freebsd4', 'freebsd5',
 29                        'freebsd6', 'freebsd7', 'freebsd8',
 30                        'bsdos2', 'bsdos3', 'bsdos4',
 31                        'openbsd', 'openbsd2', 'openbsd3', 'openbsd4'):
 32        if struct.calcsize('l') == 8:
 33            off_t = 'l'
 34            pid_t = 'i'
 35        else:
 36            off_t = 'lxxxx'
 37            pid_t = 'l'
 38        lockdata = struct.pack(off_t + off_t + pid_t + 'hh', 0, 0, 0,
 39                               fcntl.F_WRLCK, 0)
 40    elif sys.platform in ['aix3', 'aix4', 'hp-uxB', 'unixware7']:
 41        lockdata = struct.pack('hhlllii', fcntl.F_WRLCK, 0, 0, 0, 0, 0, 0)
 42    elif sys.platform in ['os2emx']:
 43        lockdata = None
 44    else:
 45        lockdata = struct.pack('hh'+start_len+'hh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)
 46    if lockdata:
 47        if verbose:
 48            print 'struct.pack: ', repr(lockdata)
 49    return lockdata
 50
 51lockdata = get_lockdata()
 52
 53
 54class TestFcntl(unittest.TestCase):
 55
 56    def setUp(self):
 57        self.f = None
 58
 59    def tearDown(self):
 60        if self.f and not self.f.closed:
 61            self.f.close()
 62        unlink(TESTFN)
 63
 64    def test_fcntl_fileno(self):
 65        # the example from the library docs
 66        self.f = open(TESTFN, 'w')
 67        rv = fcntl.fcntl(self.f.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
 68        if verbose:
 69            print 'Status from fcntl with O_NONBLOCK: ', rv
 70        if sys.platform not in ['os2emx']:
 71            rv = fcntl.fcntl(self.f.fileno(), fcntl.F_SETLKW, lockdata)
 72            if verbose:
 73                print 'String from fcntl with F_SETLKW: ', repr(rv)
 74        self.f.close()
 75
 76    def test_fcntl_file_descriptor(self):
 77        # again, but pass the file rather than numeric descriptor
 78        self.f = open(TESTFN, 'w')
 79        rv = fcntl.fcntl(self.f, fcntl.F_SETFL, os.O_NONBLOCK)
 80        if sys.platform not in ['os2emx']:
 81            rv = fcntl.fcntl(self.f, fcntl.F_SETLKW, lockdata)
 82        self.f.close()
 83
 84    def test_fcntl_64_bit(self):
 85        # Issue #1309352: fcntl shouldn't fail when the third arg fits in a
 86        # C 'long' but not in a C 'int'.
 87        try:
 88            cmd = fcntl.F_NOTIFY
 89            # This flag is larger than 2**31 in 64-bit builds
 90            flags = fcntl.DN_MULTISHOT
 91        except AttributeError:
 92            # F_NOTIFY or DN_MULTISHOT unavailable, skipping
 93            return
 94        fd = os.open(os.path.dirname(os.path.abspath(TESTFN)), os.O_RDONLY)
 95        try:
 96            fcntl.fcntl(fd, cmd, flags)
 97        finally:
 98            os.close(fd)
 99
100
101def test_main():
102    run_unittest(TestFcntl)
103
104if __name__ == '__main__':
105    test_main()