view tests/test-utils.sh @ 404:1fb8bee777e5 api-inversion

Begin working towards inverting audioDB::insert() / audiodb_insert(). New data type audiodb_datum_t, roughly corresponding to a "track" in current audioDB parlance; it contains exactly the feature information and metadata to record. New function audiodb_insert_datum() to insert one of these audiodb_datum_t objects into the database; the intention is that not only can insertion of feature files be implemented in terms of this function, but that it will be a useful function in its own right, callable perhaps from PD, Max/MSP, and/or a VAMP plugin. This function is complicated enough that it actually gets a comment. Implement audioDB::insert() in terms of audiodb_insert_datum(), via a wrapper which handles the slightly wacky error/non-error case of attempting to insert features with a key that already exists in the database. Delete whole rafts of code. We can't quite delete everything because there's batchinsert / batchinsert_large_adb to sort out; the good news is that the batchinsert operation can simply be implemented as a loop around audiodb_insert_datum() without loss of efficiency. (There's also a stray extra audiodb_insert() in libtests/0027/, found through an earlier iteration of this patch.)
author mas01cr
date Fri, 05 Dec 2008 22:32:43 +0000
parents e21cc48ddf4d
children d5ada9532a40
line wrap: on
line source
# no shebang line: this file should be sourced by run-test.sh files

set -E

trap "exit 1" ERR

if [ -z "${AUDIODB}" ]; then
  AUDIODB=../../audioDB
fi

# FIXME: maybe generalize to multiple arguments?  Also, implement it
# properly, rather than just for a few floats that we know how to
# encode.  This might involve writing some C code, as Bash doesn't do
# Floating Point.  (scanf() is probably enough).

expect_clean_error_exit() {
  trap - ERR
  "$@"
  exit_code=$?
  trap "exit 1" ERR
  if [ $exit_code -eq 0 ]; then
    exit 1
  elif [ $exit_code -ge 126 ]; then
    exit 1
  fi
}

floatstring() {
  for arg in "$@"; do
    case ${arg} in
      0)
        printf "\x00\x00\x00\x00\x00\x00\x00\x00";;
      -0.5)
        printf "\x00\x00\x00\x00\x00\x00\xe0\xbf";;
      0.5)
        printf "\x00\x00\x00\x00\x00\x00\xe0\x3f";;
      -1)
        printf "\x00\x00\x00\x00\x00\x00\xf0\xbf";;
      1)
        printf "\x00\x00\x00\x00\x00\x00\xf0\x3f";;
      *)
        echo "bad arg to floatstring(): ${arg}"
        exit 1;;
    esac
  done
}

# FIXME: likewise.  And endianness issues (which are a reflection of
# the endianness of audioDB as of 2007-09-18, unfortunately).

intstring() {
  # works up to 9 for now
  if [ $1 -ge 10 ]; then echo "intstring() arg too large: ${1}"; exit 1; fi
  printf "%b\x00\x00\x00" "\\x${1}"
}

# Web services utilities
start_server() {
  $1 -s $2 &
  # HACK: deal with race on process creation
  sleep 1
  trap 'kill $!; exit 1' ERR
}

stop_server() {
  grep "${AUDIODB}" /proc/$1/cmdline > /dev/null
  kill $1
  # HACK: deal with race on process exit
  sleep 1
  expect_clean_error_exit grep ${AUDIODB} /proc/$1/cmdline
}

check_server() {
  grep "${AUDIODB}" /proc/$1/cmdline > /dev/null
}

expect_client_failure() {
  # FIXME: work out whether and how the client should report server
  # errors.  At present, the client exits with a zero exit code.
  "$@"
}