#! /usr/bin/env bash

#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

#
# Basic regression test script.
#
# Verify that the source tree builds and that out of tree builds work. We don't use root for any of this because
# it should not be required (that would be a bug). Then run the automake regression tests and the traffic_server
# regression tests.
#

set -e # exit on error

TMPDIR=${TMPDIR:-/tmp}
BUILDID="org.apache.trafficserver.$$"

SRCROOT=${SRCROOT:-$(cd $(dirname $0)/.. && pwd)} # where the source lives
OBJROOT=${OBJROOT:-"$TMPDIR/$BUILDID/obj"} # where we are building
DSTROOT=${DSTROOT:-"$TMPDIR/$BUILDID/dst"} # where we are installing

export CCACHE_BASEDIR="$SRCROOT"

# Force low make parallelization so that the build can complete in a VM with
# only a small amount of memory.
NPROCS=${NPROCS:-2}

mkdir -p $SRCROOT
mkdir -p $OBJROOT
mkdir -p $DSTROOT

prog() {
  case $1 in
    cc)
      case $(uname -v) in
        Darwin*) echo clang ;;
        omnios*) echo /opt/gcc-4.6.3/bin/gcc ;;
        *) echo ccache cc ;;
      esac
      ;;
    cxx)
      case $(uname -v) in
        Darwin*) echo clang++ ;;
        omnios*) echo /opt/gcc-4.6.3/bin/g++ ;;
        *) echo ccache c++ ;;
      esac
      ;;
    make)
      case $(uname) in
        FreeBSD) echo gmake ;;
        *) echo make ;;
      esac
      ;;
  esac
}

extras() {
  case $(uname -v) in
    omnios*) echo --with-tcl=/opt/omni/lib/amd64 ;;
  esac
}

autogen() {
  [[ -e "$SRCROOT/configure" ]] || ( cd $SRCROOT && autoreconf -fi )
}

configure() {
  [[ -e "$SRCROOT/Makefile" ]] && ( cd $SRCROOT && make distclean)

  (
    cd $OBJROOT
    $SRCROOT/configure \
      --prefix=$DSTROOT \
      --enable-debug \
      --enable-wccp \
      --enable-experimental-plugins \
      $(extras) \
      CC="$CC" \
      CXX="$CXX"
  )
}

build() {
  ( cd $OBJROOT && $MAKE -j $NPROCS )
  ( cd $OBJROOT && $MAKE install )
}

regress() {
  ( cd $OBJROOT && $MAKE check ) && \
  $DSTROOT/bin/traffic_server -R 1
}

CC=${CC:-$(prog cc)}
CXX=${CXX:-$(prog cxx)}
MAKE=${MAKE:-$(prog make)}
export CC CXX MAKE

autogen
configure "$@"
build
regress
