|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [OSSTEST PATCH 13/13] rump kernel tests: Run xenstore-ls demo
We can use the newly-generalised ts-rumpuserxen-demo-setup to set up
the config file etc. to run xenstore-ls from the xen.git build.
We have a bespoke script to actually execute it: we extract the actual
program output from the guest console log, and compare the results to
those we expect (based on running xenstore-ls in dom0).
Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
---
make-flight | 2 +
sg-run-job | 4 ++
ts-rumpuserxen-demo-xenstorels | 111 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 117 insertions(+)
create mode 100755 ts-rumpuserxen-demo-xenstorels
diff --git a/make-flight b/make-flight
index ccfa3e3..b02720f 100755
--- a/make-flight
+++ b/make-flight
@@ -125,6 +125,8 @@ do_rumpkernel_tests () {
guests_rumpuserxenbuildjob=build-$rumparch-rumpuserxen \
rump_builtimage=rumpuserxen:/usr/local/lib/xen/rump-kernel \
rump_cmdline=3 \
+ xenstorels_builtimage=:/usr/local/bin/xenstore \
+ xenstorels_cmdline='ls -fp device' \
all_hostflags=$most_hostflags
}
diff --git a/sg-run-job b/sg-run-job
index ab9f333..2cf810a 100755
--- a/sg-run-job
+++ b/sg-run-job
@@ -315,6 +315,10 @@ proc run-job/test-rumpuserxen {} {
run-ts . = ts-rumpuserxen-demo-setup + host $g
run-ts . = ts-guest-start + host $g
run-ts . = ts-guest-destroy + host $g
+ set g xenstorels
+ run-ts . = ts-rumpuserxen-demo-setup + host + $g
+ run-ts . = ts-rumpuserxen-demo-xenstorels + host + $g
+ run-ts . = ts-guest-destroy-hard + host + $g
}
#---------- builds ----------
diff --git a/ts-rumpuserxen-demo-xenstorels b/ts-rumpuserxen-demo-xenstorels
new file mode 100755
index 0000000..07388a4
--- /dev/null
+++ b/ts-rumpuserxen-demo-xenstorels
@@ -0,0 +1,111 @@
+#!/usr/bin/perl -w
+# This is part of "osstest", an automated testing framework for Xen.
+# Copyright (C) 2009-2013 Citrix Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+use strict qw(vars);
+use DBI;
+use Osstest;
+use Osstest::TestSupport;
+use Data::Dumper;
+
+tsreadconfig();
+
+our ($ho,$gho) = ts_get_host_guest(@ARGV);
+
+our $domid;
+
+our $gn = $gho->{Guest};
+
+sub start () {
+ my $cmd= toolstack()->{Command}." create ".
+ $r{ $gho->{Guest}.'_'. toolstack()->{CfgPathVar} };
+ target_cmd_root($ho, $cmd, 30);
+
+ $domid = target_cmd_output_root($ho,"xl domid $gho->{Guest}");
+}
+
+sub await_end () {
+ poll_loop(30,3, "await ending of $gho->{Guest}", sub {
+ my $st= guest_get_state($ho,$gho);
+ return undef if $st =~ m/s/;
+ return "guest state is $st";
+ });
+}
+
+our (%file);
+our (%output);
+
+sub stash ($$) {
+ my ($data, $what) = @_;
+ my $leaf = "xenstore-ls-device--$gn--$what";
+ my $stashh = open_unique_stashfile(\$leaf);
+ print $stashh $data or die $!;
+ close $stashh or die $!;
+ $file{$what} = "$stash/$leaf";
+}
+
+sub some_xenstorels ($$$) {
+ my ($what, $massage, $cmd) = @_;
+ $output{$what} = target_cmd_output_root($ho,$cmd);
+ stash($output{$what}, "$what-raw");
+ $massage->();
+ $output{$what} = join "\n", sort split /\n/, $output{$what};
+ $output{$what} .= "\n";
+ stash($output{$what}, "$what-massaged");
+}
+
+sub our_xenstorels () {
+ some_xenstorels('ours', sub {
+ $output{ours} =~ s{^/local/domain/$domid/}{}gm;
+ }, <<END);
+ xenstore-ls -fp /local/domain/$domid/device
+END
+}
+
+sub their_xenstorels () {
+ some_xenstorels('theirs', sub {
+ $output{theirs} =~ s{\r\n}{\n}g;
+ while ($output{theirs} =~ m{\n=== calling main\(\) ===\n\n}) {
+ $output{theirs} = $'; #';
+ }
+ $output{theirs} =~ m{\n=== main\(\) returned (\d+) ===\n} or die;
+ $output{theirs} = $`;
+ die "$1 ?" if $1 ne '0';
+ $output{theirs} =~ s{^STUB \`\`\w+'' called\n}{}mg;
+ }, <<END);
+ cat /var/log/xen/console/guest-$gn.log
+END
+}
+
+sub check_output () {
+ eval {
+ our_xenstorels();
+ their_xenstorels();
+ 1;
+ };
+ if ($@) {
+ die Dumper(\%output)."$@";
+ }
+ if ($output{ours} ne $output{theirs}) {
+ system qw(diff -u), map { $file{"$_-massaged"} } qw(ours theirs);
+ die "$? COMPARISON FAILED";
+ }
+}
+
+start();
+await_end();
+check_output();
+logm("all good.");
--
1.7.10.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |