Tests: Add test for toolchains-v1 File API object

This commit is contained in:
Ben McMorran
2021-01-11 18:37:32 -08:00
parent 1c5bd1bed5
commit 6418dabb87
10 changed files with 195 additions and 54 deletions
@@ -24,6 +24,7 @@ function(check_python case)
file(GLOB index ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/reply/index-*.json)
execute_process(
COMMAND ${PYTHON_EXECUTABLE} "${RunCMake_SOURCE_DIR}/${case}-check.py" "${index}" "${CMAKE_CXX_COMPILER_ID}"
"${RunCMake_TEST_BINARY_DIR}"
RESULT_VARIABLE result
OUTPUT_VARIABLE output
ERROR_VARIABLE output
@@ -62,3 +63,4 @@ endfunction()
run_object(codemodel-v2)
run_object(cache-v2)
run_object(cmakeFiles-v1)
run_object(toolchains-v1)
@@ -0,0 +1,11 @@
set(expect
query
query/client-foo
query/client-foo/query.json
reply
reply/index-[0-9.T-]+.json
reply/toolchains-v1-[0-9a-f]+.json
)
check_api("^${expect}$")
check_python(toolchains-v1)
@@ -0,0 +1,4 @@
file(REMOVE_RECURSE ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/query)
file(WRITE "${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/query/client-foo/query.json" [[
{ "requests": [ { "kind": "toolchains", "version" : 1 } ] }
]])
@@ -0,0 +1,11 @@
set(expect
query
query/client-foo
query/client-foo/toolchains-v1
reply
reply/index-[0-9.T-]+.json
reply/toolchains-v1-[0-9a-f]+.json
)
check_api("^${expect}$")
check_python(toolchains-v1)
@@ -0,0 +1,2 @@
file(REMOVE_RECURSE ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/query)
file(WRITE "${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/query/client-foo/toolchains-v1" "")
@@ -0,0 +1,10 @@
set(expect
query
query/toolchains-v1
reply
reply/index-[0-9.T-]+.json
reply/toolchains-v1-[0-9a-f]+.json
)
check_api("^${expect}$")
check_python(toolchains-v1)
@@ -0,0 +1,2 @@
file(REMOVE_RECURSE ${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/query)
file(WRITE "${RunCMake_TEST_BINARY_DIR}/.cmake/api/v1/query/toolchains-v1" "")
@@ -0,0 +1,86 @@
from check_index import *
import os
class ExpectedVar(object):
def __init__(self, name):
self.name = name
class ExpectedList(object):
def __init__(self, name):
self.name = name
EXPECTED_TOOLCHAIN = {
"language": "CXX",
"compiler": {
"path": ExpectedVar("CMAKE_CXX_COMPILER"),
"id": ExpectedVar("CMAKE_CXX_COMPILER_ID"),
"version": ExpectedVar("CMAKE_CXX_COMPILER_VERSION"),
"target": ExpectedVar("CMAKE_CXX_COMPILER_TARGET"),
"implicit": {
"includeDirectories": \
ExpectedList("CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES"),
"linkDirectories": \
ExpectedList("CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES"),
"linkFrameworkDirectories": \
ExpectedList(
"CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES"),
"linkLibraries": \
ExpectedList("CMAKE_CXX_IMPLICIT_LINK_LIBRARIES"),
}
},
"sourceFileExtensions": \
ExpectedList("CMAKE_CXX_SOURCE_FILE_EXTENSIONS"),
}
def check_objects(o):
assert is_list(o)
assert len(o) == 1
check_index_object(o[0], "toolchains", 1, 0, check_object_toolchains)
def check_object_toolchains(o):
assert sorted(o.keys()) == ["kind", "toolchains", "version"]
# The "kind" and "version" members are handled by check_index_object.
toolchains = o["toolchains"]
assert is_list(toolchains)
# Other platform-specific toolchains may exist (like RC on Windows).
has_cxx_toolchain = False
for toolchain in toolchains:
assert is_dict(toolchain)
assert "language" in toolchain
if toolchain["language"] == "CXX":
check_object_toolchain(toolchain, EXPECTED_TOOLCHAIN)
has_cxx_toolchain = True
assert has_cxx_toolchain
def check_object_toolchain(o, expected):
expected_keys = [
key for (key, value) in expected.items()
if is_string(value) or is_dict(value)
or (type(value) in (ExpectedVar, ExpectedList)
and variables[value.name]["defined"])]
assert sorted(o.keys()) == sorted(expected_keys)
for key in expected_keys:
value = expected[key]
if is_string(value):
assert o[key] == value
elif is_dict(value):
check_object_toolchain(o[key], value)
elif type(value) == ExpectedVar:
assert o[key] == variables[value.name]["value"]
elif type(value) == ExpectedList:
expected_items = filter(
None, variables[value.name]["value"].split(";"))
check_list_match(lambda a, b: a == b, o[key], expected_items)
else:
assert False
with open(os.path.join(sys.argv[3], "toolchain_variables.json")) as f:
variables = json.load(f)
assert is_dict(variables)
assert is_dict(index)
assert sorted(index.keys()) == ["cmake", "objects", "reply"]
check_objects(index["objects"])
@@ -0,0 +1,22 @@
enable_language(CXX)
set(variable_suffixes
COMPILER COMPILER_ID COMPILER_VERSION COMPILER_TARGET
IMPLICIT_INCLUDE_DIRECTORIES IMPLICIT_LINK_DIRECTORIES
IMPLICIT_LINK_FRAMEWORK_DIRECTORIES IMPLICIT_LINK_LIBRARIES
SOURCE_FILE_EXTENSIONS)
set(language CXX)
set(json "{}")
foreach(variable_suffix ${variable_suffixes})
set(variable "CMAKE_${language}_${variable_suffix}")
string(JSON json SET "${json}" "${variable}" "{}")
if(DEFINED "${variable}")
string(JSON json SET "${json}" "${variable}" "defined" "true")
string(JSON json SET "${json}" "${variable}" "value" "\"${${variable}}\"")
else()
string(JSON json SET "${json}" "${variable}" "defined" "false")
endif()
endforeach()
file(WRITE ${CMAKE_BINARY_DIR}/toolchain_variables.json "${json}")