88import glob
99import pathlib
1010import random
11+ import shutil
1112import subprocess
1213import sys
1314from test .support import unlink
2223bz2 = support .import_module ('bz2' )
2324from 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
2637class 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
9689class 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):
838831class 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