#!/bin/bash

exec 2>&1
set -eE

banner() {
  echo
  echo "$@"
  echo "$@" | sed -e 's/./-/g'
  echo
}

cleanup() {
  rm  -f /usr/lib/elixir/{CHANGELOG.md,VERSION}
  rm  -f /usr/lib/elixir/lib/iex/mix.exs
  rm -rf /usr/lib/elixir/lib/elixir/src
  rm -rf /usr/lib/elixir/lib/elixir/scripts

  for lib in $(ls -1A lib); do
    rm -rf "/usr/lib/elixir/lib/${lib}/lib" \
           "/usr/lib/elixir/lib/${lib}/test" \
           "/usr/lib/elixir/lib/${lib}/tmp"
  done

  chown -R root:root /usr/lib/elixir/lib

  epmd -kill || true
}

export HOME=/usr/lib/elixir/lib/elixir

# Calls the cleanup function on the following signals: SIGHUP, SIGINT, SIGQUIT
# and SIGABRT.
trap "cleanup && exit 130" 2
trap "cleanup" 1 3 6 ERR

epmd -daemon

failed=0

# The Elixir tests are very sensitive to the place they are located relatively
# to the elixir executable via which they are invoked. Moreover, the tests
# depend on some files which are parts of the source tree.

cp {CHANGELOG.md,VERSION} /usr/lib/elixir

cp lib/iex/mix.exs /usr/lib/elixir/lib/iex

cp -r lib/elixir/src /usr/lib/elixir/lib/elixir

cp -r lib/elixir/scripts /usr/lib/elixir/lib/elixir

mkdir -p /usr/lib/elixir/lib/mix/test/fixtures
cp /usr/bin/rebar3 /usr/lib/elixir/lib/mix/test/fixtures/rebar3

for lib in $(ls -1A lib); do
  cp -r "lib/${lib}/lib" "lib/${lib}/test" "/usr/lib/elixir/lib/${lib}"
done

chown -R $AUTOPKGTEST_NORMAL_USER /usr/lib/elixir/lib

(
  banner stdlib
  su - $AUTOPKGTEST_NORMAL_USER -c \
      'cd /usr/lib/elixir/lib/elixir && elixir -r "test/elixir/test_helper.exs" -pr "test/elixir/**/*_test.exs"'
) || failed=1

for lib in $(ls -1A lib | grep -v elixir); do
  (
    banner $lib
    set -x
    su - $AUTOPKGTEST_NORMAL_USER -c \
        "cd /usr/lib/elixir/lib/${lib} && elixir -r test/test_helper.exs -pr 'test/**/*_test.exs'"
  ) || failed=1
done

cleanup

exit $failed

