Skip to content

Commit becc615

Browse files
[3.11] gh-115961: Improve tests for compressed file-like objects (GH-115963) (GH-116039)
* Increase coverage for compressed file-like objects initialized with a file name, an open file object, a file object opened by file descriptor, and a file-like object without name and mode attributes (io.BytesIO) * Increase coverage for name, fileno(), mode, readable(), writable(), seekable() in different modes and states * No longer skip tests with bytes names * Test objects implementing the path protocol, not just pathlib.Path. (cherry picked from commit e72576c)
1 parent 4007086 commit becc615

File tree

5 files changed

+480
-43
lines changed

5 files changed

+480
-43
lines changed

Lib/test/test_bz2.py

+131-7
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@
33

44
import array
55
import unittest
6+
import io
67
from io import BytesIO, DEFAULT_BUFFER_SIZE
78
import os
89
import pickle
910
import glob
1011
import tempfile
11-
import pathlib
1212
import random
1313
import shutil
1414
import subprocess
1515
import threading
1616
from test.support import import_helper
1717
from test.support import threading_helper
18-
from test.support.os_helper import unlink
18+
from test.support.os_helper import unlink, FakePath
1919
import _compression
2020
import sys
2121

@@ -537,12 +537,136 @@ def testMultiStreamOrdering(self):
537537
with BZ2File(self.filename) as bz2f:
538538
self.assertEqual(bz2f.read(), data1 + data2)
539539

