setup() {
  IMAGE_NAME="$NAME:$VERSION"
}

# function relative to the current container / image
build_image() {
  #disable outputs
  docker build -t $IMAGE_NAME $BATS_TEST_DIRNAME/../image &> /dev/null
}

run_image() {
  CONTAINER_ID=$(docker run $@ -d $IMAGE_NAME --copy-service -c "/container/service/slapd/test.sh" $EXTRA_DOCKER_RUN_FLAGS)
  CONTAINER_IP=$(get_container_ip_by_cid $CONTAINER_ID)
}

start_container() {
  start_containers_by_cid $CONTAINER_ID
}

stop_container() {
  stop_containers_by_cid $CONTAINER_ID
}

remove_container() {
  remove_containers_by_cid $CONTAINER_ID
}

clear_container() {
  stop_containers_by_cid $CONTAINER_ID
  remove_containers_by_cid $CONTAINER_ID
}

wait_process() {
  wait_process_by_cid $CONTAINER_ID $@
}

check_container() {
  # "Status" = "exited", and "ExitCode" != 0,
  local CSTAT=$(docker inspect -f "{{ .State.Status }} {{ .State.ExitCode }}" $CONTAINER_ID)
  echo "$CSTAT"
}

# generic functions
get_container_ip_by_cid() {
  local IP=$(docker inspect -f "{{ .NetworkSettings.IPAddress }}" $1)
  echo "$IP"
}

start_containers_by_cid() {
  for cid in "$@"
  do
    #disable outputs
    docker start $cid &> /dev/null
  done
}

stop_containers_by_cid() {
  for cid in "$@"
  do
    #disable outputs
    docker stop $cid &> /dev/null
  done
}

remove_containers_by_cid() {
  for cid in "$@"
  do
    #disable outputs
    docker rm $cid &> /dev/null
  done
}

clear_containers_by_cid() {
  stop_containers_by_cid $@
  remove_containers_by_cid $@
}

wait_process_by_cid() {
  cid=$1
  docker exec $cid /container/tool/wait-process ${@:2}
}
