xref: /freebsd/tools/regression/geom_gpt/gctl_test.t (revision b58910a05f4669b5e83607ae8079aad72aecacba)
1e02a067aSEnji Cooper#!/usr/bin/env perl -w
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
29e02a067aSEnji Coopermy $disk = "/tmp/disk-$$";
30e02a067aSEnji Coopermy $mntpt = "/tmp/mount-$$";
31e02a067aSEnji Cooper
32e02a067aSEnji Coopermy %steps = (
33e02a067aSEnji Cooper    "000" => "gctl",
34e02a067aSEnji Cooper    "001" => "gctl verb=bogus",
35e02a067aSEnji Cooper    "010" => "gctl verb=create",
36e02a067aSEnji Cooper    "011" => "gctl verb=create provider=bogus",
37e02a067aSEnji Cooper    "020" => "mdcfg create pristine",
38e02a067aSEnji Cooper    "021" => "gctl verb=create provider=%dev% entries=-1",
39e02a067aSEnji Cooper    "022" => "gctl verb=create provider=%dev% entries=128",
40e02a067aSEnji Cooper    "023" => "gctl verb=create provider=%dev%",
41e02a067aSEnji Cooper    "024" => "gctl verb=modify geom=%dev%",
42e02a067aSEnji Cooper    "025" => "conf",
43e02a067aSEnji Cooper    "030" => "gctl verb=add",
44e02a067aSEnji Cooper    "031" => "gctl verb=add geom=bogus",
45e02a067aSEnji Cooper    "032" => "gctl verb=add geom=%dev%",
46e02a067aSEnji Cooper    "033" => "gctl verb=add geom=%dev% type=bogus",
47e02a067aSEnji Cooper    "034" => "gctl verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace",
48e02a067aSEnji Cooper    "035" => "gctl verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=1",
49e02a067aSEnji Cooper    "036" => "gctl verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=34",
50e02a067aSEnji Cooper    "037" => "gctl verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=34 end=12345678",
51e02a067aSEnji Cooper    "038" => "gctl verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=162 end=417 entry=129",
52e02a067aSEnji Cooper    "039" => "gctl verb=add geom=%dev% type=ed0101b0-2a71-11da-ba81-003048416ace start=162 end=417 entry:8=5",
53e02a067aSEnji Cooper    "040" => "gctl verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=34 end=161 entry=5",
54e02a067aSEnji Cooper    "041" => "gctl verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=34 end=546",
55e02a067aSEnji Cooper    "042" => "gctl verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=162 end=417",
56e02a067aSEnji Cooper    "043" => "gctl verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=100 end=300",
57e02a067aSEnji Cooper    "044" => "gctl verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=300 end=500",
58e02a067aSEnji Cooper    "045" => "gctl verb=add geom=%dev% type=83d34ed5-c4ff-11da-b65b-000347c5d7f3 start=34 end=161 entry:8",
59e02a067aSEnji Cooper    "046" => "gctl verb=add geom=%dev% type=d2bd4509-c4ff-11da-b4cc-00306e39b62f start=418 end=546 entry:8",
60e02a067aSEnji Cooper    "047" => "conf",
61e02a067aSEnji Cooper    "050" => "gctl verb=remove geom=%dev% entry=5",
62e02a067aSEnji Cooper    "051" => "gctl verb=remove geom=%dev% entry=2",
63e02a067aSEnji Cooper    "052" => "gctl verb=remove geom=%dev% entry=1",
64e02a067aSEnji Cooper    "053" => "gctl verb=remove geom=%dev% entry=1",
65e02a067aSEnji Cooper    "054" => "conf",
66e02a067aSEnji Cooper    "060" => "gctl verb=add geom=%dev% type=516e7cb6-6ecf-11d6-8ff8-00022d09712b start=34 end=546 entry:8=1",
67e02a067aSEnji Cooper    "061" => "mount %dev%p1",
68e02a067aSEnji Cooper    "062" => "gctl verb=remove geom=%dev% entry=1",
69e02a067aSEnji Cooper    "063" => "umount %dev%p1",
70e02a067aSEnji Cooper    "064" => "gctl verb=remove geom=%dev% entry=1",
71e02a067aSEnji Cooper    "065" => "conf",
72e02a067aSEnji Cooper    "100" => "mdcfg destroy",
73e02a067aSEnji Cooper    "110" => "mdcfg create corrupted",
74e02a067aSEnji Cooper    "111" => "gctl verb=add geom=%dev%",
75e02a067aSEnji Cooper    "120" => "mdcfg destroy",
76e02a067aSEnji Cooper);
77e02a067aSEnji Cooper
78e02a067aSEnji Coopermy %result = (
79e02a067aSEnji Cooper    "000" => "FAIL Verb missing",
80e02a067aSEnji Cooper    "001" => "FAIL 22 verb 'bogus'",
81e02a067aSEnji Cooper    "010" => "FAIL 87 provider",
82e02a067aSEnji Cooper    "011" => "FAIL 22 provider 'bogus'",
83e02a067aSEnji Cooper    "020" => "",
84e02a067aSEnji Cooper    "021" => "FAIL 22 entries -1",
85e02a067aSEnji Cooper    "022" => "PASS",
86e02a067aSEnji Cooper    "023" => "FAIL 17 geom '%dev%'",
87e02a067aSEnji Cooper    "024" => "FAIL 87 entry",
88e02a067aSEnji Cooper    "025" => "b1856477950e5786898c8f01361196cf",
89e02a067aSEnji Cooper    "030" => "FAIL 87 geom",
90e02a067aSEnji Cooper    "031" => "FAIL 22 geom 'bogus'",
91e02a067aSEnji Cooper    "032" => "FAIL 87 type",
92e02a067aSEnji Cooper    "033" => "FAIL 22 type 'bogus'",
93e02a067aSEnji Cooper    "034" => "FAIL 87 start",
94e02a067aSEnji Cooper    "035" => "FAIL 22 start 1",
95e02a067aSEnji Cooper    "036" => "FAIL 87 end",
96e02a067aSEnji Cooper    "037" => "FAIL 22 end 12345678",
97e02a067aSEnji Cooper    "038" => "FAIL 22 entry 129",
98e02a067aSEnji Cooper    "039" => "PASS entry=5",
99e02a067aSEnji Cooper    "040" => "FAIL 17 entry 5",
100e02a067aSEnji Cooper    "041" => "FAIL 28 start/end 34/546",
101e02a067aSEnji Cooper    "042" => "FAIL 28 start/end 162/417",
102e02a067aSEnji Cooper    "043" => "FAIL 28 start/end 100/300",
103e02a067aSEnji Cooper    "044" => "FAIL 28 start/end 300/500",
104e02a067aSEnji Cooper    "045" => "PASS entry=1",
105e02a067aSEnji Cooper    "046" => "PASS entry=2",
106e02a067aSEnji Cooper    "047" => "50783a39eecfc62a29db24381e12b9d8",
107e02a067aSEnji Cooper    "050" => "PASS",
108e02a067aSEnji Cooper    "051" => "PASS",
109e02a067aSEnji Cooper    "052" => "PASS",
110e02a067aSEnji Cooper    "053" => "FAIL 2 entry 1",
111e02a067aSEnji Cooper    "054" => "b1856477950e5786898c8f01361196cf",
112e02a067aSEnji Cooper    "060" => "PASS",
113e02a067aSEnji Cooper    "061" => "PASS",
114e02a067aSEnji Cooper    "062" => "FAIL 16",
115e02a067aSEnji Cooper    "063" => "PASS",
116e02a067aSEnji Cooper    "064" => "PASS",
117e02a067aSEnji Cooper    "065" => "b1856477950e5786898c8f01361196cf",
118e02a067aSEnji Cooper    "100" => "",
119e02a067aSEnji Cooper    "110" => "",
120e02a067aSEnji Cooper    "111" => "FAIL 6 geom '%dev%'",
121e02a067aSEnji Cooper    "120" => "",
122e02a067aSEnji Cooper);
123e02a067aSEnji Cooper
124e02a067aSEnji Coopermy $verbose = "";
125e02a067aSEnji Cooperif (exists $ENV{'TEST_VERBOSE'}) {
126e02a067aSEnji Cooper    $verbose = "-v";
127e02a067aSEnji Cooper}
128e02a067aSEnji Cooper
129e02a067aSEnji Cooper# Compile the driver...
130*b58910a0SEnji Coopermy $st = system("make obj && make all");
131e02a067aSEnji Cooperif ($st != 0) {
132e02a067aSEnji Cooper    print "1..0 # SKIP error compiling test.c\n";
133e02a067aSEnji Cooper    exit 0;
134e02a067aSEnji Cooper}
135*b58910a0SEnji Cooperchomp(my $cmd = `make '-V\${.OBJDIR}/\${PROG}'`);
136*b58910a0SEnji Cooper
137*b58910a0SEnji Coopermy $out = "/tmp/$cmd.out";
138e02a067aSEnji Cooper
139e02a067aSEnji Cooper# Make sure we have permission to use gctl...
140e02a067aSEnji Cooperif (`$cmd` =~ "^FAIL Permission denied") {
141e02a067aSEnji Cooper    print "1..0 # SKIP not enough permission\n";
142e02a067aSEnji Cooper    unlink $cmd;
143e02a067aSEnji Cooper    exit 0;
144e02a067aSEnji Cooper}
145e02a067aSEnji Cooper
146e02a067aSEnji Cooper$count = keys (%steps);
147e02a067aSEnji Cooperprint "1..$count\n";
148e02a067aSEnji Cooper
149e02a067aSEnji Coopermy $nr = 1;
150e02a067aSEnji Coopermy $dev = "n/a";
151e02a067aSEnji Cooperforeach my $key (sort keys %steps) {
152e02a067aSEnji Cooper    my ($action, $args) = split(/ /, $steps{$key}, 2);
153e02a067aSEnji Cooper    my $res = $result{$key};
154e02a067aSEnji Cooper    $args = "" if (not defined $args);
155e02a067aSEnji Cooper    $args =~ s/%dev%/$dev/g;
156e02a067aSEnji Cooper    $res =~ s/%dev%/$dev/g;
157e02a067aSEnji Cooper
158e02a067aSEnji Cooper    if ($action =~ "^gctl") {
159e02a067aSEnji Cooper	system("$cmd $verbose $args | tee $out 2>&1");
160e02a067aSEnji Cooper	$st = `tail -1 $out`;
161e02a067aSEnji Cooper	if ($st =~ "^$res") {
162e02a067aSEnji Cooper	    print "ok $nr \# gctl($key)\n";
163e02a067aSEnji Cooper	} else {
164e02a067aSEnji Cooper	    print "not ok $nr \# gctl($key) - $st\n";
165e02a067aSEnji Cooper	}
166e02a067aSEnji Cooper	unlink $out;
167e02a067aSEnji Cooper    } elsif ($action =~ "^mdcfg") {
168e02a067aSEnji Cooper	if ($args =~ "^create") {
169e02a067aSEnji Cooper	    system("dd if=/dev/zero of=$disk count=1024 2>&1");
170e02a067aSEnji Cooper	    if ($args =~ "corrupted") {
171e02a067aSEnji Cooper		system("gpt create -p $disk");
172e02a067aSEnji Cooper	    }
173e02a067aSEnji Cooper	    $dev = `mdconfig -a -t vnode -f $disk`;
174e02a067aSEnji Cooper	    chomp $dev;
175e02a067aSEnji Cooper	} elsif ($args =~ "^destroy") {
176e02a067aSEnji Cooper	    $dev =~ s/md/-u /g;
177e02a067aSEnji Cooper	    system("mdconfig -d $dev");
178e02a067aSEnji Cooper	    unlink $disk;
179e02a067aSEnji Cooper	    $dev = "n/a";
180e02a067aSEnji Cooper	}
181e02a067aSEnji Cooper	print "ok $nr \# mdcfg($key)\n";
182e02a067aSEnji Cooper    } elsif ($action =~ "^conf") {
183e02a067aSEnji 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");
184e02a067aSEnji Cooper	$st = `tail -1 $out`;
185e02a067aSEnji Cooper	if ($st =~ "^$res") {
186e02a067aSEnji Cooper	    print "ok $nr \# conf($key)\n";
187e02a067aSEnji Cooper	} else {
188e02a067aSEnji Cooper	    print "not ok $nr \# conf($key) - $st\n";
189e02a067aSEnji Cooper	}
190e02a067aSEnji Cooper	unlink $out;
191e02a067aSEnji Cooper    } elsif ($action =~ "^mount") {
192e02a067aSEnji Cooper	    system("mkdir $mntpt-$args");
193e02a067aSEnji Cooper	    system("newfs $args");
194e02a067aSEnji Cooper	    system("mount -t ufs /dev/$args $mntpt-$args");
195e02a067aSEnji Cooper	    print "ok $nr \# mount($key)\n";
196e02a067aSEnji Cooper    } elsif ($action =~ "^umount") {
197e02a067aSEnji Cooper	    system("umount $mntpt-$args");
198e02a067aSEnji Cooper	    system("rmdir $mntpt-$args");
199e02a067aSEnji Cooper	    print "ok $nr \# umount($key)\n";
200e02a067aSEnji Cooper    }
201e02a067aSEnji Cooper    $nr += 1;
202e02a067aSEnji Cooper}
203e02a067aSEnji Cooper
204e02a067aSEnji Cooperunlink $cmd;
205e02a067aSEnji Cooperexit 0;
206