From c914cfb30e9a5af105d687816c5ca6b2fc5889ea Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Sat, 31 Oct 2026 10:47:45 -0400 Subject: [PATCH] Select CI tests through CMake suite membership and browser discovery --- .github/workflows/integration-test.yml | 77 +--------- .github/workflows/sanitizer.yml | 3 +- tests/CMakeLists.txt | 3 + tests/cmake/CiSuites.cmake | 30 ++++ tests/unit/CMakeLists.txt | 137 +++++++++--------- tests/unit/cmake/system_health/startup.cmake | 2 +- ...=> bulkTagsReconciliation.browser.spec.js} | 2 +- ....js => zoneEditorCheckbox.browser.spec.js} | 2 +- 8 files changed, 112 insertions(+), 144 deletions(-) create mode 100644 tests/cmake/CiSuites.cmake rename web/tests/e2e/{bulkTagsReconciliation.spec.js => bulkTagsReconciliation.browser.spec.js} (99%) rename web/tests/e2e/{zoneEditorCheckbox.spec.js => zoneEditorCheckbox.browser.spec.js} (99%) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index f867fd467..caad54018 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -75,79 +75,14 @@ jobs: -DENABLE_MQTT=OFF \ -DCMAKE_C_FLAGS="--coverage -fprofile-update=atomic" \ -DCMAKE_EXE_LINKER_FLAGS="--coverage" - make -j$(nproc) \ - test_storage_pressure \ - test_storage_pressure_extended \ - test_detection_result_structures \ - test_stream_frame_rate \ - test_recording_video_params \ - test_mp4_segment_boundaries \ - test_storage_retention_sqlite \ - test_storage_manager_retention \ - test_storage_target_pressure_cleanup \ - test_storage_migration \ - test_storage_archive \ - test_authorization \ - test_api_handlers_recordings_playback \ - test_db_storage_targets \ - test_db_storage_policies \ - test_api_handlers_storage_targets \ - test_api_handlers_storage_policies \ - test_sqlite_migration_boundaries \ - test_config \ - test_logger \ - test_strings \ - test_memory \ - test_request_response \ - test_shutdown_coordinator \ - test_system_health_startup \ - test_detection_config \ - test_detection_model_motion \ - test_db_streams \ - test_db_camera_favorites \ - test_api_handlers_camera_favorites \ - test_db_backup \ - test_mp4_failed_open_memory \ - test_db_recordings_extended \ - test_db_detections \ - test_db_zones \ - test_db_events \ - test_db_auth \ - test_db_transactions \ - test_db_maintenance \ - test_db_query_builder \ - test_logger_json \ - test_batch_delete_progress \ - test_db_recordings_sync \ - test_httpd_utils \ - test_zone_filter \ - test_onvif_soap_fault \ - test_faac_encoder \ - test_audio_transcoder \ - test_mp4_audio_recovery \ - test_mp4_forced_reconnect \ - test_mp4_recovery_watchdog \ - test_audio_voice_enhancement \ - test_audio_voice_filter_faults \ - test_udt_recording \ - test_detection_current_frame \ - test_detection_io_recovery \ - test_hls_cleanup \ - test_stream_manager \ - test_stream_state \ - test_packet_buffer \ - test_timestamp_manager \ - test_motion_trigger_parse \ - test_motion_max_area \ - test_url_utils + cmake --build . --parallel "$(nproc)" --target ci-unit-tests echo "Unity test binaries built:" ls -la bin/test_* - name: Run Unity tests run: | cd build - ctest --output-on-failure -V \ - -R "test_sqlite_migration_boundaries|test_storage_pressure$|test_storage_pressure_extended|test_detection_result_structures|test_stream_frame_rate|test_recording_video_params|test_mp4_segment_boundaries|test_storage_retention_sqlite|test_storage_manager_retention|test_storage_target_pressure_cleanup|test_storage_migration|test_storage_archive_s3|test_storage_archive_operator|test_authorization|test_api_handlers_recordings_playback|test_db_storage_targets|test_db_storage_policies|test_api_handlers_storage_targets|test_api_handlers_storage_policies|test_config|test_logger|test_strings|test_memory|test_request_response|test_shutdown_coordinator|test_detection_config|test_detection_model_motion|test_db_streams|test_db_camera_favorites|test_api_handlers_camera_favorites|test_db_backup|test_mp4_failed_open_memory|test_db_recordings_extended|test_db_detections|test_db_zones|test_db_events|test_db_auth|test_db_transactions|test_db_maintenance|test_db_query_builder|test_logger_json|test_batch_delete_progress|test_db_recordings_sync|test_httpd_utils|test_zone_filter|test_onvif_soap_fault|test_faac_encoder|test_audio_transcoder|test_mp4_audio_recovery|test_mp4_forced_reconnect|test_mp4_recovery_watchdog|test_audio_voice_enhancement|test_audio_voice_filter_faults|test_udt_recording|test_detection_current_frame|test_detection_io_recovery|test_hls_cleanup|test_stream_manager|test_stream_state|test_packet_buffer|test_timestamp_manager|test_motion_trigger_parse|test_motion_max_area|test_url_utils|test_system_health_startup$" + ctest --output-on-failure --no-tests=error -V -L '^ci-unit$' - name: Generate coverage report if: always() @@ -606,13 +541,9 @@ jobs: npm ci npx playwright install --with-deps chromium - - name: Bulk tag reconciliation regression - if: ${{ matrix.shard == 1 }} - run: npm --prefix web run test:e2e -- --testPathPatterns=bulkTagsReconciliation - - - name: Zone Editor checkbox regression + - name: Component browser regressions if: ${{ matrix.shard == 1 }} - run: npm --prefix web run test:e2e -- --testPathPatterns=zoneEditorCheckbox + run: npm --prefix web run test:e2e -- --testPathPatterns='\.browser\.spec\.js$' - name: Run Playwright UI tests run: | diff --git a/.github/workflows/sanitizer.yml b/.github/workflows/sanitizer.yml index 5768c9a2c..7183485c6 100644 --- a/.github/workflows/sanitizer.yml +++ b/.github/workflows/sanitizer.yml @@ -59,8 +59,7 @@ jobs: run: | cd build echo "Running tests with ASan + UBSan enabled..." - ctest --output-on-failure -V \ - -R "test_sqlite_migration_boundaries|test_config|test_logger|test_strings|test_memory|test_request_response|test_shutdown_coordinator|test_detection_config|test_detection_model_motion|test_db_streams|test_db_recordings_extended|test_db_detections|test_db_zones|test_db_events|test_db_auth|test_db_transactions|test_db_maintenance|test_db_query_builder|test_logger_json|test_batch_delete_progress|test_db_recordings_sync|test_httpd_utils|test_zone_filter|test_faac_encoder|test_audio_transcoder|test_audio_voice_enhancement|test_audio_voice_filter_faults|test_udt_recording|test_detection_current_frame|test_detection_io_recovery|test_stream_manager|test_stream_state|test_packet_buffer|test_timestamp_manager|test_storage_pressure$|test_storage_pressure_extended|test_detection_result_structures|test_stream_frame_rate|test_recording_video_params|test_mp4_segment_boundaries|test_storage_retention_sqlite|test_audit_log|test_audit_summary" + ctest --output-on-failure --no-tests=error -V -L '^ci-sanitizer$' - name: Smoke test - start and stop service run: | diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6f5d89199..798e29b0e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,5 +1,7 @@ # Tests CMakeLists.txt +include(cmake/CiSuites.cmake) + # Get the ENABLE_SOD option from parent if(NOT DEFINED ENABLE_SOD) option(ENABLE_SOD "Enable SOD library for object detection" ON) @@ -136,6 +138,7 @@ set_target_properties(test_db_backup # Add database backup test to CTest add_test(NAME test_db_backup COMMAND test_db_backup) +lightnvr_ci_test(test_db_backup CI_UNIT) # Add stream detection test add_executable(test_stream_detection test_stream_detection.c) diff --git a/tests/cmake/CiSuites.cmake b/tests/cmake/CiSuites.cmake new file mode 100644 index 000000000..811d1cfc0 --- /dev/null +++ b/tests/cmake/CiSuites.cmake @@ -0,0 +1,30 @@ +# CI suite membership lives beside each test registration. For example: +# add_layer2_test(test_example CI_UNIT CI_SANITIZER) +# Both the aggregate build target and CTest label come from that declaration. +add_custom_target(ci-unit-tests) +add_custom_target(ci-sanitizer-tests) + +function(lightnvr_ci_test TEST_TARGET) + cmake_parse_arguments(ARG "CI_UNIT;CI_SANITIZER" "" "TESTS" ${ARGN}) + if(ARG_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown CI test options: ${ARG_UNPARSED_ARGUMENTS}") + endif() + if(NOT TARGET ${TEST_TARGET}) + message(FATAL_ERROR "Missing CI test target: ${TEST_TARGET}") + endif() + if(NOT ARG_TESTS) + set(ARG_TESTS ${TEST_TARGET}) + endif() + foreach(SUITE IN ITEMS UNIT SANITIZER) + if(ARG_CI_${SUITE}) + string(TOLOWER "${SUITE}" SUITE_LABEL) + add_dependencies(ci-${SUITE_LABEL}-tests ${TEST_TARGET}) + foreach(TEST_NAME IN LISTS ARG_TESTS) + if(NOT TEST ${TEST_NAME}) + message(FATAL_ERROR "Missing CI test registration: ${TEST_NAME}") + endif() + set_property(TEST ${TEST_NAME} APPEND PROPERTY LABELS ci-${SUITE_LABEL}) + endforeach() + endif() + endforeach() +endfunction() diff --git a/tests/unit/CMakeLists.txt b/tests/unit/CMakeLists.txt index 684667ba7..2a8391a96 100644 --- a/tests/unit/CMakeLists.txt +++ b/tests/unit/CMakeLists.txt @@ -20,6 +20,7 @@ macro(add_layer1_test TEST_NAME) target_link_libraries(${TEST_NAME} unity_lib) set_target_properties(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME}) + lightnvr_ci_test(${TEST_NAME} ${ARGN}) endmacro() macro(add_layer2_test TEST_NAME) @@ -53,8 +54,11 @@ macro(add_layer2_test TEST_NAME) ${CMAKE_CURRENT_SOURCE_DIR}/s3_fixture.py $) add_test(NAME test_storage_archive_operator COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_archive_operator.py) + lightnvr_ci_test(${TEST_NAME} ${ARGN} + TESTS test_storage_archive_s3 test_storage_archive_operator) else() add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME}) + lightnvr_ci_test(${TEST_NAME} ${ARGN}) endif() endmacro() @@ -65,14 +69,14 @@ target_sources(test_hls_cache_cleanup PRIVATE # Variant for Layer 2 tests that require CURL macro(add_layer2_test_with_curl TEST_NAME) - add_layer2_test(${TEST_NAME}) + add_layer2_test(${TEST_NAME} ${ARGN}) target_link_libraries(${TEST_NAME} ${CURL_LIBRARIES}) endmacro() # Convenience wrappers for Layer 2 tests with common external deps. macro(add_layer2_test_with_ffmpeg TEST_NAME) - add_layer2_test(${TEST_NAME}) + add_layer2_test(${TEST_NAME} ${ARGN}) target_link_libraries(${TEST_NAME} ${FFMPEG_LIBRARIES}) endmacro() @@ -108,6 +112,7 @@ macro(add_layer3_test TEST_NAME) endif() set_target_properties(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME}) + lightnvr_ci_test(${TEST_NAME} ${ARGN}) endmacro() # ==================================================================== @@ -116,42 +121,42 @@ endmacro() # disk_pressure_level_str() and evaluate_disk_pressure_level() are # both static inline in storage_manager.h, so no .c files are linked. # ==================================================================== -add_layer1_test(test_storage_pressure) +add_layer1_test(test_storage_pressure CI_UNIT CI_SANITIZER) # ==================================================================== # Layer 2: test_storage_retention_sqlite # Integration test — runs real SQL queries via db_core / db_recordings. # ==================================================================== -add_layer2_test(test_storage_retention_sqlite) +add_layer2_test(test_storage_retention_sqlite CI_UNIT CI_SANITIZER) # ==================================================================== # Layer 1: Pure logic tests — unity_lib + project headers only # (Only tests whose functions are static inline in headers) # ==================================================================== -add_layer1_test(test_storage_pressure_extended) -add_layer1_test(test_detection_result_structures) -add_layer1_test(test_stream_frame_rate) +add_layer1_test(test_storage_pressure_extended CI_UNIT CI_SANITIZER) +add_layer1_test(test_detection_result_structures CI_UNIT CI_SANITIZER) +add_layer1_test(test_stream_frame_rate CI_UNIT CI_SANITIZER) target_sources(test_stream_frame_rate PRIVATE ${CMAKE_SOURCE_DIR}/src/video/stream_frame_rate.c) # ==================================================================== # Layer 2: lightnvr_lib tests — compiled functions + optional SQLite # ==================================================================== -add_layer2_test(test_config) +add_layer2_test(test_config CI_UNIT CI_SANITIZER) add_layer2_test(test_db_core_initialization) -add_layer2_test(test_sqlite_migration_boundaries) +add_layer2_test(test_sqlite_migration_boundaries CI_UNIT CI_SANITIZER) set_tests_properties(test_sqlite_migration_boundaries PROPERTIES TIMEOUT 20) -add_layer2_test(test_logger) -add_layer2_test(test_strings) +add_layer2_test(test_logger CI_UNIT CI_SANITIZER) +add_layer2_test(test_strings CI_UNIT CI_SANITIZER) add_layer2_test(test_interruptible_sleep) add_layer2_test(test_stream_metrics) -add_layer2_test(test_memory) +add_layer2_test(test_memory CI_UNIT CI_SANITIZER) add_layer2_test(test_path_utils) -add_layer2_test(test_request_response) -add_layer2_test(test_shutdown_coordinator) +add_layer2_test(test_request_response CI_UNIT CI_SANITIZER) +add_layer2_test(test_shutdown_coordinator CI_UNIT CI_SANITIZER) add_layer2_test(test_go2rtc_lifecycle) -add_layer2_test(test_detection_config) -add_layer2_test_with_curl(test_detection_model_motion) +add_layer2_test(test_detection_config CI_UNIT CI_SANITIZER) +add_layer2_test_with_curl(test_detection_model_motion CI_UNIT CI_SANITIZER) add_layer2_test_with_curl(test_detection_system_onvif) add_layer3_test(test_onvif_poll_recovery) target_link_options(test_onvif_poll_recovery PRIVATE @@ -163,7 +168,7 @@ target_compile_definitions(test_onvif_lpr_event PRIVATE TEST_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}" ) add_layer2_test_with_ffmpeg(test_api_detection) -add_layer2_test_with_ffmpeg(test_mp4_failed_open_memory) +add_layer2_test_with_ffmpeg(test_mp4_failed_open_memory CI_UNIT) add_layer2_test_with_ffmpeg(test_ffmpeg_rgb24_padding) if(TARGET lightnvr-ffmpeg-guard) add_executable(test_ffmpeg_guard_probe ffmpeg_guard_probe.c) @@ -182,8 +187,8 @@ if(TARGET lightnvr-ffmpeg-guard) "$" "$") endif() -add_layer2_test_with_curl(test_url_utils) -add_layer2_test(test_db_streams) +add_layer2_test_with_curl(test_url_utils CI_UNIT) +add_layer2_test(test_db_streams CI_UNIT CI_SANITIZER) add_layer2_test(test_db_detection_engines) add_layer2_test(test_db_lpr_reads) add_layer2_test(test_api_handlers_lpr) @@ -198,8 +203,8 @@ add_layer2_test(test_api_handlers_fleet) add_layer2_test(test_api_handlers_workspaces) add_layer2_test(test_db_live_saved_layouts) add_layer2_test(test_api_handlers_live_layouts) -add_layer2_test(test_db_camera_favorites) -add_layer2_test(test_api_handlers_camera_favorites) +add_layer2_test(test_db_camera_favorites CI_UNIT) +add_layer2_test(test_api_handlers_camera_favorites CI_UNIT) add_layer2_test(test_db_operator_floor_plans) add_layer2_test(test_api_handlers_operator_floor_plans) add_layer2_test(test_api_handlers_investigations) @@ -207,10 +212,10 @@ add_layer2_test(test_db_investigation_bookmarks) add_layer2_test(test_api_handlers_investigation_bookmarks) add_layer2_test(test_db_camera_collections) add_layer2_test(test_api_handlers_camera_collections) -add_layer2_test(test_db_recordings_extended) +add_layer2_test(test_db_recordings_extended CI_UNIT CI_SANITIZER) add_layer2_test(test_api_handlers_recordings_list) add_layer2_test(test_recording_transcode) -add_layer2_test(test_api_handlers_recordings_playback) +add_layer2_test(test_api_handlers_recordings_playback CI_UNIT) target_link_options(test_api_handlers_recordings_playback PRIVATE "-Wl,--wrap=storage_source_resolve" "-Wl,--wrap=storage_source_remote" @@ -220,22 +225,22 @@ target_link_options(test_api_handlers_recordings_playback PRIVATE "-Wl,--wrap=request_recording_transcode_cache" "-Wl,--wrap=http_serve_file" ) -add_layer2_test(test_storage_manager_retention) -add_layer2_test(test_storage_target_pressure_cleanup) -add_layer2_test(test_storage_migration) +add_layer2_test(test_storage_manager_retention CI_UNIT) +add_layer2_test(test_storage_target_pressure_cleanup CI_UNIT) +add_layer2_test(test_storage_migration CI_UNIT) add_layer2_test(test_storage_deletion_ledger) # Layer 2: deletion ledger scoping, pruning, indexes if(ENABLE_S3_ARCHIVE) - add_layer2_test(test_storage_archive) + add_layer2_test(test_storage_archive CI_UNIT) target_link_options(test_storage_archive PRIVATE "-Wl,--wrap=uv_timer_start" "-Wl,--wrap=db_open_readonly_connection") endif() -add_layer2_test(test_db_detections) -add_layer2_test(test_db_zones) -add_layer2_test(test_db_events) -add_layer2_test(test_db_auth) -add_layer2_test(test_authorization) -add_layer2_test(test_audit_log) -add_layer2_test(test_audit_summary) +add_layer2_test(test_db_detections CI_UNIT CI_SANITIZER) +add_layer2_test(test_db_zones CI_UNIT CI_SANITIZER) +add_layer2_test(test_db_events CI_UNIT CI_SANITIZER) +add_layer2_test(test_db_auth CI_UNIT CI_SANITIZER) +add_layer2_test(test_authorization CI_UNIT) +add_layer2_test(test_audit_log CI_SANITIZER) +add_layer2_test(test_audit_summary CI_SANITIZER) add_layer2_test(test_event_envelope) add_layer2_test(test_event_bus) add_layer2_test(test_event_detection_adapter) @@ -247,20 +252,20 @@ add_layer2_test(test_api_handlers_event_routes) add_layer2_test(test_event_router) add_layer2_test(test_db_event_destinations) add_layer2_test(test_api_handlers_event_destinations) -add_layer2_test(test_db_storage_targets) -add_layer2_test(test_db_storage_policies) -add_layer2_test(test_api_handlers_storage_targets) -add_layer2_test(test_api_handlers_storage_policies) -add_layer2_test(test_db_transactions) -add_layer2_test(test_db_maintenance) -add_layer2_test(test_db_query_builder) +add_layer2_test(test_db_storage_targets CI_UNIT) +add_layer2_test(test_db_storage_policies CI_UNIT) +add_layer2_test(test_api_handlers_storage_targets CI_UNIT) +add_layer2_test(test_api_handlers_storage_policies CI_UNIT) +add_layer2_test(test_db_transactions CI_UNIT CI_SANITIZER) +add_layer2_test(test_db_maintenance CI_UNIT CI_SANITIZER) +add_layer2_test(test_db_query_builder CI_UNIT CI_SANITIZER) add_layer2_test(test_db_system_settings) -add_layer2_test(test_logger_json) -add_layer2_test(test_batch_delete_progress) -add_layer2_test(test_db_recordings_sync) -add_layer2_test(test_httpd_utils) -add_layer2_test(test_zone_filter) -add_layer2_test(test_onvif_soap_fault) +add_layer2_test(test_logger_json CI_UNIT CI_SANITIZER) +add_layer2_test(test_batch_delete_progress CI_UNIT CI_SANITIZER) +add_layer2_test(test_db_recordings_sync CI_UNIT CI_SANITIZER) +add_layer2_test(test_httpd_utils CI_UNIT CI_SANITIZER) +add_layer2_test(test_zone_filter CI_UNIT CI_SANITIZER) +add_layer2_test(test_onvif_soap_fault CI_UNIT) add_layer2_test(test_onvif_discovery_response) add_layer2_test(test_go2rtc_base_path) add_layer2_test(test_yaml_validate) @@ -342,26 +347,26 @@ endif() # ==================================================================== # Layer 3: Integration tests — lightnvr_lib + FFmpeg # ==================================================================== -add_layer3_test(test_faac_encoder) -add_layer3_test(test_audio_transcoder) -add_layer3_test(test_mp4_forced_reconnect) +add_layer3_test(test_faac_encoder CI_UNIT CI_SANITIZER) +add_layer3_test(test_audio_transcoder CI_UNIT CI_SANITIZER) +add_layer3_test(test_mp4_forced_reconnect CI_UNIT) target_link_options(test_mp4_forced_reconnect PRIVATE "-Wl,--wrap=record_segment" "-Wl,--wrap=av_usleep" "-Wl,--wrap=get_stream_config_by_name" "-Wl,--wrap=storage_should_pause_recording" "-Wl,--wrap=prepare_placed_mp4_recording_path") -add_layer3_test(test_mp4_recovery_watchdog) +add_layer3_test(test_mp4_recovery_watchdog CI_UNIT) target_link_options(test_mp4_recovery_watchdog PRIVATE "-Wl,--wrap=sleep" "-Wl,--wrap=mp4_writer_start_recording_thread" "-Wl,--wrap=mp4_writer_stop_recording_thread" "-Wl,--wrap=mp4_writer_is_recording" "-Wl,--wrap=go2rtc_integration_is_using_go2rtc_for_recording" "-Wl,--wrap=_log_message_ctx") set_tests_properties(test_mp4_forced_reconnect test_mp4_recovery_watchdog PROPERTIES TIMEOUT 10) -add_layer3_test(test_mp4_audio_recovery) +add_layer3_test(test_mp4_audio_recovery CI_UNIT) target_link_options(test_mp4_audio_recovery PRIVATE "-Wl,--wrap=av_read_frame" "-Wl,--wrap=cleanup_audio_transcoder") -add_layer3_test(test_stream_manager) -add_layer3_test(test_stream_state) -add_layer3_test(test_packet_buffer) -add_layer3_test(test_hls_cleanup) +add_layer3_test(test_stream_manager CI_UNIT CI_SANITIZER) +add_layer3_test(test_stream_state CI_UNIT CI_SANITIZER) +add_layer3_test(test_packet_buffer CI_UNIT CI_SANITIZER) +add_layer3_test(test_hls_cleanup CI_UNIT) target_compile_definitions(test_hls_cleanup PRIVATE TEST_RECORDING_PATH="${CMAKE_SOURCE_DIR}/tests/integration/fixtures/recording.mp4" ) @@ -374,33 +379,33 @@ target_link_options(test_hls_reconnect_backoff PRIVATE "-Wl,--wrap=av_usleep") set_tests_properties(test_hls_reconnect_backoff PROPERTIES TIMEOUT 10) add_layer3_test(test_mp4_writer_watchdog) add_layer3_test(test_mp4_segment_timestamps) -add_layer3_test(test_mp4_segment_boundaries) -add_layer3_test(test_recording_video_params) +add_layer3_test(test_mp4_segment_boundaries CI_UNIT CI_SANITIZER) +add_layer3_test(test_recording_video_params CI_UNIT CI_SANITIZER) target_link_options(test_recording_video_params PRIVATE "-Wl,--wrap=update_stream_video_params") add_layer3_test(test_mp4_faststart) target_compile_definitions(test_mp4_faststart PRIVATE RECORDING_FIXTURE="${CMAKE_SOURCE_DIR}/tests/integration/fixtures/recording.mp4") -add_layer3_test(test_audio_voice_enhancement) +add_layer3_test(test_audio_voice_enhancement CI_UNIT CI_SANITIZER) if(ENABLE_AUDIO_FILTERS) # Fault injection for the voice-enhancement graph (issue #652). - add_layer3_test(test_audio_voice_filter_faults) + add_layer3_test(test_audio_voice_filter_faults CI_UNIT CI_SANITIZER) target_link_options(test_audio_voice_filter_faults PRIVATE "-Wl,--wrap=avfilter_inout_alloc" "-Wl,--wrap=av_strdup" "-Wl,--wrap=avfilter_graph_config" "-Wl,--wrap=av_buffersrc_add_frame_flags" "-Wl,--wrap=av_buffersink_get_frame" "-Wl,--wrap=av_audio_fifo_write" ) endif() -add_layer3_test(test_timestamp_manager) +add_layer3_test(test_timestamp_manager CI_UNIT CI_SANITIZER) add_layer3_test(test_api_handlers_system) add_layer3_test(test_api_read_isolation) set_tests_properties(test_api_read_isolation PROPERTIES TIMEOUT 15) add_layer1_test(test_external_motion_trigger) # Layer 1: external_motion_trigger state-machine (PR #356) -add_layer2_test(test_motion_trigger_parse) # Layer 2: motion trigger body parsing (#466) -add_layer2_test(test_motion_max_area) # Layer 2: motion detector max-area sanity cap +add_layer2_test(test_motion_trigger_parse CI_UNIT) # Layer 2: motion trigger body parsing (#466) +add_layer2_test(test_motion_max_area CI_UNIT) # Layer 2: motion detector max-area sanity cap add_layer3_test(test_cross_stream_motion_trigger) add_layer3_test(test_annotation_writer_registry) # Layer 3: continuous-writer probe behind annotation mode (#547) -add_layer3_test(test_detection_current_frame) +add_layer3_test(test_detection_current_frame CI_UNIT CI_SANITIZER) target_compile_definitions(test_detection_current_frame PRIVATE TEST_FIXTURE_DIR="${CMAKE_SOURCE_DIR}/tests/fixtures/detection" ) @@ -411,7 +416,7 @@ target_link_options(test_detection_current_frame PRIVATE "-Wl,--wrap=filter_detections_by_stream_objects" ) set_tests_properties(test_detection_current_frame PROPERTIES TIMEOUT 15) -add_layer3_test(test_detection_io_recovery) +add_layer3_test(test_detection_io_recovery CI_UNIT CI_SANITIZER) target_compile_definitions(test_detection_io_recovery PRIVATE TEST_RECORDING_PATH="${CMAKE_SOURCE_DIR}/tests/integration/fixtures/recording.mp4" ) @@ -421,7 +426,7 @@ target_link_options(test_detection_io_recovery PRIVATE "-Wl,--wrap=_log_message_ctx" ) set_tests_properties(test_detection_io_recovery PROPERTIES TIMEOUT 30) -add_layer3_test(test_udt_recording) +add_layer3_test(test_udt_recording CI_UNIT CI_SANITIZER) target_compile_definitions(test_udt_recording PRIVATE TEST_RECORDING_PATH="${CMAKE_SOURCE_DIR}/tests/integration/fixtures/recording.mp4" ) diff --git a/tests/unit/cmake/system_health/startup.cmake b/tests/unit/cmake/system_health/startup.cmake index decdf19dc..ad9c3df56 100644 --- a/tests/unit/cmake/system_health/startup.cmake +++ b/tests/unit/cmake/system_health/startup.cmake @@ -1,4 +1,4 @@ -add_layer3_test(test_system_health_startup) +add_layer3_test(test_system_health_startup CI_UNIT) target_link_options(test_system_health_startup PRIVATE -Wl,--wrap=pthread_cond_wait -Wl,--wrap=pthread_mutex_lock -Wl,--wrap=pthread_create -Wl,--wrap=pthread_join) set_tests_properties(test_system_health_startup PROPERTIES TIMEOUT 30) diff --git a/web/tests/e2e/bulkTagsReconciliation.spec.js b/web/tests/e2e/bulkTagsReconciliation.browser.spec.js similarity index 99% rename from web/tests/e2e/bulkTagsReconciliation.spec.js rename to web/tests/e2e/bulkTagsReconciliation.browser.spec.js index 0440b8b46..94b030fd4 100644 --- a/web/tests/e2e/bulkTagsReconciliation.spec.js +++ b/web/tests/e2e/bulkTagsReconciliation.browser.spec.js @@ -1,5 +1,5 @@ /** Real component effects with delayed API and parent recording snapshots. */ -// Run with: npm --prefix web run test:e2e -- --testPathPatterns=bulkTagsReconciliation +// Run with: npm --prefix web run test:e2e -- --testPathPatterns='\.browser\.spec\.js$' const browserTest = it; async function openBrowser({ delayedCatalog = false diff --git a/web/tests/e2e/zoneEditorCheckbox.spec.js b/web/tests/e2e/zoneEditorCheckbox.browser.spec.js similarity index 99% rename from web/tests/e2e/zoneEditorCheckbox.spec.js rename to web/tests/e2e/zoneEditorCheckbox.browser.spec.js index 26104885f..ebfb8d134 100644 --- a/web/tests/e2e/zoneEditorCheckbox.spec.js +++ b/web/tests/e2e/zoneEditorCheckbox.browser.spec.js @@ -17,7 +17,7 @@ const fixtureZones = [{ }] }]; const t = key => 'translated:' + key; -// Run with: npm --prefix web run test:e2e -- --testPathPatterns=zoneEditorCheckbox +// Run with: npm --prefix web run test:e2e -- --testPathPatterns='\.browser\.spec\.js$' const browserTest = it; async function openZoneBrowser() { const {