xref: /freebsd/sbin/growfs/tests/legacy_test.pl (revision d0b2dbfa)
1c68de748SJulio Merino
2c68de748SJulio Merinouse strict;
3c68de748SJulio Merinouse warnings;
45b347b28SEnji Cooperuse POSIX;
5c68de748SJulio Merinouse Test::More tests => 19;
6c68de748SJulio Merinouse Fcntl qw(:DEFAULT :seek);
7c68de748SJulio Merino
8c68de748SJulio Merinouse constant BLK => 512;
9c68de748SJulio Merinouse constant BLKS_PER_MB => 2048;
10c68de748SJulio Merino
11c68de748SJulio Merinomy $unit;
12c68de748SJulio MerinoEND { system "mdconfig -du$unit" if defined $unit };
13c68de748SJulio Merino
145b347b28SEnji Coopersub fsck_md {
155b347b28SEnji Cooper    my ($is_clean, $md);
165b347b28SEnji Cooper
175b347b28SEnji Cooper    $md = shift;
185b347b28SEnji Cooper
195b347b28SEnji Cooper    chomp(my @fsck_output = `fsck_ffs -Ffy ${md}a`);
205b347b28SEnji Cooper    $is_clean = WIFEXITED($?) &&
215b347b28SEnji Cooper    	(WEXITSTATUS($?) == 0 || WEXITSTATUS($?) == 7);
225b347b28SEnji Cooper    ok($is_clean, "checking ${md}a's filesystem");
235b347b28SEnji Cooper    if ($is_clean) {
245b347b28SEnji Cooper	diag "filesystem reported clean";
255b347b28SEnji Cooper    } else {
265b347b28SEnji Cooper	diag "filesystem not reported clean: " . join("\n", @fsck_output);
275b347b28SEnji Cooper    }
285b347b28SEnji Cooper}
295b347b28SEnji Cooper
30c68de748SJulio Merinosub setsize {
31c68de748SJulio Merino    my ($partszMB, $unitszMB) = @_;
32c68de748SJulio Merino
335b1b1405SRuslan Bukin    open my $fd, "|-", "bsdlabel -R md$unit /dev/stdin" or die;
34c68de748SJulio Merino    print $fd "a: ", ($partszMB * BLKS_PER_MB), " 0 4.2BSD 1024 8192\n";
35c68de748SJulio Merino    print $fd "c: ", ($unitszMB * BLKS_PER_MB), " 0 unused 0 0\n";
36c68de748SJulio Merino    close $fd;
37c68de748SJulio Merino}
38c68de748SJulio Merino
39c68de748SJulio Merinosub fill {
40c68de748SJulio Merino    my ($start, $size, $content) = @_;
41c68de748SJulio Merino
42c68de748SJulio Merino    my $content512 = $content x (int(512 / length $content) + 1);
43c68de748SJulio Merino    substr($content512, 512) = "";
44c68de748SJulio Merino    sysopen my $fd, "/dev/md$unit", O_RDWR or die "/dev/md$unit: $!";
45c68de748SJulio Merino    seek($fd, $start * BLK, SEEK_SET);
46c68de748SJulio Merino    while ($size) {
47c68de748SJulio Merino	syswrite($fd, $content512) == 512 or die "write: $!";
48c68de748SJulio Merino	$size--;
49c68de748SJulio Merino    }
50c68de748SJulio Merino}
51c68de748SJulio Merino
52c68de748SJulio MerinoSKIP: {
53c68de748SJulio Merino    skip "Cannot test without UID 0", 19 if $<;
54c68de748SJulio Merino
55c68de748SJulio Merino    chomp(my $md = `mdconfig -s40m`);
56c68de748SJulio Merino    like($md, qr/^md\d+$/, "Created $md with size 40m") or die;
57c68de748SJulio Merino    $unit = substr $md, 2;
58c68de748SJulio Merino
59c68de748SJulio Merino    for my $type (1..2) {
60c68de748SJulio Merino
61c68de748SJulio Merino	initialise: {
62c68de748SJulio Merino	    ok(setsize(10, 40), "Sized ${md}a to 10m");
63c68de748SJulio Merino	    system "newfs -O $type -U ${md}a >/dev/null";
64c68de748SJulio Merino	    is($?, 0, "Initialised the filesystem on ${md}a as UFS$type");
655b347b28SEnji Cooper
665b347b28SEnji Cooper	    fsck_md($md);
67c68de748SJulio Merino	}
68c68de748SJulio Merino
69c68de748SJulio Merino	extend20_zeroed: {
70c68de748SJulio Merino	    ok(setsize(20, 40), "Sized ${md}a to 20m");
71c68de748SJulio Merino	    diag "Filling the extent with zeros";
72c68de748SJulio Merino	    fill(10 * BLKS_PER_MB, 10 * BLKS_PER_MB, chr(0));
73c68de748SJulio Merino	    my $out = `growfs -y ${md}a`;
74c68de748SJulio Merino	    is($?, 0, "Extended the filesystem on ${md}a") or print $out;
75c68de748SJulio Merino
76c68de748SJulio Merino	    my ($unallocated) = $out =~ m{\d+ sectors cannot be allocated};
77c68de748SJulio Merino	    fill(30 * BLKS_PER_MB - $unallocated, $unallocated, chr(0))
78c68de748SJulio Merino		if $unallocated;
79c68de748SJulio Merino
805b347b28SEnji Cooper	    fsck_md($md);
81c68de748SJulio Merino	}
82c68de748SJulio Merino
83c68de748SJulio Merino	extend30_garbaged: {
84c68de748SJulio Merino	    ok(setsize(30, 40), "Sized ${md}a to 30m");
85c68de748SJulio Merino	    diag "Filling the extent with garbage";
86c68de748SJulio Merino	    fill(20 * BLKS_PER_MB, 10 * BLKS_PER_MB, chr(0xaa) . chr(0x55));
87c68de748SJulio Merino	    my $out = `growfs -y ${md}a`;
88c68de748SJulio Merino	    is($?, 0, "Extended the filesystem on ${md}a") or print $out;
89c68de748SJulio Merino
90c68de748SJulio Merino	    my ($unallocated) = $out =~ m{\d+ sectors cannot be allocated};
91c68de748SJulio Merino	    fill(30 * BLKS_PER_MB - $unallocated, $unallocated, chr(0))
92c68de748SJulio Merino		if $unallocated;
93c68de748SJulio Merino
945b347b28SEnji Cooper	    fsck_md($md);
95c68de748SJulio Merino	}
96c68de748SJulio Merino    }
97c68de748SJulio Merino
98c68de748SJulio Merino    system "mdconfig -du$unit";
99c68de748SJulio Merino    undef $unit;
100c68de748SJulio Merino}
101