changeset 489:4cb6c611f812 api-inversion

Begin removing uses of audiodb_query() audiodb_query() is actually an unsupportable interface. It requires access to the filesystem, does not (and cannot) actually support whole swathes of functionality, is only implementable using code that is no longer part of the core of audioDB (reporter.h), is in the way of fixing memory leaks in the SOAP server, and is horrible to use to boot. So, begin converting the libtests uses of audiodb_query() to audio_query_spec(). In the process, go through the test code and remove useless comments, pointless variables, and commented-out bits of shell scripts.
author mas01cr
date Sat, 10 Jan 2009 15:32:53 +0000
parents f4dc8e47ee37
children 13de7ba21966
files libtests/0001/prog1.c libtests/0001/short-description libtests/0002/prog1.c libtests/0002/short-description libtests/0003/prog1.c libtests/0004/prog1.c libtests/0037/prog1.c libtests/run-tests.sh libtests/test_utils_lib.h
diffstat 9 files changed, 164 insertions(+), 335 deletions(-) [+]
line wrap: on
line diff
--- a/libtests/0001/prog1.c	Sat Jan 10 15:32:49 2009 +0000
+++ b/libtests/0001/prog1.c	Sat Jan 10 15:32:53 2009 +0000
@@ -1,74 +1,34 @@
 #include "audioDB_API.h"
 #include "test_utils_lib.h"
 
