cover_buckets chose one level per pass, so an odd first whole bucket (half of all measurement ranges) never reached a level above 0 and folded every remaining bucket at level 0 -- 15624 entries for a 1e6-sample pyramid. Pick the largest aligned, in-range, materialised level at each cursor instead; the new cost test counts folded entries through a PLOT_PYRAMID_COUNT_COVERS-only hook (absent from normal builds) and fails on the old body. Ring slots are now relaxed std::atomic: overwrite-on-full means the producer reuses the slot of a snapshot's oldest sample while the consumer reads it, which was a data race, not just a stale value. copy_from loads explicitly instead of std::copy; push stays lock-free. A new producer/consumer case is the one TSan flags without this. Also extends the wrapped-window test with x0/bounds/pyramid/sum/sumsq/gather checks, and corrects the StreamSeries threading note to the sample-count bound.
43 lines
1.6 KiB
CMake
43 lines
1.6 KiB
CMake
# EGL powers the surfaceless headless context the GL tests assert pixels
|
|
# against. It is a *test-only* dependency: plot_core never links or includes it,
|
|
# so a machine without EGL can still build the library (-DPLOT_BUILD_TESTS=OFF).
|
|
# Prefer CMake's own module, fall back to pkg-config, and fail loudly if neither
|
|
# can supply EGL rather than silently dropping the GL tests.
|
|
find_package(EGL QUIET)
|
|
if(NOT EGL_FOUND)
|
|
find_package(PkgConfig QUIET)
|
|
if(PkgConfig_FOUND)
|
|
pkg_check_modules(EGL_PC QUIET IMPORTED_TARGET egl)
|
|
endif()
|
|
endif()
|
|
|
|
if(TARGET EGL::EGL)
|
|
set(plot_egl_library EGL::EGL)
|
|
elseif(TARGET PkgConfig::EGL_PC)
|
|
set(plot_egl_library PkgConfig::EGL_PC)
|
|
else()
|
|
message(FATAL_ERROR
|
|
"plot: PLOT_BUILD_TESTS=ON requires EGL (EGL/egl.h plus libEGL) for the headless "
|
|
"OpenGL context used by the GL tests. Install it (e.g. libegl-dev, libegl1-mesa-dev "
|
|
"or mesa-libEGL-devel) or configure with -DPLOT_BUILD_TESTS=OFF.")
|
|
endif()
|
|
|
|
find_package(Threads REQUIRED) # std::thread in the push/read race test
|
|
|
|
add_executable(plot_tests
|
|
main.cpp
|
|
test_transform.cpp
|
|
test_gl_context.cpp
|
|
test_ring_buffer.cpp
|
|
test_minmax_pyramid.cpp
|
|
test_series.cpp
|
|
egl_headless.cpp
|
|
)
|
|
target_link_libraries(plot_tests PRIVATE plot::core ${plot_egl_library} Threads::Threads)
|
|
# Same switch the library is built with: the decomposition-cost test reads the
|
|
# counter behind it (see include/plot/data/detail/cover_count.hpp).
|
|
target_compile_definitions(plot_tests PRIVATE PLOT_PYRAMID_COUNT_COVERS)
|
|
plot_apply_warnings(plot_tests)
|
|
|
|
add_test(NAME plot_tests COMMAND plot_tests)
|