diff --git a/dev_support/CMakeLists.txt b/dev_support/CMakeLists.txt index ab76b70b..3d6494c0 100644 --- a/dev_support/CMakeLists.txt +++ b/dev_support/CMakeLists.txt @@ -1,5 +1,7 @@ # Only mock Demo and test tools link these kFixture registrations. # A single OBJECT target inserts each registration exactly once per consumer. -add_library(edgeflow_demo_fixture_models OBJECT inference/test_biz_models.cpp) +file(GLOB_RECURSE EDGEFLOW_DEMO_FIXTURE_SOURCES CONFIGURE_DEPENDS + "${CMAKE_CURRENT_SOURCE_DIR}/inference/*.cpp") +add_library(edgeflow_demo_fixture_models OBJECT ${EDGEFLOW_DEMO_FIXTURE_SOURCES}) target_link_libraries(edgeflow_demo_fixture_models PRIVATE edgeflow_internal_headers llm_edgeflow::internal_runtime) diff --git a/doc/dev_guide/source_layout.md b/doc/dev_guide/source_layout.md index d0aa892d..5820f5a4 100644 --- a/doc/dev_guide/source_layout.md +++ b/doc/dev_guide/source_layout.md @@ -96,8 +96,10 @@ cmake -P tests/contract/architecture/test_cmake_structure.cmake Engine 的 `backends/` 单独归 Backend 目标。Adapter 的 `shared_algorithm_runtime.cpp` 与本地日志等级实现 `src/log.cpp` 显式归组合根。CLI 的两个可执行入口及 Demo 的 `main.cpp` 从公共实现中排除, 分别归自己的可执行目标。新增独立目标时仍须声明其入口和归属,不能混入已有目标。 -测试按 `tests/RuntimeTests.cmake` 的目录和命名规则收集。跨 runner、进程隔离、生成源码及 -可选 E2E 目标保留显式登记。常规 GoogleTest 用例自动发现并生成 CTest 入口。 +测试按 `tests/RuntimeTests.cmake` 的目录和命名规则递归收集;`dev_support/` 的示例和推理夹具 +也按所属目录递归收集。跨 runner、进程隔离、生成源码及可选 E2E 目标保留显式登记。 +常规 GoogleTest 用例和脚本测试自动生成 CTest 入口;命名、参数和新增文件的规则见 +[测试收集](../../tests/README.md#开发与收集)。 ## 头文件的三种使用范围 @@ -166,7 +168,7 @@ CMake 缓存变量 `EDGEFLOW_OPERATOR_SHELL`(默认 `mock`)为每个构建 以上三个必需目录缺一时配置失败。Adapter、Demo、测试 runner 和集成层头视图的通配收集 先排除全部具体壳及 `operator_shell//` 夹具目录,再加入选中项。壳无关一致性套件位于 `tests/contract/operator_shell/` 本层。公共头视图和平台声明仍使用当前来源;该机制只隔离源码与 -夹具,不表示已经可以切换真实平台头。`OperatorShellSelectionTest` 检查默认选择、缺失目录失败、 +夹具,不表示已经可以切换真实平台头。`contract/architecture/test_operator_shell_selection.cmake` 检查默认选择、缺失目录失败、 未选中壳的排除,以及生产目标不含测试驱动和清单。 编写转换器时,包含 `adapter/io_converter.h` 和 `adapter/converter_authoring.h`。 diff --git a/scripts/check_layer_isolation.sh b/scripts/check_layer_isolation.sh index 68e353af..da75eadd 100755 --- a/scripts/check_layer_isolation.sh +++ b/scripts/check_layer_isolation.sh @@ -116,7 +116,7 @@ echo "✅ [LayerGuard PASS] Backend vendor resources and Qwen generation semanti if [[ -n "${LLM_EDGEFLOW_LAYER_COMPILE_MANIFEST:-}" ]]; then cmake "-DLAYER_COMPILE_MANIFEST=${LLM_EDGEFLOW_LAYER_COMPILE_MANIFEST}" \ - -P "${REPO_ROOT}/tests/contract/architecture/test_layer_header_views.cmake" + -P "${REPO_ROOT}/tests/contract/architecture/layer_header_view_checks.cmake" fi echo "======================================================================" diff --git a/scripts/run_sanitizers.sh b/scripts/run_sanitizers.sh index 8f182fd5..10c561ef 100755 --- a/scripts/run_sanitizers.sh +++ b/scripts/run_sanitizers.sh @@ -157,7 +157,7 @@ else echo ">>> Running full sanitized CTest suite with [${SANITIZERS}] <<<" fi if [[ "${DETECT_LEAKS:-0}" == "1" ]] || [[ "${SANITIZERS}" == *"thread"* ]]; then - CTEST_ARGS+=( -E '^PipelineStudioServerTest$' ) + CTEST_ARGS+=( -E '^tooling/test_pipeline_studio\.py$' ) fi ( cd "${BUILD_DIR}" diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ce378591..7586e24a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -40,41 +40,8 @@ endfunction() find_package(Python3 COMPONENTS Interpreter REQUIRED) -set(_edgeflow_guard_platform_flags "") -foreach(flag IN LISTS edgeflow_cxx_platform_flags) - list(APPEND _edgeflow_guard_platform_flags "--cxx-flag=${flag}") -endforeach() -set(_edgeflow_guard_sanitizers "") -if(ENABLE_SANITIZERS) - list(APPEND _edgeflow_guard_sanitizers --sanitizers "${LLM_EDGEFLOW_SANITIZERS}") -endif() -add_test(NAME QualityGateScriptsContractTest - COMMAND ${Python3_EXECUTABLE} - ${PROJECT_SOURCE_DIR}/tests/contract/architecture/test_quality_gate_contract.py - --cxx ${CMAKE_CXX_COMPILER} - ${_edgeflow_guard_platform_flags} - ${_edgeflow_guard_sanitizers} - --gtest-include $ - --gtest-library $ - --gtest-main ${PROJECT_SOURCE_DIR}/tests/support/gtest_main.cpp - --ctest-policy ${PROJECT_SOURCE_DIR}/tests/SafeGtestDiscovery.cmake) - include(${CMAKE_CURRENT_LIST_DIR}/RuntimeTests.cmake) - -add_test(NAME JsonPromptDemoTest - COMMAND ${Python3_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tests/tooling/test_json_prompt_demo.py) -set_tests_properties(JsonPromptDemoTest PROPERTIES - WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" - LABELS "tier3;tooling;dev-fast;sanitizer-compatible" - ENVIRONMENT "LLM_EDGEFLOW_DEMO_BINARY=$") - -add_test(NAME TestLabelsContractTest - COMMAND ${Python3_EXECUTABLE} - ${PROJECT_SOURCE_DIR}/tests/contract/architecture/test_test_labels_contract.py - --build-dir ${PROJECT_BINARY_DIR}) -set_tests_properties(QualityGateScriptsContractTest TestLabelsContractTest PROPERTIES - WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" - LABELS "tier1;static-gate;dev-fast;sanitizer-compatible") +include(${CMAKE_CURRENT_LIST_DIR}/ScriptTests.cmake) option(ENABLE_REAL_MODEL_TESTS "Enable real model weights E2E test suite" OFF) if(ENABLE_REAL_MODEL_TESTS) diff --git a/tests/README.md b/tests/README.md index 5b406881..6ba6bd55 100644 --- a/tests/README.md +++ b/tests/README.md @@ -43,10 +43,17 @@ cmake --build build --target edgeflow_test_nodes_runner -j4 ``` 四个 runner 的源码目录在 `RuntimeTests.cmake` 中定义。GoogleTest 从编译出的用例生成 CTest -入口,包括脚手架生成的测试。新测试套件无需手动注册名称。`TestLabelsContractTest` +入口,包括脚手架生成的测试。新测试套件无需手动注册名称。`contract/architecture/test_test_labels_contract.py` 把实际用例与 CTest 过滤器对照,拒绝空匹配、漏执行、重复执行及不明确的 tier, 同时拒绝禁用的 CTest 条目和仅列举 GoogleTest 用例的命令。 -独立 registry/SDK 目标保持进程和公开依赖隔离。 +常规 `test_*.cpp` 和 `dev_support/` 所属目录中的 `.cpp` 递归收集,增删后在下次构建自动更新。 +独立 registry/SDK 目标保持进程和公开依赖隔离;生成源码和可选 E2E 仍显式声明。 + +`contract/`、`tooling/` 下的 `test_*.py`、`test_*.sh`、`test_*.cmake` 自动注册, +CTest 名称为相对 `tests/` 的路径。只有独立测试入口使用 `test_*` 前缀。 +特殊参数在 `ScriptTests.cmake` 中配置 `EDGEFLOW_TEST_ARGS`,环境和标签通过 `set_tests_properties` 配置。 +Studio 自动发现 `studio_*_test.mjs`;浏览器测试仍按 Playwright 环境变量启用。 + runner 只收集 `EDGEFLOW_OPERATOR_SHELL` 选中壳的 `operator_shell//` 目录,规则见 [Operator 壳选择](../doc/dev_guide/source_layout.md#operator-壳选择)。一致性场景通过驱动调用 公共入口,不直接使用平台结构或数字错误码;场景检查返回 `::testing::AssertionResult`, diff --git a/tests/RuntimeTests.cmake b/tests/RuntimeTests.cmake index ff3c00e5..ee5efb04 100644 --- a/tests/RuntimeTests.cmake +++ b/tests/RuntimeTests.cmake @@ -1,15 +1,25 @@ # 分片的 Google Test runner 与按标签驱动的开发测试矩阵。 +# Collect each runner's owned directories, including nested tests. Concrete +# Operator shells share a directory convention; only the selected shell is used. +function(edgeflow_collect_test_files output_var) + file(GLOB_RECURSE sources CONFIGURE_DEPENDS ${ARGN}) + set(selected) + foreach(source IN LISTS sources) + file(RELATIVE_PATH relative "${PROJECT_SOURCE_DIR}" "${source}") + if(relative MATCHES "/operator_shell/([^/]+)/" AND + NOT CMAKE_MATCH_1 STREQUAL EDGEFLOW_OPERATOR_SHELL) + continue() + endif() + list(APPEND selected "${source}") + endforeach() + set(${output_var} "${selected}" PARENT_SCOPE) +endfunction() + include(${CMAKE_CURRENT_LIST_DIR}/ScaffoldFixtures.cmake) option(LLM_EDGEFLOW_TEST_PCH "Enable precompiled headers for test runners" OFF) -add_test(NAME ThirdPartyCacheMetadataTest - COMMAND ${CMAKE_COMMAND} - -DPROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR} - -DTEST_ROOT=${PROJECT_BINARY_DIR}/third_party_cache_metadata_test - -P ${PROJECT_SOURCE_DIR}/tests/contract/architecture/test_third_party_cache_metadata.cmake) - # Runtime runners share only their test entrypoint, runtime link and optional PCH. # Fixture sources, allocation instrumentation and component libraries stay local. function(edgeflow_configure_gtest_target target_name) @@ -31,7 +41,7 @@ endfunction() # 只扫描每个 runner 自有的测试目录。生成的源码、进程隔离的契约测试和 # 需显式开启的 E2E 目标保持显式列出。CONFIGURE_DEPENDS 使增删文件在下次 # 构建时触发重新生成 (CMake 3.19)。 -file(GLOB EDGEFLOW_TEST_CORE_SRCS CONFIGURE_DEPENDS +edgeflow_collect_test_files(EDGEFLOW_TEST_CORE_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/unit/core/test_*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/unit/engine/test_*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/unit/logging/test_*.cpp") @@ -118,7 +128,7 @@ if(LLM_EDGEFLOW_HAS_ONNXRUNTIME) "{\"pipe_path\":\"pipeline_cross_rerank_missing_model.json\"}\n") endif() -file(GLOB EDGEFLOW_TEST_NODE_SRCS CONFIGURE_DEPENDS +edgeflow_collect_test_files(EDGEFLOW_TEST_NODE_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/unit/nodes/test_*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/unit/contracts/test_*.cpp") add_executable(edgeflow_test_nodes_runner @@ -130,16 +140,11 @@ target_link_libraries(edgeflow_test_nodes_runner PRIVATE edgeflow_test_allocatio # 壳无关一致性套件位于 contract/operator_shell/;具体壳的驱动、清单及依赖其 # 载体的测试位于各 runner 目录下的 operator_shell//,只收集选中的壳。 -set(EDGEFLOW_TEST_SHELL "operator_shell/${EDGEFLOW_OPERATOR_SHELL}") -file(GLOB EDGEFLOW_TEST_ADAPTER_SRCS CONFIGURE_DEPENDS +edgeflow_collect_test_files(EDGEFLOW_TEST_ADAPTER_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/unit/adapter/test_*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/unit/operator/test_*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/integration/operator/test_*.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/contract/operator_shell/*.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/contract/${EDGEFLOW_TEST_SHELL}/*.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/unit/operator/${EDGEFLOW_TEST_SHELL}/test_*.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/integration/operator/${EDGEFLOW_TEST_SHELL}/test_*.cpp" -) + "${CMAKE_CURRENT_SOURCE_DIR}/contract/operator_shell/*.cpp") list(APPEND EDGEFLOW_TEST_ADAPTER_SRCS "${EDGEFLOW_CONTROL_FIXTURE_SOURCE}") add_executable(edgeflow_test_adapter_runner ${EDGEFLOW_TEST_ADAPTER_SRCS} @@ -147,13 +152,10 @@ add_executable(edgeflow_test_adapter_runner edgeflow_configure_gtest_target(edgeflow_test_adapter_runner) target_link_libraries(edgeflow_test_adapter_runner PRIVATE edgeflow_test_allocation_failure) -file(GLOB EDGEFLOW_TEST_TOOLING_SRCS CONFIGURE_DEPENDS +edgeflow_collect_test_files(EDGEFLOW_TEST_TOOLING_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/integration/demo/test_*.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/integration/demo/${EDGEFLOW_TEST_SHELL}/test_*.cpp") -list(APPEND EDGEFLOW_TEST_TOOLING_SRCS - "${CMAKE_CURRENT_SOURCE_DIR}/integration/pipeline/test_pipeline_catalog_validator.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/integration/pipeline/test_pipeline_authoring.cpp" - "${EDGEFLOW_CONTROL_FIXTURE_SOURCE}") + "${CMAKE_CURRENT_SOURCE_DIR}/integration/pipeline/test_*.cpp") +list(APPEND EDGEFLOW_TEST_TOOLING_SRCS "${EDGEFLOW_CONTROL_FIXTURE_SOURCE}") add_executable(edgeflow_test_tooling_runner ${EDGEFLOW_TEST_TOOLING_SRCS} $ @@ -245,10 +247,6 @@ set_tests_properties(CppOperatorSdkTest PROPERTIES WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" LABELS "${_edgeflow_tier2}") # 架构与源码治理门禁。 -add_test(NAME CMakeStructureTest - COMMAND ${CMAKE_COMMAND} - -DPROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR} - -P ${PROJECT_SOURCE_DIR}/tests/contract/architecture/test_cmake_structure.cmake) # 记录各目标实际源码,供壳选择检查确认生产目标不含测试驱动与清单。 set(_edgeflow_shell_manifest "set(operator_shell [==[${EDGEFLOW_OPERATOR_SHELL}]==])\n") set(_edgeflow_shell_production_targets @@ -267,73 +265,26 @@ foreach(target IN LISTS _edgeflow_shell_production_targets _edgeflow_shell_test_ endforeach() file(GENERATE OUTPUT "${PROJECT_BINARY_DIR}/operator_shell_sources_$.cmake" CONTENT "${_edgeflow_shell_manifest}") -add_test(NAME OperatorShellSelectionTest - COMMAND ${CMAKE_COMMAND} - -DTEST_ROOT=${PROJECT_BINARY_DIR}/operator_shell_selection_test - "-DSOURCE_MANIFEST=${PROJECT_BINARY_DIR}/operator_shell_sources_$.cmake" - -P ${PROJECT_SOURCE_DIR}/tests/contract/architecture/test_operator_shell_selection.cmake) add_test(NAME LayerGuardTest COMMAND ${CMAKE_COMMAND} -E env "LLM_EDGEFLOW_LAYER_COMPILE_MANIFEST=${PROJECT_BINARY_DIR}/layer_includes/compile_checks_$.cmake" ${PROJECT_SOURCE_DIR}/scripts/check_layer_isolation.sh) -add_test(NAME LayerGuardSelfTest - COMMAND ${Python3_EXECUTABLE} - ${PROJECT_SOURCE_DIR}/tests/contract/architecture/test_layer_guard_contract.py) -add_test(NAME SpecSignatureDiagnosticsTest - COMMAND ${CMAKE_COMMAND} - "-DLAYER_COMPILE_MANIFEST=${PROJECT_BINARY_DIR}/layer_includes/compile_checks_$.cmake" - -P "${PROJECT_SOURCE_DIR}/tests/contract/authoring/test_spec_signature_diagnostics.cmake") add_test(NAME ArchitectureDocsDriftTest COMMAND ${PROJECT_SOURCE_DIR}/scripts/check_architecture_docs.sh) -add_test(NAME ArchitectureDocsDriftGateSelfTest - COMMAND ${PROJECT_SOURCE_DIR}/tests/contract/architecture/test_architecture_docs_drift_gate.sh) add_test(NAME GovernanceConsistencyTest COMMAND ${PROJECT_SOURCE_DIR}/scripts/check_governance.sh) add_test(NAME DocLinksTest COMMAND ${Python3_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/check_doc_links.py) -add_test(NAME DocLinksSelfTest - COMMAND ${Python3_EXECUTABLE} - ${PROJECT_SOURCE_DIR}/tests/contract/architecture/test_doc_links_contract.py) add_test(NAME DiagramAssetsCheckTest COMMAND ${PROJECT_SOURCE_DIR}/scripts/render_architecture_diagrams.sh --check) -add_test(NAME DiagramRenderGateSelfTest - COMMAND ${PROJECT_SOURCE_DIR}/tests/contract/architecture/test_diagram_render_gate.sh) -add_test(NAME ScriptGeneratorDetectionTest - COMMAND ${PROJECT_SOURCE_DIR}/tests/contract/architecture/test_script_generator_detection.sh) set_tests_properties( - CMakeStructureTest ThirdPartyCacheMetadataTest SpecSignatureDiagnosticsTest - OperatorShellSelectionTest - LayerGuardTest LayerGuardSelfTest ArchitectureDocsDriftTest - ArchitectureDocsDriftGateSelfTest GovernanceConsistencyTest - DocLinksTest DocLinksSelfTest ScriptGeneratorDetectionTest + LayerGuardTest ArchitectureDocsDriftTest GovernanceConsistencyTest DocLinksTest PROPERTIES WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" LABELS "tier1;static-gate;dev-fast;sanitizer-compatible") -set_tests_properties(DiagramAssetsCheckTest DiagramRenderGateSelfTest - PROPERTIES WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" +set_tests_properties(DiagramAssetsCheckTest PROPERTIES + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" LABELS "tier4;tooling;static-gate;slow") -add_test(NAME PipelineStudioServerTest - COMMAND ${Python3_EXECUTABLE} - ${PROJECT_SOURCE_DIR}/tests/tooling/test_pipeline_studio.py) -set_tests_properties(PipelineStudioServerTest PROPERTIES - ENVIRONMENT - "LLM_EDGEFLOW_PIPELINE_TOOL=$;LLM_EDGEFLOW_SELECTION_TOOL=$;LLM_EDGEFLOW_DEMO_BINARY=$;LLM_EDGEFLOW_ALG_SHOW=$") - -add_test(NAME CustomNodeScaffoldTest - COMMAND ${Python3_EXECUTABLE} - ${PROJECT_SOURCE_DIR}/tests/tooling/test_scaffold_custom_node.py) - -add_test(NAME BpeTokenizerToolTest - COMMAND ${Python3_EXECUTABLE} - ${PROJECT_SOURCE_DIR}/tests/tooling/test_prepare_bpe_tokenizer.py) - -add_test(NAME DevRecipeTest - COMMAND ${Python3_EXECUTABLE} - ${PROJECT_SOURCE_DIR}/tests/tooling/test_dev_recipe.py) -set_tests_properties(DevRecipeTest PROPERTIES - ENVIRONMENT - "LLM_EDGEFLOW_PIPELINE_TOOL=$;LLM_EDGEFLOW_SELECTION_TOOL=$;LLM_EDGEFLOW_DEMO_BINARY=$") - add_test(NAME DemoSmokeTest COMMAND $ --suite smoke) set_tests_properties(DemoSmokeTest PROPERTIES WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" @@ -372,18 +323,9 @@ endif() add_test(NAME PipelineToolCatalogTest COMMAND $ catalog) -add_test(NAME PipelineToolValidateTest COMMAND ${Python3_EXECUTABLE} - ${CMAKE_CURRENT_SOURCE_DIR}/tooling/test_pipeline_cli.py - --tool $ - --test-tool $ - --repo ${PROJECT_SOURCE_DIR}) -set_tests_properties( - PipelineStudioServerTest CustomNodeScaffoldTest BpeTokenizerToolTest DevRecipeTest - PipelineToolCatalogTest PipelineToolValidateTest +set_tests_properties(PipelineToolCatalogTest PROPERTIES WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" LABELS "${_edgeflow_tier4}") -set_tests_properties(PipelineToolValidateTest PROPERTIES - ENVIRONMENT "LLM_EDGEFLOW_ALG_SHOW=$") add_custom_target(edgeflow_dev_tests DEPENDS alg_demo alg_pipeline_tool alg_pipeline_tool_test alg_show diff --git a/tests/ScaffoldFixtures.cmake b/tests/ScaffoldFixtures.cmake index e466c17c..563c1685 100644 --- a/tests/ScaffoldFixtures.cmake +++ b/tests/ScaffoldFixtures.cmake @@ -25,9 +25,6 @@ add_custom_command( VERBATIM) # 在测试 runner 中编译文档里的原样函数示例,绝不进入 SDK Catalog。 -list(APPEND EDGEFLOW_SCAFFOLD_FIXTURE_SOURCE - "${PROJECT_SOURCE_DIR}/dev_support/node_authoring/starter_batch_node.cpp" - "${PROJECT_SOURCE_DIR}/dev_support/node_authoring/starter_multi_model_node.cpp" - "${PROJECT_SOURCE_DIR}/dev_support/node_authoring/starter_batch_join_node.cpp" - "${PROJECT_SOURCE_DIR}/dev_support/node_authoring/starter_batch_group_node.cpp" - "${PROJECT_SOURCE_DIR}/dev_support/node_authoring/starter_batch_select_scatter_node.cpp") +file(GLOB_RECURSE EDGEFLOW_NODE_AUTHORING_SOURCES CONFIGURE_DEPENDS + "${PROJECT_SOURCE_DIR}/dev_support/node_authoring/*.cpp") +list(APPEND EDGEFLOW_SCAFFOLD_FIXTURE_SOURCE ${EDGEFLOW_NODE_AUTHORING_SOURCES}) diff --git a/tests/ScriptTests.cmake b/tests/ScriptTests.cmake new file mode 100644 index 00000000..ed3442c9 --- /dev/null +++ b/tests/ScriptTests.cmake @@ -0,0 +1,77 @@ +# Discover conventional scripts; configure only exceptional arguments and properties. +find_program(EDGEFLOW_BASH_EXECUTABLE bash REQUIRED) + +set(_edgeflow_guard_flags) +foreach(flag IN LISTS edgeflow_cxx_platform_flags) + list(APPEND _edgeflow_guard_flags "--cxx-flag=${flag}") +endforeach() +if(ENABLE_SANITIZERS) + list(APPEND _edgeflow_guard_flags --sanitizers "${LLM_EDGEFLOW_SANITIZERS}") +endif() +set_property(SOURCE contract/architecture/test_quality_gate_contract.py + PROPERTY EDGEFLOW_TEST_ARGS + --cxx "${CMAKE_CXX_COMPILER}" ${_edgeflow_guard_flags} + --gtest-include $ + --gtest-library $ + --gtest-main "${CMAKE_CURRENT_SOURCE_DIR}/support/gtest_main.cpp" + --ctest-policy "${CMAKE_CURRENT_SOURCE_DIR}/SafeGtestDiscovery.cmake") +set_property(SOURCE contract/architecture/test_test_labels_contract.py + PROPERTY EDGEFLOW_TEST_ARGS --build-dir "${PROJECT_BINARY_DIR}") +set_property(SOURCE contract/architecture/test_operator_shell_selection.cmake + PROPERTY EDGEFLOW_TEST_ARGS + "-DSOURCE_MANIFEST=${PROJECT_BINARY_DIR}/operator_shell_sources_$.cmake") +set_property(SOURCE contract/authoring/test_spec_signature_diagnostics.cmake + PROPERTY EDGEFLOW_TEST_ARGS + "-DLAYER_COMPILE_MANIFEST=${PROJECT_BINARY_DIR}/layer_includes/compile_checks_$.cmake") +set_property(SOURCE tooling/test_pipeline_cli.py PROPERTY EDGEFLOW_TEST_ARGS + --tool $ + --test-tool $ + --repo "${PROJECT_SOURCE_DIR}") + +edgeflow_collect_test_files(scripts + "${CMAKE_CURRENT_SOURCE_DIR}/contract/test_*.py" + "${CMAKE_CURRENT_SOURCE_DIR}/contract/test_*.sh" + "${CMAKE_CURRENT_SOURCE_DIR}/contract/test_*.cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/tooling/test_*.py" + "${CMAKE_CURRENT_SOURCE_DIR}/tooling/test_*.sh" + "${CMAKE_CURRENT_SOURCE_DIR}/tooling/test_*.cmake") +foreach(script IN LISTS scripts) + file(RELATIVE_PATH name "${CMAKE_CURRENT_SOURCE_DIR}" "${script}") + if(name MATCHES "^tooling/") + set(labels "tier4;tooling;dev-fast;sanitizer-compatible") + else() + set(labels "tier1;static-gate;dev-fast;sanitizer-compatible") + endif() + get_source_file_property(arguments "${script}" EDGEFLOW_TEST_ARGS) + if(arguments STREQUAL "NOTFOUND") + set(arguments) + endif() + get_filename_component(extension "${script}" LAST_EXT) + if(extension STREQUAL ".py") + set(command "${Python3_EXECUTABLE}" "${script}" ${arguments}) + elseif(extension STREQUAL ".sh") + set(command "${EDGEFLOW_BASH_EXECUTABLE}" "${script}" ${arguments}) + else() + set(command "${CMAKE_COMMAND}" + "-DPROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}" + "-DPROJECT_BINARY_DIR=${PROJECT_BINARY_DIR}" + "-DTEST_ROOT=${PROJECT_BINARY_DIR}/script-tests/${name}" + ${arguments} -P "${script}") + endif() + add_test(NAME "${name}" COMMAND ${command}) + set_tests_properties("${name}" PROPERTIES + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" + LABELS "${labels}" + TIMEOUT 120) +endforeach() + +set_tests_properties(contract/architecture/test_diagram_render_gate.sh PROPERTIES + LABELS "tier4;tooling;static-gate;slow") +set_tests_properties(tooling/test_json_prompt_demo.py PROPERTIES + LABELS "tier3;tooling;dev-fast;sanitizer-compatible" + ENVIRONMENT "LLM_EDGEFLOW_DEMO_BINARY=$") +set_tests_properties(tooling/test_pipeline_studio.py tooling/test_dev_recipe.py PROPERTIES + ENVIRONMENT + "LLM_EDGEFLOW_PIPELINE_TOOL=$;LLM_EDGEFLOW_SELECTION_TOOL=$;LLM_EDGEFLOW_DEMO_BINARY=$;LLM_EDGEFLOW_ALG_SHOW=$") +set_tests_properties(tooling/test_pipeline_cli.py PROPERTIES + ENVIRONMENT "LLM_EDGEFLOW_ALG_SHOW=$") diff --git a/tests/contract/architecture/test_layer_header_views.cmake b/tests/contract/architecture/layer_header_view_checks.cmake similarity index 100% rename from tests/contract/architecture/test_layer_header_views.cmake rename to tests/contract/architecture/layer_header_view_checks.cmake diff --git a/tests/contract/architecture/test_llama_cache.cmake b/tests/contract/architecture/llama_cache_checks.cmake similarity index 100% rename from tests/contract/architecture/test_llama_cache.cmake rename to tests/contract/architecture/llama_cache_checks.cmake diff --git a/tests/contract/architecture/test_third_party_cache_metadata.cmake b/tests/contract/architecture/test_third_party_cache_metadata.cmake index b965eb95..444c5fe6 100644 --- a/tests/contract/architecture/test_third_party_cache_metadata.cmake +++ b/tests/contract/architecture/test_third_party_cache_metadata.cmake @@ -201,5 +201,5 @@ execute_process(COMMAND "${CMAKE_COMMAND}" -P "${TEST_ROOT}/invalid.cmake" if(invalid_result EQUAL 0 OR NOT "${output}${error}" MATCHES "requires") message(FATAL_ERROR "Incomplete cache metadata request must fail") endif() -include("${PROJECT_SOURCE_DIR}/tests/contract/architecture/test_llama_cache.cmake") +include("${PROJECT_SOURCE_DIR}/tests/contract/architecture/llama_cache_checks.cmake") message(STATUS "PASS cache identity, ABI invalidation and actual llama cache consumer") diff --git a/tests/tooling/test_pipeline_studio.py b/tests/tooling/test_pipeline_studio.py index de6dd740..e8a077cd 100644 --- a/tests/tooling/test_pipeline_studio.py +++ b/tests/tooling/test_pipeline_studio.py @@ -515,10 +515,12 @@ def request_cancel(job_id): process.wait(timeout=5) def test_javascript_library_and_fix_consumers(self): - for script in ("studio_editor_test.mjs", "studio_graph_test.mjs", - "studio_config_roundtrip_test.mjs", "studio_fix_workflow_test.mjs"): + scripts = sorted(path for path in (ROOT / "tests/tooling").rglob("studio_*_test.mjs") + if path != ROOT / "tests/tooling/studio_browser_test.mjs") + self.assertTrue(scripts, "Studio JavaScript test discovery must not be empty") + for script in scripts: with self.subTest(script=script): - result = subprocess.run(["node", str(ROOT / "tests/tooling" / script), self.url], + result = subprocess.run(["node", str(script), self.url], cwd=ROOT, capture_output=True, text=True, timeout=45) self.assertEqual(result.returncode, 0, result.stdout + result.stderr) self.assertIn("PASS", result.stdout)