1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
# 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()
|