xref: /freebsd/tools/regression/geom_gpt/gctl_test.t (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
1acca703aSEnji Cooper#!/usr/bin/env perl
2e02a067aSEnji Cooper#
3e02a067aSEnji Cooper# Copyright (c) 2005, 2006 Marcel Moolenaar
4e02a067aSEnji Cooper# All rights reserved.
5e02a067aSEnji Cooper#
6e02a067aSEnji Cooper# Redistribution and use in source and binary forms, with or without
7e02a067aSEnji Cooper# modification, are permitted provided that the following conditions
8e02a067aSEnji Cooper# are met:
9e02a067aSEnji Cooper#
10e02a067aSEnji Cooper# 1. Redistributions of source code must retain the above copyright
11e02a067aSEnji Cooper#    notice, this list of conditions and the following disclaimer.
12e02a067aSEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright
13e02a067aSEnji Cooper#    notice, this list of conditions and the following disclaimer in the
14e02a067aSEnji Cooper#    documentation and/or other materials provided with the distribution.
15e02a067aSEnji Cooper#
16e02a067aSEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17e02a067aSEnji Cooper# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18e02a067aSEnji Cooper# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19e02a067aSEnji Cooper# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20e02a067aSEnji Cooper# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21e02a067aSEnji Cooper# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22e02a067aSEnji Cooper# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23e02a067aSEnji Cooper# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24e02a067aSEnji Cooper# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25e02a067aSEnji Cooper# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26e02a067aSEnji Cooper#
27e02a067aSEnji Cooper
28acca703aSEnji Cooperuse strict;
29acca703aSEnji Cooperuse warnings;
30acca703aSEnji Cooper
319940eaaaSEnji Cooperuse File::Basename;
329940eaaaSEnji Cooper
33e02a067aSEnji Coopermy $disk = "/tmp/disk-$$";
349940eaaaSEnji Coopermy $mntpt_prefix = "/tmp/mount-$$";
35e02a067aSEnji Cooper
36e02a067aSEnji Coopermy %steps = (
37e15b2a78SEnji Cooper    "000" => "gctl class=PART",
38e15b2a78SEnji Cooper    "001" => "gctl class=PART verb=bogus",
39e15b2a78SEnji Cooper    "010" => "gctl class=PART verb=create",
40e15b2a78SEnji Cooper    "011" => "gctl class=PART verb=create provider=bogus",
41e02a067aSEnji Cooper    "020" => "mdcfg create pristine",
42e15b2a78SEnji Cooper    "021" => "gctl class=PART verb=create provider=%dev% entries=-1",
43e15b2a78SEnji Cooper    "022" => "gctl class=PART verb=create provider=%dev% entries=128",
44e15b2a78SEnji Cooper    "023" => "gctl class=PART verb=create provider=%dev%",
45e15b2a78SEnji Cooper    "024" => "gctl class=PART verb=modify geom=%dev%",
46e02a067aSEnji Cooper    "025" => "conf",
47e15b2a78SEnji Cooper    "030" => "gctl class=PART verb=add",
48e15b2a78SEnji Cooper    "031" => "gctl class=PART verb=add geom=bogus",
49e15b2a78SEnji Cooper    "032" => "gctl class=PART verb=add geom=%dev%",
50e15b2a78SEnji Cooper    "033" => "gctl class=PART verb=add geom=%dev% type=bogus",
51e15b2a78SEnji Cooper    "034" => "gctl class=PART verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace",
52e15b2a78SEnji Cooper    "035" => "gctl class=PART verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=1",
53e15b2a78SEnji Cooper    "036" => "gctl class=PART verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=34",
54e15b2a78SEnji Cooper    "037" => "gctl class=PART verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=34 end=12345678",
55e15b2a78SEnji Cooper    "038" => "gctl class=PART verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=162 end=417 entry=129",
56e15b2a78SEnji Cooper    "039" => "gctl class=PART verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=162 end=417 entry:8=5",
57e15b2a78SEnji Cooper    "040" => "gctl class=PART verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=34 end=161 entry=5",
58e15b2a78SEnji Cooper    "041" => "gctl class=PART verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=34 end=546",
59e15b2a78SEnji Cooper    "042" => "gctl class=PART verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=162 end=417",
60e15b2a78SEnji Cooper    "043" => "gctl class=PART verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=100 end=300",
61e15b2a78SEnji Cooper    "044" => "gctl class=PART verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=300 end=500",
62e15b2a78SEnji Cooper    "045" => "gctl class=PART verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=34 end=161 entry:8",
63e15b2a78SEnji Cooper    "046" => "gctl class=PART verb=add geom=%dev% type=d2bd4509-c4ff-11da-b4cc-00306e39b62f start=418 end=546 entry:8",
64e02a067aSEnji Cooper    "047" => "conf",
65e15b2a78SEnji Cooper    "050" => "gctl class=PART verb=remove geom=%dev% entry=5",
66e15b2a78SEnji Cooper    "051" => "gctl class=PART verb=remove geom=%dev% entry=2",
67e15b2a78SEnji Cooper    "052" => "gctl class=PART verb=remove geom=%dev% entry=1",
68e15b2a78SEnji Cooper    "053" => "gctl class=PART verb=remove geom=%dev% entry=1",
69e02a067aSEnji Cooper    "054" => "conf",
70e15b2a78SEnji Cooper    "060" => "gctl class=PART verb=add geom=%dev% type=516e7cb6-6ecf-11d6-8ff8-00022d09712b start=34 end=546 entry:8=1",
71e02a067aSEnji Cooper    "061" => "mount %dev%p1",
72e15b2a78SEnji Cooper    "062" => "gctl class=PART verb=delete geom=%dev% entry=1",
73e02a067aSEnji Cooper    "063" => "umount %dev%p1",
74e15b2a78SEnji Cooper    "064" => "gctl class=PART verb=delete geom=%dev% entry=1",
75e02a067aSEnji Cooper    "065" => "conf",
76e02a067aSEnji Cooper    "100" => "mdcfg destroy",
77e02a067aSEnji Cooper    "110" => "mdcfg create corrupted",
78e15b2a78SEnji Cooper    "111" => "gctl class=PART verb=add geom=%dev%",
79e02a067aSEnji Cooper    "120" => "mdcfg destroy",
80e02a067aSEnji Cooper);
81e02a067aSEnji Cooper
82e02a067aSEnji Coopermy %result = (
83e02a067aSEnji Cooper    "000" => "FAIL Verb missing",
84e02a067aSEnji Cooper    "001" => "FAIL 22 verb 'bogus'",
85e02a067aSEnji Cooper    "010" => "FAIL 87 provider",
86e02a067aSEnji Cooper    "011" => "FAIL 22 provider 'bogus'",
87e02a067aSEnji Cooper    "020" => "",
88e02a067aSEnji Cooper    "021" => "FAIL 22 entries -1",
89e02a067aSEnji Cooper    "022" => "PASS",
90e02a067aSEnji Cooper    "023" => "FAIL 17 geom '%dev%'",
91e02a067aSEnji Cooper    "024" => "FAIL 87 entry",
92e02a067aSEnji Cooper    "025" => "b1856477950e5786898c8f01361196cf",
93e02a067aSEnji Cooper    "030" => "FAIL 87 geom",
94e02a067aSEnji Cooper    "031" => "FAIL 22 geom 'bogus'",
95e02a067aSEnji Cooper    "032" => "FAIL 87 type",
96e02a067aSEnji Cooper    "033" => "FAIL 22 type 'bogus'",
97e02a067aSEnji Cooper    "034" => "FAIL 87 start",
98e02a067aSEnji Cooper    "035" => "FAIL 22 start 1",
99e02a067aSEnji Cooper    "036" => "FAIL 87 end",
100e02a067aSEnji Cooper    "037" => "FAIL 22 end 12345678",
101e02a067aSEnji Cooper    "038" => "FAIL 22 entry 129",
102e02a067aSEnji Cooper    "039" => "PASS entry=5",
103e02a067aSEnji Cooper    "040" => "FAIL 17 entry 5",
104e02a067aSEnji Cooper    "041" => "FAIL 28 start/end 34/546",
105e02a067aSEnji Cooper    "042" => "FAIL 28 start/end 162/417",
106e02a067aSEnji Cooper    "043" => "FAIL 28 start/end 100/300",
107e02a067aSEnji Cooper    "044" => "FAIL 28 start/end 300/500",
108e02a067aSEnji Cooper    "045" => "PASS entry=1",
109e02a067aSEnji Cooper    "046" => "PASS entry=2",
110e02a067aSEnji Cooper    "047" => "50783a39eecfc62a29db24381e12b9d8",
111e02a067aSEnji Cooper    "050" => "PASS",
112e02a067aSEnji Cooper    "051" => "PASS",
113e02a067aSEnji Cooper    "052" => "PASS",
114e02a067aSEnji Cooper    "053" => "FAIL 2 entry 1",
115e02a067aSEnji Cooper    "054" => "b1856477950e5786898c8f01361196cf",
116e02a067aSEnji Cooper    "060" => "PASS",
117e02a067aSEnji Cooper    "061" => "PASS",
118e02a067aSEnji Cooper    "062" => "FAIL 16",
119e02a067aSEnji Cooper    "063" => "PASS",
120e02a067aSEnji Cooper    "064" => "PASS",
121e02a067aSEnji Cooper    "065" => "b1856477950e5786898c8f01361196cf",
122e02a067aSEnji Cooper    "100" => "",
123e02a067aSEnji Cooper    "110" => "",
124e02a067aSEnji Cooper    "111" => "FAIL 6 geom '%dev%'",
125e02a067aSEnji Cooper    "120" => "",
126e02a067aSEnji Cooper);
127e02a067aSEnji Cooper
128e02a067aSEnji Coopermy $verbose = "";
129e02a067aSEnji Cooperif (exists $ENV{'TEST_VERBOSE'}) {
130e02a067aSEnji Cooper    $verbose = "-v";
131e02a067aSEnji Cooper}
132e02a067aSEnji Cooper
133e02a067aSEnji Cooper# Compile the driver...
134b58910a0SEnji Coopermy $st = system("make obj && make all");
135e02a067aSEnji Cooperif ($st != 0) {
136e02a067aSEnji Cooper    print "1..0 # SKIP error compiling test.c\n";
137e02a067aSEnji Cooper    exit 0;
138e02a067aSEnji Cooper}
139b58910a0SEnji Cooperchomp(my $cmd = `make '-V\${.OBJDIR}/\${PROG}'`);
140b58910a0SEnji Cooper
1419940eaaaSEnji Coopermy $out = basename($cmd) . ".out";
142e02a067aSEnji Cooper
143e02a067aSEnji Cooper# Make sure we have permission to use gctl...
144e02a067aSEnji Cooperif (`$cmd` =~ "^FAIL Permission denied") {
145acca703aSEnji Cooper    print "1..0 # SKIP insufficient permissions\n";
146*22184bfaSEnji Cooper    exit 0;
147*22184bfaSEnji Cooper}
148*22184bfaSEnji Cooper
149*22184bfaSEnji Coopermy $debugflags_oid = 'kern.geom.debugflags';
150*22184bfaSEnji Cooperchomp(my $old_geom_debugflags = `sysctl -n $debugflags_oid`);
151*22184bfaSEnji Cooperif ($? != 0) {
152*22184bfaSEnji Cooper    print "1..0 # SKIP could not query $debugflags_oid\n";
153*22184bfaSEnji Cooper    exit 0;
154*22184bfaSEnji Cooper}
155*22184bfaSEnji Cooperif (system("sysctl $debugflags_oid=0") != 0) {
156*22184bfaSEnji Cooper    print "1..0 # SKIP could not set $debugflags_oid=0\n";
157e02a067aSEnji Cooper    exit 0;
158e02a067aSEnji Cooper}
159e02a067aSEnji Cooper
160acca703aSEnji Coopermy $count = keys (%steps);
161e02a067aSEnji Cooperprint "1..$count\n";
162e02a067aSEnji Cooper
163e02a067aSEnji Coopermy $nr = 1;
164e02a067aSEnji Coopermy $dev = "n/a";
165e02a067aSEnji Cooperforeach my $key (sort keys %steps) {
166e02a067aSEnji Cooper    my ($action, $args) = split(/ /, $steps{$key}, 2);
167e02a067aSEnji Cooper    my $res = $result{$key};
168e02a067aSEnji Cooper    $args = "" if (not defined $args);
169e02a067aSEnji Cooper    $args =~ s/%dev%/$dev/g;
170e02a067aSEnji Cooper    $res =~ s/%dev%/$dev/g;
171e02a067aSEnji Cooper
172e02a067aSEnji Cooper    if ($action =~ "^gctl") {
173d1f57d59SEnji Cooper	my $errmsg = "";
174e02a067aSEnji Cooper	system("$cmd $verbose $args | tee $out 2>&1");
175d1f57d59SEnji Cooper	chomp($st = `tail -1 $out`);
176d1f57d59SEnji Cooper	if ($st ne $res) {
177d1f57d59SEnji Cooper	    $errmsg = "\"$st\" (actual) != \"$res\" (expected)\n";
178e02a067aSEnji Cooper	}
179d1f57d59SEnji Cooper	printf("%sok $nr \# gctl($key)%s\n",
180d1f57d59SEnji Cooper	    ($errmsg eq "" ? "" : "not "),
181d1f57d59SEnji Cooper	    ($errmsg eq "" ? "" : " - $errmsg"));
182e02a067aSEnji Cooper	unlink $out;
183e02a067aSEnji Cooper    } elsif ($action =~ "^mdcfg") {
18467b1f73fSEnji Cooper	my $errmsg = "";
185e02a067aSEnji Cooper	if ($args =~ "^create") {
18667b1f73fSEnji Cooper	    # NOTE: `count=1024` affects $key => {"025" "054", "065"}.
18767b1f73fSEnji Cooper	    if (system("dd if=/dev/zero of=$disk count=1024 2>&1") == 0) {
18867b1f73fSEnji Cooper		chomp($dev = `mdconfig -a -t vnode -f $disk`);
18967b1f73fSEnji Cooper		if ($? == 0) {
19067b1f73fSEnji Cooper		    if (system("gpart create -s GPT $dev") != 0) {
19167b1f73fSEnji Cooper			$errmsg = "gpart create failed";
192e02a067aSEnji Cooper		    }
19367b1f73fSEnji Cooper		} else {
19467b1f73fSEnji Cooper		    $errmsg = "mdconfig -a failed";
19567b1f73fSEnji Cooper		}
19667b1f73fSEnji Cooper	    } else {
19767b1f73fSEnji Cooper		$errmsg = "dd failed";
19867b1f73fSEnji Cooper	    }
199e02a067aSEnji Cooper	} elsif ($args =~ "^destroy") {
200e02a067aSEnji Cooper	    $dev =~ s/md/-u /g;
20167b1f73fSEnji Cooper	    if (system("mdconfig -d $dev") != 0) {
20267b1f73fSEnji Cooper		$errmsg = "mdconfig -d failed";
20367b1f73fSEnji Cooper	    }
204e02a067aSEnji Cooper	    unlink $disk;
205e02a067aSEnji Cooper	    $dev = "n/a";
206e02a067aSEnji Cooper	}
20767b1f73fSEnji Cooper	printf("%sok $nr # mdcfg($key)%s\n",
20867b1f73fSEnji Cooper	    ($errmsg eq "" ? "" : "not "),
20967b1f73fSEnji Cooper	    ($errmsg eq "" ? "" : " - $errmsg"));
210e02a067aSEnji Cooper    } elsif ($action =~ "^conf") {
211e02a067aSEnji Cooper	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");
212e02a067aSEnji Cooper	$st = `tail -1 $out`;
213e02a067aSEnji Cooper	if ($st =~ "^$res") {
214e02a067aSEnji Cooper	    print "ok $nr \# conf($key)\n";
215e02a067aSEnji Cooper	} else {
216e02a067aSEnji Cooper	    print "not ok $nr \# conf($key) - $st\n";
217e02a067aSEnji Cooper	}
218e02a067aSEnji Cooper	unlink $out;
219e02a067aSEnji Cooper    } elsif ($action =~ "^mount") {
220d1f57d59SEnji Cooper	my $errmsg = "";
221d1f57d59SEnji Cooper	mkdir("$mntpt_prefix-$args");
222d1f57d59SEnji Cooper	if (system("newfs /dev/$args") == 0) {
223d1f57d59SEnji Cooper	    if (system("mount /dev/$args $mntpt_prefix-$args") != 0) {
224d1f57d59SEnji Cooper		$errmsg = "mount failed";
225d1f57d59SEnji Cooper	    }
226d1f57d59SEnji Cooper	} else {
227d1f57d59SEnji Cooper	    $errmsg = "newfs failed";
228d1f57d59SEnji Cooper	}
229d1f57d59SEnji Cooper	printf("%sok $nr # mount($key)%s\n",
230d1f57d59SEnji Cooper	    ($errmsg eq "" ? "" : "not "),
231d1f57d59SEnji Cooper	    ($errmsg eq "" ? "" : " - $errmsg"));
232e02a067aSEnji Cooper    } elsif ($action =~ "^umount") {
2339940eaaaSEnji Cooper	system("umount $mntpt_prefix-$args");
2349940eaaaSEnji Cooper	system("rmdir $mntpt_prefix-$args");
235e02a067aSEnji Cooper	print "ok $nr \# umount($key)\n";
236e02a067aSEnji Cooper    }
237e02a067aSEnji Cooper    $nr += 1;
238e02a067aSEnji Cooper}
239*22184bfaSEnji CooperEND {
240*22184bfaSEnji Cooper    system("sysctl $debugflags_oid=$old_geom_debugflags");
241*22184bfaSEnji Cooper    unlink($cmd);
242*22184bfaSEnji Cooper}
243