#! /bin/sh

# some unit tests for the craft UI

# save stdout to 3, dup stdout to a file
log=.testlog.$$
ln -sf LOG $log
exec 3>&1
exec >$log 2>&1

failcount=0
passcount=0

fail() {
  echo "FAIL: $*" >&3
  echo "FAIL: $*"
  ((failcount++))
}

pass() {
  echo "PASS: $*" >&3
  echo "PASS: $*"
  ((passcount++))
}

testname() {
  test="$*"
  echo ""
  echo "---------------------------------------------------------"
  echo "starting test '$test'"
}

check_success() {
  status=$?
  echo "check_success: last return code was $status, wanted 0"
  if [ $status = 0 ]; then
    pass $test
  else
    fail $test
  fi
}

check_failure() {
  status=$?
  echo "check_failure: last return code was $status, wanted not-0"
  if [ $status != 0 ]; then
    pass $test
  else
    fail $test
  fi
}

onexit() {
  testname "process not running at exit"
  kill -0 $pid
  check_failure

  testname "end of script reached"
  test "$eos" = 1
  check_success

  exec 1>&3
  echo "SUMMARY: pass=$passcount fail=$failcount"
  if [ $failcount -eq 0 ]; then
    echo "SUCCESS: $passcount tests passed."
  else
    echo "FAILURE: $failcount tests failed."
    echo "details follow:"
    cat $log
  fi
  rm -f $log

  exit $failcount
}

run_tests() {
  local use_https http https url curl n arg secure_arg curl_arg
  use_https=$1

  http=8888
  https=8889
  url=http://localhost:$http

  if [ "$use_https" = 1 ]; then
    url=https://localhost:$https
    secure_arg=-S
    curl_arg=-k

    # not really testing here, just showing the mode change
    testname "INFO: https mode"
    true
    check_success
  else
    # not really testing here, just showing the mode change
    testname "INFO: http mode"
    true
    check_success
  fi

  testname "server not running"
  curl -s http://localhost:8888/
  check_failure

  ./craftui $secure_arg &
  pid=$!

  testname "process running"
  kill -0 $pid
  check_success

  sleep 1

  curl="curl -v -s -m 1 $curl_arg"

  if [ "$use_https" = 1 ]; then
    for n in localhost 127.0.0.1; do
      testname "redirect web page ($n)"
      $curl "http://$n:8888/anything" |& grep "Location: https://$n:8889/"
      check_success
    done
  fi

  testname "404 not found"
  $curl $url/notexist |& grep '404: Not Found'
  check_success

  baduser_auth="--digest --user root:admin"
  badpass_auth="--digest --user guest:admin"

  for auth in "" "$baduser_auth" "$badpass_auth"; do
    for n in / /config /content.json; do
      testname "page $n bad auth ($auth)"
      $curl -v $auth $url/ |& grep 'WWW-Authenticate: Digest'
      check_success
    done
  done

  admin_auth="--digest --user admin:admin"
  guest_auth="--digest --user guest:guest"

  for auth in "$admin_auth" "$guest_auth"; do
    testname "main web page ($auth)"
    $curl $auth $url/ |& grep index.thtml
    check_success

    testname "config web page ($auth)"
    $curl $auth $url/config |& grep config.thtml
    check_success

    testname "json ($auth)"
    $curl $auth $url/content.json |& grep '"platform": "GFCH100"'
    check_success
  done

  testname "bad json to config page"
  $curl $admin_auth -d 'duck' $url/content.json | grep "json format error"
  check_success

  testname "good json config"
  d='{"config":[{"peer_ipaddr":"192.168.99.99/24"}]}'
  $curl $admin_auth -d $d $url/content.json |& grep '"error": 0}'
  check_success

  testname "good json config, bad value"
  d='{"config":[{"peer_ipaddr":"192.168.99.99/240"}]}'
  $curl $admin_auth -d $d $url/content.json |& grep '"error": 1}'
  check_success

  testname "good json config, guest access"
  d='{"config":[{"peer_ipaddr":"192.168.99.99/24"}]}'
  $curl $guest_auth -d $d $url/content.json |& grep '401 Unauthorized'
  check_success

  testname "good json config, no auth"
  d='{"config":[{"peer_ipaddr":"192.168.99.99/24"}]}'
  $curl -d $d $url/content.json |& grep '401 Unauthorized'
  check_success

  testname "password is base64"
  d='{"config":[{"password_guest":"ZHVja3k="}]}'	# ducky
  $curl $admin_auth -d $d $url/content.json |& grep '"error": 0}'
  check_success

  # TODO(edjames): duckduck does not fail.  Need to catch that.
  testname "password not base64"
  d='{"config":[{"password_guest":"abc123XXX"}]}'
  $curl $admin_auth -d $d $url/content.json |& grep '"error": 1}'
  check_success

  testname "process still running at end of test sequence"
  kill -0 $pid
  check_success

  # cleanup
  t0=$(date +%s)
  kill $pid
  wait
  t1=$(date +%s)
  dt=$((t1 - t0))

  testname "process stopped on TERM reasonably fast"
  echo "process stopped in $dt seconds"
  test "$dt" -lt 3
  check_success
}

#
# main()
#
trap onexit 0 1 2 3

# sanity tests
testname true
true
check_success

testname false
false
check_failure

# run without https
run_tests 0

# run with https
run_tests 1

# If there's a syntax error in this script, trap 0 will call onexit,
# so indicate we really hit the end of the script.
eos=1
# end of script, add more tests before this section
