summaryrefslogtreecommitdiff
path: root/docs/run_test.txt
blob: 561657c7f94d1eac7a86f741deb3ffdbe830775a (plain)
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/**
@page run_test_howto How to write a run_test.pl

ACE/TAO's auto_builds expect run_test.pl's to follow some guidelines
that are needed to keep the auto_builds from hanging and to make
sure the run_test.pl works on all platforms

- The run_test must not hang or block.
- The run_test must clean up any temporary files when it is done.  
- The run_test must not require any user input
- The run_test should return a non-zero value if the test failed

Following is an example

@subsection example Example

@verbatim
eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}'
    & eval 'exec perl -S $0 $argv:q'
    if 0;

# $Id$
# -*- perl -*-

use lib '../../../bin';
use PerlACE::Run_Test;
use Cwd;

$server_ior = PerlACE::LocalFile ("server.ior");
unlink $server_ior;

$SV = new PerlACE::Process ("server", "-o $server_ior");

$SV->Spawn ();

if (PerlACE::waitforfile_timed ($server_ior, 5) == -1) {
    print STDERR "ERROR: cannot find file <$server_ior>\n";
    $SV->Kill (); $SV->TimedWait (1);
    exit 1;
} 

$CL = new PerlACE::Process ("client", " -k file://$server_ior ");

$client = $CL->SpawnWaitKill (60);
$server = $SV->WaitKill (5);

unlink $server_ior;
 
if ($server != 0 || $client != 0) {
    exit 1;
}

exit 0;
@endverbatim

@subsection details Example Details

@verbatim
eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}'
    & eval 'exec perl -S $0 $argv:q'
    if 0;

# $Id$
@endverbatim

This is the standard header stuff.  The eval is a trick used
to get the perl script to run if it a unix shell treats it as
a shell script.

The CVS ID string is the usual one we put in.

@verbatim
use lib '../../../bin';
use PerlACE::Run_Test;
@endverbatim

The use lib line is used to tell Perl where the PerlACE modules are.
It should be a relative path to the bin directory.

And PerlACE::Run_Test is a module to be used by all run_test.pl's.
It does a couple of things, including parsing some common command
line arguments (like -Config and -ExeSubDir) and also brings in
the PerlACE::Process module.

@verbatim
use Cwd;

$server_ior = PerlACE::LocalFile ("server.ior");

unlink $server_ior;
@endverbatim

Because of the way tests work on chorus, we need to have a fully 
qualified path to all *.ior and *.conf files.  We unlink the file
immediately because we use PerlACE::waitforfile_timed later.

@verbatim
$SV = new PerlACE::Process ("server", "-o $server_ior");

$SV->Spawn ();
@endverbatim

The PerlACE::Process is constructed with an executable and 
arguments.  @note Unlike the old Process module, the process
isn't started until one of the Spawn's is called.

@verbatim
if (PerlACE::waitforfile_timed ($server_ior, 5) == -1) {
    print STDERR "ERROR: cannot find file <$server_ior>\n";
    $SV->Kill (); $SV->TimedWait (1);
    exit 1;
} 
@endverbatim

The PerlACE::waitforfile_timed method waits until the file is
created.  In this way, we know when to start the client.

@verbatim
$CL = new PerlACE::Process ("client", " -k file://$server_ior ");

$client = $CL->SpawnWaitKill (60);
$server = $SV->WaitKill (5);
@endverbatim

Here are two more methods on the PerlACE::Process object.
SpawnWaitKill will start the process and wait for the specified
number of seconds for the process to end.  If the time limit
is reached, it will kill the process.  WaitKill will do the same,
but is used after the process is already spawned.

@verbatim
unlink $server_ior;
 
if ($server != 0 || $client != 0) {
    exit 1;
}
 
exit 0;
@endverbatim

And finally, we just check the return codes of the server and 
client and return 1 from this perl script if they aren't 0.

This return code is used by the auto_run_tests.pl script.
*/