From 89f189fe9a73b27674a9cf1e142fd0bd476f8105 Mon Sep 17 00:00:00 2001 From: Peter Mocary Date: Tue, 27 Aug 2024 22:14:34 +0200 Subject: [PATCH] add tests for pin based tracer engine --- .../sources/collect_trace/cpp_sources/tst.cpp | 7 + tests/sources/collect_trace/tst | Bin 36536 -> 36496 bytes tests/sources/collect_trace/tst-no-debug | Bin 0 -> 14768 bytes tests/sources/collect_trace/tst_waiting | Bin 14976 -> 18584 bytes tests/test_tracer.py | 412 ++++++++++++++++++ 5 files changed, 419 insertions(+) create mode 100755 tests/sources/collect_trace/tst-no-debug diff --git a/tests/sources/collect_trace/cpp_sources/tst.cpp b/tests/sources/collect_trace/cpp_sources/tst.cpp index c7af420f3..d3b130f74 100644 --- a/tests/sources/collect_trace/cpp_sources/tst.cpp +++ b/tests/sources/collect_trace/cpp_sources/tst.cpp @@ -13,6 +13,7 @@ int main() { STAP_PROBE(PROV, INSIDE_CYCLE); int *input = new int[i]; + for(int j = 0; j < i; j++) { input[j] = i - j - 1; } @@ -22,6 +23,12 @@ int main() { } STAP_PROBE(PROV, BEFORE_CYCLE_end); + int *calloc_array = (int*)calloc(10, sizeof(int)); + int *malloc_array = (int*)malloc(11*sizeof(int)); + malloc_array = (int*)realloc(malloc_array, 12*sizeof(int)); + free(calloc_array); + free(malloc_array); + std::cout << "C++ sort" << std::endl; return 0; } diff --git a/tests/sources/collect_trace/tst b/tests/sources/collect_trace/tst index 1fd8bfadc3a6c1f482c7fe72acc26a3f0926ef7e..1af78e70ee2a87c70741c1f9da741f7859a440d8 100755 GIT binary patch literal 36496 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 literal 36536 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 VKjeq|ZZ~acRa_%Cq?Ha<{1cnFGt>Y8 literal 0 HcmV?d00001 diff --git a/tests/sources/collect_trace/tst_waiting b/tests/sources/collect_trace/tst_waiting index 48654b6cbaaa5365426c603db641f10adb9c20c7..3336ad13edb382a054be2ded98cf44ca6f7fd5e3 100755 GIT binary patch literal 18584 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 literal 14976 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 LYZkD7OXdF`CF(?9 diff --git a/tests/test_tracer.py b/tests/test_tracer.py index 04aaac934..43d558b94 100644 --- a/tests/test_tracer.py +++ b/tests/test_tracer.py @@ -4,12 +4,15 @@ # Standard Imports import glob +import json import os import re import shutil # Third-Party Imports from click.testing import CliRunner +from elftools.dwarf.compileunit import CompileUnit +import pytest # Perun Imports from perun import cli @@ -18,10 +21,14 @@ from perun.utils import decorators from perun.utils.exceptions import SystemTapStartupException from perun.utils.structs import CollectStatus +from perun.profile.factory import Profile import perun.collect.trace.run as trace_run import perun.collect.trace.systemtap.engine as stap +import perun.collect.trace.pin.engine as pin +from perun.collect.trace.pin.parse import parser, time_parser, instructions_parser, memory_parser import perun.testing.utils as test_utils + _mocked_stap_code = 0 _mocked_stap_file = "tst_stap_record.txt" @@ -649,3 +656,408 @@ def test_collect_trace_fail(monkeypatch, pcs_full, trace_collect_job): # ) # assert result.exit_code == 1 # assert 'Error while parsing the raw trace record' in result.output + + +@pytest.mark.parametrize( + "mode, additional_arguments", + [ + ("time", []), + ("time", ["--collect-arguments"]), + ("time", ["--collect-basic-blocks"]), + ("time", ["--collect-basic-blocks-only"]), + ("time", ["--collect-arguments", "--collect-basic-blocks"]), + ("instructions", []), + ("memory", []), + ], +) +def test_collect_trace_pin_engine(pcs_full, mode, additional_arguments): + expected_functions = ["main", "QuickSortBad", "BadPartition", "Swap"] + memory_mode_expected_functions = ["new", "free", "malloc"] + profiles_path = os.path.join(os.getcwd(), ".perun", "jobs") + trace_files_path = os.path.join(pcs_full.get_tmp_directory(), "trace", "files") + + runner = CliRunner() + target = os.path.join(os.path.split(__file__)[0], "sources", "collect_trace", "tst") + + args_as_str = "_".join(arg[2:] for arg in additional_arguments) + current_profile_name = f"pin_trace_{mode}_{args_as_str}.perf" + + result = runner.invoke( + cli.collect, + [ + "--profile-name", current_profile_name, + "--cmd", target, + "trace", + "--engine", "pin", + "--mode", mode, + "--keep-temps", + ] + + additional_arguments, + ) # fmt: skip + + generated_profiles = [file for file in os.listdir(profiles_path) if not file.startswith(".")] + trace_files = [file for file in os.listdir(trace_files_path) if not file.startswith(".")] + + pin_root = os.environ["PIN_ROOT"] if os.environ["PIN_ROOT"] else "" + if not pin_root or not os.path.isdir(pin_root): + missing_pin_error_msg = ( + "Undefined PIN_ROOT! Please execute: export PIN_ROOT=" + ) + assert missing_pin_error_msg in result.output + assert len(generated_profiles) == 0 + assert len(trace_files) == 0 + assert result.exit_code == 1 + return + + assert current_profile_name in generated_profiles + assert len(generated_profiles) == 1 + generated_profile_name = generated_profiles[0] + assert len(trace_files) == 2 + assert any(file.startswith("collect_dynamic-data") for file in trace_files) + assert any(file.startswith("collect_static-data") for file in trace_files) + + for trace_file in trace_files: + trace_file_path = os.path.join(trace_files_path, trace_file) + memory_mode_static_data = mode == "memory" and trace_file.startswith("collect_static-data") + # Note: special case - memory mode does not produce static data + assert os.stat(trace_file_path).st_size > 0 or ( + os.stat(trace_file_path).st_size == 0 and memory_mode_static_data + ) + assert result.exit_code == 0 + + generated_profile_path = os.path.join(profiles_path, generated_profile_name) + with open(generated_profile_path) as profile: + profile_contents = json.load(profile) + + expected_function_names = expected_functions + if mode == "memory": + expected_function_names = memory_mode_expected_functions + for expected_function_name in expected_function_names: + any(key.startswith(expected_function_name) for key in profile_contents["resources"]) + + if "--collect-arguments" in additional_arguments: + # Check if some arguments have been collected and that their name and type is present as well + found_arg_value = False + for resource_key, resource_values in profile_contents["resources"].items(): + if any(key.startswith("arg_value") for key in resource_values): + found_arg_value = True + keys = profile_contents["resource_type_map"][resource_key].keys() + keys = [key.split("#", 1)[0] for key in keys if "#" in key] + assert "arg_name" in keys and "arg_type" in keys + assert found_arg_value + + if any(x.startswith("--collect-basic-blocks") for x in additional_arguments): + assert any(key.startswith("BBL") for key in profile_contents["resources"]) + + +# TODO: split this test into 3 test functions +@pytest.mark.parametrize( + "target_binary, additional_args, pin_root, expected_error_msg", + [ + ("tst", [], "/invalid/path", "Undefined or invalid pin root!"), # test invalid pin root + ( + "nonexistent", + [], + "set_to_predefined_variable", + "does not exist or is not an executable ELF", + ), # test nonexistent binary argument + ( + "tst-no-debug", + [], + "set_to_predefined_variable", + "does not exist or is not an executable ELF", + ), # test binary argument without debug info + ( + "tst", + ["--mode", "nonexistent"], + "set_to_predefined_variable", + "Unknown pin engine mode!", + ), # test wrong mode argument value + ("tst", [], "set_to_predefined_variable", "Failed to instrument the program!"), + ], +) +def test_collect_trace_pin_engine_fail( + monkeypatch, pcs_full, target_binary, additional_args, pin_root, expected_error_msg +): + runner = CliRunner() + target = os.path.join(os.path.split(__file__)[0], "sources", "collect_trace", target_binary) + original_pin_root = os.environ["PIN_ROOT"] if os.environ["PIN_ROOT"] else "" + + if pin_root == "set_to_predefined_variable": + if not original_pin_root or not os.path.isdir(original_pin_root): + # test requires predefined PIN_ROOT wich was not defined + return + pin_root = original_pin_root + + if "Failed to instrument the program" in expected_error_msg: + print("happens") + + def _mocked_assemble_collect_program(self, **_): + return + + monkeypatch.setattr( + pin.PinEngine, "assemble_collect_program", _mocked_assemble_collect_program + ) + + os.environ["PIN_ROOT"] = pin_root + result = runner.invoke( + cli.collect, + [ + "--cmd", target, + "trace", + "--engine", "pin", + ] + + additional_args, + ) # fmt: skip + os.environ["PIN_ROOT"] = original_pin_root + + assert expected_error_msg in result.output + assert result.exit_code == 1 + return + + +def test_pin_parsing_instructions_mode_dynamic_data_has_only_basic_blocks(pcs_full, monkeypatch): + runner = CliRunner() + target = os.path.join(os.path.split(__file__)[0], "sources", "collect_trace", "tst") + + def _mocked_collect(self, **_): + # Write to the file so that the parsing executes + with open(self.dynamic_data, "w") as dynamic_data_file: + dynamic_data_file.write("00;123;123;123") + + def _mocked_assemble_collect_program(self, **_): + return + + def _mocked_parse_current_dynamic_entry(self): + dummy_entry = { + "granularity": parser.Granularity.RTN, + "location": parser.InstrumentationLocation.BEFORE, + "id": 123, + "tid": 123, + "pid": 123, + } + return instructions_parser.InstructionDataEntry(**dummy_entry) + + monkeypatch.setattr(pin.PinEngine, "assemble_collect_program", _mocked_assemble_collect_program) + monkeypatch.setattr(pin.PinEngine, "collect", _mocked_collect) + monkeypatch.setattr( + instructions_parser.PinInstructionOutputParser, + "_parse_current_dynamic_entry", + _mocked_parse_current_dynamic_entry, + ) + + result = runner.invoke( + cli.collect, [ + "--cmd", target, + "trace", + "--engine", "pin", + "--mode", "instructions" + ] + ) # fmt: skip + + expected_error_msg = "expects only basic blocks in the dynamic data file" + assert expected_error_msg in result.output + assert result.exit_code == 1 + return + + +@pytest.mark.parametrize( + "mode, entry_index", + [ + ("instructions", -2), + ("instructions", -1), + ("memory", -2), + ("memory", -1), + ("time", 0), + ("time", -1), + ], +) +def test_pin_parsing_dynamic_data_missing_pair_entries(pcs_full, monkeypatch, mode, entry_index): + runner = CliRunner() + target = os.path.join(os.path.split(__file__)[0], "sources", "collect_trace", "tst") + + static_data_contents_instructions = ( + "#Files\n" + "/home/jirka/perun/tests/collect_trace/cpp_sources/tst.cpp;1\n" + ";0\n" + "#Basic blocks\n" + "94025837187843;main;1;7;1;9;11;12\n" + "94025837187869;main;1;6;1;13;14\n" + ) + + dynamic_data_contents_instructions = [ + "10;94025837187843;0;1205897\n", + "11;94025837187843;0;1205897\n", + "10;94025837187869;0;1205897\n", + "11;94025837187869;0;1205897\n", + ] + + static_data_contents_time = ( + "#Files\n" + "/home/jirka/perun/tests/collect_trace/cpp_sources/sorts.h;1\n" + ";0\n" + "#Routines\n" + "0;Swap;1;77;81\n" + "1;BadPartition;1;104;120\n" + ) + dynamic_data_contents_time = [ + "00;1;0;1201051;1724240590601647\n", + "00;0;0;1201051;1724240590601880\n", + "01;0;0;1201051;1724240590601888\n", + "01;1;0;1201051;1724240590601965\n", + ] + + dynamic_data_contents_memory = [ + "140061472141296;malloc;140061474240492;operator new;0;1206663;/path/file.cpp;0;20\n", + "140061472141296;malloc;0;1206663;0x5585a9dc62b0\n", + "140061472143008;free;94031851818233;QuickSortBad;0;1206663;/path/file.cpp;74;0x5585a9dc62d0\n", + "140061474240464;new;94031851819838;main;0;1206663;/path/file.cpp;14;80\n", + "140061474240464;new;0;1206663;0x5585a9dc63f0\n", + ] + + expected_resources_count = 1 + if mode == "instructions": + dynamic_data_contents = dynamic_data_contents_instructions + static_data_contents = static_data_contents_instructions + + if mode == "memory": + dynamic_data_contents = dynamic_data_contents_memory + static_data_contents = "" + expected_resources_count = 2 + + if mode == "time": + dynamic_data_contents = dynamic_data_contents_time + static_data_contents = static_data_contents_time + + dynamic_data_contents.pop(entry_index) + + def _mocked_collect(self, **_): + with open(self.dynamic_data, "w") as dynamic_data_file: + dynamic_data_file.write("".join(dynamic_data_contents)) + if mode != "memory": + with open(self.static_data, "w") as static_data_file: + static_data_file.write(static_data_contents) + + def _mocked_assemble_collect_program(self, **_): + return + + def _mocked_after(**kwargs): + resources = list(kwargs["config"].engine.transform(**kwargs)) + assert len(resources) == expected_resources_count + kwargs["profile"] = Profile() + kwargs["profile"].update_resources({"resources": resources}, "global") + return CollectStatus.OK, "", dict(kwargs) + + monkeypatch.setattr(pin.PinEngine, "assemble_collect_program", _mocked_assemble_collect_program) + monkeypatch.setattr(pin.PinEngine, "collect", _mocked_collect) + monkeypatch.setattr(trace_run, "after", _mocked_after) + + result = runner.invoke( + cli.cli, [ + "-vvv", + "-d", + "collect", + "--cmd", target, + "trace", + "--engine", "pin", + "--mode", mode + ], + ) # fmt: skip + + assert result.exit_code == 0 + + # check some debug messages + basic_blocks_backlog_unpaired = 1 + functions_backlog_unpaired = 1 + if entry_index == -2 or entry_index == 0: # if removing the opening entry + assert "Closing entry does not have a pair in the backlog" in result.output + basic_blocks_backlog_unpaired = 0 + functions_backlog_unpaired = 0 + if mode == "time": + basic_blocks_backlog_unpaired = 0 + + unpaired_entries_in_backlogs_cnt = basic_blocks_backlog_unpaired + functions_backlog_unpaired + if mode in ["instructions", "time"] and unpaired_entries_in_backlogs_cnt > 0: + assert ( + f"Unpaired entries in backlogs: Functions - {functions_backlog_unpaired} " + f"and Basic blocks - {basic_blocks_backlog_unpaired}" + ) in result.output + if mode == "memory" and entry_index == -1: + assert "Unpaired memory entries in backlog: 1" in result.output + + +def test_pin_parsing_malformed_static_data(pcs_full, monkeypatch): + runner = CliRunner() + target = os.path.join(os.path.split(__file__)[0], "sources", "collect_trace", "tst") + + static_data_contents = ( + "\n\n#Files\n" + "/home/jirka/perun/tests/collect_trace/cpp_sources/tst.cpp;1\n" + ";0\n\n\n\n" + "#Basic blocks\n" + "94025837187843;main;1;7;1;9;11;12\n" + "94025837187869;main;1;6;1;13;14\n" + "#Invalid table header 123\n" + ) + dynamic_data_contents = [ + "10;94025837187843;0;1205897\n", + "11;94025837187843;0;1205897\n", + ] + + def _mocked_collect(self, **_): + with open(self.dynamic_data, "w") as dynamic_data_file: + dynamic_data_file.write("".join(dynamic_data_contents)) + with open(self.static_data, "w") as static_data_file: + static_data_file.write(static_data_contents) + + def _mocked_assemble_collect_program(self, **_): + return + + monkeypatch.setattr(pin.PinEngine, "assemble_collect_program", _mocked_assemble_collect_program) + monkeypatch.setattr(pin.PinEngine, "collect", _mocked_collect) + + result = runner.invoke( + cli.cli, [ + "-vvv", + "-d", + "collect", + "--cmd", target, + "trace", + "--engine", "pin", + "--mode", "instructions", + ], + ) # fmt: skip + + assert result.exit_code == 0 + assert ( + "Skipping table with unknown separator: " "#Invalid table header 123" + ) in result.output # debug message + return + + +def test_pin_binary_scan_fail(pcs_full, monkeypatch): + runner = CliRunner() + target = os.path.join(os.path.split(__file__)[0], "sources", "collect_trace", "tst") + + def _mocked_get_top_DIE(self): + raise Exception("Dummy exception") + + monkeypatch.setattr(CompileUnit, "get_top_DIE", _mocked_get_top_DIE) + + result = runner.invoke( + cli.cli, [ + "-vvv", + "-d", + "collect", + "--cmd", target, + "trace", + "--engine", "pin", + "--collect-arguments", + ], + ) # fmt: skip + + assert result.exit_code == 1 + assert ( + "Couldn't read the DWARF debug info, please ensure that the binary is compiled " + "with -g option (when using gcc)." + ) in result.output