diff --git a/source/lib/output/generateCSV.cpp b/source/lib/output/generateCSV.cpp index f1ea6c64a2..9161c57a93 100644 --- a/source/lib/output/generateCSV.cpp +++ b/source/lib/output/generateCSV.cpp @@ -647,7 +647,7 @@ generate_csv(const output_config& "Agent_Id", "Queue_Id", "Thread_Id", - "Alloc_flags", + "Alloc_Flags", "Start_Timestamp", "End_Timestamp", }}; diff --git a/tests/rocprofv3/scratch-memory/CMakeLists.txt b/tests/rocprofv3/scratch-memory/CMakeLists.txt index cc5a43aa3b..219a46d2fe 100644 --- a/tests/rocprofv3/scratch-memory/CMakeLists.txt +++ b/tests/rocprofv3/scratch-memory/CMakeLists.txt @@ -1,5 +1,5 @@ # -# +# rocprofv3 tool test # cmake_minimum_required(VERSION 3.21.0 FATAL_ERROR) @@ -17,25 +17,45 @@ string(REPLACE "LD_PRELOAD=" "ROCPROF_PRELOAD=" PRELOAD_ENV set(scratch-memory-tracing-env "${PRELOAD_ENV}") +set(VALIDATION_DEPENDS) +foreach(_OUTPUT_FORMAT csv json) + add_test( + NAME rocprofv3-test-scratch-memory-tracing-${_OUTPUT_FORMAT}-execute + COMMAND + $ --scratch-memory-trace -d + ${CMAKE_CURRENT_BINARY_DIR}/%tag%-trace -o out --output-format + ${_OUTPUT_FORMAT} --log-level env -- $) + + set_tests_properties( + rocprofv3-test-scratch-memory-tracing-${_OUTPUT_FORMAT}-execute + PROPERTIES TIMEOUT 45 LABELS "integration-tests" ENVIRONMENT + "${scratch-memory-tracing-env}" FAIL_REGULAR_EXPRESSION + "threw an exception") + + list(APPEND VALIDATION_DEPENDS + rocprofv3-test-scratch-memory-tracing-${_OUTPUT_FORMAT}-execute) +endforeach() + add_test( - NAME rocprofv3-test-scratch-memory-tracing-execute + NAME rocprofv3-test-scratch-memory-tracing-validate COMMAND - $ --scratch-memory-trace -d - ${CMAKE_CURRENT_BINARY_DIR}/%tag%-trace -o out --output-format json --log-level - env -- $) + ${Python3_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/validate.py --json-input + ${CMAKE_CURRENT_BINARY_DIR}/scratch-memory-trace/out_results.json --csv-input + ${CMAKE_CURRENT_BINARY_DIR}/scratch-memory-trace/out_scratch_memory_trace.csv) -set_tests_properties( - rocprofv3-test-scratch-memory-tracing-execute - PROPERTIES TIMEOUT 45 LABELS "integration-tests" ENVIRONMENT - "${scratch-memory-tracing-env}" FAIL_REGULAR_EXPRESSION - "threw an exception") - -add_test(NAME rocprofv3-test-scratch-memory-tracing-validate - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/validate.py --input - ${CMAKE_CURRENT_BINARY_DIR}/scratch-memory-trace/out_results.json) +set(VALIDATION_FILES + ${CMAKE_CURRENT_BINARY_DIR}/scratch-memory-trace/out_results.json + ${CMAKE_CURRENT_BINARY_DIR}/scratch-memory-trace/out_scratch_memory_trace.csv) set_tests_properties( rocprofv3-test-scratch-memory-tracing-validate - PROPERTIES TIMEOUT 45 LABELS "integration-tests" DEPENDS - rocprofv3-test-scratch-memory-tracing-execute FAIL_REGULAR_EXPRESSION - "AssertionError") + PROPERTIES TIMEOUT + 45 + LABELS + "integration-tests" + DEPENDS + "${VALIDATION_DEPENDS}" + FAIL_REGULAR_EXPRESSION + "AssertionError" + ATTACHED_FILES_ON_FAIL + "${VALIDATION_FILES}") diff --git a/tests/rocprofv3/scratch-memory/conftest.py b/tests/rocprofv3/scratch-memory/conftest.py index e099667cb6..a5184d68f0 100644 --- a/tests/rocprofv3/scratch-memory/conftest.py +++ b/tests/rocprofv3/scratch-memory/conftest.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 +import csv import json import pytest @@ -9,15 +10,33 @@ from rocprofiler_sdk.pytest_utils import collapse_dict_list def pytest_addoption(parser): parser.addoption( - "--input", + "--json-input", action="store", default="scratch-memory-tracing/out_results.json", help="Input JSON", ) + parser.addoption( + "--csv-input", + action="store", + default="scratch-memory-tracing/out_scratch_memory_trace.csv", + help="Input CSV", + ) @pytest.fixture -def input_data(request): - filename = request.config.getoption("--input") +def json_input_data(request): + filename = request.config.getoption("--json-input") with open(filename, "r") as inp: return dotdict(collapse_dict_list(json.load(inp))) + + +@pytest.fixture +def csv_input_data(request): + filename = request.config.getoption("--csv-input") + data = [] + with open(filename, "r") as inp: + reader = csv.DictReader(inp) + for row in reader: + data.append(row) + + return data diff --git a/tests/rocprofv3/scratch-memory/validate.py b/tests/rocprofv3/scratch-memory/validate.py index 72c3dec2f1..75ecd179de 100755 --- a/tests/rocprofv3/scratch-memory/validate.py +++ b/tests/rocprofv3/scratch-memory/validate.py @@ -27,8 +27,8 @@ def get_operation(record, kind_name, op_name=None): return None -def test_scratch_memory(input_data): - data = input_data["rocprofiler-sdk-tool"] +def test_scratch_memory(json_input_data, csv_input_data): + data = json_input_data["rocprofiler-sdk-tool"] buffer_records = data["buffer_records"] scratch_memory_data = buffer_records["scratch_memory"] @@ -41,6 +41,9 @@ def test_scratch_memory(input_data): detected_agents_ids = set( agent["id"]["handle"] for agent in data["agents"] if agent["type"] == 2 ) + + assert len(scratch_memory_data) > 0 + # check buffering data for node in scratch_memory_data: assert "size" in node @@ -74,6 +77,41 @@ def test_scratch_memory(input_data): assert 2**64 - 1 not in scratch_reported_agent_ids assert scratch_reported_agent_ids == detected_agents_ids + assert len(csv_input_data) > 0 + + for row in csv_input_data: + assert "Kind" in row, "Kind header not present in csv for scratch memory trace." + assert ( + "Operation" in row + ), "Operation header not present in csv for scratch memory trace." + assert ( + "Agent_Id" in row + ), "Agent_Id header not present in csv for scratch memory trace." + assert ( + "Queue_Id" in row + ), "Queue_Id header not present in csv for scratch memory trace." + assert ( + "Thread_Id" in row + ), "Thread_Id header not present in csv for scratch memory trace." + assert ( + "Alloc_Flags" in row + ), "Alloc_Flags header not present in csv for scratch memory trace." + assert ( + "Start_Timestamp" in row + ), "Start_Timestamp header not present in csv for scratch memory trace." + assert ( + "End_Timestamp" in row + ), "End_Timestamp header not present in csv for scratch memory trace." + + assert row["Kind"] == "SCRATCH_MEMORY" + assert row["Operation"] in ["SCRATCH_MEMORY_ALLOC", "SCRATCH_MEMORY_FREE"] + assert int(row["Agent_Id"]) > 0 + assert int(row["Queue_Id"]) > 0 + assert int(row["Thread_Id"]) > 0 + assert int(row["Start_Timestamp"]) > 0 + assert int(row["End_Timestamp"]) > 0 + assert int(row["Start_Timestamp"]) < int(row["End_Timestamp"]) + if __name__ == "__main__": exit_code = pytest.main(["-x", __file__] + sys.argv[1:])