Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e0e9d5f

Browse files
Issue #28664: test_bz2 now works on non-Windows platforms without bunzip2
(e.g. on Android).
2 parents 1352712 + 5adc22b commit e0e9d5f

1 file changed

Lines changed: 26 additions & 33 deletions

File tree

Lib/test/test_bz2.py

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import glob
99
import pathlib
1010
import random
11+
import shutil
1112
import subprocess
1213
import sys
1314
from test.support import unlink
@@ -22,6 +23,16 @@
2223
bz2 = support.import_module('bz2')
2324
from bz2 import BZ2File, BZ2Compressor, BZ2Decompressor
2425

26+
has_cmdline_bunzip2 = None
27+
28+
def ext_decompress(data):
29+
global has_cmdline_bunzip2
30+
if has_cmdline_bunzip2 is None:
31+
has_cmdline_bunzip2 = bool(shutil.which('bunzip2'))
32+
if has_cmdline_bunzip2:
33+
return subprocess.check_output(['bunzip2'], input=data)
34+
else:
35+
return bz2.decompress(data)
2536

2637
class BaseTest(unittest.TestCase):
2738
"Base for other testcases."
@@ -74,24 +85,6 @@ def tearDown(self):
7485
if os.path.isfile(self.filename):
7586
os.unlink(self.filename)
7687

77-
if sys.platform == "win32":
78-
# bunzip2 isn't available to run on Windows.
79-
def decompress(self, data):
80-
return bz2.decompress(data)
81-
else:
82-
def decompress(self, data):
83-
pop = subprocess.Popen("bunzip2", shell=True,
84-
stdin=subprocess.PIPE,
85-
stdout=subprocess.PIPE,
86-
stderr=subprocess.STDOUT)
87-
pop.stdin.write(data)
88-
pop.stdin.close()
89-
ret = pop.stdout.read()
90-
pop.stdout.close()
91-
if pop.wait() != 0:
92-
ret = bz2.decompress(data)
93-
return ret
94-
9588

9689
class BZ2FileTest(BaseTest):
9790
"Test the BZ2File class."
@@ -252,7 +245,7 @@ def testWrite(self):
252245
self.assertRaises(TypeError, bz2f.write)
253246
bz2f.write(self.TEXT)
254247
with open(self.filename, 'rb') as f:
255-
self.assertEqual(self.decompress(f.read()), self.TEXT)
248+
self.assertEqual(ext_decompress(f.read()), self.TEXT)
256249

257250
def testWriteChunks10(self):
258251
with BZ2File(self.filename, "w") as bz2f:
@@ -264,7 +257,7 @@ def testWriteChunks10(self):
264257
bz2f.write(str)
265258
n += 1
266259
with open(self.filename, 'rb') as f:
267-
self.assertEqual(self.decompress(f.read()), self.TEXT)
260+
self.assertEqual(ext_decompress(f.read()), self.TEXT)
268261

269262
def testWriteNonDefaultCompressLevel(self):
270263
expected = bz2.compress(self.TEXT, compresslevel=5)
@@ -281,7 +274,7 @@ def testWriteLines(self):
281274
# should raise an exception.
282275
self.assertRaises(ValueError, bz2f.writelines, ["a"])
283276
with open(self.filename, 'rb') as f:
284-
self.assertEqual(self.decompress(f.read()), self.TEXT)
277+
self.assertEqual(ext_decompress(f.read()), self.TEXT)
285278

286279
def testWriteMethodsOnReadOnlyFile(self):
287280
with BZ2File(self.filename, "w") as bz2f:
@@ -299,7 +292,7 @@ def testAppend(self):
299292
self.assertRaises(TypeError, bz2f.write)
300293
bz2f.write(self.TEXT)
301294
with open(self.filename, 'rb') as f:
302-
self.assertEqual(self.decompress(f.read()), self.TEXT * 2)
295+
self.assertEqual(ext_decompress(f.read()), self.TEXT * 2)
303296

304297
def testSeekForward(self):
305298
self.createTempFile()
@@ -602,7 +595,7 @@ def testWriteBytesIO(self):
602595
with BZ2File(bio, "w") as bz2f:
603596
self.assertRaises(TypeError, bz2f.write)
604597
bz2f.write(self.TEXT)
605-
self.assertEqual(self.decompress(bio.getvalue()), self.TEXT)
598+
self.assertEqual(ext_decompress(bio.getvalue()), self.TEXT)
606599
self.assertFalse(bio.closed)
607600

