+++ /dev/null
-"""Test largefile support on system where this makes sense.\r
-"""\r
-\r
-from __future__ import print_function\r
-\r
-import os\r
-import stat\r
-import sys\r
-import unittest\r
-from test.test_support import run_unittest, TESTFN, verbose, requires, \\r
- unlink\r
-import io # C implementation of io\r
-import _pyio as pyio # Python implementation of io\r
-\r
-try:\r
- import signal\r
- # The default handler for SIGXFSZ is to abort the process.\r
- # By ignoring it, system calls exceeding the file size resource\r
- # limit will raise IOError instead of crashing the interpreter.\r
- oldhandler = signal.signal(signal.SIGXFSZ, signal.SIG_IGN)\r
-except (ImportError, AttributeError):\r
- pass\r
-\r
-# create >2GB file (2GB = 2147483648 bytes)\r
-size = 2500000000\r
-\r
-\r
-class LargeFileTest(unittest.TestCase):\r
- """Test that each file function works as expected for a large\r
- (i.e. > 2GB, do we have to check > 4GB) files.\r
-\r
- NOTE: the order of execution of the test methods is important! test_seek\r
- must run first to create the test file. File cleanup must also be handled\r
- outside the test instances because of this.\r
-\r
- """\r
-\r
- def test_seek(self):\r
- if verbose:\r
- print('create large file via seek (may be sparse file) ...')\r
- with self.open(TESTFN, 'wb') as f:\r
- f.write(b'z')\r
- f.seek(0)\r
- f.seek(size)\r
- f.write(b'a')\r
- f.flush()\r
- if verbose:\r
- print('check file size with os.fstat')\r
- self.assertEqual(os.fstat(f.fileno())[stat.ST_SIZE], size+1)\r
-\r
- def test_osstat(self):\r
- if verbose:\r
- print('check file size with os.stat')\r
- self.assertEqual(os.stat(TESTFN)[stat.ST_SIZE], size+1)\r
-\r
- def test_seek_read(self):\r
- if verbose:\r
- print('play around with seek() and read() with the built largefile')\r
- with self.open(TESTFN, 'rb') as f:\r
- self.assertEqual(f.tell(), 0)\r
- self.assertEqual(f.read(1), b'z')\r
- self.assertEqual(f.tell(), 1)\r
- f.seek(0)\r
- self.assertEqual(f.tell(), 0)\r
- f.seek(0, 0)\r
- self.assertEqual(f.tell(), 0)\r
- f.seek(42)\r
- self.assertEqual(f.tell(), 42)\r
- f.seek(42, 0)\r
- self.assertEqual(f.tell(), 42)\r
- f.seek(42, 1)\r
- self.assertEqual(f.tell(), 84)\r
- f.seek(0, 1)\r
- self.assertEqual(f.tell(), 84)\r
- f.seek(0, 2) # seek from the end\r
- self.assertEqual(f.tell(), size + 1 + 0)\r
- f.seek(-10, 2)\r
- self.assertEqual(f.tell(), size + 1 - 10)\r
- f.seek(-size-1, 2)\r
- self.assertEqual(f.tell(), 0)\r
- f.seek(size)\r
- self.assertEqual(f.tell(), size)\r
- # the 'a' that was written at the end of file above\r
- self.assertEqual(f.read(1), b'a')\r
- f.seek(-size-1, 1)\r
- self.assertEqual(f.read(1), b'z')\r
- self.assertEqual(f.tell(), 1)\r
-\r
- def test_lseek(self):\r
- if verbose:\r
- print('play around with os.lseek() with the built largefile')\r
- with self.open(TESTFN, 'rb') as f:\r
- self.assertEqual(os.lseek(f.fileno(), 0, 0), 0)\r
- self.assertEqual(os.lseek(f.fileno(), 42, 0), 42)\r
- self.assertEqual(os.lseek(f.fileno(), 42, 1), 84)\r
- self.assertEqual(os.lseek(f.fileno(), 0, 1), 84)\r
- self.assertEqual(os.lseek(f.fileno(), 0, 2), size+1+0)\r
- self.assertEqual(os.lseek(f.fileno(), -10, 2), size+1-10)\r
- self.assertEqual(os.lseek(f.fileno(), -size-1, 2), 0)\r
- self.assertEqual(os.lseek(f.fileno(), size, 0), size)\r
- # the 'a' that was written at the end of file above\r
- self.assertEqual(f.read(1), b'a')\r
-\r
- def test_truncate(self):\r
- if verbose:\r
- print('try truncate')\r
- with self.open(TESTFN, 'r+b') as f:\r
- # this is already decided before start running the test suite\r
- # but we do it anyway for extra protection\r
- if not hasattr(f, 'truncate'):\r
- raise unittest.SkipTest("open().truncate() not available on this system")\r
- f.seek(0, 2)\r
- # else we've lost track of the true size\r
- self.assertEqual(f.tell(), size+1)\r
- # Cut it back via seek + truncate with no argument.\r
- newsize = size - 10\r
- f.seek(newsize)\r
- f.truncate()\r
- self.assertEqual(f.tell(), newsize) # else pointer moved\r
- f.seek(0, 2)\r
- self.assertEqual(f.tell(), newsize) # else wasn't truncated\r
- # Ensure that truncate(smaller than true size) shrinks\r
- # the file.\r
- newsize -= 1\r
- f.seek(42)\r
- f.truncate(newsize)\r
- if self.new_io:\r
- self.assertEqual(f.tell(), 42)\r
- f.seek(0, 2)\r
- self.assertEqual(f.tell(), newsize)\r
- # XXX truncate(larger than true size) is ill-defined\r
- # across platform; cut it waaaaay back\r
- f.seek(0)\r
- f.truncate(1)\r
- if self.new_io:\r
- self.assertEqual(f.tell(), 0) # else pointer moved\r
- f.seek(0)\r
- self.assertEqual(len(f.read()), 1) # else wasn't truncated\r
-\r
- def test_seekable(self):\r
- # Issue #5016; seekable() can return False when the current position\r
- # is negative when truncated to an int.\r
- if not self.new_io:\r
- self.skipTest("builtin file doesn't have seekable()")\r
- for pos in (2**31-1, 2**31, 2**31+1):\r
- with self.open(TESTFN, 'rb') as f:\r
- f.seek(pos)\r
- self.assertTrue(f.seekable())\r
-\r
-\r
-def test_main():\r
- # On Windows and Mac OSX this test comsumes large resources; It\r
- # takes a long time to build the >2GB file and takes >2GB of disk\r
- # space therefore the resource must be enabled to run this test.\r
- # If not, nothing after this line stanza will be executed.\r
- if sys.platform[:3] == 'win' or sys.platform == 'darwin':\r
- requires('largefile',\r
- 'test requires %s bytes and a long time to run' % str(size))\r
- else:\r
- # Only run if the current filesystem supports large files.\r
- # (Skip this test on Windows, since we now always support\r
- # large files.)\r
- f = open(TESTFN, 'wb', buffering=0)\r
- try:\r
- # 2**31 == 2147483648\r
- f.seek(2147483649)\r
- # Seeking is not enough of a test: you must write and\r
- # flush, too!\r
- f.write(b'x')\r
- f.flush()\r
- except (IOError, OverflowError):\r
- f.close()\r
- unlink(TESTFN)\r
- raise unittest.SkipTest("filesystem does not have largefile support")\r
- else:\r
- f.close()\r
- suite = unittest.TestSuite()\r
- for _open, prefix in [(io.open, 'C'), (pyio.open, 'Py'),\r
- (open, 'Builtin')]:\r
- class TestCase(LargeFileTest):\r
- pass\r
- TestCase.open = staticmethod(_open)\r
- TestCase.new_io = _open is not open\r
- TestCase.__name__ = prefix + LargeFileTest.__name__\r
- suite.addTest(TestCase('test_seek'))\r
- suite.addTest(TestCase('test_osstat'))\r
- suite.addTest(TestCase('test_seek_read'))\r
- suite.addTest(TestCase('test_lseek'))\r
- with _open(TESTFN, 'wb') as f:\r
- if hasattr(f, 'truncate'):\r
- suite.addTest(TestCase('test_truncate'))\r
- suite.addTest(TestCase('test_seekable'))\r
- unlink(TESTFN)\r
- try:\r
- run_unittest(suite)\r
- finally:\r
- unlink(TESTFN)\r
-\r
-if __name__ == '__main__':\r
- test_main()\r