#!/bin/sh

#
# 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.
#

if [ "x" = "x$1" ]; then
  printf "run-test.sh needs an argument, the name of the test to run. Try 'ThriftTest' or 'ProtoDebugTest'\n"
  exit 2
fi

# Check some basics
if [ -z $BASE ]; then
    BASE=../..
fi

if [ -z $THRIFT_BIN ]; then
    THRIFT_BIN=$BASE/compiler/cpp/thrift 
fi

if [ ! -x "$THRIFT_BIN" ]; then
    printf "Could not find thrift binary; pass it as environment variable THRIFT_BIN\n"
    exit 1
fi

# Figure out what file to generate bindings from
if [ -z $THRIFT_FILE ]; then
    THRIFT_FILE=$BASE/test/$1.thrift
fi

if [ ! -e $THRIFT_FILE ]; then
    printf "Missing thrift file $THRIFT_FILE \n"
    exit 2
fi

if [ ! -e "$THRIFT_FILE" ]; then
    printf "Could not find thrift file to run; pass it as environment variable THRIFT_FILE\n"
    exit 1
fi

# Figure out what file to run has a server
if [ -z $TEST_SOURCE_FILE ]; then
    TEST_SOURCE_FILE=$BASE/test/hs/$1_Main.hs
fi

if [ ! -e $TEST_SOURCE_FILE ]; then
    printf "Missing server code file $TEST_SOURCE_FILE \n"
    exit 3
fi

# Actually run the server bits
printf "Generating bindings... \n"
$THRIFT_BIN --gen hs $THRIFT_FILE

printf "Running test... \n"
runhaskell -Wall -Werror -i$BASE/lib/hs/src -igen-hs $TEST_SOURCE_FILE
