diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 07ba057..109d6ce 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,34 +7,47 @@ on: branches: [main] jobs: - linux: + linux-unit-tests: runs-on: ubuntu-latest strategy: fail-fast: false steps: - uses: actions/checkout@v4 - name: Install dependencies - run: sudo apt-get update && sudo apt-get install -y libfuse3-dev fuse3 + run: sudo apt-get update && sudo apt-get install -y libfuse3-dev fuse3 libelf-dev zlib1g-dev - name: Configure - run: cmake -B build -DAGENTVFS_EBPF=OFF + run: cmake -B build -DAGENTVFS_EBPF=OFF -DAGENTVFS_LDPRELOAD=ON - name: Build run: cmake --build build -j - name: Unit tests run: | - ./build/cas_test_working_tree - ./build/cas_test_write_buffer - ./build/cas_test_object_store - ./build/cas_test_branch_context - ./build/cas_test_branch_merge - ./build/cas_test_branch_merge_commit - ./build/cas_test_fh_lifecycle /tmp /tmp/test.sock || true - ./build/cas_test_branch_merge_daemon || true - ./build/cas_test_branch_persistence || true - ./build/cas_test_blake3_simd - ./build/cas_test_telemetry_event - ./build/cas_test_telemetry_registry + run_test() { + echo "==> $1" + "$1" + } + + run_test ./build/tests/cas_test_working_tree + run_test ./build/tests/cas_test_write_buffer + run_test ./build/tests/cas_test_object_store + run_test ./build/tests/cas_test_branch_context + run_test ./build/tests/cas_test_branch_merge + run_test ./build/tests/cas_test_branch_merge_commit + run_test ./build/tests/cas_test_branch_merge_daemon + run_test ./build/tests/cas_test_branch_persistence + run_test ./build/tests/cas_test_blake3_simd + run_test ./build/tests/cas_test_telemetry_event + run_test ./build/tests/cas_test_telemetry_registry + run_test ./build/tests/cas_test_workspace_cli + run_test ./build/tests/cas_test_ebpf_backend + run_test ./build/tests/cas_test_fanotify_backend + run_test ./build/tests/cas_test_ptrace_backend + run_test ./build/tests/cas_test_ldpreload_backend + run_test ./build/tests/cas_test_bpftime_backend + run_test ./build/tests/cas_test_wasm_backend + run_test ./build/tests/cas_test_lua_backend + run_test ./build/tests/cas_test_ldpreload_preload - macos: + macos-unit-tests: runs-on: macos-latest strategy: fail-fast: false @@ -42,53 +55,108 @@ jobs: - uses: actions/checkout@v4 - name: Configure # AGENTVFS_FUSE_T defaults to ON on Apple; disable it here so this - # portable-only job doesn't require fuse-t (covered by macos-daemon). + # unit-only job doesn't require fuse-t. run: cmake -B build -DAGENTVFS_EBPF=OFF -DAGENTVFS_FUSE_T=OFF - name: Build run: cmake --build build -j - name: Unit tests - # macOS is UNIX, so every UNIX-gated test still builds and runs. - # The daemon target is Linux-only and is intentionally not built - # here. run: | - ./build/cas_test_working_tree - ./build/cas_test_write_buffer - ./build/cas_test_object_store - ./build/cas_test_branch_context - ./build/cas_test_branch_merge - ./build/cas_test_branch_merge_commit - ./build/cas_test_blake3_simd - ./build/cas_test_telemetry_event - ./build/cas_test_telemetry_registry + ./build/tests/cas_test_working_tree + ./build/tests/cas_test_write_buffer + ./build/tests/cas_test_object_store + ./build/tests/cas_test_branch_context + ./build/tests/cas_test_branch_merge + ./build/tests/cas_test_branch_merge_commit + ./build/tests/cas_test_blake3_simd + ./build/tests/cas_test_telemetry_event + ./build/tests/cas_test_telemetry_registry + ./build/tests/cas_test_workspace_cli + ./build/tests/cas_test_fuse_t_preflight - windows: + windows-unit-tests: runs-on: windows-latest strategy: fail-fast: false steps: - uses: actions/checkout@v4 - name: Configure - # AGENTVFS_WINFSP defaults to ON on Windows; explicitly disable it - # so this portable-only job doesn't require the WinFsp SDK. + # Build only unit targets here; WinFsp is reserved for system tests. run: cmake -B build -DAGENTVFS_EBPF=OFF -DAGENTVFS_WINFSP=OFF - name: Build - # Windows builds only the portable tests gated by the CMake - # if(UNIX)/if(LINUX) guards. The fh_lifecycle / object_store / - # branch_merge_commit / telemetry_registry / branch_persistence / - # branch_merge_daemon harnesses use POSIX-only APIs and are not - # available here. cas_core itself compiles via std::filesystem - # and the posix_compat.h shim. run: cmake --build build --config Release -j - name: Unit tests run: | - .\build\Release\cas_test_working_tree.exe - .\build\Release\cas_test_write_buffer.exe - .\build\Release\cas_test_branch_context.exe - .\build\Release\cas_test_branch_merge.exe - .\build\Release\cas_test_blake3_simd.exe - .\build\Release\cas_test_telemetry_event.exe + .\build\tests\Release\cas_test_working_tree.exe + .\build\tests\Release\cas_test_write_buffer.exe + .\build\tests\Release\cas_test_branch_context.exe + .\build\tests\Release\cas_test_branch_merge.exe + .\build\tests\Release\cas_test_blake3_simd.exe + .\build\tests\Release\cas_test_telemetry_event.exe + .\build\tests\Release\cas_test_win_helpers.exe + .\build\tests\Release\cas_test_named_pipe_channel.exe + + linux-system-tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - uses: actions/checkout@v4 + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y \ + libfuse3-dev \ + fuse3 \ + netcat-openbsd \ + clang \ + libbpf-dev \ + libelf-dev \ + zlib1g-dev \ + liblua5.4-dev \ + lua5.4 \ + wabt + - name: Configure + run: cmake -B build -DAGENTVFS_EBPF=OFF -DAGENTVFS_FANOTIFY=ON -DAGENTVFS_PTRACE=ON -DAGENTVFS_LDPRELOAD=ON -DAGENTVFS_BPFTIME=ON -DAGENTVFS_WASM=ON -DAGENTVFS_LUA=ON + - name: Build + run: cmake --build build -j + - name: System tests + run: | + run_system_test() { + echo "==> $1" + bash "$1" + } - windows-daemon: + run_root_system_test() { + echo "==> $1 (root)" + sudo -E env "PATH=$PATH" bash "$1" + } + + sudo sysctl -w kernel.yama.ptrace_scope=0 + + run_system_test tests/system/test_agentvfs_ctl.sh + run_system_test tests/system/test_workspace_cli.sh + run_system_test tests/system/test_cas_smoke.sh + run_system_test tests/system/test_cas_bootstrap.sh + run_system_test tests/system/test_cas_fh_lifecycle.sh + run_root_system_test tests/system/test_cas_branching.sh + run_root_system_test tests/system/test_cas_branch_merge.sh + run_root_system_test tests/system/test_cas_multi_branch.sh + run_root_system_test tests/system/test_cas_multi_branch_merge.sh + run_root_system_test tests/system/test_workspace_multi_branch.sh + run_system_test tests/system/test_cas_10cp_rollback.sh + # eBPF-specific coverage is not runnable on the hosted Ubuntu kernel/tooling image. + run_system_test tests/system/test_cas_backend_compare.sh + run_system_test tests/system/test_cas_multi_backend.sh + run_root_system_test tests/system/test_cas_fanotify.sh + run_system_test tests/system/test_cas_ptrace.sh + run_system_test tests/system/test_cas_ldpreload.sh + run_system_test tests/system/test_cas_bpftime.sh + run_system_test tests/system/test_cas_lua_actually_skipped.sh + run_system_test tests/system/test_cas_wasm_actually_skipped.sh + run_system_test tests/system/test_start_sh.sh + run_system_test tests/system/test_quickstart_demo_smoke.sh + + windows-system-tests: runs-on: windows-latest strategy: { fail-fast: false } steps: @@ -114,15 +182,11 @@ jobs: run: cmake -B build -DAGENTVFS_EBPF=OFF -DAGENTVFS_WINFSP=ON - name: Build run: cmake --build build --config Release -j - - name: Windows unit tests - run: | - .\build\Release\cas_test_win_helpers.exe - .\build\Release\cas_test_named_pipe_channel.exe - - name: E2E test + - name: System tests shell: powershell - run: ./tests/cas/windows/test_winfsp_e2e.ps1 + run: ./tests/system/windows/test_winfsp_e2e.ps1 - macos-daemon: + macos-system-tests: runs-on: macos-latest strategy: { fail-fast: false } steps: @@ -133,7 +197,5 @@ jobs: run: cmake -B build -DAGENTVFS_EBPF=OFF -DAGENTVFS_FUSE_T=ON - name: Build run: cmake --build build -j - - name: Preflight unit test - run: ./build/cas_test_fuse_t_preflight - - name: E2E test - run: bash tests/cas/test_macos_e2e.sh + - name: System tests + run: bash tests/system/test_macos_e2e.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 52fd04e..dfcaa77 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,21 +106,6 @@ if(WIN32 AND AGENTVFS_WINFSP) "AGENTVFS_WINFSP=ON but WinFsp SDK not found. " "Install WinFsp 2.0+ from https://winfsp.dev.") endif() - - add_executable(cas_test_named_pipe_channel - tests/cas/test_named_pipe_channel.cpp - src/cas/platform/windows/named_pipe_channel.cpp) - target_include_directories(cas_test_named_pipe_channel PRIVATE - src src/cas) - target_compile_features(cas_test_named_pipe_channel PRIVATE cxx_std_17) - - add_executable(cas_test_win_helpers - tests/cas/test_win_helpers.cpp - src/cas/platform/windows/path_translation.cpp - src/cas/platform/windows/ntstatus_map.cpp) - target_include_directories(cas_test_win_helpers PRIVATE - src src/cas ${WINFSP_INCLUDE_DIR}) - target_compile_features(cas_test_win_helpers PRIVATE cxx_std_17) endif() # ── cas_core static library (always built) ───────────────────────── @@ -478,188 +463,4 @@ add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake COMMENT "Removing files listed in install_manifest.txt") -if(UNIX) -add_executable(cas_test_workspace_cli - tests/cas/test_workspace_cli.cpp - src/cas/workspace_cli.cpp) -target_include_directories(cas_test_workspace_cli PRIVATE src/cas) -if(NOT MSVC) - target_compile_options(cas_test_workspace_cli PRIVATE -Wall -Wextra -Wpedantic) -endif() -target_link_libraries(cas_test_workspace_cli PRIVATE Threads::Threads) -if(AGENTVFS_EBPF) - target_compile_definitions(cas_test_workspace_cli PRIVATE AGENTVFS_EBPF=1) -endif() -if(AGENTVFS_FANOTIFY) - target_compile_definitions(cas_test_workspace_cli PRIVATE AGENTVFS_FANOTIFY=1) -endif() -endif() # UNIX - -if(APPLE) -add_executable(cas_test_fuse_t_preflight - tests/cas/test_fuse_t_preflight.cpp - src/cas/platform/macos/fuse_t_preflight.cpp) -target_include_directories(cas_test_fuse_t_preflight PRIVATE - src src/cas include) -target_compile_features(cas_test_fuse_t_preflight PRIVATE cxx_std_17) -if(NOT MSVC) - target_compile_options(cas_test_fuse_t_preflight PRIVATE - -Wall -Wextra -Wpedantic) -endif() -endif() - -# ── CAS unit tests ────────────────────────────────────────────────── -add_executable(cas_test_working_tree tests/cas/test_working_tree.cpp) -target_link_libraries(cas_test_working_tree PRIVATE cas_core) - -add_executable(cas_test_write_buffer tests/cas/test_write_buffer.cpp) -target_link_libraries(cas_test_write_buffer PRIVATE cas_core) - -# Uses POSIX /mkdtemp/lstat in its harness; gate to UNIX. The -# cas_core APIs it exercises are themselves portable. -if(UNIX) -add_executable(cas_test_object_store tests/cas/test_object_store.cpp) -target_link_libraries(cas_test_object_store PRIVATE cas_core) -endif() - -# Harness uses only POSIX syscalls; no cas_core link needed. Gated to -# UNIX because the test is an AF_UNIX integration client of a running -# daemon — it cannot meaningfully run on Windows even after cas_core -# itself compiles there. -if(UNIX) -add_executable(cas_test_fh_lifecycle tests/cas/test_cas_fh_lifecycle.cpp) -endif() - -add_executable(cas_test_branch_context tests/cas/test_branch_context.cpp) -target_link_libraries(cas_test_branch_context PRIVATE cas_core) - -add_executable(cas_test_branch_merge tests/cas/test_branch_merge.cpp) -target_link_libraries(cas_test_branch_merge PRIVATE cas_core) - -# Same as cas_test_object_store: harness uses POSIX directory APIs. -if(UNIX) -add_executable(cas_test_branch_merge_commit tests/cas/test_branch_merge_commit.cpp) -target_link_libraries(cas_test_branch_merge_commit PRIVATE cas_core) -endif() - -if(UNIX) -add_executable(cas_test_branch_merge_daemon - tests/cas/test_branch_merge_daemon.cpp - tests/cas/ebpf_loader_stub.cpp) -target_link_libraries(cas_test_branch_merge_daemon PRIVATE cas_core) -if(AGENTVFS_EBPF) - target_link_libraries(cas_test_branch_merge_daemon PRIVATE ${LIBBPF_LIBRARIES} elf z) -endif() - -add_executable(cas_test_branch_persistence - tests/cas/test_branch_persistence.cpp - tests/cas/ebpf_loader_stub.cpp) -target_link_libraries(cas_test_branch_persistence PRIVATE cas_core) -if(AGENTVFS_EBPF) - target_link_libraries(cas_test_branch_persistence PRIVATE ${LIBBPF_LIBRARIES} elf z) -endif() -endif() # UNIX - -add_executable(cas_test_telemetry_event tests/cas/test_telemetry_event.cpp src/cas/telemetry_event.cpp) -target_include_directories(cas_test_telemetry_event PRIVATE include src src/cas) -target_compile_features(cas_test_telemetry_event PRIVATE cxx_std_17) - -# Uses fork()/waitpid() in the harness; gate to UNIX. -if(UNIX) -add_executable(cas_test_telemetry_registry tests/cas/test_telemetry_registry.cpp src/cas/telemetry_registry.cpp src/cas/telemetry_event.cpp) -target_include_directories(cas_test_telemetry_registry PRIVATE include src src/cas) -target_compile_features(cas_test_telemetry_registry PRIVATE cxx_std_17) -endif() - -if(AGENTVFS_BLAKE3_SIMD) -add_executable(cas_test_blake3_simd tests/cas/test_blake3_simd.cpp) -target_link_libraries(cas_test_blake3_simd PRIVATE cas_core) -endif() - -if(LINUX) -add_executable(cas_test_ebpf_backend - tests/cas/test_ebpf_backend.cpp - src/cas/backends/ebpf_backend.cpp - src/cas/ebpf_loader.cpp) -target_include_directories(cas_test_ebpf_backend PRIVATE include src src/cas) -target_link_libraries(cas_test_ebpf_backend PRIVATE cas_core) -target_compile_features(cas_test_ebpf_backend PRIVATE cxx_std_17) -if(AGENTVFS_EBPF) - target_include_directories(cas_test_ebpf_backend PRIVATE - ${LIBBPF_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR}) - target_link_libraries(cas_test_ebpf_backend PRIVATE ${LIBBPF_LIBRARIES} elf z) - add_dependencies(cas_test_ebpf_backend cas_bpf_skel) -endif() - -add_executable(cas_test_fanotify_backend - tests/cas/test_fanotify_backend.cpp - src/cas/backends/fanotify_backend.cpp - src/cas/telemetry_event.cpp) -target_include_directories(cas_test_fanotify_backend PRIVATE include src src/cas) -target_link_libraries(cas_test_fanotify_backend PRIVATE Threads::Threads) -target_compile_features(cas_test_fanotify_backend PRIVATE cxx_std_17) -if(AGENTVFS_FANOTIFY) - target_compile_definitions(cas_test_fanotify_backend PRIVATE AGENTVFS_FANOTIFY=1) -endif() - -add_executable(cas_test_ptrace_backend - tests/cas/test_ptrace_backend.cpp - src/cas/backends/ptrace_backend.cpp - src/cas/telemetry_event.cpp) -target_include_directories(cas_test_ptrace_backend PRIVATE include src src/cas) -target_link_libraries(cas_test_ptrace_backend PRIVATE Threads::Threads) -target_compile_features(cas_test_ptrace_backend PRIVATE cxx_std_17) -if(AGENTVFS_PTRACE) - target_compile_definitions(cas_test_ptrace_backend PRIVATE AGENTVFS_PTRACE=1) -endif() - -add_executable(cas_test_ldpreload_backend - tests/cas/test_ldpreload_backend.cpp - src/cas/backends/ldpreload_backend.cpp - src/cas/telemetry_event.cpp) -target_include_directories(cas_test_ldpreload_backend PRIVATE include src src/cas) -target_link_libraries(cas_test_ldpreload_backend PRIVATE Threads::Threads) -target_compile_features(cas_test_ldpreload_backend PRIVATE cxx_std_17) -if(AGENTVFS_LDPRELOAD) - target_compile_definitions(cas_test_ldpreload_backend PRIVATE AGENTVFS_LDPRELOAD=1) -endif() - -add_executable(cas_test_bpftime_backend - tests/cas/test_bpftime_backend.cpp - src/cas/backends/bpftime_backend.cpp) -target_include_directories(cas_test_bpftime_backend PRIVATE include src src/cas) -target_link_libraries(cas_test_bpftime_backend PRIVATE Threads::Threads) -target_compile_features(cas_test_bpftime_backend PRIVATE cxx_std_17) -if(AGENTVFS_BPFTIME) - target_compile_definitions(cas_test_bpftime_backend PRIVATE AGENTVFS_BPFTIME=1) -endif() - -add_executable(cas_test_wasm_backend - tests/cas/test_wasm_backend.cpp - src/cas/backends/wasm_backend.cpp) -target_include_directories(cas_test_wasm_backend PRIVATE include src src/cas) -target_compile_features(cas_test_wasm_backend PRIVATE cxx_std_17) -if(AGENTVFS_WASM) - target_compile_definitions(cas_test_wasm_backend PRIVATE AGENTVFS_WASM=1) -endif() - -add_executable(cas_test_lua_backend - tests/cas/test_lua_backend.cpp - src/cas/backends/lua_backend.cpp) -target_include_directories(cas_test_lua_backend PRIVATE include src src/cas) -target_compile_features(cas_test_lua_backend PRIVATE cxx_std_17) -if(AGENTVFS_LUA) - target_compile_definitions(cas_test_lua_backend PRIVATE AGENTVFS_LUA=1) -endif() - -if(AGENTVFS_LDPRELOAD) - add_executable(cas_test_ldpreload_preload - tests/cas/test_ldpreload_preload.cpp) - target_include_directories(cas_test_ldpreload_preload PRIVATE include src src/cas) - target_link_libraries(cas_test_ldpreload_preload PRIVATE dl Threads::Threads) - target_compile_features(cas_test_ldpreload_preload PRIVATE cxx_std_17) - target_compile_definitions(cas_test_ldpreload_preload PRIVATE - CAS_PRELOAD_LIB="${CMAKE_CURRENT_BINARY_DIR}/libcas_preload.so") - add_dependencies(cas_test_ldpreload_preload cas_preload) -endif() -endif() # LINUX +add_subdirectory(tests) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..539b74b --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,193 @@ +if(WIN32) + add_executable(cas_test_named_pipe_channel + unit/test_named_pipe_channel.cpp + ../src/cas/platform/windows/named_pipe_channel.cpp) + target_include_directories(cas_test_named_pipe_channel PRIVATE + ../src ../src/cas) + target_compile_features(cas_test_named_pipe_channel PRIVATE cxx_std_17) + + add_executable(cas_test_win_helpers + unit/test_win_helpers.cpp + ../src/cas/platform/windows/path_translation.cpp + ../src/cas/platform/windows/ntstatus_map.cpp) + target_include_directories(cas_test_win_helpers PRIVATE + ../src ../src/cas) + target_compile_features(cas_test_win_helpers PRIVATE cxx_std_17) +endif() + +if(UNIX) +add_executable(cas_test_workspace_cli + unit/test_workspace_cli.cpp + ../src/cas/workspace_cli.cpp) +target_include_directories(cas_test_workspace_cli PRIVATE ../src/cas) +if(NOT MSVC) + target_compile_options(cas_test_workspace_cli PRIVATE -Wall -Wextra -Wpedantic) +endif() +target_link_libraries(cas_test_workspace_cli PRIVATE Threads::Threads) +if(AGENTVFS_EBPF) + target_compile_definitions(cas_test_workspace_cli PRIVATE AGENTVFS_EBPF=1) +endif() +if(AGENTVFS_FANOTIFY) + target_compile_definitions(cas_test_workspace_cli PRIVATE AGENTVFS_FANOTIFY=1) +endif() +endif() # UNIX + +if(APPLE) +add_executable(cas_test_fuse_t_preflight + unit/test_fuse_t_preflight.cpp + ../src/cas/platform/macos/fuse_t_preflight.cpp) +target_include_directories(cas_test_fuse_t_preflight PRIVATE + ../src ../src/cas ../include) +target_compile_features(cas_test_fuse_t_preflight PRIVATE cxx_std_17) +if(NOT MSVC) + target_compile_options(cas_test_fuse_t_preflight PRIVATE + -Wall -Wextra -Wpedantic) +endif() +endif() + +add_executable(cas_test_working_tree unit/test_working_tree.cpp) +target_link_libraries(cas_test_working_tree PRIVATE cas_core) + +add_executable(cas_test_write_buffer unit/test_write_buffer.cpp) +target_link_libraries(cas_test_write_buffer PRIVATE cas_core) + +if(UNIX) +add_executable(cas_test_object_store unit/test_object_store.cpp) +target_link_libraries(cas_test_object_store PRIVATE cas_core) +endif() + +if(UNIX) +add_executable(cas_test_fh_lifecycle system/test_cas_fh_lifecycle.cpp) +endif() + +add_executable(cas_test_branch_context unit/test_branch_context.cpp) +target_link_libraries(cas_test_branch_context PRIVATE cas_core) + +add_executable(cas_test_branch_merge unit/test_branch_merge.cpp) +target_link_libraries(cas_test_branch_merge PRIVATE cas_core) + +if(UNIX) +add_executable(cas_test_branch_merge_commit unit/test_branch_merge_commit.cpp) +target_link_libraries(cas_test_branch_merge_commit PRIVATE cas_core) +endif() + +if(UNIX) +add_executable(cas_test_branch_merge_daemon + unit/test_branch_merge_daemon.cpp + support/ebpf_loader_stub.cpp) +target_link_libraries(cas_test_branch_merge_daemon PRIVATE cas_core) +if(AGENTVFS_EBPF) + target_link_libraries(cas_test_branch_merge_daemon PRIVATE ${LIBBPF_LIBRARIES} elf z) +endif() + +add_executable(cas_test_branch_persistence + unit/test_branch_persistence.cpp + support/ebpf_loader_stub.cpp) +target_link_libraries(cas_test_branch_persistence PRIVATE cas_core) +if(AGENTVFS_EBPF) + target_link_libraries(cas_test_branch_persistence PRIVATE ${LIBBPF_LIBRARIES} elf z) +endif() +endif() # UNIX + +add_executable(cas_test_telemetry_event unit/test_telemetry_event.cpp ../src/cas/telemetry_event.cpp) +target_include_directories(cas_test_telemetry_event PRIVATE ../include ../src ../src/cas) +target_compile_features(cas_test_telemetry_event PRIVATE cxx_std_17) + +if(UNIX) +add_executable(cas_test_telemetry_registry unit/test_telemetry_registry.cpp ../src/cas/telemetry_registry.cpp ../src/cas/telemetry_event.cpp) +target_include_directories(cas_test_telemetry_registry PRIVATE ../include ../src ../src/cas) +target_compile_features(cas_test_telemetry_registry PRIVATE cxx_std_17) +endif() + +if(AGENTVFS_BLAKE3_SIMD) +add_executable(cas_test_blake3_simd unit/test_blake3_simd.cpp) +target_link_libraries(cas_test_blake3_simd PRIVATE cas_core) +endif() + +if(LINUX) +add_executable(cas_test_ebpf_backend + unit/test_ebpf_backend.cpp + ../src/cas/backends/ebpf_backend.cpp + ../src/cas/ebpf_loader.cpp) +target_include_directories(cas_test_ebpf_backend PRIVATE ../include ../src ../src/cas) +target_link_libraries(cas_test_ebpf_backend PRIVATE cas_core) +target_compile_features(cas_test_ebpf_backend PRIVATE cxx_std_17) +if(AGENTVFS_EBPF) + target_include_directories(cas_test_ebpf_backend PRIVATE + ${LIBBPF_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(cas_test_ebpf_backend PRIVATE ${LIBBPF_LIBRARIES} elf z) + add_dependencies(cas_test_ebpf_backend cas_bpf_skel) +endif() + +add_executable(cas_test_fanotify_backend + unit/test_fanotify_backend.cpp + ../src/cas/backends/fanotify_backend.cpp + ../src/cas/telemetry_event.cpp) +target_include_directories(cas_test_fanotify_backend PRIVATE ../include ../src ../src/cas) +target_link_libraries(cas_test_fanotify_backend PRIVATE Threads::Threads) +target_compile_features(cas_test_fanotify_backend PRIVATE cxx_std_17) +if(AGENTVFS_FANOTIFY) + target_compile_definitions(cas_test_fanotify_backend PRIVATE AGENTVFS_FANOTIFY=1) +endif() + +add_executable(cas_test_ptrace_backend + unit/test_ptrace_backend.cpp + ../src/cas/backends/ptrace_backend.cpp + ../src/cas/telemetry_event.cpp) +target_include_directories(cas_test_ptrace_backend PRIVATE ../include ../src ../src/cas) +target_link_libraries(cas_test_ptrace_backend PRIVATE Threads::Threads) +target_compile_features(cas_test_ptrace_backend PRIVATE cxx_std_17) +if(AGENTVFS_PTRACE) + target_compile_definitions(cas_test_ptrace_backend PRIVATE AGENTVFS_PTRACE=1) +endif() + +add_executable(cas_test_ldpreload_backend + unit/test_ldpreload_backend.cpp + ../src/cas/backends/ldpreload_backend.cpp + ../src/cas/telemetry_event.cpp) +target_include_directories(cas_test_ldpreload_backend PRIVATE ../include ../src ../src/cas) +target_link_libraries(cas_test_ldpreload_backend PRIVATE Threads::Threads) +target_compile_features(cas_test_ldpreload_backend PRIVATE cxx_std_17) +if(AGENTVFS_LDPRELOAD) + target_compile_definitions(cas_test_ldpreload_backend PRIVATE AGENTVFS_LDPRELOAD=1) +endif() + +add_executable(cas_test_bpftime_backend + unit/test_bpftime_backend.cpp + ../src/cas/backends/bpftime_backend.cpp) +target_include_directories(cas_test_bpftime_backend PRIVATE ../include ../src ../src/cas) +target_link_libraries(cas_test_bpftime_backend PRIVATE Threads::Threads) +target_compile_features(cas_test_bpftime_backend PRIVATE cxx_std_17) +if(AGENTVFS_BPFTIME) + target_compile_definitions(cas_test_bpftime_backend PRIVATE AGENTVFS_BPFTIME=1) +endif() + +add_executable(cas_test_wasm_backend + unit/test_wasm_backend.cpp + ../src/cas/backends/wasm_backend.cpp) +target_include_directories(cas_test_wasm_backend PRIVATE ../include ../src ../src/cas) +target_compile_features(cas_test_wasm_backend PRIVATE cxx_std_17) +if(AGENTVFS_WASM) + target_compile_definitions(cas_test_wasm_backend PRIVATE AGENTVFS_WASM=1) +endif() + +add_executable(cas_test_lua_backend + unit/test_lua_backend.cpp + ../src/cas/backends/lua_backend.cpp) +target_include_directories(cas_test_lua_backend PRIVATE ../include ../src ../src/cas) +target_compile_features(cas_test_lua_backend PRIVATE cxx_std_17) +if(AGENTVFS_LUA) + target_compile_definitions(cas_test_lua_backend PRIVATE AGENTVFS_LUA=1) +endif() + +if(AGENTVFS_LDPRELOAD) + add_executable(cas_test_ldpreload_preload + unit/test_ldpreload_preload.cpp) + target_include_directories(cas_test_ldpreload_preload PRIVATE ../include ../src ../src/cas) + target_link_libraries(cas_test_ldpreload_preload PRIVATE dl Threads::Threads) + target_compile_features(cas_test_ldpreload_preload PRIVATE cxx_std_17) + target_compile_definitions(cas_test_ldpreload_preload PRIVATE + CAS_PRELOAD_LIB="$") + add_dependencies(cas_test_ldpreload_preload cas_preload) +endif() +endif() # LINUX diff --git a/tests/cas/fixtures/test_filter.wat b/tests/fixtures/test_filter.wat similarity index 100% rename from tests/cas/fixtures/test_filter.wat rename to tests/fixtures/test_filter.wat diff --git a/tests/cas/fixtures/test_policy.lua b/tests/fixtures/test_policy.lua similarity index 100% rename from tests/cas/fixtures/test_policy.lua rename to tests/fixtures/test_policy.lua diff --git a/tests/cas/ebpf_loader_stub.cpp b/tests/support/ebpf_loader_stub.cpp similarity index 100% rename from tests/cas/ebpf_loader_stub.cpp rename to tests/support/ebpf_loader_stub.cpp diff --git a/tests/cas/test_agentvfs_ctl.sh b/tests/system/test_agentvfs_ctl.sh similarity index 100% rename from tests/cas/test_agentvfs_ctl.sh rename to tests/system/test_agentvfs_ctl.sh diff --git a/tests/cas/test_cas_10cp_ebpf.sh b/tests/system/test_cas_10cp_ebpf.sh similarity index 100% rename from tests/cas/test_cas_10cp_ebpf.sh rename to tests/system/test_cas_10cp_ebpf.sh diff --git a/tests/cas/test_cas_10cp_rollback.sh b/tests/system/test_cas_10cp_rollback.sh similarity index 100% rename from tests/cas/test_cas_10cp_rollback.sh rename to tests/system/test_cas_10cp_rollback.sh diff --git a/tests/cas/test_cas_backend_compare.sh b/tests/system/test_cas_backend_compare.sh similarity index 100% rename from tests/cas/test_cas_backend_compare.sh rename to tests/system/test_cas_backend_compare.sh diff --git a/tests/cas/test_cas_bootstrap.sh b/tests/system/test_cas_bootstrap.sh similarity index 100% rename from tests/cas/test_cas_bootstrap.sh rename to tests/system/test_cas_bootstrap.sh diff --git a/tests/cas/test_cas_bpftime.sh b/tests/system/test_cas_bpftime.sh similarity index 100% rename from tests/cas/test_cas_bpftime.sh rename to tests/system/test_cas_bpftime.sh diff --git a/tests/cas/test_cas_branch_merge.sh b/tests/system/test_cas_branch_merge.sh similarity index 100% rename from tests/cas/test_cas_branch_merge.sh rename to tests/system/test_cas_branch_merge.sh diff --git a/tests/cas/test_cas_branching.sh b/tests/system/test_cas_branching.sh similarity index 100% rename from tests/cas/test_cas_branching.sh rename to tests/system/test_cas_branching.sh diff --git a/tests/cas/test_cas_fanotify.sh b/tests/system/test_cas_fanotify.sh similarity index 100% rename from tests/cas/test_cas_fanotify.sh rename to tests/system/test_cas_fanotify.sh diff --git a/tests/cas/test_cas_fh_lifecycle.cpp b/tests/system/test_cas_fh_lifecycle.cpp similarity index 100% rename from tests/cas/test_cas_fh_lifecycle.cpp rename to tests/system/test_cas_fh_lifecycle.cpp diff --git a/tests/cas/test_cas_fh_lifecycle.sh b/tests/system/test_cas_fh_lifecycle.sh similarity index 92% rename from tests/cas/test_cas_fh_lifecycle.sh rename to tests/system/test_cas_fh_lifecycle.sh index 46ba66f..d11c71c 100755 --- a/tests/cas/test_cas_fh_lifecycle.sh +++ b/tests/system/test_cas_fh_lifecycle.sh @@ -7,7 +7,7 @@ MNT="$ROOT/mnt" STORE="$ROOT/store" SOCK="$ROOT/control.sock" BIN="$(pwd)/build/agentvfs" -HARNESS="$(pwd)/build/cas_test_fh_lifecycle" +HARNESS="$(pwd)/build/tests/cas_test_fh_lifecycle" cleanup() { fusermount3 -u "$MNT" 2>/dev/null || true diff --git a/tests/cas/test_cas_ldpreload.sh b/tests/system/test_cas_ldpreload.sh similarity index 100% rename from tests/cas/test_cas_ldpreload.sh rename to tests/system/test_cas_ldpreload.sh diff --git a/tests/cas/test_cas_lua.sh b/tests/system/test_cas_lua_actually_skipped.sh similarity index 94% rename from tests/cas/test_cas_lua.sh rename to tests/system/test_cas_lua_actually_skipped.sh index 7f2e851..424a9b6 100755 --- a/tests/cas/test_cas_lua.sh +++ b/tests/system/test_cas_lua_actually_skipped.sh @@ -2,7 +2,7 @@ set -euo pipefail BIN="${BIN:-$(pwd)/build/agentvfs}" -FIXTURE="$(pwd)/tests/cas/fixtures/test_policy.lua" +FIXTURE="$(pwd)/tests/fixtures/test_policy.lua" if [[ ! -x "$BIN" ]]; then echo "SKIP test_cas_lua: $BIN is not built" diff --git a/tests/cas/test_cas_multi_backend.sh b/tests/system/test_cas_multi_backend.sh similarity index 100% rename from tests/cas/test_cas_multi_backend.sh rename to tests/system/test_cas_multi_backend.sh diff --git a/tests/cas/test_cas_multi_branch.sh b/tests/system/test_cas_multi_branch.sh similarity index 100% rename from tests/cas/test_cas_multi_branch.sh rename to tests/system/test_cas_multi_branch.sh diff --git a/tests/cas/test_cas_multi_branch_ebpf.sh b/tests/system/test_cas_multi_branch_ebpf.sh similarity index 100% rename from tests/cas/test_cas_multi_branch_ebpf.sh rename to tests/system/test_cas_multi_branch_ebpf.sh diff --git a/tests/cas/test_cas_multi_branch_merge.sh b/tests/system/test_cas_multi_branch_merge.sh similarity index 100% rename from tests/cas/test_cas_multi_branch_merge.sh rename to tests/system/test_cas_multi_branch_merge.sh diff --git a/tests/cas/test_cas_ptrace.sh b/tests/system/test_cas_ptrace.sh similarity index 100% rename from tests/cas/test_cas_ptrace.sh rename to tests/system/test_cas_ptrace.sh diff --git a/tests/cas/test_cas_smoke.sh b/tests/system/test_cas_smoke.sh similarity index 100% rename from tests/cas/test_cas_smoke.sh rename to tests/system/test_cas_smoke.sh diff --git a/tests/cas/test_cas_telemetry.sh b/tests/system/test_cas_telemetry.sh similarity index 100% rename from tests/cas/test_cas_telemetry.sh rename to tests/system/test_cas_telemetry.sh diff --git a/tests/cas/test_cas_telemetry_ramp.sh b/tests/system/test_cas_telemetry_ramp.sh similarity index 99% rename from tests/cas/test_cas_telemetry_ramp.sh rename to tests/system/test_cas_telemetry_ramp.sh index e43fc2f..4b7ecd2 100755 --- a/tests/cas/test_cas_telemetry_ramp.sh +++ b/tests/system/test_cas_telemetry_ramp.sh @@ -1,5 +1,5 @@ #!/bin/bash -# tests/cas/test_cas_telemetry_ramp.sh — cumulative multi-backend telemetry ramp. +# tests/system/test_cas_telemetry_ramp.sh — cumulative multi-backend telemetry ramp. # # For each K in 1..7, spawn agentvfs with the first K backends from the canonical # order (sources before processors), run 5 checkpoints + reverse rollback, verify @@ -12,8 +12,8 @@ # pipeline-failure protection while letting `pass`/`fail` count outcomes freely. set -uo pipefail -BIN="${BIN:-$(pwd)/build-all/agentvfs}" -PRELOAD_LIB="${PRELOAD_LIB:-$(pwd)/build-all/libcas_preload.so}" +BIN="${BIN:-$(pwd)/build/agentvfs}" +PRELOAD_LIB="${PRELOAD_LIB:-$(pwd)/build/libcas_preload.so}" ROOT="${ROOT:-/tmp/agentvfs-ramp}" RAMP_LIMIT="${RAMP_LIMIT:-7}" # stop after iteration N (dev/CI smoke) RAMP_NEGATIVE="${RAMP_NEGATIVE:-0}" diff --git a/tests/cas/test_cas_wasm.sh b/tests/system/test_cas_wasm_actually_skipped.sh similarity index 95% rename from tests/cas/test_cas_wasm.sh rename to tests/system/test_cas_wasm_actually_skipped.sh index 1f61849..507e395 100755 --- a/tests/cas/test_cas_wasm.sh +++ b/tests/system/test_cas_wasm_actually_skipped.sh @@ -2,7 +2,7 @@ set -euo pipefail BIN="${BIN:-$(pwd)/build/agentvfs}" -FIXTURE="$(pwd)/tests/cas/fixtures/test_filter.wat" +FIXTURE="$(pwd)/tests/fixtures/test_filter.wat" if [[ ! -x "$BIN" ]]; then echo "SKIP test_cas_wasm: $BIN is not built" diff --git a/tests/cas/test_macos_e2e.sh b/tests/system/test_macos_e2e.sh similarity index 100% rename from tests/cas/test_macos_e2e.sh rename to tests/system/test_macos_e2e.sh diff --git a/tests/cas/test_quickstart_demo_smoke.sh b/tests/system/test_quickstart_demo_smoke.sh similarity index 98% rename from tests/cas/test_quickstart_demo_smoke.sh rename to tests/system/test_quickstart_demo_smoke.sh index 9798bc9..ce0e5a3 100755 --- a/tests/cas/test_quickstart_demo_smoke.sh +++ b/tests/system/test_quickstart_demo_smoke.sh @@ -10,6 +10,7 @@ set -euo pipefail REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)" SCRIPT="$REPO_ROOT/demo/agentvfs-quickstart.sh" +export PATH="$REPO_ROOT/build:$PATH" if [[ ! -x "$SCRIPT" ]]; then echo "FAIL: $SCRIPT not found or not executable" >&2 diff --git a/tests/cas/test_start_sh.sh b/tests/system/test_start_sh.sh similarity index 99% rename from tests/cas/test_start_sh.sh rename to tests/system/test_start_sh.sh index 422bd9f..fe8d136 100755 --- a/tests/cas/test_start_sh.sh +++ b/tests/system/test_start_sh.sh @@ -8,6 +8,7 @@ BIN="${BIN:-$REPO/build/agentvfs}" WORK="$(mktemp -d)" export HOME="$WORK/home" export XDG_RUNTIME_DIR="$WORK/xdg" +export PATH="$REPO/build:$PATH" mkdir -p "$HOME" "$XDG_RUNTIME_DIR" cleanup() { diff --git a/tests/cas/test_agentvfs_workspace.sh b/tests/system/test_workspace_cli.sh similarity index 100% rename from tests/cas/test_agentvfs_workspace.sh rename to tests/system/test_workspace_cli.sh diff --git a/tests/cas/workspace_test.sh b/tests/system/test_workspace_multi_branch.sh similarity index 96% rename from tests/cas/workspace_test.sh rename to tests/system/test_workspace_multi_branch.sh index 2af805d..355c055 100755 --- a/tests/cas/workspace_test.sh +++ b/tests/system/test_workspace_multi_branch.sh @@ -1,6 +1,6 @@ #!/bin/bash # 5 branches x 5 checkpoints + rollback + merge through `agentvfs workspace`. -# Run: sudo bash workspace_test.sh +# Run: bash tests/system/test_workspace_multi_branch.sh set -euo pipefail BIN_DIR="${BIN_DIR:-$(pwd)/build}" @@ -10,7 +10,10 @@ ROOT="${ROOT:-/tmp/agentvfs-ws-test}" NAME="cas-test" CG_BASE="/sys/fs/cgroup/agentvfs-ws-test-$$" -[[ $EUID -eq 0 ]] || { echo "re-run with sudo: sudo bash $0"; exit 1; } +if [[ $EUID -ne 0 ]]; then + echo "SKIP test_workspace_multi_branch: needs root for cgroup creation" + exit 0 +fi [[ -x "$AGENTVFS" ]] || { echo "missing $AGENTVFS — build first: cmake -B build && cmake --build build -j"; exit 1; } [[ -x "$CTL" ]] || { echo "missing $CTL"; exit 1; } diff --git a/tests/cas/windows/test_winfsp_e2e.ps1 b/tests/system/windows/test_winfsp_e2e.ps1 similarity index 100% rename from tests/cas/windows/test_winfsp_e2e.ps1 rename to tests/system/windows/test_winfsp_e2e.ps1 diff --git a/tests/cas/test_blake3_simd.cpp b/tests/unit/test_blake3_simd.cpp similarity index 100% rename from tests/cas/test_blake3_simd.cpp rename to tests/unit/test_blake3_simd.cpp diff --git a/tests/cas/test_bpftime_backend.cpp b/tests/unit/test_bpftime_backend.cpp similarity index 100% rename from tests/cas/test_bpftime_backend.cpp rename to tests/unit/test_bpftime_backend.cpp diff --git a/tests/cas/test_branch_context.cpp b/tests/unit/test_branch_context.cpp similarity index 100% rename from tests/cas/test_branch_context.cpp rename to tests/unit/test_branch_context.cpp diff --git a/tests/cas/test_branch_merge.cpp b/tests/unit/test_branch_merge.cpp similarity index 100% rename from tests/cas/test_branch_merge.cpp rename to tests/unit/test_branch_merge.cpp diff --git a/tests/cas/test_branch_merge_commit.cpp b/tests/unit/test_branch_merge_commit.cpp similarity index 100% rename from tests/cas/test_branch_merge_commit.cpp rename to tests/unit/test_branch_merge_commit.cpp diff --git a/tests/cas/test_branch_merge_daemon.cpp b/tests/unit/test_branch_merge_daemon.cpp similarity index 100% rename from tests/cas/test_branch_merge_daemon.cpp rename to tests/unit/test_branch_merge_daemon.cpp diff --git a/tests/cas/test_branch_persistence.cpp b/tests/unit/test_branch_persistence.cpp similarity index 100% rename from tests/cas/test_branch_persistence.cpp rename to tests/unit/test_branch_persistence.cpp diff --git a/tests/cas/test_ebpf_backend.cpp b/tests/unit/test_ebpf_backend.cpp similarity index 100% rename from tests/cas/test_ebpf_backend.cpp rename to tests/unit/test_ebpf_backend.cpp diff --git a/tests/cas/test_fanotify_backend.cpp b/tests/unit/test_fanotify_backend.cpp similarity index 100% rename from tests/cas/test_fanotify_backend.cpp rename to tests/unit/test_fanotify_backend.cpp diff --git a/tests/cas/test_fuse_t_preflight.cpp b/tests/unit/test_fuse_t_preflight.cpp similarity index 100% rename from tests/cas/test_fuse_t_preflight.cpp rename to tests/unit/test_fuse_t_preflight.cpp diff --git a/tests/cas/test_ldpreload_backend.cpp b/tests/unit/test_ldpreload_backend.cpp similarity index 100% rename from tests/cas/test_ldpreload_backend.cpp rename to tests/unit/test_ldpreload_backend.cpp diff --git a/tests/cas/test_ldpreload_preload.cpp b/tests/unit/test_ldpreload_preload.cpp similarity index 100% rename from tests/cas/test_ldpreload_preload.cpp rename to tests/unit/test_ldpreload_preload.cpp diff --git a/tests/cas/test_lua_backend.cpp b/tests/unit/test_lua_backend.cpp similarity index 98% rename from tests/cas/test_lua_backend.cpp rename to tests/unit/test_lua_backend.cpp index bd6eef6..e64687e 100644 --- a/tests/cas/test_lua_backend.cpp +++ b/tests/unit/test_lua_backend.cpp @@ -82,7 +82,7 @@ static void test_start_with_script_fails_without_runtime_callbacks() { cas::BackendConfig cfg{}; bool callback_called = false; - cfg.params["script_path"] = "tests/cas/fixtures/test_policy.lua"; + cfg.params["script_path"] = "tests/fixtures/test_policy.lua"; CHECK(!backend.start(cfg, [&](cas::TelemetryEvent) { callback_called = true; })); diff --git a/tests/cas/test_named_pipe_channel.cpp b/tests/unit/test_named_pipe_channel.cpp similarity index 100% rename from tests/cas/test_named_pipe_channel.cpp rename to tests/unit/test_named_pipe_channel.cpp diff --git a/tests/cas/test_object_store.cpp b/tests/unit/test_object_store.cpp similarity index 100% rename from tests/cas/test_object_store.cpp rename to tests/unit/test_object_store.cpp diff --git a/tests/cas/test_ptrace_backend.cpp b/tests/unit/test_ptrace_backend.cpp similarity index 100% rename from tests/cas/test_ptrace_backend.cpp rename to tests/unit/test_ptrace_backend.cpp diff --git a/tests/cas/test_telemetry_event.cpp b/tests/unit/test_telemetry_event.cpp similarity index 100% rename from tests/cas/test_telemetry_event.cpp rename to tests/unit/test_telemetry_event.cpp diff --git a/tests/cas/test_telemetry_registry.cpp b/tests/unit/test_telemetry_registry.cpp similarity index 100% rename from tests/cas/test_telemetry_registry.cpp rename to tests/unit/test_telemetry_registry.cpp diff --git a/tests/cas/test_wasm_backend.cpp b/tests/unit/test_wasm_backend.cpp similarity index 100% rename from tests/cas/test_wasm_backend.cpp rename to tests/unit/test_wasm_backend.cpp diff --git a/tests/cas/test_win_helpers.cpp b/tests/unit/test_win_helpers.cpp similarity index 100% rename from tests/cas/test_win_helpers.cpp rename to tests/unit/test_win_helpers.cpp diff --git a/tests/cas/test_working_tree.cpp b/tests/unit/test_working_tree.cpp similarity index 100% rename from tests/cas/test_working_tree.cpp rename to tests/unit/test_working_tree.cpp diff --git a/tests/cas/test_workspace_cli.cpp b/tests/unit/test_workspace_cli.cpp similarity index 100% rename from tests/cas/test_workspace_cli.cpp rename to tests/unit/test_workspace_cli.cpp diff --git a/tests/cas/test_write_buffer.cpp b/tests/unit/test_write_buffer.cpp similarity index 100% rename from tests/cas/test_write_buffer.cpp rename to tests/unit/test_write_buffer.cpp