@@ -782,7 +782,7 @@ def test_terminate(self):
782782 self .assertStderrEqual (stderr , b'' )
783783 self .assertEqual (p .wait (), - signal .SIGTERM )
784784
785- def test_surrogates (self ):
785+ def test_surrogates_error_message (self ):
786786 def prepare ():
787787 raise ValueError ("surrogate:\uDCff " )
788788
@@ -801,6 +801,28 @@ def prepare():
801801 else :
802802 self .fail ("Expected ValueError or RuntimeError" )
803803
804+ def test_undecodable_env (self ):
805+ for key , value in (('test' , 'abc\uDCFF ' ), ('test\uDCFF ' , '42' )):
806+ value_repr = repr (value ).encode ("ascii" )
807+
808+ # test str with surrogates
809+ script = "import os; print(repr(os.getenv(%s)))" % repr (key )
810+ stdout = subprocess .check_output (
811+ [sys .executable , "-c" , script ],
812+ env = {key : value })
813+ stdout = stdout .rstrip (b'\n \r ' )
814+ self .assertEquals (stdout , value_repr )
815+
816+ # test bytes
817+ key = key .encode ("ascii" , "surrogateescape" )
818+ value = value .encode ("ascii" , "surrogateescape" )
819+ script = "import os; print(repr(os.getenv(%s)))" % repr (key )
820+ stdout = subprocess .check_output (
821+ [sys .executable , "-c" , script ],
822+ env = {key : value })
823+ stdout = stdout .rstrip (b'\n \r ' )
824+ self .assertEquals (stdout , value_repr )
825+
804826
805827@unittest .skipUnless (mswindows , "Windows specific tests" )
806828class Win32ProcessTestCase (BaseTestCase ):
0 commit comments