#!/bin/bash

# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Determine script directory.
SCRIPT_DIR=$(dirname $(readlink -f "$0"))
ROOT_DIR="$(dirname ${SCRIPT_DIR})"
SRCDIR="${SRCDIR:-${ROOT_DIR}}"
BUILD="${BUILD:-${ROOT_DIR}/build}"
BUILD_RUN="${BUILD_RUN:-${BUILD}}"
SRC_RUN="${SRC_RUN:-${SRCDIR}}"
BUILD_DIR="${BUILD}"
BIN_DIR=${BUILD_DIR}/install_for_test/bin
FUTILITY=${BIN_DIR}/futility
TEST_DIR="${BUILD_DIR}/tests"
TESTKEY_DIR=${SCRIPT_DIR}/testkeys
TESTCASE_DIR=${SCRIPT_DIR}/testcases
TESTKEY_SCRATCH_DIR=${TEST_DIR}/testkeys

if [ ! -d ${TESTKEY_SCRATCH_DIR} ]; then
    mkdir -p ${TESTKEY_SCRATCH_DIR}
fi

# Color output encodings.
COL_RED='\E[31;1m'
COL_GREEN='\E[32;1m'
COL_YELLOW='\E[33;1m'
COL_BLUE='\E[34;1m'
COL_STOP='\E[0;m'

hash_algos=( sha1 sha256 sha512 )
key_lengths=( 1024 2048 4096 8192 2048_exp3 3072_exp3 )

function happy {
  echo -e "${COL_GREEN}$*${COL_STOP}" 1>&2
}

# args: [nested level [message]]
function warning {
  echo -e "${COL_YELLOW}WARNING: $*${COL_STOP}" 1>&2
}

# args: [nested level [message]]
function error {
  local lev=${1:-}
  case "${1:-}" in
    [0-9]*)
      lev=$1
      shift
      ;;
    *) lev=0
      ;;
  esac
  local x=$(caller $lev)
  local cline=${x%% *}
  local cfunc=${x#* }
  cfunc=${cfunc##*/}
  local args="$*"
  local spacer=${args:+: }
  echo -e "${COL_RED}ERROR at ${cfunc}, line ${cline}${spacer}${args}" \
    "${COL_STOP}" 1>&2
  exit 1
}

function check_test_keys {
  [ -d ${TESTKEY_DIR} ] || \
    error 1 "You must run gen_test_keys.sh to generate test keys first."
}

