3030from .content_tests import ContentTestCollector
3131from .file_tests import FileTestCollector
3232from .schema import WorkflowTest , workflow_tests_from_schema
33- from .util import duplicate_tree , is_in_dir , replace_whitespace
33+ from .util import (decode_unaligned , duplicate_tree , is_in_dir ,
34+ replace_whitespace )
3435from .workflow import Workflow , WorkflowQueue
3536
3637
@@ -450,7 +451,10 @@ def collect(self):
450451 tests += [ExitCodeTest .from_parent (
451452 parent = self ,
452453 workflow = workflow ,
453- stderr_bytes = self .config .getoption ("stderr_bytes" ))]
454+ stderr_bytes = self .config .getoption ("stderr_bytes" ),
455+ stdout_encoding = self .workflow_test .stdout .encoding ,
456+ stderr_encoding = self .workflow_test .stderr .encoding ,
457+ )]
454458
455459 tests += [
456460 FileTestCollector .from_parent (
@@ -476,11 +480,16 @@ def collect(self):
476480
477481class ExitCodeTest (pytest .Item ):
478482 def __init__ (self , parent : pytest .Collector ,
479- workflow : Workflow , stderr_bytes : int ):
483+ workflow : Workflow ,
484+ stderr_bytes : int ,
485+ stdout_encoding : Optional [str ] = None ,
486+ stderr_encoding : Optional [str ] = None ):
480487 name = f"exit code should be { workflow .desired_exit_code } "
481488 super ().__init__ (name , parent = parent )
482489 self .stderr_bytes = stderr_bytes
483490 self .workflow = workflow
491+ self .stdout_encoding = stdout_encoding
492+ self .stderr_encoding = stderr_encoding
484493
485494 def runtest (self ):
486495 # workflow.exit_code waits for workflow to finish.
@@ -489,16 +498,21 @@ def runtest(self):
489498 def repr_failure (self , excinfo , style = None ):
490499 standerr = self .workflow .stderr_file
491500 standout = self .workflow .stdout_file
492- with open (standout , "rb" ) as standout_file , \
493- open (standerr , "rb" ) as standerr_file :
494- if os .path .getsize (standerr ) >= self .stderr_bytes :
495- standerr_file .seek (- self .stderr_bytes , os .SEEK_END )
501+
502+ with open (standout , "rb" ) as standout_file :
496503 if os .path .getsize (standout ) >= self .stderr_bytes :
497504 standout_file .seek (- self .stderr_bytes , os .SEEK_END )
498- message = (f"'{ self .workflow .name } ' exited with exit code " +
499- f"'{ self .workflow .exit_code } ' instead of "
500- f"'{ self .workflow .desired_exit_code } '.\n stderr: "
501- f"{ standerr_file .read ().strip ().decode ('utf-8' )} "
502- f"\n stdout: "
503- f"{ standout_file .read ().strip ().decode ('utf-8' )} " )
504- return message
505+ stdout_text = decode_unaligned (standout_file .read ().strip (),
506+ encoding = self .stdout_encoding )
507+ with open (standerr , "rb" ) as standerr_file :
508+ if os .path .getsize (standerr ) >= self .stderr_bytes :
509+ standerr_file .seek (- self .stderr_bytes , os .SEEK_END )
510+ stderr_text = decode_unaligned (standerr_file .read ().strip (),
511+ encoding = self .stderr_encoding )
512+
513+ return (
514+ f"'{ self .workflow .name } ' exited with exit code " +
515+ f"'{ self .workflow .exit_code } ' instead of "
516+ f"'{ self .workflow .desired_exit_code } '.\n "
517+ f"stderr: { stderr_text } \n "
518+ f"stdout: { stdout_text } " )
0 commit comments