add_executable(brq_block_lifecycle tests.cpp)
target_link_libraries(brq_block_lifecycle PRIVATE TwoBufQueue)
brq_warnings(brq_block_lifecycle)
enable_testing()
foreach(case state_single state_1n state_nn read_progress force_ignore scan_skip_head scan_before_create
    bounds_single bounds_1n bounds_nn bitmap_reuse last_release_scan many_getters same_block_alloc_release
    wait_timeouts wait_multiple slice_pool_single slice_pool_1n slice_pool_nn close_then_release notifications destructor_scan
    pointer_single pointer_1n pointer_nn pointer_publication slice_state_range intrusive_queue derived_recycle_condition)
  add_test(NAME block_lifecycle_${case} COMMAND brq_block_lifecycle ${case})
  set_tests_properties(block_lifecycle_${case} PROPERTIES TIMEOUT 90 LABELS "functional;data_integrity;block_lifecycle")
endforeach()
function(death case message)
  add_test(NAME block_lifecycle_death_${case} COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/check_death.py"
    "$<TARGET_FILE:brq_block_lifecycle>" death_${case} "${message}")
  set_tests_properties(block_lifecycle_death_${case} PROPERTIES TIMEOUT 15 LABELS "functional;death;block_lifecycle")
endfunction()
death(force_writing "force_recycle requires LeaveWriter")
death(force_finished "force_recycle requires LeaveWriter")
death(force_free "force_recycle requires LeaveWriter")
death(force_twice "force_recycle requires LeaveWriter")
death(leave_writing "expected WriteFinished")
death(leave_twice "expected WriteFinished")
death(finish_twice "expected Writing")
death(allocate_finished "expected Allocating block")
death(slice_bounds "source cursors must satisfy read <= published <= capacity")
death(slice_free "expected Writing, WriteFinished or LeaveWriter range")
death(slice_forced "expected Writing, WriteFinished or LeaveWriter range")
death(release_twice "cannot release an empty or already released slice")
death(release_forced "slice credential is no longer valid")
death(release_stale "slice credential is no longer valid")
death(destructor_writing "destroying WarmPool while resources are still in use")
death(destructor_unread "destroying WarmPool while resources are still in use")
death(destructor_slice "destroying WarmPool while resources are still in use")

add_executable(brq_block_pool_trim trim.cpp)
target_link_libraries(brq_block_pool_trim PRIVATE TwoBufQueue)
brq_warnings(brq_block_pool_trim)
foreach(case single 1n nn held preallocate force_ignore concurrent hot_prefix restore_failure actual_destroy slice_access_overlap)
  add_test(NAME block_pool_trim_${case} COMMAND brq_block_pool_trim ${case})
  set_tests_properties(block_pool_trim_${case} PROPERTIES TIMEOUT 90 LABELS "functional;data_integrity;block_pool_trim")
endforeach()
foreach(case free stale)
  if(case STREQUAL "free")
    set(reason "slice credential is no longer valid")
  else()
    set(reason "slice credential is no longer valid")
  endif()
  add_test(NAME block_pool_trim_death_${case} COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/check_death.py"
    "$<TARGET_FILE:brq_block_pool_trim>" death_${case} "${reason}")
  set_tests_properties(block_pool_trim_death_${case} PROPERTIES TIMEOUT 15 LABELS "functional;death;block_pool_trim")
endforeach()