+int main(int argc, char **argv) {
+  adb_t *adb;
+  struct stat st;
 
-int main(int argc, char **argv){
+  clean_remove_db(TESTDB);
 
-    int returnval=0;
-    adb_ptr mydbp={0};
-    adb_ptr mydbp2={0};
-    struct stat statbuf;
-    int statval=0;
+  adb = audiodb_open(TESTDB, O_RDWR);
+  if(adb)
+    return 1;
 
-    char * databasename="testdb";
+  adb = audiodb_create(TESTDB, 0, 0, 0);
+  if (!adb)
+    return 1;
 
-    //if [ -f testdb ]; then rm -f testdb; fi
-    /* remove old directory */
-    clean_remove_db(databasename);
+  if(stat(TESTDB, &st))
+    return 1;
 
-    /* create new db */
-    //# creation
-    //${AUDIODB} -N -d testdb
-    mydbp=audiodb_open(databasename,O_RDWR);
+  audiodb_close(adb);
 
+  adb = audiodb_create(TESTDB, 0, 0, 0);
+  if(adb)
+    return 1;
 
-    /* open should fail (return NULL), so create a new db */
-    if (!mydbp){
-        mydbp=audiodb_create(databasename,0,0,0);
-    }
+  adb = audiodb_open(TESTDB, O_RDONLY);
+  if (!adb)
+    return 1;
 
+  audiodb_close(adb);
 
-
-    if (!mydbp){
-        printf("fail\n");
-        returnval=-1;
-    }
-    
-
-    /* stat testdb - let's make sure that it is there */
-    //stat testdb
-    statval=stat(databasename, &statbuf);
-
-    if (statval){
-       returnval=-1;
-    }
-    
-    audiodb_close(mydbp);
-
-    /* try to create should fail, because db exists now */
-    mydbp2=audiodb_create(databasename,0,0,0);
-
-    if (mydbp2){
-        returnval=-1;
-    }
-
-
-/* should pass now - db exists */ 
-//expect_clean_error_exit ${AUDIODB} -N -d testdb
-    mydbp2=audiodb_open(databasename, O_RDONLY);
-    if (!mydbp2){
-       returnval=-1;
-    }
-
-//this test would fail at compile time because of the API interface
-//# should fail (no db given)
-//expect_clean_error_exit ${AUDIODB} -N
-
-
-    audiodb_close(mydbp2);
-
-//    printf("returnval:%d\n",returnval);
-
-    return(returnval);
+  return 104;
 }
-
--- a/libtests/0001/short-description	Sat Jan 10 15:32:49 2009 +0000
+++ b/libtests/0001/short-description	Sat Jan 10 15:32:53 2009 +0000
@@ -1,1 +1,1 @@
-DB creation using lib
+DB creation with library
--- a/libtests/0002/prog1.c	Sat Jan 10 15:32:49 2009 +0000
+++ b/libtests/0002/prog1.c	Sat Jan 10 15:32:53 2009 +0000
@@ -1,45 +1,22 @@
 #include "audioDB_API.h"
 #include "test_utils_lib.h"
 
+int main(int argc, char **argv) {
+  adb_t *adb;
+  adb_status_t status={0};
 
-int main(int argc, char **argv){
+  clean_remove_db(TESTDB);
 
-    int returnval=0;
-    adb_ptr mydbp={0};
-    adb_status_t mystatus={0};
+  adb = audiodb_create(TESTDB, 0, 0, 0);
 
-    char * databasename="testdb";
+  if(audiodb_status(adb, &status)){
+    return 1;
+  }
+  if(status.numFiles != 0)
+    return 1;
 
-//. ../test-utils.sh
-//
-//if [ -f testdb ]; then rm -f testdb; fi
-//
-    /* remove old directory */
-    clean_remove_db(databasename);
+  audiodb_close(adb);
 
-    /* create new db */
-//${AUDIODB} -N -d testdb
-//
-    mydbp=audiodb_create(databasename,0,0,0);
-
-
-//# FIXME: at some point we will want to test that some relevant
-//# information is being printed
-//${AUDIODB} -S -d testdb
-//${AUDIODB} -d testdb -S
-
-    if(audiodb_status(mydbp,&mystatus)){
-        returnval=-1;
-    }
-
-/* not relevent, caught by API */
-//# should fail (no db given)
-//expect_clean_error_exit ${AUDIODB} -S
-
-
-
-    audiodb_close(mydbp);
-
-    return(returnval);
+  return 104;
 }
 
--- a/libtests/0002/short-description	Sat Jan 10 15:32:49 2009 +0000
+++ b/libtests/0002/short-description	Sat Jan 10 15:32:53 2009 +0000
@@ -1,1 +1,1 @@
-DB status using lib
+DB status with library
--- a/libtests/0003/prog1.c	Sat Jan 10 15:32:49 2009 +0000
+++ b/libtests/0003/prog1.c	Sat Jan 10 15:32:53 2009 +0000
@@ -1,77 +1,39 @@
 #include "audioDB_API.h"
 #include "test_utils_lib.h"
 
-int main(int argc, char **argv){
+int main(int argc, char **argv) {
+  adb_t *adb;
 
-    int returnval=0;
-    adb_ptr mydbp={0};
-    int ivals[10]={0};
-    double dvals[10]={0.0};
-    adb_insert_t myinsert={0};
-    unsigned int myerr=0;
-    adb_query_t myadbquery={0};
-    adb_queryresult_t myadbqueryresult={0};
-    char * databasename="testdb";
-    int size=0;
+  clean_remove_db(TESTDB);
+  if(!(adb = audiodb_create(TESTDB, 0, 0, 0)))
+    return 1;
+  if(audiodb_l2norm(adb))
+    return 1;
 
+  adb_datum_t datum = {1, 1, "testfeature", (double[1]) {1}, NULL, NULL};
+  if(audiodb_insert_datum(adb, &datum))
+    return 1;
 
-    /* remove old directory */
-    //if [ -f testdb ]; then rm -f testdb; fi
-    //
-    clean_remove_db(databasename);
+  adb_query_id_t qid = {0};
+  qid.datum = &datum;
+  qid.sequence_length = 1;
+  qid.sequence_start = 0;
+  adb_query_parameters_t parms = 
+    {ADB_ACCUMULATION_DB, ADB_DISTANCE_DOT_PRODUCT, 10, 0};
+  adb_query_refine_t refine = {0};
+  refine.hopsize = 1;
 
+  adb_query_spec_t spec;
+  spec.qid = qid;
+  spec.params = parms;
+  spec.refine = refine;
 
-    /* create new db */
-    //${AUDIODB} -d testdb -N
-    mydbp=audiodb_create(databasename,0,0,0);
+  adb_query_results_t *results = audiodb_query_spec(adb, &spec);
+  if(!results || results->nresults != 1) return 1;
+  result_present_or_fail(results, "testfeature", 1, 0, 0);
+  audiodb_query_free_results(adb, &spec, results);
 
-    /* turn on l2norm */
-    //# point query now implemented as sequence search
-    //${AUDIODB} -d testdb -L
-    audiodb_l2norm(mydbp);
+  audiodb_close(adb);
 
-    /* make a test file */
-    //# FIXME: endianness!
-    //intstring 1 > testfeature
-    //floatstring 1 >> testfeature
-    ivals[0]=1;
-    dvals[0]=1;
-    maketestfile("testfeature",ivals,dvals,1);
-    
-    /* insert */ 
-    //${AUDIODB} -d testdb -I -f testfeature
-    myinsert.features="testfeature";
-    myerr=audiodb_insert(mydbp,&myinsert);   
-    
-    /* query */ 
-    //${AUDIODB} -d testdb -Q point -f testfeature > test-query-output
-    myadbquery.querytype="point"; 
-    myadbquery.feature="testfeature"; 
-    audiodb_query(mydbp,&myadbquery,&myadbqueryresult);
-    
-    /* check the test values */
-    //echo testfeature 1 0 0 > test-expected-query-output
-    //cmp test-query-output test-expected-query-output
-    size=myadbqueryresult.sizeRlist;
-    if (size != 1) {returnval = -1;};
-    if (testoneresult(&myadbqueryresult,0,"testfeature",1,0,0)) {returnval = -1;};   
-    
-
-//#
-//## failure cases
-//expect_clean_error_exit ${AUDIODB} -d testdb -I
-//expect_clean_error_exit ${AUDIODB} -d testdb -f testfeature
-//expect_clean_error_exit ${AUDIODB} -I -f testfeature
-//expect_clean_error_exit ${AUDIODB} -d testdb -Q notpoint -f testfeature
-//expect_clean_error_exit ${AUDIODB} -Q point -f testfeature
-/* all of these will fail at compile time because of API */
-
-    audiodb_close(mydbp);
-      
-    return(returnval);
+  return 104;
 }
-
-
-
-
-
--- a/libtests/0004/prog1.c	Sat Jan 10 15:32:49 2009 +0000
+++ b/libtests/0004/prog1.c	Sat Jan 10 15:32:53 2009 +0000
@@ -1,127 +1,62 @@
 #include "audioDB_API.h"
 #include "test_utils_lib.h"
 
+int main(int argc, char **argv) {
+  adb_t *adb;
 
-int main(int argc, char **argv){
+  clean_remove_db(TESTDB);
+  if(!(adb = audiodb_create(TESTDB, 0, 0, 0)))
+    return 1;
+  if(audiodb_l2norm(adb))
+    return 1;
 
-    int returnval=0;
-    adb_ptr mydbp={0};
-    adb_status_t mystatus={0};
-    int ivals[10];
-    double dvals[10];
-    FILE * myfile;
-    int ret=0;
-    adb_insert_t myinsert={0};
-    unsigned int myerr=0;
-    adb_query_t myadbquery={0};
-    adb_queryresult_t myadbqueryresult={0};
-    adb_query_t myadbquery2={0};
-    adb_queryresult_t myadbqueryresult2={0};
-    char * databasename="testdb";
-    int i=0;
-    int size=0;
+  adb_datum_t feature = {2, 2, "testfeature", (double[4]) {0, 1, 1, 0}};
+  if(audiodb_insert_datum(adb, &feature))
+    return 1;
 
+  adb_datum_t query = {1, 2, "testquery", (double [2]) {0, 0.5}};
 
-    /* remove old directory */
-    //if [ -f testdb ]; then rm -f testdb; fi
-    clean_remove_db(databasename);
+  adb_query_id_t qid = {0};
+  qid.datum = &query;
+  qid.sequence_length = 1;
+  qid.sequence_start = 0;
+  adb_query_parameters_t parms = 
+    {ADB_ACCUMULATION_DB, ADB_DISTANCE_DOT_PRODUCT, 10, 0};
+  adb_query_refine_t refine = {0};
+  refine.hopsize = 1;
 
-    /* create new db */
-    //${AUDIODB} -d testdb -N
-    mydbp=audiodb_create(databasename,0,0,0);
+  adb_query_spec_t spec;
+  spec.qid = qid;
+  spec.params = parms;
+  spec.refine = refine;
 
-    /* turn on l2norm */
-    //${AUDIODB} -d testdb -L
-    audiodb_l2norm(mydbp);
+  adb_query_results_t *results = audiodb_query_spec(adb, &spec);
+  if(!results || results->nresults != 2) return 1;
+  result_present_or_fail(results, "testfeature", 0.5, 0, 0);
+  result_present_or_fail(results, "testfeature", 0, 0, 1);
+  audiodb_query_free_results(adb, &spec, results);
 
-    /* make a test file */
-    //intstring 2 > testfeature
-    //floatstring 0 1 >> testfeature
-    //floatstring 1 0 >> testfeature
-    ivals[0]=2;
-    dvals[0]=0; dvals[1]=1; dvals[2]=1; dvals[3]=0;
-    maketestfile("testfeature", ivals,dvals,4);
+  spec.params.npoints = 1;
+  results = audiodb_query_spec(adb, &spec);
+  if(!results || results->nresults != 1) return 1;
+  result_present_or_fail(results, "testfeature", 0.5, 0, 0);  
+  audiodb_query_free_results(adb, &spec, results);
 
+  spec.qid.datum->data = (double[2]) {0.5, 0};
+  spec.params.npoints = 10;
+  results = audiodb_query_spec(adb, &spec);
+  result_present_or_fail(results, "testfeature", 0.5, 0, 1);
+  result_present_or_fail(results, "testfeature", 0, 0, 0);
+  audiodb_query_free_results(adb, &spec, results);
 
-    /* insert */ 
-    //${AUDIODB} -d testdb -I -f testfeature
-    myinsert.features="testfeature";
-    myerr=audiodb_insert(mydbp,&myinsert);   
+  spec.params.npoints = 1;
+  results = audiodb_query_spec(adb, &spec);
+  if(!results || results->nresults != 1) return 1;
+  result_present_or_fail(results, "testfeature", 0.5, 0, 1);  
+  audiodb_query_free_results(adb, &spec, results);
 
-    /* testquery */ 
-    //echo "query point (0.0,0.5)"
-    //intstring 2 > testquery
-    //floatstring 0 0.5 >> testquery
-    ivals[0]=2;
-    dvals[0]=0; dvals[1]=0.5; dvals[2]=0; dvals[3]=0;
-    maketestfile("testquery", ivals,dvals,4);
+  audiodb_close(adb);
 
-    /* query 1 */
-    //${AUDIODB} -d testdb -Q point -f testquery > testoutput
-    //echo testfeature 0.5 0 0 > test-expected-output
-    //echo testfeature 0 0 1 >> test-expected-output
-    //cmp testoutput test-expected-output
-    myadbquery.querytype="point"; 
-    myadbquery.feature="testquery"; 
-    audiodb_query(mydbp,&myadbquery,&myadbqueryresult);
-    size=myadbqueryresult.sizeRlist;
-    
-    /* check the test values */
-    if (size != 2) {returnval = -1;};
-    if (testoneresult(&myadbqueryresult,0,"testfeature",.5,0,0)) {returnval = -1;};   
-    if (testoneresult(&myadbqueryresult,1,"testfeature",0,0,1)) {returnval = -1;};   
-    
-    /* query 2 - same but only first result */
-//${AUDIODB} -d testdb -Q point -f testquery -n 1 > testoutput
-//echo testfeature 0.5 0 0 > test-expected-output
-//cmp testoutput test-expected-output
-    myadbquery.numpoints="1"; 
-    audiodb_query(mydbp,&myadbquery,&myadbqueryresult);
-    size=myadbqueryresult.sizeRlist;
-
-    if (size != 1) {returnval = -1;};
-    if (testoneresult(&myadbqueryresult,0,"testfeature",.5,0,0)) {returnval = -1;};   
-
-
-    /* testquery2 */ 
-    //echo "query point (0.5,0.0)"
-    //intstring 2 > testquery
-    //floatstring 0.5 0 >> testquery
-    ivals[0]=2;
-    dvals[0]=0.5; dvals[1]=0; dvals[2]=0; dvals[3]=0;
-    maketestfile("testquery", ivals,dvals,4);
-
-    /* query 3 */ 
-    //${AUDIODB} -d testdb -Q point -f testquery > testoutput
-    //echo testfeature 0.5 0 1 > test-expected-output
-    //echo testfeature 0 0 0 >> test-expected-output
-    //cmp testoutput test-expected-output
-    myadbquery2.querytype="point"; 
-    myadbquery2.feature="testquery"; 
-    myadbquery2.numpoints=NULL; 
-    audiodb_query(mydbp,&myadbquery2,&myadbqueryresult2);
-    size=myadbqueryresult2.sizeRlist;
-
-    /* check the test values */
-    if (size != 2) {returnval = -1;};
-    if (testoneresult(&myadbqueryresult2,0,"testfeature",.5,0,1)) {returnval = -1;};   
-    if (testoneresult(&myadbqueryresult2,1,"testfeature",0,0,0)) {returnval = -1;};   
-     
-    /* query 4 - same as 3 but only first result */
-    //${AUDIODB} -d testdb -Q point -f testquery -n 1 > testoutput
-    //echo testfeature 0.5 0 1 > test-expected-output
-    //cmp testoutput test-expected-output
-    myadbquery2.numpoints="1"; 
-    audiodb_query(mydbp,&myadbquery2,&myadbqueryresult2);
-    size=myadbqueryresult2.sizeRlist;
-
-
-    if (size != 1) {returnval = -1;};
-    if (testoneresult(&myadbqueryresult2,0,"testfeature",.5,0,1)) {returnval = -1;};   
-
-    audiodb_close(mydbp);
-
-
-    return(returnval);
+  return 104;
 }
 
--- a/libtests/0037/prog1.c	Sat Jan 10 15:32:49 2009 +0000
+++ b/libtests/0037/prog1.c	Sat Jan 10 15:32:53 2009 +0000
@@ -1,27 +1,15 @@
 #include "audioDB_API.h"
 #include "test_utils_lib.h"
 
-int result_position(adb_query_results_t *r, const char *key, float dist, uint32_t qpos, uint32_t ipos) {
-  for(uint32_t k = 0; k < r->nresults; k++) {
-    adb_result_t result = r->results[k];
-    if((dist == result.dist) && (qpos == result.qpos) &&
-       (ipos == result.ipos) && !(strcmp(key, result.key))) {
-      return k;
-    }
-  }
-  return -1;
-}
-
 int main(int argc, char *argv[]) {
-  char *dbname = "testdb";
   adb_t *adb;
   adb_insert_t *batch = 0;
   adb_status_t status;
   adb_query_t query = {0};
   adb_queryresult_t result;
 
-  clean_remove_db(dbname);
-  adb = audiodb_create("testdb", 0, 0, 0);
+  clean_remove_db(TESTDB);
+  adb = audiodb_create(TESTDB, 0, 0, 0);
   if(!adb) {
     return 1;
   }
@@ -71,39 +59,39 @@
 
   adb_query_results_t *results = audiodb_query_spec(adb, &spec);
 
-  if(results->nresults != 4) return 1;
-  if(result_position(results, "testfeature01", 0, 0, 0) < 0) return 1;
-  if(result_position(results, "testfeature01", 2, 0, 1) < 0) return 1;
-  if(result_position(results, "testfeature10", 0, 0, 1) < 0) return 1;
-  if(result_position(results, "testfeature10", 2, 0, 0) < 0) return 1;
+  if(!results || results->nresults != 4) return 1;
+  result_present_or_fail(results, "testfeature01", 0, 0, 0);
+  result_present_or_fail(results, "testfeature01", 2, 0, 1);
+  result_present_or_fail(results, "testfeature10", 0, 0, 1);
+  result_present_or_fail(results, "testfeature10", 2, 0, 0);
   audiodb_query_free_results(adb, &spec, results);
 
   spec.params.npoints = 2;
   results = audiodb_query_spec(adb, &spec);
 
-  if(results->nresults != 4) return 1;
-  if(result_position(results, "testfeature01", 0, 0, 0) < 0) return 1;
-  if(result_position(results, "testfeature01", 2, 0, 1) < 0) return 1;
-  if(result_position(results, "testfeature10", 0, 0, 1) < 0) return 1;
-  if(result_position(results, "testfeature10", 2, 0, 0) < 0) return 1;
+  if(!results || results->nresults != 4) return 1;
+  result_present_or_fail(results, "testfeature01", 0, 0, 0);
+  result_present_or_fail(results, "testfeature01", 2, 0, 1);
+  result_present_or_fail(results, "testfeature10", 0, 0, 1);
+  result_present_or_fail(results, "testfeature10", 2, 0, 0);
   audiodb_query_free_results(adb, &spec, results);
 
   spec.params.npoints = 5;
   results = audiodb_query_spec(adb, &spec);
 
-  if(results->nresults != 4) return 1;
-  if(result_position(results, "testfeature01", 0, 0, 0) < 0) return 1;
-  if(result_position(results, "testfeature01", 2, 0, 1) < 0) return 1;
-  if(result_position(results, "testfeature10", 0, 0, 1) < 0) return 1;
-  if(result_position(results, "testfeature10", 2, 0, 0) < 0) return 1;
+  if(!results || results->nresults != 4) return 1;
+  result_present_or_fail(results, "testfeature01", 0, 0, 0);
+  result_present_or_fail(results, "testfeature01", 2, 0, 1);
+  result_present_or_fail(results, "testfeature10", 0, 0, 1);
+  result_present_or_fail(results, "testfeature10", 2, 0, 0);
   audiodb_query_free_results(adb, &spec, results);
 
   spec.params.npoints = 1;
   results = audiodb_query_spec(adb, &spec);
 
-  if(results->nresults != 2) return 1;
-  if(result_position(results, "testfeature01", 0, 0, 0) < 0) return 1;
-  if(result_position(results, "testfeature10", 0, 0, 1) < 0) return 1;
+  if(!results || results->nresults != 2) return 1;
+  result_present_or_fail(results, "testfeature01", 0, 0, 0);
+  result_present_or_fail(results, "testfeature10", 0, 0, 1);
 
   audiodb_query_free_results(adb, &spec, results);
 
@@ -111,39 +99,39 @@
   spec.params.npoints = 10;
   results = audiodb_query_spec(adb, &spec);
 
-  if(results->nresults != 4) return 1;
-  if(result_position(results, "testfeature01", 0, 0, 1) < 0) return 1;
-  if(result_position(results, "testfeature01", 2, 0, 0) < 0) return 1;
-  if(result_position(results, "testfeature10", 0, 0, 0) < 0) return 1;
-  if(result_position(results, "testfeature10", 2, 0, 1) < 0) return 1;
+  if(!results || results->nresults != 4) return 1;
+  result_present_or_fail(results, "testfeature01", 0, 0, 1);
+  result_present_or_fail(results, "testfeature01", 2, 0, 0);
+  result_present_or_fail(results, "testfeature10", 0, 0, 0);
+  result_present_or_fail(results, "testfeature10", 2, 0, 1);
   audiodb_query_free_results(adb, &spec, results);
 
   spec.params.npoints = 2;
   results = audiodb_query_spec(adb, &spec);
 
-  if(results->nresults != 4) return 1;
-  if(result_position(results, "testfeature01", 0, 0, 1) < 0) return 1;
-  if(result_position(results, "testfeature01", 2, 0, 0) < 0) return 1;
-  if(result_position(results, "testfeature10", 0, 0, 0) < 0) return 1;
-  if(result_position(results, "testfeature10", 2, 0, 1) < 0) return 1;
+  if(!results || results->nresults != 4) return 1;
+  result_present_or_fail(results, "testfeature01", 0, 0, 1);
+  result_present_or_fail(results, "testfeature01", 2, 0, 0);
+  result_present_or_fail(results, "testfeature10", 0, 0, 0);
+  result_present_or_fail(results, "testfeature10", 2, 0, 1);
   audiodb_query_free_results(adb, &spec, results);
 
   spec.params.npoints = 5;
   results = audiodb_query_spec(adb, &spec);
 
-  if(results->nresults != 4) return 1;
-  if(result_position(results, "testfeature01", 0, 0, 1) < 0) return 1;
-  if(result_position(results, "testfeature01", 2, 0, 0) < 0) return 1;
-  if(result_position(results, "testfeature10", 0, 0, 0) < 0) return 1;
-  if(result_position(results, "testfeature10", 2, 0, 1) < 0) return 1;
+  if(!results || results->nresults != 4) return 1;
+  result_present_or_fail(results, "testfeature01", 0, 0, 1);
+  result_present_or_fail(results, "testfeature01", 2, 0, 0);
+  result_present_or_fail(results, "testfeature10", 0, 0, 0);
+  result_present_or_fail(results, "testfeature10", 2, 0, 1);
   audiodb_query_free_results(adb, &spec, results);
 
   spec.params.npoints = 1;
   results = audiodb_query_spec(adb, &spec);
 
-  if(results->nresults != 2) return 1;
-  if(result_position(results, "testfeature01", 0, 0, 1) < 0) return 1;
-  if(result_position(results, "testfeature10", 0, 0, 0) < 0) return 1;
+  if(!results || results->nresults != 2) return 1;
+  result_present_or_fail(results, "testfeature01", 0, 0, 1);
+  result_present_or_fail(results, "testfeature10", 0, 0, 0);
   audiodb_query_free_results(adb, &spec, results);
 
   audiodb_close(adb);
--- a/libtests/run-tests.sh	Sat Jan 10 15:32:49 2009 +0000
+++ b/libtests/run-tests.sh	Sat Jan 10 15:32:53 2009 +0000
@@ -1,15 +1,5 @@
 #! /bin/bash
 
-AUDIODB=../../${EXECUTABLE:-audioDB}
-export AUDIODB
-
-if [ -x ${AUDIODB#../} ]; then 
-  :
-else 
-  echo Cannot execute audioDB: ${AUDIODB#../}
-  exit 1
-fi
-
 if [ "$1" = "--full" ]; then
   pattern="[0-9][0-9][0-9][0-9]*"
 else
--- a/libtests/test_utils_lib.h	Sat Jan 10 15:32:49 2009 +0000
+++ b/libtests/test_utils_lib.h	Sat Jan 10 15:32:53 2009 +0000
@@ -6,6 +6,8 @@
 #include <string.h>
 #include <stdio.h>
 
+#define TESTDB "testdb"
+
 void clean_remove_db(char *dbname);
 int testoneresult(adb_queryresult_ptr myadbqueryresult, int i, char * Rlist, double Dist,double Qpos,double Spos);
 void maketestfile(char * filename, int * ivals, double * dvals, int dvalsize);
@@ -86,3 +88,18 @@
     fclose(myfile);
 
 }
+
+int result_position(adb_query_results_t *r, const char *key, float dist, uint32_t qpos, uint32_t ipos) {
+  for(uint32_t k = 0; k < r->nresults; k++) {
+    adb_result_t result = r->results[k];
+    if((dist == result.dist) && (qpos == result.qpos) &&
+       (ipos == result.ipos) && !(strcmp(key, result.key))) {
+      return k;
+    }
+  }
+  return -1;
+}
+
+#define result_present_or_fail(r, k, d, q, i) \
+  if(result_position(r, k, d, q, i) < 0) return 1;
+