#!/bin/bash
# This script is executed by Sandcastle
# to determine next steps to run

#
# Helper variables
#
REPORT_EMAIL="'report': [
    {
        'type':'email',
        'triggers':['fail'],
        'emails':['leveldb@fb.com']
    }
]"

CLEANUP_ENV="
{
  'name':'Cleanup environment',
  'shell':'rm -rf /dev/shm/rocksdb && mkdir /dev/shm/rocksdb && make clean',
  'user':'root'
}"

DEBUG="OPT=-g"
SHM="TEST_TMPDIR=/dev/shm/rocksdb"
GCC_481="ROCKSDB_FBCODE_BUILD_WITH_481=1"
ASAN="COMPILE_WITH_ASAN=1"
CLANG="USE_CLANG=1"
LITE="OPT=-DROCKSDB_LITE"
TSAN="COMPILE_WITH_TSAN=1"

#
# RocksDB unit test in parallel
# Currently we always have noise in our parallel runs. This job is to help
# manage the noise
#
PARALLEL_UNIT_TEST_COMMANDS="[
    {
        'name':'Rocksdb Parallel Unit Test',
        'steps': [
            $CLEANUP_ENV,
            {
                'name':'Build and test RocksDB debug version',
                'shell':'$SHM $DEBUG make check 2>&1 > /dev/null || cat t/log-*',
                'user':'root'
            },
            $CLEANUP_ENV,
            {
                'name':'Build and test RocksDB debug version under gcc-4.8.1',
                'shell':'$SHM $GCC_481 $DEBUG make check 2>&1 > /dev/null || cat t/log-*',
                'user':'root'
            },
        ],
        $REPORT_EMAIL
    }
]"

#
# RocksDB unit test
#
UNIT_TEST_COMMANDS="[
    {
        'name':'Rocksdb Unit Test',
        'steps': [
            $CLEANUP_ENV,
            {
                'name':'Build and test RocksDB debug version',
                'shell':'$SHM $DEBUG make J=1 check',
                'user':'root'
            },
        ],
        $REPORT_EMAIL
    }
]"

#
# RocksDB unit test on gcc-4.8.1
#
UNIT_TEST_COMMANDS_481="[
    {
        'name':'Rocksdb Unit Test on GCC 4.8.1',
        'steps': [
            $CLEANUP_ENV,
            {
                'name':'Build and test RocksDB debug version',
                'shell':'$SHM $GCC_481 $DEBUG make J=1 check',
                'user':'root'
            },
        ],
        $REPORT_EMAIL
    }
]"

#
# RocksDB unit test with CLANG
#
CLANG_UNIT_TEST_COMMANDS="[
    {
        'name':'Rocksdb Unit Test',
        'steps': [
            $CLEANUP_ENV,
            {
                'name':'Build and test RocksDB debug',
                'shell':'$CLANG $SHM $DEBUG make check',
                'user':'root'
            },
        ],
        $REPORT_EMAIL
    }
]"

#
# Build RocksDB lite
#
LITE_BUILD_COMMANDS="[
    {
        'name':'Rocksdb Lite build',
        'steps': [
            $CLEANUP_ENV,
            {
                'name':'Build RocksDB debug version',
                'shell':'$LITE $DEBUG make J=1 static_lib',
                'user':'root'
            },
        ],
        $REPORT_EMAIL
    }
]"

#
# RocksDB stress/crash test
#
STRESS_CRASH_TEST_COMMANDS="[
    {
        'name':'Rocksdb Stress/Crash Test',
        'steps': [
            $CLEANUP_ENV,
            {
                'name':'Build and run RocksDB debug stress tests',
                'shell':'$SHM $DEBUG make J=1 db_stress',
                'user':'root'
            },
            {
                'name':'Build and run RocksDB debug crash tests',
                'shell':'$SHM $DEBUG make J=1 crash_test',
                'user':'root'
            }
        ],
        $REPORT_EMAIL
    }
]"


#
# RocksDB test under address sanitizer
#
ASAN_TEST_COMMANDS="[
    {
        'name':'Rocksdb Unit Test under ASAN',
        'steps': [
            $CLEANUP_ENV,
            {
                'name':'Test RocksDB debug under ASAN',
                'shell':'set -o pipefail && $SHM $ASAN $DEBUG make J=1 asan_check |& /usr/facebook/ops/scripts/asan_symbolize.py -d',
                'user':'root'
            }
        ],
        $REPORT_EMAIL
    }
]"

#
# RocksDB crash testing under address sanitizer
#
ASAN_CRASH_TEST_COMMANDS="[
    {
        'name':'Rocksdb crash test under ASAN',
        'steps': [
            $CLEANUP_ENV,
            {
                'name':'Build and run RocksDB debug asan_crash_test',
                'shell':'$SHM $DEBUG make J=1 asan_crash_test',
                'user':'root'
            },
        ],
        $REPORT_EMAIL
    }
]"

#
# RocksDB unit test under valgrind
#
VALGRIND_TEST_COMMANDS="[
    {
        'name':'Rocksdb Unit Test under valgrind',
        'steps': [
            $CLEANUP_ENV,
            {
                'name':'Run RocksDB debug unit tests',
                'shell':'$SHM $DEBUG ./build_tools/valgrind_test.sh',
                'user':'root'
            },
        ],
        $REPORT_EMAIL
    }
]"

#
# RocksDB test under TSAN
#
TSAN_TEST_COMMANDS="[
    {
        'name':'Rocksdb Unit Test under TSAN',
        'steps': [
            $CLEANUP_ENV,
            {
                'name':'Run RocksDB debug unit test',
                'shell':'set -o pipefail && $SHM $DEBUG $TSAN make J=1 check',
                'user':'root'
            },
        ],
        $REPORT_EMAIL
    }
]"

case $1 in
  punit)
    echo $PARALLEL_UNIT_TEST_COMMANDS
    ;;
  unit)
    echo $UNIT_TEST_COMMANDS
    ;;
  unit_481)
    echo $UNIT_TEST_COMMANDS_481
    ;;
  clang_unit)
    echo $CLANG_UNIT_TEST_COMMANDS
    ;;
  lite)
    echo $LITE_BUILD_COMMANDS
    ;;
  stress_crash)
    echo $STRESS_CRASH_TEST_COMMANDS
    ;;
  asan)
    echo $ASAN_TEST_COMMANDS
    ;;
  asan_crash)
    echo $ASAN_CRASH_TEST_COMMANDS
    ;;
  valgrind)
    echo $VALGRIND_TEST_COMMANDS
    ;;
  tsan)
    echo $TSAN_TEST_COMMANDS
    ;;
  *)
    echo "Invalid determinator command"
    ;;
esac