645322 | 2001-02-01 | Per Hedbor | | int verbose;
Configuration c;
function do_when_done;
string http_url;
int current_test, tests_failed;
Process.Process test;
string indent( int l, string what )
{
array q = what/"\n";
string i = (" "*l+"| ");
return i+q*("\n"+i)+"\n";
}
string do_describe_error( mixed err )
{
if( stringp( err ) )
return indent(2,err + (strlen(err)?(err[-1] == '\n' ? "": "\n" ):""));
err = (array)err;
err[1] = err[1][sizeof(err[1])-3..];
return indent(2, describe_backtrace( err ) );
}
string common_wait( mapping m )
{
int err = test->wait();
if( err == 100 ) return "Illegal arguments";
if( err == 99 ) return "Timeout";
if( !m[10] && (err == 10) )
return "The external pike script triggered an error";
if( !m[1] && (err == 1) )
return "The external pike script failed to compile";
return err && ( m[ err ] || ("Unknown error "+err) );
}
void run_pikescript( string p, string ... args )
{
if( !http_url )
foreach( c->query("URLs"), string url )
if( has_prefix( url, "http://" ) )
http_url = url;
if( !http_url )
{
werror("Cannot run test -- no HTTP port open\n");
return;
}
test = Process.create_process( ({
"pike",
combine_path( __FILE__, "../"+p ),
http_url
})+args );
}
void current_test_done()
{
#define IND(X) this_object()[ "test_"+current_test+(X) ]
if( !test || test->status() )
{
if( function fp = IND("_check") )
if( string fail = fp( ) )
{
tests_failed++;
if( verbose ) report_debug(" FAILED\n");
report_debug(do_describe_error(IND("_desc")+" FAILED\n" ));
report_debug(do_describe_error( fail ));
}
else if( verbose )
report_debug(" PASS\n");
current_test++;
if( function t = IND("") )
{
if( verbose )
report_debug("%3d %c%-66s ", current_test,' ',IND("_desc")[..65] );
if( mixed err = catch {
t();
} )
{
if( verbose ) report_debug(" FAILED\n");
report_debug(do_describe_error( err ) );
}
call_out( current_test_done, 0.1 );
}
else
do_when_done( (current_test-1), tests_failed );
}
else
call_out( current_test_done, 0.1 );
}
void low_run_tests( Configuration _c, function go_on )
{
do_when_done = go_on;
c = _c;
call_out( current_test_done, 0 );
}
void create( int v )
{
verbose = v;
}
|