608601
def testSeekForwardBytesIO(self):
@@ -639,7 +632,7 @@ def testCompress(self):
639632
self.assertRaises(TypeError, bz2c.compress)
640633
data = bz2c.compress(self.TEXT)
641634
data += bz2c.flush()
642-
self.assertEqual(self.decompress(data), self.TEXT)
635+
self.assertEqual(ext_decompress(data), self.TEXT)
643636

644637
def testCompressEmptyString(self):
645638
bz2c = BZ2Compressor()
@@ -658,7 +651,7 @@ def testCompressChunks10(self):
658651
data += bz2c.compress(str)
659652
n += 1
660653
data += bz2c.flush()
661-
self.assertEqual(self.decompress(data), self.TEXT)
654+
self.assertEqual(ext_decompress(data), self.TEXT)
662655

663656
@bigmemtest(size=_4G + 100, memuse=2)
664657
def testCompress4G(self, size):
@@ -838,7 +831,7 @@ def test_failure(self):
838831
class CompressDecompressTest(BaseTest):
839832
def testCompress(self):
840833
data = bz2.compress(self.TEXT)
841-
self.assertEqual(self.decompress(data), self.TEXT)
834+
self.assertEqual(ext_decompress(data), self.TEXT)
842835

843836
def testCompressEmptyString(self):
844837
text = bz2.compress(b'')
@@ -888,14 +881,14 @@ def test_binary_modes(self):
888881
with self.open(self.filename, mode) as f:
889882
f.write(self.TEXT)
890883
with open(self.filename, "rb") as f:
891-
file_data = self.decompress(f.read())
884+
file_data = ext_decompress(f.read())
892885
self.assertEqual(file_data, self.TEXT)
893886
with self.open(self.filename, "rb") as f:
894887
self.assertEqual(f.read(), self.TEXT)
895888
with self.open(self.filename, "ab") as f:
896889
f.write(self.TEXT)
897890
with open(self.filename, "rb") as f:
898-
file_data = self.decompress(f.read())
891+
file_data = ext_decompress(f.read())
899892
self.assertEqual(file_data, self.TEXT * 2)
900893

901894
def test_implicit_binary_modes(self):
@@ -906,14 +899,14 @@ def test_implicit_binary_modes(self):
906899
with self.open(self.filename, mode) as f:
907900
f.write(self.TEXT)
908901
with open(self.filename, "rb") as f:
909-
file_data = self.decompress(f.read())
902+
file_data = ext_decompress(f.read())
910903
self.assertEqual(file_data, self.TEXT)
911904
with self.open(self.filename, "r") as f:
912905
self.assertEqual(f.read(), self.TEXT)
913906
with self.open(self.filename, "a") as f:
914907
f.write(self.TEXT)
915908
with open(self.filename, "rb") as f:
916-
file_data = self.decompress(f.read())
909+
file_data = ext_decompress(f.read())
917910
self.assertEqual(file_data, self.TEXT * 2)
918911

919912
def test_text_modes(self):
@@ -925,14 +918,14 @@ def test_text_modes(self):
925918
with self.open(self.filename, mode) as f:
926919
f.write(text)
927920
with open(self.filename, "rb") as f:
928-
file_data = self.decompress(f.read()).decode("ascii")
921+
file_data = ext_decompress(f.read()).decode("ascii")
929922
self.assertEqual(file_data, text_native_eol)
930923
with self.open(self.filename, "rt") as f:
931924
self.assertEqual(f.read(), text)
932925
with self.open(self.filename, "at") as f:
933926
f.write(text)
934927
with open(self.filename, "rb") as f:
935-
file_data = self.decompress(f.read()).decode("ascii")
928+
file_data = ext_decompress(f.read()).decode("ascii")
936929
self.assertEqual(file_data, text_native_eol * 2)
937930

938931
def test_x_mode(self):
@@ -973,7 +966,7 @@ def test_encoding(self):
973966
with self.open(self.filename, "wt", encoding="utf-16-le") as f:
974967
f.write(text)
975968
with open(self.filename, "rb") as f:
976-
file_data = self.decompress(f.read()).decode("utf-16-le")
969+
file_data = ext_decompress(f.read()).decode("utf-16-le")
977970
self.assertEqual(file_data, text_native_eol)
978971
with self.open(self.filename, "rt", encoding="utf-16-le") as f:
979972
self.assertEqual(f.read(), text)

0 commit comments

Comments
 (0)