#
# Nightly-only jobs
#
# This file is conditionally included in the main
# .gitlab-ci.yml only when doing nightly builds
# so the builds here do not explicitly need to be
# made nightly-only using rules.
#

default:
  timeout: 8 hours

# Simple x86_64 Linux build
Linux Nightly Build:
  stage: build
  interruptible: true
  variables:
    CMAKE_FLAGS: >-
      -DCMAKE_BUILD_TYPE=RelWithDebInfo
      -DAOM_EXTRA_C_FLAGS="--coverage"
      -DAOM_EXTRA_CXX_FLAGS="--coverage"
      -DAOM_EXTRA_EXE_LINKER_FLAGS="--coverage"
  script:
    - 'echo "CMake Flags: $CMAKE_FLAGS"'
    - cmake -B "aom_nightly_build" -GNinja $CMAKE_FLAGS
    - cmake --build "aom_nightly_build" --target test_libaom
  needs: []
  artifacts:
    expire_in: 1 day
    paths:
      - 'aom_nightly_build/test_libaom'
      - 'aom_nightly_build/**/*.gcno'
      - 'aom_nightly_build/**/*.[hc]'

# Full unit tests run (with coverage report)
Linux All Unit Test:
  stage: test
  interruptible: true
  parallel: 24
  variables:
    LIBAOM_TEST_DATA_PATH: ${CI_PROJECT_DIR}/libaom-test-data
    GTEST_TOTAL_SHARDS: ${CI_NODE_TOTAL}
    GTEST_OUTPUT: "xml:report.xml"
  before_script:
    - export GTEST_SHARD_INDEX=$((CI_NODE_INDEX - 1))
  script:
    - cd aom_nightly_build
    - ./test_libaom
    - gcovr
      --exclude '../third_party/'
      --json -o "coverage_${CI_NODE_INDEX}.json"
      -r ../ .
  needs:
    - 'Test Data'
    - 'Linux Nightly Build'
  artifacts:
    when: always
    reports:
      junit: ./aom_nightly_build/report.xml
    paths:
      - aom_nightly_build/coverage_*.json

# Produce actual coverage report from the
# "Linux All Unit Test" job that ran in the
# test stage before.
Coverage Report:
  stage: report
  interruptible: true
  script:
    - mkdir -p coverage-html
    - cd aom_nightly_build
    # the find can be replace with --add-tracefile "coverage_*.json" once
    # next release of gcovr is done (current is gcovr 4.2)
    # additionally --html-self-contained could then be used.
    - >-
      gcovr
      $(find . -name 'coverage_*.json' -printf '--add-tracefile %p ')
      --exclude '../third_party/'
      --xml ../coverage.xml
      --html --html-details ../coverage-html/coverage.html
      --print-summary
      -r ../ .
  coverage: '/lines:\s(\d+.\d+\%)/'
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage.xml
    paths:
      - coverage-html


#
# Tests run with varying SIMD levels
# [sse2, sse3, ssse3, sse4_1, sse4_2, avx2]
#
# This is not done with a big matrix, because
# GitLab CI has a limitation on expanding matrices
# being limited to 50 jobs only. If that limit is
# ever raised, this should be re-written using a
# matrix!
#

# Common unit-optim template
# This is inherited by all the SIMD-level jobs
.common-linux-unit-optim:
  stage: test
  interruptible: true
  parallel: 20
  variables:
    LIBAOM_TEST_DATA_PATH: ${CI_PROJECT_DIR}/libaom-test-data
    GTEST_TOTAL_SHARDS: ${CI_NODE_TOTAL}
    GTEST_OUTPUT: "xml:report.xml"
  script:
    - cd aom_nightly_build
    - |
      case "${AOM_OPTIM_LEVEL}" in
        sse) export AOM_SIMD_CAPS_MASK=0x3 ;;
        sse2) export AOM_SIMD_CAPS_MASK=0x7 ;;
        sse3) export AOM_SIMD_CAPS_MASK=0xf ;;
        ssse3) export AOM_SIMD_CAPS_MASK=0x1f ;;
        sse4_1) export AOM_SIMD_CAPS_MASK=0x3f ;;
        # sse4_2 was added *after* avx2 so the mask is a little weird
        sse4_2) export AOM_SIMD_CAPS_MASK=0x13f ;;
        avx2) export AOM_SIMD_CAPS_MASK=0x1ff ;;
      esac

      test_filter="-C*:MMX*:SSE*:SSSE*:AVX*"

    - ./test_libaom --gtest_filter=${test_filter}
  needs:
    - 'Test Data'
    - 'Linux Nightly Build'
  artifacts:
    when: always
    reports:
      junit: ./aom_nightly_build/report.xml
  before_script:
    - export GTEST_SHARD_INDEX=$((CI_NODE_INDEX - 1))

Linux Unit (x86_64, sse2):
  extends: .common-linux-unit-optim
  variables:
    AOM_OPTIM_LEVEL: sse2

Linux Unit (x86_64, sse3):
  extends: .common-linux-unit-optim
  variables:
    AOM_OPTIM_LEVEL: sse3

