blob: 1535a7317f53246a7465ab63c129fdb4d947fd2f [file] [log] [blame]
Trent Mickf29f47b2000-08-11 19:02:59 +00001#!python
2
3#----------------------------------------------------------------------
4# test largefile support on system where this makes sense
5#
Trent Mickf29f47b2000-08-11 19:02:59 +00006#----------------------------------------------------------------------
7
Barry Warsaw04f357c2002-07-23 19:04:11 +00008from test import test_support
Trent Mickf29f47b2000-08-11 19:02:59 +00009import os, struct, stat, sys
10
Martin v. Löwisdf8adcd2001-12-11 17:57:26 +000011try:
12 import signal
13 # The default handler for SIGXFSZ is to abort the process.
14 # By ignoring it, system calls exceeding the file size resource
15 # limit will raise IOError instead of crashing the interpreter.
16 oldhandler = signal.signal(signal.SIGXFSZ, signal.SIG_IGN)
17except (ImportError, AttributeError):
18 pass
19
Trent Mickf29f47b2000-08-11 19:02:59 +000020
Guido van Rossuma31ddbb2001-09-10 15:03:18 +000021# create >2GB file (2GB = 2147483648 bytes)
Guido van Rossume2a383d2007-01-15 16:59:06 +000022size = 2500000000
Guido van Rossuma31ddbb2001-09-10 15:03:18 +000023name = test_support.TESTFN
24
25
Guido van Rossum3b10dc32002-12-02 10:42:30 +000026# On Windows and Mac OSX this test comsumes large resources; It takes
27# a long time to build the >2GB file and takes >2GB of disk space
28# therefore the resource must be enabled to run this test. If not,
29# nothing after this line stanza will be executed.
30if sys.platform[:3] == 'win' or sys.platform == 'darwin':
Barry Warsaw7fdfc382001-08-20 22:37:34 +000031 test_support.requires(
32 'largefile',
33 'test requires %s bytes and a long time to run' % str(size))
Guido van Rossum47f40342001-09-10 13:34:12 +000034else:
35 # Only run if the current filesystem supports large files.
36 # (Skip this test on Windows, since we now always support large files.)
37 f = open(test_support.TESTFN, 'wb')
38 try:
39 # 2**31 == 2147483648
Guido van Rossume2a383d2007-01-15 16:59:06 +000040 f.seek(2147483649)
Guido van Rossum47f40342001-09-10 13:34:12 +000041 # Seeking is not enough of a test: you must write and flush, too!
42 f.write("x")
43 f.flush()
44 except (IOError, OverflowError):
45 f.close()
46 os.unlink(test_support.TESTFN)
47 raise test_support.TestSkipped, \
48 "filesystem does not have largefile support"
49 else:
50 f.close()
51
52
Trent Mickf29f47b2000-08-11 19:02:59 +000053def expect(got_this, expect_this):
Fred Drakedce56412000-10-23 16:38:20 +000054 if test_support.verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000055 print('%r =?= %r ...' % (got_this, expect_this), end=' ')
Fred Drakedce56412000-10-23 16:38:20 +000056 if got_this != expect_this:
57 if test_support.verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000058 print('no')
Tim Petersb8c02302001-09-06 01:17:45 +000059 raise test_support.TestFailed, 'got %r, but expected %r' %\
60 (got_this, expect_this)
Fred Drakedce56412000-10-23 16:38:20 +000061 else:
62 if test_support.verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000063 print('yes')
Trent Mickf29f47b2000-08-11 19:02:59 +000064
65
66# test that each file function works as expected for a large (i.e. >2GB, do
67# we have to check >4GB) files
68
69if test_support.verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000070 print('create large file via seek (may be sparse file) ...')
Tim Peters6e13a562001-09-06 00:32:15 +000071f = open(name, 'wb')
Jason Tishler063606a2003-08-26 11:59:27 +000072try:
73 f.write('z')
74 f.seek(0)
75 f.seek(size)
76 f.write('a')
77 f.flush()
78 if test_support.verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000079 print('check file size with os.fstat')
Jason Tishler063606a2003-08-26 11:59:27 +000080 expect(os.fstat(f.fileno())[stat.ST_SIZE], size+1)
81finally:
82 f.close()
Trent Mickf29f47b2000-08-11 19:02:59 +000083if test_support.verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000084 print('check file size with os.stat')
Trent Mickf29f47b2000-08-11 19:02:59 +000085expect(os.stat(name)[stat.ST_SIZE], size+1)
86
87if test_support.verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000088 print('play around with seek() and read() with the built largefile')
Tim Peters6e13a562001-09-06 00:32:15 +000089f = open(name, 'rb')
Jason Tishler063606a2003-08-26 11:59:27 +000090try:
91 expect(f.tell(), 0)
Collin Winterd745c432007-07-23 00:51:28 +000092 expect(f.read(1), b'z')
Jason Tishler063606a2003-08-26 11:59:27 +000093 expect(f.tell(), 1)
94 f.seek(0)
95 expect(f.tell(), 0)
96 f.seek(0, 0)
97 expect(f.tell(), 0)
98 f.seek(42)
99 expect(f.tell(), 42)
100 f.seek(42, 0)
101 expect(f.tell(), 42)
102 f.seek(42, 1)
103 expect(f.tell(), 84)
104 f.seek(0, 1)
105 expect(f.tell(), 84)
106 f.seek(0, 2) # seek from the end
107 expect(f.tell(), size + 1 + 0)
108 f.seek(-10, 2)
109 expect(f.tell(), size + 1 - 10)
110 f.seek(-size-1, 2)
111 expect(f.tell(), 0)
112 f.seek(size)
113 expect(f.tell(), size)
Collin Winterd745c432007-07-23 00:51:28 +0000114 expect(f.read(1), b'a') # the 'a' that was written at the end of file above
Jason Tishler063606a2003-08-26 11:59:27 +0000115 f.seek(-size-1, 1)
Collin Winterd745c432007-07-23 00:51:28 +0000116 expect(f.read(1), b'z')
Jason Tishler063606a2003-08-26 11:59:27 +0000117 expect(f.tell(), 1)
118finally:
119 f.close()
Trent Mickf29f47b2000-08-11 19:02:59 +0000120
121if test_support.verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000122 print('play around with os.lseek() with the built largefile')
Tim Petersb8c02302001-09-06 01:17:45 +0000123f = open(name, 'rb')
Jason Tishler063606a2003-08-26 11:59:27 +0000124try:
125 expect(os.lseek(f.fileno(), 0, 0), 0)
126 expect(os.lseek(f.fileno(), 42, 0), 42)
127 expect(os.lseek(f.fileno(), 42, 1), 84)
128 expect(os.lseek(f.fileno(), 0, 1), 84)
129 expect(os.lseek(f.fileno(), 0, 2), size+1+0)
130 expect(os.lseek(f.fileno(), -10, 2), size+1-10)
131 expect(os.lseek(f.fileno(), -size-1, 2), 0)
132 expect(os.lseek(f.fileno(), size, 0), size)
Collin Winterd745c432007-07-23 00:51:28 +0000133 expect(f.read(1), b'a') # the 'a' that was written at the end of file above
Jason Tishler063606a2003-08-26 11:59:27 +0000134finally:
135 f.close()
Trent Mickf29f47b2000-08-11 19:02:59 +0000136
Tim Petersfb05db22002-03-11 00:24:00 +0000137if hasattr(f, 'truncate'):
138 if test_support.verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000139 print('try truncate')
Tim Petersfb05db22002-03-11 00:24:00 +0000140 f = open(name, 'r+b')
Jason Tishler063606a2003-08-26 11:59:27 +0000141 try:
142 f.seek(0, 2)
143 expect(f.tell(), size+1) # else we've lost track of the true size
144 # Cut it back via seek + truncate with no argument.
145 newsize = size - 10
146 f.seek(newsize)
147 f.truncate()
148 expect(f.tell(), newsize) # else pointer moved
149 f.seek(0, 2)
150 expect(f.tell(), newsize) # else wasn't truncated
151 # Ensure that truncate(smaller than true size) shrinks the file.
152 newsize -= 1
153 f.seek(42)
154 f.truncate(newsize)
155 expect(f.tell(), 42) # else pointer moved
156 f.seek(0, 2)
157 expect(f.tell(), newsize) # else wasn't truncated
Tim Peters8f01b682002-03-12 03:04:44 +0000158
Jason Tishler063606a2003-08-26 11:59:27 +0000159 # XXX truncate(larger than true size) is ill-defined across platforms
Tim Peters8f01b682002-03-12 03:04:44 +0000160
Jason Tishler063606a2003-08-26 11:59:27 +0000161 # cut it waaaaay back
162 f.seek(0)
163 f.truncate(1)
164 expect(f.tell(), 0) # else pointer moved
165 expect(len(f.read()), 1) # else wasn't truncated
Tim Peters8f01b682002-03-12 03:04:44 +0000166
Jason Tishler063606a2003-08-26 11:59:27 +0000167 finally:
168 f.close()
Trent Mickf29f47b2000-08-11 19:02:59 +0000169
170os.unlink(name)