xref: /freebsd/tools/regression/geom_gpt/gctl_test.t (revision e15b2a7854b77974f32d6a82faf31b0abf08655a)
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# $FreeBSD$
28e02a067aSEnji Cooper
29acca703aSEnji Cooperuse strict;
30acca703aSEnji Cooperuse warnings;
31acca703aSEnji Cooper
329940eaaaSEnji Cooperuse File::Basename;
339940eaaaSEnji Cooper
34e02a067aSEnji Coopermy $disk = "/tmp/disk-$$";
359940eaaaSEnji Coopermy $mntpt_prefix = "/tmp/mount-$$";
36e02a067aSEnji Cooper
37e02a067aSEnji Coopermy %steps = (
38*e15b2a78SEnji Cooper    "000" => "gctl class=PART",
39*e15b2a78SEnji Cooper    "001" => "gctl class=PART verb=bogus",
40*e15b2a78SEnji Cooper    "010" => "gctl class=PART verb=create",
41*e15b2a78SEnji Cooper    "011" => "gctl class=PART verb=create provider=bogus",
42e02a067aSEnji Cooper    "020" => "mdcfg create pristine",
43*e15b2a78SEnji Cooper    "021" => "gctl class=PART verb=create provider=%dev% entries=-1",
44*e15b2a78SEnji Cooper    "022" => "gctl class=PART verb=create provider=%dev% entries=128",
45*e15b2a78SEnji Cooper    "023" => "gctl class=PART verb=create provider=%dev%",
46*e15b2a78SEnji Cooper    "024" => "gctl class=PART verb=modify geom=%dev%",
47e02a067aSEnji Cooper    "025" => "conf",
48*e15b2a78SEnji Cooper    "030" => "gctl class=PART verb=add",
49*e15b2a78SEnji Cooper    "031" => "gctl class=PART verb=add geom=bogus",
50*e15b2a78SEnji Cooper    "032" => "gctl class=PART verb=add geom=%dev%",
51*e15b2a78SEnji Cooper    "033" => "gctl class=PART verb=add geom=%dev% type=bogus",
52*e15b2a78SEnji Cooper    "034" => "gctl class=PART verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace",
53*e15b2a78SEnji Cooper    "035" => "gctl class=PART verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=1",
54*e15b2a78SEnji Cooper    "036" => "gctl class=PART verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=34",
55*e15b2a78SEnji Cooper    "037" => "gctl class=PART verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=34 end=12345678",
56*e15b2a78SEnji Cooper    "038" => "gctl class=PART verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=162 end=417 entry=129",
57*e15b2a78SEnji Cooper    "039" => "gctl class=PART verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=162 end=417 entry:8=5",
58*e15b2a78SEnji Cooper    "040" => "gctl class=PART verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=34 end=161 entry=5",
59*e15b2a78SEnji Cooper    "041" => "gctl class=PART verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=34 end=546",
60*e15b2a78SEnji Cooper    "042" => "gctl class=PART verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=162 end=417",
61*e15b2a78SEnji Cooper    "043" => "gctl class=PART verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=100 end=300",
62*e15b2a78SEnji Cooper    "044" => "gctl class=PART verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=300 end=500",
63*e15b2a78SEnji Cooper    "045" => "gctl class=PART verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=34 end=161 entry:8",
64*e15b2a78SEnji Cooper    "046" => "gctl class=PART verb=add geom=%dev% type=d2bd4509-c4ff-11da-b4cc-00306e39b62f start=418 end=546 entry:8",
65e02a067aSEnji Cooper    "047" => "conf",
66*e15b2a78SEnji Cooper    "050" => "gctl class=PART verb=remove geom=%dev% entry=5",
67*e15b2a78SEnji Cooper    "051" => "gctl class=PART verb=remove geom=%dev% entry=2",
68*e15b2a78SEnji Cooper    "052" => "gctl class=PART verb=remove geom=%dev% entry=1",
69*e15b2a78SEnji Cooper    "053" => "gctl class=PART verb=remove geom=%dev% entry=1",
70e02a067aSEnji Cooper    "054" => "conf",
71*e15b2a78SEnji Cooper    "060" => "gctl class=PART verb=add geom=%dev% type=516e7cb6-6ecf-11d6-8ff8-00022d09712b start=34 end=546 entry:8=1",
72e02a067aSEnji Cooper    "061" => "mount %dev%p1",
73*e15b2a78SEnji Cooper    "062" => "gctl class=PART verb=delete geom=%dev% entry=1",
74e02a067aSEnji Cooper    "063" => "umount %dev%p1",
75*e15b2a78SEnji Cooper    "064" => "gctl class=PART verb=delete geom=%dev% entry=1",
76e02a067aSEnji Cooper    "065" => "conf",
77e02a067aSEnji Cooper    "100" => "mdcfg destroy",
78e02a067aSEnji Cooper    "110" => "mdcfg create corrupted",
79*e15b2a78SEnji Cooper    "111" => "gctl class=PART verb=add geom=%dev%",
80e02a067aSEnji Cooper    "120" => "mdcfg destroy",
81e02a067aSEnji Cooper);
82e02a067aSEnji Cooper
83e02a067aSEnji Coopermy %result = (
84e02a067aSEnji Cooper    "000" => "FAIL Verb missing",
85e02a067aSEnji Cooper    "001" => "FAIL 22 verb 'bogus'",
86e02a067aSEnji Cooper    "010" => "FAIL 87 provider",
87e02a067aSEnji Cooper    "011" => "FAIL 22 provider 'bogus'",
88e02a067aSEnji Cooper    "020" => "",
89e02a067aSEnji Cooper    "021" => "FAIL 22 entries -1",
90e02a067aSEnji Cooper    "022" => "PASS",
91e02a067aSEnji Cooper    "023" => "FAIL 17 geom '%dev%'",
92e02a067aSEnji Cooper    "024" => "FAIL 87 entry",
93e02a067aSEnji Cooper    "025" => "b1856477950e5786898c8f01361196cf",
94e02a067aSEnji Cooper    "030" => "FAIL 87 geom",
95e02a067aSEnji Cooper    "031" => "FAIL 22 geom 'bogus'",
96e02a067aSEnji Cooper    "032" => "FAIL 87 type",
97e02a067aSEnji Cooper    "033" => "FAIL 22 type 'bogus'",
98e02a067aSEnji Cooper    "034" => "FAIL 87 start",
99e02a067aSEnji Cooper    "035" => "FAIL 22 start 1",
100e02a067aSEnji Cooper    "036" => "FAIL 87 end",
101e02a067aSEnji Cooper    "037" => "FAIL 22 end 12345678",
102e02a067aSEnji Cooper    "038" => "FAIL 22 entry 129",
103e02a067aSEnji Cooper    "039" => "PASS entry=5",
104e02a067aSEnji Cooper    "040" => "FAIL 17 entry 5",
105e02a067aSEnji Cooper    "041" => "FAIL 28 start/end 34/546",
106e02a067aSEnji Cooper    "042" => "FAIL 28 start/end 162/417",
107e02a067aSEnji Cooper    "043" => "FAIL 28 start/end 100/300",
108e02a067aSEnji Cooper    "044" => "FAIL 28 start/end 300/500",
109e02a067aSEnji Cooper    "045" => "PASS entry=1",
110e02a067aSEnji Cooper    "046" => "PASS entry=2",
111e02a067aSEnji Cooper    "047" => "50783a39eecfc62a29db24381e12b9d8",
112e02a067aSEnji Cooper    "050" => "PASS",
113e02a067aSEnji Cooper    "051" => "PASS",
114e02a067aSEnji Cooper    "052" => "PASS",
115e02a067aSEnji Cooper    "053" => "FAIL 2 entry 1",
116e02a067aSEnji Cooper    "054" => "b1856477950e5786898c8f01361196cf",
117e02a067aSEnji Cooper    "060" => "PASS",
118e02a067aSEnji Cooper    "061" => "PASS",
119e02a067aSEnji Cooper    "062" => "FAIL 16",
120e02a067aSEnji Cooper    "063" => "PASS",
121e02a067aSEnji Cooper    "064" => "PASS",
122e02a067aSEnji Cooper    "065" => "b1856477950e5786898c8f01361196cf",
123e02a067aSEnji Cooper    "100" => "",
124e02a067aSEnji Cooper    "110" => "",
125e02a067aSEnji Cooper    "111" => "FAIL 6 geom '%dev%'",
126e02a067aSEnji Cooper    "120" => "",
127e02a067aSEnji Cooper);
128e02a067aSEnji Cooper
129e02a067aSEnji Coopermy $verbose = "";
130e02a067aSEnji Cooperif (exists $ENV{'TEST_VERBOSE'}) {
131e02a067aSEnji Cooper    $verbose = "-v";
132e02a067aSEnji Cooper}
133e02a067aSEnji Cooper
134e02a067aSEnji Cooper# Compile the driver...
135b58910a0SEnji Coopermy $st = system("make obj && make all");
136e02a067aSEnji Cooperif ($st != 0) {
137e02a067aSEnji Cooper    print "1..0 # SKIP error compiling test.c\n";
138e02a067aSEnji Cooper    exit 0;
139e02a067aSEnji Cooper}
140b58910a0SEnji Cooperchomp(my $cmd = `make '-V\${.OBJDIR}/\${PROG}'`);
141b58910a0SEnji Cooper
1429940eaaaSEnji Coopermy $out = basename($cmd) . ".out";
143e02a067aSEnji Cooper
144e02a067aSEnji Cooper# Make sure we have permission to use gctl...
145e02a067aSEnji Cooperif (`$cmd` =~ "^FAIL Permission denied") {
146acca703aSEnji Cooper    print "1..0 # SKIP insufficient permissions\n";
147e02a067aSEnji Cooper    unlink $cmd;
148e02a067aSEnji Cooper    exit 0;
149e02a067aSEnji Cooper}
150e02a067aSEnji Cooper
151acca703aSEnji Coopermy $count = keys (%steps);
152e02a067aSEnji Cooperprint "1..$count\n";
153e02a067aSEnji Cooper
154e02a067aSEnji Coopermy $nr = 1;
155e02a067aSEnji Coopermy $dev = "n/a";
156e02a067aSEnji Cooperforeach my $key (sort keys %steps) {
157e02a067aSEnji Cooper    my ($action, $args) = split(/ /, $steps{$key}, 2);
158e02a067aSEnji Cooper    my $res = $result{$key};
159e02a067aSEnji Cooper    $args = "" if (not defined $args);
160e02a067aSEnji Cooper    $args =~ s/%dev%/$dev/g;
161e02a067aSEnji Cooper    $res =~ s/%dev%/$dev/g;
162e02a067aSEnji Cooper
163e02a067aSEnji Cooper    if ($action =~ "^gctl") {
164d1f57d59SEnji Cooper	my $errmsg = "";
165e02a067aSEnji Cooper	system("$cmd $verbose $args | tee $out 2>&1");
166d1f57d59SEnji Cooper	chomp($st = `tail -1 $out`);
167d1f57d59SEnji Cooper	if ($st ne $res) {
168d1f57d59SEnji Cooper	    $errmsg = "\"$st\" (actual) != \"$res\" (expected)\n";
169e02a067aSEnji Cooper	}
170d1f57d59SEnji Cooper	printf("%sok $nr \# gctl($key)%s\n",
171d1f57d59SEnji Cooper	    ($errmsg eq "" ? "" : "not "),
172d1f57d59SEnji Cooper	    ($errmsg eq "" ? "" : " - $errmsg"));
173e02a067aSEnji Cooper	unlink $out;
174e02a067aSEnji Cooper    } elsif ($action =~ "^mdcfg") {
17567b1f73fSEnji Cooper	my $errmsg = "";
176e02a067aSEnji Cooper	if ($args =~ "^create") {
17767b1f73fSEnji Cooper	    # NOTE: `count=1024` affects $key => {"025" "054", "065"}.
17867b1f73fSEnji Cooper	    if (system("dd if=/dev/zero of=$disk count=1024 2>&1") == 0) {
17967b1f73fSEnji Cooper		chomp($dev = `mdconfig -a -t vnode -f $disk`);
18067b1f73fSEnji Cooper		if ($? == 0) {
18167b1f73fSEnji Cooper		    if (system("gpart create -s GPT $dev") != 0) {
18267b1f73fSEnji Cooper			$errmsg = "gpart create failed";
183e02a067aSEnji Cooper		    }
18467b1f73fSEnji Cooper		} else {
18567b1f73fSEnji Cooper		    $errmsg = "mdconfig -a failed";
18667b1f73fSEnji Cooper		}
18767b1f73fSEnji Cooper	    } else {
18867b1f73fSEnji Cooper		$errmsg = "dd failed";
18967b1f73fSEnji Cooper	    }
190e02a067aSEnji Cooper	} elsif ($args =~ "^destroy") {
191e02a067aSEnji Cooper	    $dev =~ s/md/-u /g;
19267b1f73fSEnji Cooper	    if (system("mdconfig -d $dev") != 0) {
19367b1f73fSEnji Cooper		$errmsg = "mdconfig -d failed";
19467b1f73fSEnji Cooper	    }
195e02a067aSEnji Cooper	    unlink $disk;
196e02a067aSEnji Cooper	    $dev = "n/a";
197e02a067aSEnji Cooper	}
19867b1f73fSEnji Cooper	printf("%sok $nr # mdcfg($key)%s\n",
19967b1f73fSEnji Cooper	    ($errmsg eq "" ? "" : "not "),
20067b1f73fSEnji Cooper	    ($errmsg eq "" ? "" : " - $errmsg"));
201e02a067aSEnji Cooper    } elsif ($action =~ "^conf") {
202e02a067aSEnji 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");
203e02a067aSEnji Cooper	$st = `tail -1 $out`;
204e02a067aSEnji Cooper	if ($st =~ "^$res") {
205e02a067aSEnji Cooper	    print "ok $nr \# conf($key)\n";
206e02a067aSEnji Cooper	} else {
207e02a067aSEnji Cooper	    print "not ok $nr \# conf($key) - $st\n";
208e02a067aSEnji Cooper	}
209e02a067aSEnji Cooper	unlink $out;
210e02a067aSEnji Cooper    } elsif ($action =~ "^mount") {
211d1f57d59SEnji Cooper	my $errmsg = "";
212d1f57d59SEnji Cooper	mkdir("$mntpt_prefix-$args");
213d1f57d59SEnji Cooper	if (system("newfs /dev/$args") == 0) {
214d1f57d59SEnji Cooper	    if (system("mount /dev/$args $mntpt_prefix-$args") != 0) {
215d1f57d59SEnji Cooper		$errmsg = "mount failed";
216d1f57d59SEnji Cooper	    }
217d1f57d59SEnji Cooper	} else {
218d1f57d59SEnji Cooper	    $errmsg = "newfs failed";
219d1f57d59SEnji Cooper	}
220d1f57d59SEnji Cooper	printf("%sok $nr # mount($key)%s\n",
221d1f57d59SEnji Cooper	    ($errmsg eq "" ? "" : "not "),
222d1f57d59SEnji Cooper	    ($errmsg eq "" ? "" : " - $errmsg"));
223e02a067aSEnji Cooper    } elsif ($action =~ "^umount") {
2249940eaaaSEnji Cooper	system("umount $mntpt_prefix-$args");
2259940eaaaSEnji Cooper	system("rmdir $mntpt_prefix-$args");
226e02a067aSEnji Cooper	print "ok $nr \# umount($key)\n";
227e02a067aSEnji Cooper    }
228e02a067aSEnji Cooper    $nr += 1;
229e02a067aSEnji Cooper}
230e02a067aSEnji Cooperexit 0;
231