Linux Unit (x86_64, ssse3):
  extends: .common-linux-unit-optim
  variables:
    AOM_OPTIM_LEVEL: ssse3

Linux Unit (x86_64, sse4_1):
  extends: .common-linux-unit-optim
  variables:
    AOM_OPTIM_LEVEL: sse4_1

Linux Unit (x86_64, sse4_2):
  extends: .common-linux-unit-optim
  variables:
    AOM_OPTIM_LEVEL: sse4_2

Linux Unit (x86_64, avx2):
  extends: .common-linux-unit-optim
  variables:
    AOM_OPTIM_LEVEL: avx2

#
# Sanitizer jobs
# The following jobs run the unit tests but
# with a built where the respective sanitizers
# are enabled.
#
# This is not using a matrix as the jobs
# depend on other jobs that were built by
# a matrix job before and a matrix can not
# depend on other matrix-jobs unfortunately.
#

# Common sanitizer unit tests template
# This is inherited by all sanitizer test jobs
.sanitizer-common-nigtly:
  stage: test
  interruptible: true
  parallel: 24
  variables:
    LIBAOM_TEST_DATA_PATH: ${CI_PROJECT_DIR}/libaom-test-data
    GTEST_TOTAL_SHARDS: ${CI_NODE_TOTAL}
    GTEST_OUTPUT: "xml:report.xml"
    SANITIZER_OPTIONS: "\
     :handle_segv=1\
     :handle_abort=1\
     :handle_sigfpe=1\
     :fast_unwind_on_fatal=1\
     :allocator_may_return_null=1"
  before_script:
    - export PATH="/usr/lib/llvm-12/bin:${PATH}"
    - export GTEST_SHARD_INDEX=$((CI_NODE_INDEX - 1))
  script:
    - |
      case $AOM_SANITIZER_TYPE in
        address)
          SANITIZER_OPTIONS="${SANITIZER_OPTIONS}:detect_stack_use_after_return=1"
          SANITIZER_OPTIONS="${SANITIZER_OPTIONS}:max_uar_stack_size_log=17"
          export ASAN_OPTIONS="${SANITIZER_OPTIONS}"
          ;;
        memory)
          export MSAN_OPTIONS="${SANITIZER_OPTIONS}"
          ;;
        thread)
          # The thread sanitizer uses a subset.
          TSAN_OPTIONS="handle_sigfpe=1"
          TSAN_OPTIONS="$TSAN_OPTIONS handle_segv=1"
          TSAN_OPTIONS="$TSAN_OPTIONS handle_abort=1"
          export TSAN_OPTIONS
          ;;
        undefined|integer)
          SANITIZER_OPTIONS="${SANITIZER_OPTIONS}:print_stacktrace=1:suppressions=.gitlab/UBSan.supp"
          export UBSAN_OPTIONS="${SANITIZER_OPTIONS}"
          ;;
      esac
    - |
      filter="*Large*"
      # As of 17 May 2018 there are no large threading tests.
      [ "${AOM_SANITIZER_TYPE}" = "thread" ] && filter="*Thread*Large*" || :
    - ./aom_build/${AOM_SANITIZER_TYPE}/test_libaom --gtest_filter="${filter}" 2> >(tee -a sanitizer.log >&2)
    - |
      # Looking for sanitizer output in log...
      grep -q "\(ERROR\|WARNING\): \(Address\|Thread\|Memory\|Leak\)Sanitizer:" sanitizer.log && {
        echo "Found sanitizer errors or warnings, check the log:"
        cat sanitizer.log
        exit 1
      }
      # Looking for UBSan output in log (differs from the common format)
      grep -q ":[[:digit:]]\+:[[:digit:]]\+: runtime error:" sanitizer.log && {
        echo "Found sanitizer errors or warnings, check the log:"
        cat sanitizer.log
        exit 1
      }
      echo "No sanitizer errors found"
  artifacts:
    expose_as: 'Nightly sanitizer logs'
    name: "sanitizer.log-$CI_JOB_ID"
    when: on_failure
    paths:
      - sanitizer.log

Linux Sanitizer (address) Test Nightly:
  extends: .sanitizer-common-nigtly
  variables:
    AOM_SANITIZER_TYPE: address
  needs:
    - 'Test Data'
    - 'Linux Sanitizers (x86_64-clang): [address]'

Linux Sanitizer (undefined) Test Nightly:
  extends: .sanitizer-common-nigtly
  variables:
    AOM_SANITIZER_TYPE: undefined
  needs:
    - 'Test Data'
    - 'Linux Sanitizers (x86_64-clang): [undefined]'

Linux Sanitizer (integer) Test Nightly:
  extends: .sanitizer-common-nigtly
  variables:
    AOM_SANITIZER_TYPE: integer
  needs:
    - 'Test Data'
    - 'Linux Sanitizers (x86_64-clang): [integer]'

Linux Sanitizer (thread) Test Nightly:
  extends: .sanitizer-common-nigtly
  variables:
    AOM_SANITIZER_TYPE: thread
  needs:
    - 'Test Data'
    - 'Linux Sanitizers (x86_64-clang): [thread]'
