@@ -3447,100 +3447,53 @@ def test_too_short(self):
3447
3447
self .assertEqual (
3448
3448
b"zzz" , zipfile ._Extra .strip (b"zzz" , (self .ZIP64_EXTRA ,)))
3449
3449
3450
- class StoreSeekReadTest (unittest .TestCase ):
3451
- def test_store_seek_read (self ):
3452
- class StatIO (io .RawIOBase ):
3453
- def __init__ (self , buf : bytes ):
3450
+ class StoredZipExtFileRandomAccessTest (unittest .TestCase ):
3451
+ def test_random_access (self ):
3452
+ from _pyio import BytesIO
3453
+ class StatIO (BytesIO ):
3454
+ def __init__ (self ):
3455
+ super ().__init__ ()
3454
3456
self .bytes_read = 0
3455
- self .buffer = buf
3456
- self .pos = 0
3457
- self .eof = False
3458
-
3459
- def readinto (self , buffer , / ):
3460
- if self .eof :
3461
- return 0
3462
- sz = min (len (buffer ), len (self .buffer ) - self .pos )
3463
- buffer [:sz ] = self .buffer [self .pos :self .pos + sz ]
3464
- self .pos += sz
3465
- self .bytes_read += sz
3466
- self .eof = self .pos == len (self .buffer )
3467
- return sz
3468
-
3469
- def readall (self ):
3470
- if self .eof :
3471
- return b''
3472
- self .eof = True
3473
- self .bytes_read += len (self .buffer ) - self .pos
3474
- ret = self .buffer [self .pos :]
3475
- self .pos = len (self .buffer )
3476
- return ret
3477
-
3478
- def seek (self , offset , whence = os .SEEK_SET , / ):
3479
- if whence == os .SEEK_CUR :
3480
- new_pos = self .pos + offset
3481
- elif whence == os .SEEK_SET :
3482
- new_pos = offset
3483
- elif whence == os .SEEK_END :
3484
- new_pos = len (self .buffer ) + offset
3485
- else :
3486
- raise ValueError ("unsupported whence" )
3487
-
3488
- if new_pos < 0 :
3489
- new_pos = 0
3490
- elif new_pos > len (self .buffer ):
3491
- new_pos = len (self .buffer )
3492
-
3493
- self .eof = new_pos == len (self .buffer )
3494
- self .pos = new_pos
3495
- return new_pos
3496
-
3497
- def tell (self ):
3498
- return self .pos
3499
3457
3500
- def readable (self ):
3501
- return True
3502
-
3503
- def writable (self ):
3504
- return False
3505
-
3506
- def seekable (self ):
3507
- return True
3458
+ def read (self , size = - 1 ):
3459
+ bs = super ().read (size )
3460
+ self .bytes_read += len (bs )
3461
+ return bs
3508
3462
3509
3463
def get_bytes_read (self ):
3510
3464
return self .bytes_read
3511
3465
3512
- bio = io .BytesIO ()
3466
+ sio = StatIO ()
3467
+ # 100000 bytes
3513
3468
txt = b'0123456789' * 10000
3514
3469
3515
3470
# Check seek on a file
3516
- with zipfile .ZipFile (bio , "w" ) as zipf :
3517
- zipf .writestr ("foo.txt" , txt ) # 100000 bytes
3471
+ with zipfile .ZipFile (sio , "w" , compression = zipfile . ZIP_STORED ) as zipf :
3472
+ zipf .writestr ("foo.txt" , txt )
3518
3473
3519
- sio = StatIO (bio .getvalue ())
3520
3474
with zipfile .ZipFile (sio , "r" ) as zipf :
3521
3475
with zipf .open ("foo.txt" , "r" ) as fp :
3522
3476
br = sio .get_bytes_read ()
3523
3477
fp .seek (50000 , os .SEEK_CUR )
3524
- self .assertEqual (sio .get_bytes_read () - br , 0 , 'seek produces extra read!' )
3478
+ self .assertEqual (sio .get_bytes_read () - br , 0 , 'seek produces redundant read!' )
3525
3479
3526
3480
b = fp .read (100 )
3527
3481
self .assertEqual (b , txt [:100 ])
3528
3482
3483
+ # seek length must be greater than ZipExtFile.MIN_READ_SIZE (4096)
3529
3484
# backward seek
3530
- # seek length must be more than MIN_READ_SIZE (4096)
3531
3485
br = sio .get_bytes_read ()
3532
3486
fp .seek (5000 , os .SEEK_CUR )
3533
3487
b = fp .read (100 )
3534
3488
self .assertEqual (b , txt [50000 :50100 ])
3535
- self .assertLessEqual (sio .get_bytes_read () - br , 4096 , 'read more bytes after backward seek!' )
3489
+ self .assertLessEqual (sio .get_bytes_read () - br , 4096 , 'read redundant bytes during backward seek!' )
3536
3490
3537
3491
# forward seek
3538
- # seek length must be more than MIN_READ_SIZE (4096)
3539
3492
br = sio .get_bytes_read ()
3540
3493
fp .seek (- 40000 , os .SEEK_CUR )
3541
3494
b = fp .read (100 )
3542
3495
self .assertEqual (b , txt [10100 :10200 ])
3543
- self .assertLessEqual (sio .get_bytes_read () - br , 4096 , 'read more bytes after forward seek!' )
3496
+ self .assertLessEqual (sio .get_bytes_read () - br , 4096 , 'read redundant bytes during forward seek!' )
3544
3497
3545
3498
if __name__ == "__main__" :
3546
3499
unittest .main ()
0 commit comments