1150305Smarcel#!/usr/bin/env perl -w
2150305Smarcel#
3157622Smarcel# Copyright (c) 2005, 2006 Marcel Moolenaar
4150305Smarcel# All rights reserved.
5150305Smarcel#
6150305Smarcel# Redistribution and use in source and binary forms, with or without
7150305Smarcel# modification, are permitted provided that the following conditions
8150305Smarcel# are met:
9150305Smarcel#
10150305Smarcel# 1. Redistributions of source code must retain the above copyright
11150305Smarcel#    notice, this list of conditions and the following disclaimer.
12150305Smarcel# 2. Redistributions in binary form must reproduce the above copyright
13150305Smarcel#    notice, this list of conditions and the following disclaimer in the
14150305Smarcel#    documentation and/or other materials provided with the distribution.
15150305Smarcel#
16150305Smarcel# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17150305Smarcel# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18150305Smarcel# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19150305Smarcel# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20150305Smarcel# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21150305Smarcel# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22150305Smarcel# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23150305Smarcel# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24150305Smarcel# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25150305Smarcel# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26150305Smarcel#
27150305Smarcel# $FreeBSD: releng/10.2/tools/regression/geom_gpt/gctl.t 157622 2006-04-10 04:13:44Z marcel $
28150305Smarcel
29150305Smarcelmy $srcdir = `dirname $0`;
30150305Smarcelchomp $srcdir;
31150305Smarcel
32150308Smarcelmy $cmd = "/tmp/gctl-$$";
33150305Smarcelmy $out = "$cmd.out";
34150308Smarcelmy $disk = "/tmp/disk-$$";
35157622Smarcelmy $mntpt = "/tmp/mount-$$";
36150305Smarcel
37150308Smarcelmy %steps = (
38151172Smarcel    "000" => "gctl",
39151172Smarcel    "001" => "gctl verb=bogus",
40151172Smarcel    "010" => "gctl verb=create",
41151172Smarcel    "011" => "gctl verb=create provider=bogus",
42151172Smarcel    "020" => "mdcfg create pristine",
43152345Smarcel    "021" => "gctl verb=create provider=%dev% entries=-1",
44152345Smarcel    "022" => "gctl verb=create provider=%dev% entries=128",
45152345Smarcel    "023" => "gctl verb=create provider=%dev%",
46157622Smarcel    "024" => "gctl verb=modify geom=%dev%",
47152402Smarcel    "025" => "conf",
48151172Smarcel    "030" => "gctl verb=add",
49151172Smarcel    "031" => "gctl verb=add geom=bogus",
50152345Smarcel    "032" => "gctl verb=add geom=%dev%",
51152345Smarcel    "033" => "gctl verb=add geom=%dev% type=bogus",
52152345Smarcel    "034" => "gctl verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace",
53152345Smarcel    "035" => "gctl verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=1",
54152345Smarcel    "036" => "gctl verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=34",
55152345Smarcel    "037" => "gctl verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=34 end=12345678",
56157622Smarcel    "038" => "gctl verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=162 end=417 entry=129",
57157622Smarcel    "039" => "gctl verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=162 end=417 entry:8=5",
58157622Smarcel    "040" => "gctl verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=34 end=161 entry=5",
59157622Smarcel    "041" => "gctl verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=34 end=546",
60157622Smarcel    "042" => "gctl verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=162 end=417",
61157622Smarcel    "043" => "gctl verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=100 end=300",
62157622Smarcel    "044" => "gctl verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=300 end=500",
63157622Smarcel    "045" => "gctl verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=34 end=161 entry:8",
64157622Smarcel    "046" => "gctl verb=add geom=%dev% type=d2bd4509-c4ff-11da-b4cc-00306e39b62f start=418 end=546 entry:8",
65157622Smarcel    "047" => "conf",
66157622Smarcel    "050" => "gctl verb=remove geom=%dev% entry=5",
67157622Smarcel    "051" => "gctl verb=remove geom=%dev% entry=2",
68157622Smarcel    "052" => "gctl verb=remove geom=%dev% entry=1",
69157622Smarcel    "053" => "gctl verb=remove geom=%dev% entry=1",
70157622Smarcel    "054" => "conf",
71157622Smarcel    "060" => "gctl verb=add geom=%dev% type=516e7cb6-6ecf-11d6-8ff8-00022d09712b start=34 end=546 entry:8=1",
72157622Smarcel    "061" => "mount %dev%p1",
73157622Smarcel    "062" => "gctl verb=remove geom=%dev% entry=1",
74157622Smarcel    "063" => "umount %dev%p1",
75157622Smarcel    "064" => "gctl verb=remove geom=%dev% entry=1",
76157622Smarcel    "065" => "conf",
77151172Smarcel    "100" => "mdcfg destroy",
78151172Smarcel    "110" => "mdcfg create corrupted",
79152345Smarcel    "111" => "gctl verb=add geom=%dev%",
80151172Smarcel    "120" => "mdcfg destroy",
81150305Smarcel);
82150305Smarcel
83150308Smarcelmy %result = (
84151172Smarcel    "000" => "FAIL Verb missing",
85157622Smarcel    "001" => "FAIL 22 verb 'bogus'",
86151172Smarcel    "010" => "FAIL 87 provider",
87151172Smarcel    "011" => "FAIL 22 provider 'bogus'",
88151172Smarcel    "020" => "",
89151172Smarcel    "021" => "FAIL 22 entries -1",
90151172Smarcel    "022" => "PASS",
91152345Smarcel    "023" => "FAIL 17 geom '%dev%'",
92157622Smarcel    "024" => "FAIL 87 entry",
93157622Smarcel    "025" => "b1856477950e5786898c8f01361196cf",
94151172Smarcel    "030" => "FAIL 87 geom",
95151172Smarcel    "031" => "FAIL 22 geom 'bogus'",
96151172Smarcel    "032" => "FAIL 87 type",
97151172Smarcel    "033" => "FAIL 22 type 'bogus'",
98151172Smarcel    "034" => "FAIL 87 start",
99151172Smarcel    "035" => "FAIL 22 start 1",
100151172Smarcel    "036" => "FAIL 87 end",
101151172Smarcel    "037" => "FAIL 22 end 12345678",
102157622Smarcel    "038" => "FAIL 22 entry 129",
103157622Smarcel    "039" => "PASS entry=5",
104157622Smarcel    "040" => "FAIL 17 entry 5",
105157622Smarcel    "041" => "FAIL 28 start/end 34/546",
106157622Smarcel    "042" => "FAIL 28 start/end 162/417",
107157622Smarcel    "043" => "FAIL 28 start/end 100/300",
108157622Smarcel    "044" => "FAIL 28 start/end 300/500",
109157622Smarcel    "045" => "PASS entry=1",
110157622Smarcel    "046" => "PASS entry=2",
111157622Smarcel    "047" => "50783a39eecfc62a29db24381e12b9d8",
112157622Smarcel    "050" => "PASS",
113157622Smarcel    "051" => "PASS",
114157622Smarcel    "052" => "PASS",
115157622Smarcel    "053" => "FAIL 2 entry 1",
116157622Smarcel    "054" => "b1856477950e5786898c8f01361196cf",
117157622Smarcel    "060" => "PASS",
118157622Smarcel    "061" => "PASS",
119157622Smarcel    "062" => "FAIL 16",
120157622Smarcel    "063" => "PASS",
121157622Smarcel    "064" => "PASS",
122157622Smarcel    "065" => "b1856477950e5786898c8f01361196cf",
123151172Smarcel    "100" => "",
124151172Smarcel    "110" => "",
125152345Smarcel    "111" => "FAIL 6 geom '%dev%'",
126151172Smarcel    "120" => "",
127150308Smarcel);
128150308Smarcel
129150308Smarcelmy $verbose = "";
130150308Smarcelif (exists $ENV{'TEST_VERBOSE'}) {
131150308Smarcel    $verbose = "-v";
132150305Smarcel}
133150305Smarcel
134150305Smarcel# Compile the driver...
135150305Smarcelmy $st = system("cc -o $cmd -g $srcdir/test.c -lgeom");
136150305Smarcelif ($st != 0) {
137150305Smarcel    print "1..0 # SKIP error compiling test.c\n";
138150305Smarcel    exit 0;
139150305Smarcel}
140150305Smarcel
141150305Smarcel# Make sure we have permission to use gctl...
142150305Smarcelif (`$cmd` =~ "^FAIL Permission denied") {
143150305Smarcel    print "1..0 # SKIP not enough permission\n";
144150305Smarcel    unlink $cmd;
145150305Smarcel    exit 0;
146150305Smarcel}
147150305Smarcel
148150308Smarcel$count = keys (%steps);
149150305Smarcelprint "1..$count\n";
150150305Smarcel
151151172Smarcelmy $nr = 1;
152152345Smarcelmy $dev = "n/a";
153151172Smarcelforeach my $key (sort keys %steps) {
154151172Smarcel    my ($action, $args) = split(/ /, $steps{$key}, 2);
155152345Smarcel    my $res = $result{$key};
156151172Smarcel    $args = "" if (not defined $args);
157152345Smarcel    $args =~ s/%dev%/$dev/g;
158152345Smarcel    $res =~ s/%dev%/$dev/g;
159152345Smarcel
160157622Smarcel    if ($action =~ "^gctl") {
161151172Smarcel	system("$cmd $verbose $args | tee $out 2>&1");
162150308Smarcel	$st = `tail -1 $out`;
163151172Smarcel	if ($st =~ "^$res") {
164151172Smarcel	    print "ok $nr \# gctl($key)\n";
165150308Smarcel	} else {
166151172Smarcel	    print "not ok $nr \# gctl($key) - $st\n";
167150308Smarcel	}
168150308Smarcel	unlink $out;
169157622Smarcel    } elsif ($action =~ "^mdcfg") {
170157622Smarcel	if ($args =~ "^create") {
171150308Smarcel	    system("dd if=/dev/zero of=$disk count=1024 2>&1");
172151172Smarcel	    if ($args =~ "corrupted") {
173151172Smarcel		system("gpt create -p $disk");
174151172Smarcel	    }
175152345Smarcel	    $dev = `mdconfig -a -t vnode -f $disk`;
176152345Smarcel	    chomp $dev;
177157622Smarcel	} elsif ($args =~ "^destroy") {
178152345Smarcel	    $dev =~ s/md/-u /g;
179152345Smarcel	    system("mdconfig -d $dev");
180150308Smarcel	    unlink $disk;
181152345Smarcel	    $dev = "n/a";
182150308Smarcel	}
183151172Smarcel	print "ok $nr \# mdcfg($key)\n";
184157622Smarcel    } elsif ($action =~ "^conf") {
185157622Smarcel	system("sysctl -b kern.geom.conftxt | grep -a $dev | sed -e s:$disk:DISK:g -e s:$dev:DEV:g | sort | md5 -p | tee $out 2>&1");
186157622Smarcel	$st = `tail -1 $out`;
187157622Smarcel	if ($st =~ "^$res") {
188157622Smarcel	    print "ok $nr \# conf($key)\n";
189157622Smarcel	} else {
190157622Smarcel	    print "not ok $nr \# conf($key) - $st\n";
191157622Smarcel	}
192157622Smarcel	unlink $out;
193157622Smarcel    } elsif ($action =~ "^mount") {
194157622Smarcel	    system("mkdir $mntpt-$args");
195157622Smarcel	    system("newfs $args");
196157622Smarcel	    system("mount -t ufs /dev/$args $mntpt-$args");
197157622Smarcel	    print "ok $nr \# mount($key)\n";
198157622Smarcel    } elsif ($action =~ "^umount") {
199157622Smarcel	    system("umount $mntpt-$args");
200157622Smarcel	    system("rmdir $mntpt-$args");
201157622Smarcel	    print "ok $nr \# umount($key)\n";
202150308Smarcel    }
203151172Smarcel    $nr += 1;
204150305Smarcel}
205150305Smarcel
206150305Smarcelunlink $cmd;
207150305Smarcelexit 0;
208