540+
def testOpenFilename(self):
541+
with BZ2File(self.filename, "wb") as f:
542+
f.write(b'content')
543+
self.assertIsInstance(f.fileno(), int)
544+
self.assertIs(f.readable(), False)
545+
self.assertIs(f.writable(), True)
546+
self.assertIs(f.seekable(), False)
547+
self.assertIs(f.closed, False)
548+
self.assertIs(f.closed, True)
549+
self.assertRaises(ValueError, f.fileno)
550+
self.assertRaises(ValueError, f.readable)
551+
self.assertRaises(ValueError, f.writable)
552+
self.assertRaises(ValueError, f.seekable)
553+
554+
with BZ2File(self.filename, "ab") as f:
555+
f.write(b'appendix')
556+
self.assertIsInstance(f.fileno(), int)
557+
self.assertIs(f.readable(), False)
558+
self.assertIs(f.writable(), True)
559+
self.assertIs(f.seekable(), False)
560+
self.assertIs(f.closed, False)
561+
self.assertIs(f.closed, True)
562+
self.assertRaises(ValueError, f.fileno)
563+
self.assertRaises(ValueError, f.readable)
564+
self.assertRaises(ValueError, f.writable)
565+
self.assertRaises(ValueError, f.seekable)
566+
567+
with BZ2File(self.filename, 'rb') as f:
568+
self.assertEqual(f.read(), b'contentappendix')
569+
self.assertIsInstance(f.fileno(), int)
570+
self.assertIs(f.readable(), True)
571+
self.assertIs(f.writable(), False)
572+
self.assertIs(f.seekable(), True)
573+
self.assertIs(f.closed, False)
574+
self.assertIs(f.closed, True)
575+
with self.assertRaises(ValueError):
576+
f.fileno()
577+
self.assertRaises(ValueError, f.readable)
578+
self.assertRaises(ValueError, f.writable)
579+
self.assertRaises(ValueError, f.seekable)
580+
581+
def testOpenFileWithName(self):
582+
with open(self.filename, 'wb') as raw:
583+
with BZ2File(raw, 'wb') as f:
584+
f.write(b'content')
585+
self.assertEqual(f.fileno(), raw.fileno())
586+
self.assertIs(f.readable(), False)
587+
self.assertIs(f.writable(), True)
588+
self.assertIs(f.seekable(), False)
589+
self.assertIs(f.closed, False)
590+
self.assertIs(f.closed, True)
591+
self.assertRaises(ValueError, f.fileno)
592+
self.assertRaises(ValueError, f.readable)
593+
self.assertRaises(ValueError, f.writable)
594+
self.assertRaises(ValueError, f.seekable)
595+
596+
with open(self.filename, 'ab') as raw:
597+
with BZ2File(raw, 'ab') as f:
598+
f.write(b'appendix')
599+
self.assertEqual(f.fileno(), raw.fileno())
600+
self.assertIs(f.readable(), False)
601+
self.assertIs(f.writable(), True)
602+
self.assertIs(f.seekable(), False)
603+
self.assertIs(f.closed, False)
604+
self.assertIs(f.closed, True)
605+
self.assertRaises(ValueError, f.fileno)
606+
self.assertRaises(ValueError, f.readable)
607+
self.assertRaises(ValueError, f.writable)
608+
self.assertRaises(ValueError, f.seekable)
609+
610+
with open(self.filename, 'rb') as raw:
611+
with BZ2File(raw, 'rb') as f:
612+
self.assertEqual(f.read(), b'contentappendix')
613+
self.assertEqual(f.fileno(), raw.fileno())
614+
self.assertIs(f.readable(), True)
615+
self.assertIs(f.writable(), False)
616+
self.assertIs(f.seekable(), True)
617+
self.assertIs(f.closed, False)
618+
self.assertIs(f.closed, True)
619+
with self.assertRaises(ValueError):
620+
f.fileno()
621+
self.assertRaises(ValueError, f.readable)
622+
self.assertRaises(ValueError, f.writable)
623+
self.assertRaises(ValueError, f.seekable)
624+
625+
def testOpenFileWithoutName(self):
626+
bio = BytesIO()
627+
with BZ2File(bio, 'wb') as f:
628+
f.write(b'content')
629+
self.assertRaises(io.UnsupportedOperation, f.fileno)
630+
self.assertRaises(ValueError, f.fileno)
631+
632+
with BZ2File(bio, 'ab') as f:
633+
f.write(b'appendix')
634+
self.assertRaises(io.UnsupportedOperation, f.fileno)
635+
self.assertRaises(ValueError, f.fileno)
636+
637+
bio.seek(0)
638+
with BZ2File(bio, 'rb') as f:
639+
self.assertEqual(f.read(), b'contentappendix')
640+
self.assertRaises(io.UnsupportedOperation, f.fileno)
641+
with self.assertRaises(ValueError):
642+
f.fileno()
643+
644+
def testOpenFileWithIntName(self):
645+
fd = os.open(self.filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC)
646+
with open(fd, 'wb') as raw:
647+
with BZ2File(raw, 'wb') as f:
648+
f.write(b'content')
649+
self.assertEqual(f.fileno(), raw.fileno())
650+
self.assertRaises(ValueError, f.fileno)
651+
652+
fd = os.open(self.filename, os.O_WRONLY | os.O_CREAT | os.O_APPEND)
653+
with open(fd, 'ab') as raw:
654+
with BZ2File(raw, 'ab') as f:
655+
f.write(b'appendix')
656+
self.assertEqual(f.fileno(), raw.fileno())
657+
self.assertRaises(ValueError, f.fileno)
658+
659+
fd = os.open(self.filename, os.O_RDONLY)
660+
with open(fd, 'rb') as raw:
661+
with BZ2File(raw, 'rb') as f:
662+
self.assertEqual(f.read(), b'contentappendix')
663+
self.assertEqual(f.fileno(), raw.fileno())
664+
with self.assertRaises(ValueError):
665+
f.fileno()
666+
540667
def testOpenBytesFilename(self):
541668
str_filename = self.filename
542-
try:
543-
bytes_filename = str_filename.encode("ascii")
544-
except UnicodeEncodeError:
545-
self.skipTest("Temporary file name needs to be ASCII")
669+
bytes_filename = os.fsencode(str_filename)
546670
with BZ2File(bytes_filename, "wb") as f:
547671
f.write(self.DATA)
548672
with BZ2File(bytes_filename, "rb") as f:
@@ -552,7 +676,7 @@ def testOpenBytesFilename(self):
552676
self.assertEqual(f.read(), self.DATA)
553677

554678
def testOpenPathLikeFilename(self):
555-
filename = pathlib.Path(self.filename)
679+
filename = FakePath(self.filename)
556680
with BZ2File(filename, "wb") as f:
557681
f.write(self.DATA)
558682
with BZ2File(filename, "rb") as f:

0 commit comments

Comments
 (0)