image: "flowdalic/debian-testing-dev:1.17"

before_script:
  - ulimit -a
  - nproc
  - |
    readarray TOOLS <<EOF
    c++
    cc
    clang
    clang++
    clang-tidy
    doxygen
    g++
    gcc
    include-what-you-use
    meson
    nasm
    valgrind
    EOF
    for tool in ${TOOLS[@]}; do
      echo -n "$tool version: "
      $tool --version
    done

cache:
  paths:
    - subprojects/packagecache

variables:
  BUILDDTYPE: debugoptimized
  CC: gcc
  CXX: g++
  EXTRA_NINJA_ARGS: -v

stages:
  - smoke-test
  - test

.meson-test:
  artifacts:
    paths:
      - build-*/meson-logs
    when: on_failure
    reports:
      junit: build-*/meson-logs/testlog.junit.xml

smoke-test-suite:
  extends:
    - .meson-test
  stage: smoke-test
  script: make smoke-test-suite

fast-static-analysis:
   stage: smoke-test
   script: make fast-static-analysis
   variables:
       EMPER_IO: "true"

iwyu:
   stage: smoke-test
   script: IWYU_TOOL="${CI_PROJECT_DIR}/tools/iwyu_tool.py" make iwyu
   variables:
       EMPER_IO: "true"

clang-tidy:
   stage: smoke-test
   script: make tidy
   variables:
       EMPER_IO: "true"

.test:
  extends:
    - .meson-test
  stage: test
  script:
    - make test

.gcc:
  variables:
    CC: gcc
    CXX: g++

.clang:
  variables:
    CC: clang
    CXX: clang++

.emper-ws-scheduling:
  variables:
    EMPER_DEFAULT_SCHEDULING_STRATEGY: "work_stealing"

.emper-laws-scheduling:
  variables:
    EMPER_DEFAULT_SCHEDULING_STRATEGY: "locality_aware_work_stealing"

.emper-worker-no-sleep:
  variables:
    EMPER_WORKER_SLEEP: 'false'

.emper-stats:
  variables:
    EMPER_STATS: 'true'

.emper-userspace-rcu:
  variables:
    EMPER_USERSPACE_RCU: 'true'

.emper-pipe-sleep-strategy:
  variables:
    EMPER_WORKER_SLEEP_STRATEGY: 'pipe'

.emper-no-completer:
  variables:
    EMPER_IO_COMPLETER_BEHAVIOR: 'none'

.emper-single-uring:
  variables:
    EMPER_IO_SINGLE_URING: 'true'

.emper-io-stealing:
  variables:
    EMPER_IO_STEALING: 'true'

.emper-lockless-cq:
  variables:
    EMPER_IO_LOCKLESS_CQ: 'true'

.default-library-static:
  variables:
    EMPER_DEFAULT_LIBRARY: 'static'

.clang-sanitizer:
  extends:
    - .clang
    - .default-library-static
  variables:
    # Clang's sanitizers require undefined symbols to be allowed when
    # linking. See also:
    # - https://github.com/mesonbuild/meson/issues/764
    # - https://mesonbuild.com/Builtin-options.html
    EMPER_B_LUNDEF: 'false'


.clang-sanitizer-undefined:
  extends:
    - .clang-sanitizer
  variables:
    EMPER_B_SANITIZE: 'undefined'

#.clang-sanitizer-memory:
#  extends:
#    - .clang-sanitizer
#  variables:
#    EMPER_B_SANITIZE: 'memory'

#.sanitizer-address:
#  extends:
#    - .default-library-static
#  variables:
#    EMPER_B_SANITIZE: 'address'

.release-build:
  variables:
    BUILDTYPE: release

.debug-build:
  variables:
    BUILDTYPE: debug

.worker-wakeup-strategy-all:
  variables:
    EMPER_WORKER_WAKEUP_STRATEGY: "all"

.emper-worker-wakeup-strategy-throttle:
  variables:
    EMPER_WORKER_WAKEUP_STRATEGY: "throttle"

.do-not-log-timestamp:
  variables:
    EMPER_LOG_TIMESTAMP: "none"

.locked-ws-queues:
  variables:
    EMPER_LOCKED_WS_QUEUE: "true"

.futex-wakeup-semaphore:
  variables:
    EMPER_WAKEUP_SEMAPHORE_IMPLEMENTATION: "futex"

.locked-wakeup-semaphore:
  variables:
    EMPER_WAKEUP_SEMAPHORE_IMPLEMENTATION: "locked"

.set-affinity-on-block:
  variables:
    EMPER_SET_AFFINITY_ON_BLOCK: 'true'

test-gcc:
  extends:
    - .test
    - .gcc

test-gcc-release:
  extends:
    - test-gcc
    - .release-build

test-gcc-debug:
  extends:
    - test-gcc
    - .debug-build

test-clang:
  extends:
    - .test
    - .clang

test-clang-release:
  extends:
    - test-clang
    - .release-build

test-clang-debug:
  extends:
    - test-clang
    - .debug-build

test-worker-no-sleep:
  extends:
    - .test
    - .emper-worker-no-sleep

test-with-stats:
  extends:
    - .test
    - .emper-stats

test-with-userspace-rcu:
  extends:
    - .test
    - .emper-userspace-rcu

test-clang-sanitizer-undefined:
  extends:
    - .test
    - .clang-sanitizer-undefined

#test-clang-sanitizer-memory:
#  extends:
#    - .test
#    - .clang-sanitizer-memory

#test-clang-sanitizer-address:
#  extends:
#    - .test
#    - .clang
#    - .sanitizer-address

test-laws:
  extends:
    - .test
    - .emper-laws-scheduling

test-laws-release:
  extends:
    - test-laws
    - .release-build

test-worker-wakeup-strategy-all:
  extends:
    - .test
    - .worker-wakeup-strategy-all

test-worker-wakeup-strategy-throttle:
 extends:
   - .test
   - .emper-worker-wakeup-strategy-throttle

test-do-not-log-timestamp:
  extends:
    - .test
    - .do-not-log-timestamp

test-locked-ws-queues:
  extends:
    - .test
    - .locked-ws-queues

test-futex-wakeup-semaphore:
  extends:
    - .test
    - .futex-wakeup-semaphore

test-locked-wakeup-semaphore:
  extends:
    - .test
    - .locked-wakeup-semaphore

test-set-affinity-on-block:
  extends:
    - .test
    - .set-affinity-on-block

test-mmapped-log:
  extends:
    - .meson-test
  script: make && EMPER_LOG_FILE=emper.log make test

test-single-uring:
  extends:
    - .test
    - .emper-single-uring

test-pipe-sleep-strategy:
  extends:
    - .test
    - .emper-pipe-sleep-strategy

test-pipe-sleep-strategy-no-completer:
  extends:
    - .test
    - .emper-pipe-sleep-strategy
    - .emper-no-completer

test-lockless-cq:
  extends:
    - .test
    - .emper-lockless-cq

test-io-stealing:
  extends:
    - .test
    - .emper-io-stealing

test-lockless-io-stealing:
  extends:
    - .test
    - .emper-io-stealing
    - .emper-lockless-cq

test-io-stealing-pipe-no-completer:
  extends:
    - .test
    - .emper-pipe-sleep-strategy
    - .emper-no-completer
    - .emper-io-stealing

test-io-stealing-pipe-no-completer-lockless:
  extends:
    - .test
    - .emper-pipe-sleep-strategy
    - .emper-no-completer
    - .emper-io-stealing
    - .emper-lockless-cq