r22375: implement check_env() logic in the frontend
[Samba.git] / source / script / tests / Samba3.pm
blobf040432ce6f176a4fc57b646e95c01712e374a70
1 #!/usr/bin/perl
2 # Bootstrap Samba and run a number of tests against it.
3 # Copyright (C) 2005-2007 Jelmer Vernooij <jelmer@samba.org>
4 # Published under the GNU GPL, v3 or later.
6 package Samba3;
8 use strict;
9 use Cwd qw(abs_path);
10 use FindBin qw($RealBin);
12 sub binpath($$)
14 my ($self, $binary) = @_;
16 if (defined($self->{bindir})) {
17 my $path = "$self->{bindir}/$binary";
18 -f $path or die("File $path doesn't exist");
19 return $path;
22 return $binary;
25 sub new($$) {
26 my ($classname, $bindir) = @_;
27 my $self = { bindir => $bindir };
28 bless $self;
29 return $self;
32 sub teardown_env($$)
34 my ($self, $envvars) = @_;
36 $self->samba3_stop_sig_term($envvars->{PIDDIR});
37 $self->samba3_stop_sig_kill($envvars->{PIDDIR});
39 return 0;
42 sub getlog_env($$)
44 my ($self, $envvars) = @_;
46 # TODO...
47 return "";
50 sub check_env($$)
52 my ($self, $envvars) = @_;
54 # TODO ...
55 return 1;
58 sub setup_env($$$)
60 my ($self, $envname, $path) = @_;
62 if ($envname eq "dc") {
63 return $self->setup_dc("$path/dc");
64 } else {
65 die("Samba4 can't provide environment '$envname'");
69 sub setup_dc($$)
71 my ($self, $path) = @_;
73 my $vars = $self->provision($path);
75 $self->check_or_start($vars, ($ENV{NMBD_MAXTIME} or 2700), ($ENV{SMBD_MAXTIME} or 2700));
77 $self->wait_for_start($vars);
79 return $vars;
82 sub stop($)
84 my ($self) = @_;
87 sub samba3_stop_sig_term($$) {
88 my ($self, $piddir) = @_;
89 my $ret = 0;
90 kill("USR1", `cat $piddir/timelimit.nmbd.pid`) or \
91 kill("ALRM", `cat $piddir/timelimit.nmbd.pid`) or $ret++;
93 kill("USR1", `cat $piddir/timelimit.smbd.pid`) or \
94 kill("ALRM", `cat $piddir/timelimit.smbd.pid`) or $ret++;
96 return $ret;
99 sub samba3_stop_sig_kill($$) {
100 my ($self, $piddir) = @_;
101 kill("ALRM", `cat $piddir/timelimit.nmbd.pid`);
102 kill("ALRM", `cat $piddir/timelimit.smbd.pid`);
103 return 0;
106 sub check_or_start($$$$) {
107 my ($self, $env_vars, $nmbd_maxtime, $smbd_maxtime) = @_;
109 unlink($env_vars->{NMBD_TEST_LOG});
110 print "STARTING NMBD...";
111 my $pid = fork();
112 if ($pid == 0) {
113 open STDOUT, ">$env_vars->{NMBD_TEST_LOG}";
114 open STDERR, '>&STDOUT';
116 $ENV{MAKE_TEST_BINARY} = $self->binpath("nmbd");
117 exec($self->binpath("timelimit"), $nmbd_maxtime, $self->binpath("nmbd"), "-F", "-S", "--no-process-group", "-d0" ,"-s", $env_vars->{SERVERCONFFILE}) or die("Unable to start nmbd: $!");
119 open(PID, ">$env_vars->{PIDDIR}/timelimit.nmbd.pid");
120 print PID $pid;
121 close(PID);
122 print "DONE\n";
124 unlink($env_vars->{SMBD_TEST_LOG});
125 print "STARTING SMBD...";
126 $pid = fork();
127 if ($pid == 0) {
128 open STDOUT, ">$env_vars->{SMBD_TEST_LOG}";
129 open STDERR, '>&STDOUT';
131 $ENV{MAKE_TEST_BINARY} = $self->binpath("smbd");
132 exec($self->binpath("timelimit"), $nmbd_maxtime, $self->binpath("smbd"), "-F", "-S", "--no-process-group", "-d0" ,"-s", $env_vars->{SERVERCONFFILE}) or die("Unable to start smbd: $!");
134 open(PID, ">$env_vars->{PIDDIR}/timelimit.smbd.pid");
135 print PID $pid;
136 close(PID);
137 print "DONE\n";
139 return 0;
142 sub create_clientconf($$$)
144 my ($self, $prefix, $domain) = @_;
146 my $lockdir = "$prefix/locks";
147 my $logdir = "$prefix/logs";
148 my $piddir = "$prefix/pid";
149 my $privatedir = "$prefix/private";
150 my $scriptdir = "$RealBin/..";
151 my $conffile = "$prefix/smb.conf";
153 my $torture_interfaces='127.0.0.6/8,127.0.0.7/8,127.0.0.8/8,127.0.0.9/8,127.0.0.10/8,127.0.0.11/8';
154 open(CONF, ">$conffile");
155 print CONF "
156 [global]
157 workgroup = $domain
159 private dir = $privatedir
160 pid directory = $piddir
161 lock directory = $lockdir
162 log file = $logdir/log.\%m
163 log level = 0
165 name resolve order = bcast
167 netbios name = TORTURE_6
168 interfaces = $torture_interfaces
169 panic action = $scriptdir/gdb_backtrace \%d %\$(MAKE_TEST_BINARY)
171 passdb backend = tdbsam
173 close(CONF);
176 sub provision($$)
178 my ($self, $prefix) = @_;
181 ## setup the various environment variables we need
184 my %ret = ();
185 my $server = "localhost2";
186 my $server_ip = "127.0.0.2";
187 my $username = `PATH=/usr/ucb:$ENV{PATH} whoami`;
188 my $password = "test";
190 my $srcdir="$RealBin/../..";
191 my $scriptdir="$srcdir/script/tests";
192 my $prefix_abs = abs_path($prefix);
193 my $shrdir="$prefix_abs/tmp";
194 my $libdir="$prefix_abs/lib";
195 my $piddir="$prefix_abs/pid";
196 my $conffile="$libdir/server.conf";
197 my $privatedir="$prefix_abs/private";
198 my $lockdir="$prefix_abs/lockdir";
199 my $logdir="$prefix_abs/logs";
200 my $domain = "SAMBA-TEST";
203 ## create the test directory layout
205 mkdir($prefix_abs);
206 print "CREATE TEST ENVIRONMENT IN '$prefix'...";
207 system("rm -rf $prefix_abs/*");
208 mkdir($_) foreach($privatedir,$libdir,$piddir,$lockdir,$logdir);
209 my $tmpdir = "$prefix_abs/tmp";
210 mkdir($tmpdir);
211 chmod 0777, $tmpdir;
213 open(CONF, ">$conffile") or die("Unable to open $conffile");
214 print CONF "
215 [global]
216 workgroup = $domain
218 private dir = $privatedir
219 pid directory = $piddir
220 lock directory = $lockdir
221 log file = $logdir/log.\%m
222 log level = 0
224 name resolve order = bcast
226 netbios name = $server
227 interfaces = $server_ip/8
228 bind interfaces only = yes
229 panic action = $scriptdir/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
231 passdb backend = tdbsam
233 ; Necessary to add the build farm hacks
234 add user script = /bin/false
235 add machine script = /bin/false
237 kernel oplocks = no
238 kernel change notify = no
240 syslog = no
241 printing = bsd
242 printcap name = /dev/null
244 [tmp]
245 path = $tmpdir
246 read only = no
247 smbd:sharedelay = 100000
248 map hidden = yes
249 map system = yes
250 create mask = 755
251 [hideunread]
252 copy = tmp
253 hide unreadable = yes
254 [hideunwrite]
255 copy = tmp
256 hide unwriteable files = yes
257 [print1]
258 copy = tmp
259 printable = yes
260 printing = test
261 [print2]
262 copy = print1
263 [print3]
264 copy = print1
265 [print4]
266 copy = print1
268 close(CONF);
271 ## create a test account
274 open(PWD, "|".$self->binpath("smbpasswd")." -c $conffile -L -s -a $username");
275 print PWD "$password\n$password\n";
276 close(PWD) or die("Unable to set password for test account");
278 print "DONE\n";
280 $ret{SERVER_IP} = $server_ip;
281 $ret{NMBD_TEST_LOG} = "$prefix/nmbd_test.log";
282 $ret{SMBD_TEST_LOG} = "$prefix/smbd_test.log";
283 $ret{SERVERCONFFILE} = $conffile;
284 $ret{CONFIGURATION} ="-s $conffile";
285 $ret{SERVER} = $server;
286 $ret{USERNAME} = $username;
287 $ret{DOMAIN} = $domain;
288 $ret{NETBIOSNAME} = $server;
289 $ret{PASSWORD} = $password;
290 $ret{PIDDIR} = $piddir;
291 return \%ret;
294 sub wait_for_start($$)
296 my ($self, $envvars) = @_;
298 # give time for nbt server to register its names
299 print "delaying for nbt name registration\n";
300 sleep(10);
301 # This will return quickly when things are up, but be slow if we need to wait for (eg) SSL init
302 system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} __SAMBA__");
303 system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} __SAMBA__");
304 system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} -U 127.255.255.255 __SAMBA__");
305 system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} $envvars->{SERVER}");
306 system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} $envvars->{SERVER}");
307 # make sure smbd is also up set
308 print "wait for smbd\n";
309 system($self->binpath("smbclient") ." $envvars->{CONFIGURATION} -L $envvars->{SERVER_IP} -U% -p 139 | head -2");
310 system($self->binpath("smbclient") ." $envvars->{CONFIGURATION} -L $envvars->{SERVER_IP} -U% -p 139 | head -2");
312 print $self->getlog_env($envvars);