1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  
26
  
27
  
28
  
29
  
30
  
31
  
32
  
33
  
34
  
35
  
36
  
37
  
38
  
39
  
40
  
41
  
42
  
43
  
44
  
45
  
46
  
47
  
48
  
49
  
50
  
51
  
52
  
53
  
54
  
55
  
56
  
57
  
58
  
59
  
60
  
61
  
62
  
63
  
64
  
65
  
66
  
67
  
68
  
69
  
70
  
71
  
72
  
73
  
74
  
75
  
76
  
77
  
78
  
79
  
80
  
81
  
82
  
83
  
84
  
85
  
86
  
87
  
88
  
89
  
90
  
91
  
92
  
93
  
94
  
95
  
96
  
97
  
98
  
99
  
100
  
101
  
102
  
103
  
104
  
105
  
106
  
107
  
108
  
109
  
110
  
111
  
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"; 
//   if( q[-1] == "" )  q = q[..sizeof(q)-2]; 
  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; 
}