summaryrefslogtreecommitdiff
path: root/source4/selftest
diff options
context:
space:
mode:
Diffstat (limited to 'source4/selftest')
-rw-r--r--source4/selftest/config.mk6
-rwxr-xr-xsource4/selftest/selftest.pl21
-rw-r--r--source4/selftest/target/Kvm.pm153
3 files changed, 176 insertions, 4 deletions
diff --git a/source4/selftest/config.mk b/source4/selftest/config.mk
index 7f8f211588..4e9d31b684 100644
--- a/source4/selftest/config.mk
+++ b/source4/selftest/config.mk
@@ -10,6 +10,12 @@ SELFTEST = $(LD_LIBPATH_OVERRIDE) $(PERL) $(srcdir)/selftest/selftest.pl --prefi
test:: everything
$(SELFTEST) $(DEFAULT_TEST_OPTIONS) --immediate $(TESTS)
+kvmtest:: everything
+ $(SELFTEST) $(DEFAULT_TEST_OPTIONS) --immediate --target=kvm --image=$(KVM_IMAGE)
+
+kvmquicktest:: everything
+ $(SELFTEST) $(DEFAULT_TEST_OPTIONS) --immediate --quick --target=kvm --image=$(KVM_IMAGE)
+
testone:: everything
$(SELFTEST) $(DEFAULT_TEST_OPTIONS) --one $(TESTS)
diff --git a/source4/selftest/selftest.pl b/source4/selftest/selftest.pl
index aab2ca8f07..c17e790f63 100755
--- a/source4/selftest/selftest.pl
+++ b/source4/selftest/selftest.pl
@@ -13,7 +13,7 @@ selftest - Samba test runner
selftest --help
-selftest [--srcdir=DIR] [--builddir=DIR] [--target=samba4|samba3|win] [--socket-wrapper] [--quick] [--exclude=FILE] [--include=FILE] [--one] [--prefix=prefix] [--immediate] [--testlist=FILE] [TESTS]
+selftest [--srcdir=DIR] [--builddir=DIR] [--target=samba4|samba3|win|kvm] [--socket-wrapper] [--quick] [--exclude=FILE] [--include=FILE] [--one] [--prefix=prefix] [--immediate] [--testlist=FILE] [TESTS]
=head1 DESCRIPTION
@@ -43,7 +43,7 @@ Change directory to run tests in. Default is 'st'.
Show errors as soon as they happen rather than at the end of the test run.
-=item I<--target samba4|samba3|win>
+=item I<--target samba4|samba3|win|kvm>
Specify test target against which to run. Default is 'samba4'.
@@ -144,6 +144,7 @@ my $opt_expected_failures = undef;
my @opt_exclude = ();
my @opt_include = ();
my $opt_verbose = 0;
+my $opt_image = undef;
my $opt_testenv = 0;
my $ldap = undef;
my $opt_analyse_cmd = undef;
@@ -280,7 +281,7 @@ Usage: $Script [OPTIONS] PREFIX
Generic options:
--help this help page
- --target=samba4|samba3|win Samba version to target
+ --target=samba[34]|win|kvm Samba version to target
--testlist=FILE file to read available tests from
Paths:
@@ -301,6 +302,9 @@ Samba4 Specific:
Samba3 Specific:
--bindir=PATH path to binaries
+Kvm Specific:
+ --image=PATH path to KVM image
+
Behaviour:
--quick run quick overall test
--one abort when the first test fails
@@ -334,6 +338,7 @@ my $result = GetOptions (
'resetup-environment' => \$opt_resetup_env,
'bindir:s' => \$opt_bindir,
'format=s' => \$opt_format,
+ 'image=s' => \$opt_image,
'testlist=s' => \@testlists
);
@@ -442,6 +447,12 @@ if ($opt_target eq "samba4") {
$testenv_default = "dc";
require target::Windows;
$target = new Windows();
+} elsif ($opt_target eq "kvm") {
+ die("Kvm tests will not run with socket wrapper enabled.")
+ if ($opt_socket_wrapper);
+ require target::Kvm;
+ die("No image specified") unless ($opt_image);
+ $target = new Kvm($opt_image);
}
sub read_test_regexes($)
@@ -522,11 +533,13 @@ sub write_clientconf($$)
if (defined($vars->{WINBINDD_SOCKET_DIR})) {
print CF "\twinbindd socket directory = $vars->{WINBINDD_SOCKET_DIR}\n";
}
+ if ($opt_socket_wrapper) {
+ print CF "\tinterfaces = $interfaces\n";
+ }
print CF "
private dir = $prefix_abs/client/private
js include = $srcdir_abs/scripting/libjs
name resolve order = bcast
- interfaces = $interfaces
panic action = $srcdir_abs/script/gdb_backtrace \%PID\% \%PROG\%
max xmit = 32K
notify:inotify = false
diff --git a/source4/selftest/target/Kvm.pm b/source4/selftest/target/Kvm.pm
new file mode 100644
index 0000000000..253f3b53af
--- /dev/null
+++ b/source4/selftest/target/Kvm.pm
@@ -0,0 +1,153 @@
+#!/usr/bin/perl
+# Start a KVM machine and run a number of tests against it.
+# Copyright (C) 2005-2008 Jelmer Vernooij <jelmer@samba.org>
+# Published under the GNU GPL, v3 or later.
+
+package Kvm;
+
+use strict;
+use Cwd qw(abs_path);
+use FindBin qw($RealBin);
+use POSIX;
+
+sub new($$$$) {
+ my ($classname, $dc_image) = @_;
+ my $self = {
+ dc_image => $dc_image,
+ };
+ bless $self;
+ return $self;
+}
+
+sub write_kvm_ifup($$$)
+{
+ my ($self, $path, $ip_prefix) = @_;
+ open(SCRIPT, ">$path/kvm-ifup");
+
+ print SCRIPT <<__EOF__;
+#!/bin/sh
+
+PREFIX=$ip_prefix
+
+/sbin/ifconfig \$1 \$PREFIX.1 up
+
+cat <<EOF>$path/udhcpd.conf
+interface \$1
+start \$PREFIX.20
+end \$PREFIX.20
+max_leases 1
+lease_file $path/udhcpd.leases
+pidfile $path/udhcpd.pid
+EOF
+
+touch $path/udhcpd.leases
+
+/usr/sbin/udhcpd $path/udhcpd.conf
+
+exit 0
+__EOF__
+ close(SCRIPT);
+ chmod(0755, "$path/kvm-ifup");
+
+ return ("$path/kvm-ifup", "$path/udhcpd.pid", "$ip_prefix.20");
+}
+
+sub teardown_env($$)
+{
+ my ($self, $envvars) = @_;
+
+ print "Killing kvm instance $envvars->{KVM_PID}\n";
+
+ kill 9, $envvars->{KVM_PID};
+
+ print "Killing dhcpd instance $envvars->{DHCPD_PID}\n";
+ kill 9, $envvars->{DHCPD_PID};
+
+ return 0;
+}
+
+sub getlog_env($$)
+{
+ my ($self, $envvars) = @_;
+
+ return "";
+}
+
+sub check_env($$)
+{
+ my ($self, $envvars) = @_;
+
+ # FIXME: Check whether $self->{pid} is still running
+
+ return 1;
+}
+
+sub read_pidfile($)
+{
+ my ($path) = @_;
+
+ open(PID, $path);
+ <PID> =~ /([0-9]+)/;
+ my ($pid) = $1;
+ close(PID);
+ return $pid;
+}
+
+sub start($$$)
+{
+ my ($self, $path, $image) = @_;
+
+ my $pidfile = "$path/kvm.pid";
+
+ my $opts = (defined($ENV{KVM_OPTIONS})?$ENV{KVM_OPTIONS}:"-nographic");
+
+ if (defined($ENV{KVM_SNAPSHOT})) {
+ $opts .= " -loadvm $ENV{KVM_SNAPSHOT}";
+ }
+
+ my ($ifup_script, $dhcpd_pidfile, $ip_address) = $self->write_kvm_ifup($path, "192.168.9");
+
+ system("kvm -name \"Samba 4 Test Subject\" $opts -monitor unix:$path/kvm.monitor,server,nowait -daemonize -pidfile $pidfile -snapshot $image -net nic -net tap,script=$ifup_script");
+
+ return (read_pidfile($pidfile), read_pidfile($dhcpd_pidfile), $ip_address);
+}
+
+sub setup_env($$$)
+{
+ my ($self, $envname, $path) = @_;
+
+ if ($envname eq "dc") {
+ ($self->{dc_pid}, $self->{dc_dhcpd_pid}, $self->{dc_ip}) = $self->start($path, $self->{dc_image});
+
+ sub choose_var($$) {
+ my ($name, $default) = @_;
+ return defined($ENV{"KVM_DC_$name"})?$ENV{"KVM_DC_$name"}:$default;
+ }
+
+ if ($envname eq "dc") {
+ return {
+ KVM_PID => $self->{dc_pid},
+ DHCPD_PID => $self->{dc_dhcpd_pid},
+ USERNAME => choose_var("USERNAME", "Administrator"),
+ PASSWORD => choose_var("PASSWORD", "penguin"),
+ DOMAIN => choose_var("DOMAIN", "SAMBA"),
+ REALM => choose_var("REALM", "SAMBA"),
+ SERVER => choose_var("SERVER", "DC"),
+ SERVER_IP => $self->{dc_ip},
+ NETBIOSNAME => choose_var("NETBIOSNAME", "DC"),
+ NETBIOSALIAS => choose_var("NETBIOSALIAS", "DC"),
+ };
+ } else {
+ return undef;
+ }
+ } else {
+ return undef;
+ }
+}
+
+sub stop($)
+{
+ my ($self) = @_;
+}
+
+1;