@@ -439,3 +439,80 @@ def test_threads(scorep_env, instrumenter):
439439 assert re .search (
440440 '%s[ ]*[0-9 ]*[0-9 ]*Region: "%s"' % (event , func ), std_out
441441 )
442+
443+ @pytest .mark .skipif (sys .version_info .major < 3 , reason = "not tested for python 2" )
444+ @foreach_instrumenter
445+ def test_io (scorep_env , instrumenter ):
446+ trace_path = get_trace_path (scorep_env )
447+
448+ print ("start" )
449+ std_out , std_err = call_with_scorep (
450+ "cases/io.py" ,
451+ [
452+ "--nocompiler" ,
453+ "--instrumenter-type=" + instrumenter ,
454+ "--noinstrumenter" ,
455+ "--io=runtime:posix" ,
456+ ],
457+ env = scorep_env ,
458+ )
459+
460+ assert std_err == ""
461+ assert "test\n " in std_out
462+
463+ print ("otf2-print" )
464+ std_out , std_err = call (["otf2-print" , trace_path ])
465+
466+ assert std_err == ""
467+
468+ file_regex = "\\ [POSIX I\\ /O\\ ][ \\ w:/]*test\\ .txt"
469+ # print_regex = "STDOUT_FILENO"
470+
471+ ops = {
472+ "open" : {"ENTER" : "open64" , "IO_CREATE_HANDLE" : file_regex , "LEAVE" : "open64" },
473+ "seek" : {"ENTER" : "lseek64" , "IO_SEEK" : file_regex , "LEAVE" : "lseek64" },
474+ "write" : {
475+ "ENTER" : "write" ,
476+ "IO_OPERATION_BEGIN" : file_regex ,
477+ "IO_OPERATION_COMPLETE" : file_regex ,
478+ "LEAVE" : "write" ,
479+ },
480+ "read" : {
481+ "ENTER" : "read" ,
482+ "IO_OPERATION_BEGIN" : file_regex ,
483+ "IO_OPERATION_COMPLETE" : file_regex ,
484+ "LEAVE" : "read" ,
485+ },
486+ # for some reason there is no print in pytest
487+ # "print": {
488+ # "ENTER": "read",
489+ # "IO_OPERATION_BEGIN": print_regex,
490+ # "IO_OPERATION_COMPLETE": print_regex,
491+ # "LEAVE": "read",
492+ # },
493+ "close" : {"ENTER" : "close" , "IO_DESTROY_HANDLE" : file_regex , "LEAVE" : "close" },
494+ }
495+
496+ io_trace = ""
497+ io_trace_after = ""
498+ in_expected_io = False
499+ after_expected_io = False
500+
501+ for line in std_out .split ("\n " ):
502+ if ("user_instrumenter:expect io" in line ) and (in_expected_io is False ):
503+ in_expected_io = True
504+ elif ("user_instrumenter:expect io" in line ) and (in_expected_io is True ):
505+ in_expected_io = False
506+ after_expected_io = True
507+ if in_expected_io :
508+ io_trace += line + "\n "
509+ if after_expected_io :
510+ io_trace_after += line + "\n "
511+
512+ for _ , details in ops .items ():
513+ for event , data in details .items ():
514+ regex_str = '{event:}[ ]*[0-9 ]*[0-9 ]*(Region|Handle): "{data:}"' .format (
515+ event = event , data = data
516+ )
517+ print (regex_str )
518+ assert re .search (regex_str , io_trace )
0 commit comments