blob: 59399a9f531b986a5c7fc12a9062a8cbc344990e [file]
# Performs generic (non-project specific) validation of Trace File Contents
include(${CMAKE_CURRENT_LIST_DIR}/json.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/verify-snippet.cmake)
function(trace_entry_has_fields trace entry)
json_has_key("${trace}" "${entry}" cat)
json_has_key("${trace}" "${entry}" dur)
json_has_key("${trace}" "${entry}" name)
json_has_key("${trace}" "${entry}" ph)
json_has_key("${trace}" "${entry}" pid)
json_has_key("${trace}" "${entry}" tid)
json_has_key("${trace}" "${entry}" ts)
json_has_key("${trace}" "${entry}" args)
return(PROPAGATE RunCMake_TEST_FAILED ERROR_MESSAGE)
endfunction()
function(trace_valid_entry trace entry)
string(JSON ph GET "${entry}" ph)
if (NOT ph STREQUAL "X")
json_error("${trace}"
"Invalid event \'${ph}\' (only complete events \'X\' expected)")
endif()
string(JSON start GET "${entry}" ts)
if (start LESS 0)
json_error("${trace}" "Negative time start: ${start}")
endif()
string(JSON duration GET "${entry}" dur)
if (duration LESS 0)
json_error("${trace}" "Negative duration: ${duration}")
endif()
string(JSON pid GET "${entry}" pid)
if (NOT pid EQUAL 0)
json_error("${trace}" "Invalid PID: ${pid}")
endif()
string(JSON tid GET "${entry}" tid)
if (tid LESS 0)
json_error("${trace}" "Invalid TID: ${tid}")
endif()
# Validate "args" as snippet data
string(JSON args GET "${entry}" args)
verify_snippet_data("${trace}" "${args}")
# Check the formation of the "name" based on the snippet data
string(JSON name GET "${entry}" name)
if (NOT name)
json_error("${trace}" "Name is empty: ${entry}")
endif()
string(JSON cat GET "${entry}" cat)
set(expected_name "${cat}")
if (cat STREQUAL "compile")
string(JSON source GET "${args}" source)
string(APPEND expected_name ": ${source}")
elseif (cat STREQUAL "link")
string(JSON target GET "${args}" target)
string(APPEND expected_name ": ${target}")
elseif (cat STREQUAL "install")
string(JSON workingDir GET "${args}" workingDir)
cmake_path(GET workingDir FILENAME lastDirName)
string(APPEND expected_name ": ${lastDirName}")
elseif (cat STREQUAL "custom")
string(JSON command GET "${args}" command)
string(APPEND expected_name ": ${command}")
elseif (cat STREQUAL "test")
string(JSON testName GET "${args}" testName)
string(APPEND expected_name ": ${testName}")
endif()
if (NOT name STREQUAL expected_name)
json_error("${trace}" "Invalid name: ${name}")
endif()
return(PROPAGATE ERROR_MESSAGE RunCMake_TEST_FAILED)
endfunction()
function(verify_trace_entry trace entry)
trace_entry_has_fields("${trace}" "${entry}")
trace_valid_entry("${trace}" "${entry}")
return(PROPAGATE ERROR_MESSAGE RunCMake_TEST_FAILED)
endfunction()
function(verify_trace_file_name index_file trace_file)
cmake_path(GET trace_file FILENAME trace_filename)
cmake_path(GET index_file FILENAME index_filename)
set(timestamp_regex "^(index|trace)-([A-Z0-9\\-]+)\\.json")
if ("${trace_filename}" MATCHES "${timestamp_regex}")
set(trace_timestamp "${CMAKE_MATCH_2}")
else()
add_error("Unable to parse timestamp from trace file name: \'${trace_filename}\'")
endif()
if ("${index_filename}" MATCHES "${timestamp_regex}")
set(index_timestamp "${CMAKE_MATCH_2}")
else()
add_error("Unable to parse timestamp from index file name: \'${index_filename}\'")
endif()
if (NOT "${trace_timestamp}" STREQUAL "${index_timestamp}")
add_error("Trace file timestamp \'${trace_filename}\' does not match the index \'${index_file}\'")
endif()
return(PROPAGATE ERROR_MESSAGE RunCMake_TEST_FAILED)
endfunction()