t/unstow.t: convert to use subtests

This commit is contained in:
Adam Spiers 2024-04-06 11:59:23 +01:00
parent 6d6781dcef
commit e9ad20576c

View file

@ -22,7 +22,7 @@
use strict; use strict;
use warnings; use warnings;
use Test::More tests => 39; use Test::More tests => 32;
use Test::Output; use Test::Output;
use English qw(-no_match_vars); use English qw(-no_match_vars);
@ -34,332 +34,321 @@ cd("$TEST_DIR/target");
# Note that each of the following tests use a distinct set of files # Note that each of the following tests use a distinct set of files
my $stow; subtest("unstow a simple tree minimally", sub {
my %conflicts; plan tests => 3;
my $stow = new_Stow();
# make_path('../stow/pkg1/bin1');
# unstow a simple tree minimally make_file('../stow/pkg1/bin1/file1');
# make_link('bin1', '../stow/pkg1/bin1');
$stow = new_Stow();
make_path('../stow/pkg1/bin1'); $stow->plan_unstow('pkg1');
make_file('../stow/pkg1/bin1/file1'); $stow->process_tasks();
make_link('bin1', '../stow/pkg1/bin1'); is($stow->get_conflict_count, 0);
ok(-f '../stow/pkg1/bin1/file1');
ok(! -e 'bin1' => 'unstow a simple tree');
});
$stow->plan_unstow('pkg1'); subtest("unstow a simple tree from an existing directory", sub {
$stow->process_tasks(); plan tests => 3;
ok( my $stow = new_Stow();
$stow->get_conflict_count == 0 &&
-f '../stow/pkg1/bin1/file1' && ! -e 'bin1'
=> 'unstow a simple tree'
);
# make_path('lib2');
# unstow a simple tree from an existing directory make_path('../stow/pkg2/lib2');
# make_file('../stow/pkg2/lib2/file2');
$stow = new_Stow(); make_link('lib2/file2', '../../stow/pkg2/lib2/file2');
$stow->plan_unstow('pkg2');
make_path('lib2'); $stow->process_tasks();
make_path('../stow/pkg2/lib2'); is($stow->get_conflict_count, 0);
make_file('../stow/pkg2/lib2/file2'); ok(-f '../stow/pkg2/lib2/file2');
make_link('lib2/file2', '../../stow/pkg2/lib2/file2'); ok(-d 'lib2'
$stow->plan_unstow('pkg2');
$stow->process_tasks();
ok(
$stow->get_conflict_count == 0 &&
-f '../stow/pkg2/lib2/file2' && -d 'lib2'
=> 'unstow simple tree from a pre-existing directory' => 'unstow simple tree from a pre-existing directory'
); );
});
# subtest("fold tree after unstowing", sub {
# fold tree after unstowing plan tests => 3;
# my $stow = new_Stow();
$stow = new_Stow();
make_path('bin3'); make_path('bin3');
make_path('../stow/pkg3a/bin3'); make_path('../stow/pkg3a/bin3');
make_file('../stow/pkg3a/bin3/file3a'); make_file('../stow/pkg3a/bin3/file3a');
make_link('bin3/file3a' => '../../stow/pkg3a/bin3/file3a'); # emulate stow make_link('bin3/file3a' => '../../stow/pkg3a/bin3/file3a'); # emulate stow
make_path('../stow/pkg3b/bin3'); make_path('../stow/pkg3b/bin3');
make_file('../stow/pkg3b/bin3/file3b'); make_file('../stow/pkg3b/bin3/file3b');
make_link('bin3/file3b' => '../../stow/pkg3b/bin3/file3b'); # emulate stow make_link('bin3/file3b' => '../../stow/pkg3b/bin3/file3b'); # emulate stow
$stow->plan_unstow('pkg3b'); $stow->plan_unstow('pkg3b');
$stow->process_tasks(); $stow->process_tasks();
ok( is($stow->get_conflict_count, 0);
$stow->get_conflict_count == 0 && ok(-l 'bin3');
-l 'bin3' && is(readlink('bin3'), '../stow/pkg3a/bin3'
readlink('bin3') eq '../stow/pkg3a/bin3'
=> 'fold tree after unstowing' => 'fold tree after unstowing'
); );
});
# subtest("existing link is owned by stow but is invalid so it gets removed anyway", sub {
# existing link is owned by stow but is invalid so it gets removed anyway plan tests => 2;
# my $stow = new_Stow();
$stow = new_Stow();
make_path('bin4'); make_path('bin4');
make_path('../stow/pkg4/bin4'); make_path('../stow/pkg4/bin4');
make_file('../stow/pkg4/bin4/file4'); make_file('../stow/pkg4/bin4/file4');
make_invalid_link('bin4/file4', '../../stow/pkg4/bin4/does-not-exist'); make_invalid_link('bin4/file4', '../../stow/pkg4/bin4/does-not-exist');
$stow->plan_unstow('pkg4'); $stow->plan_unstow('pkg4');
$stow->process_tasks(); $stow->process_tasks();
ok( is($stow->get_conflict_count, 0);
$stow->get_conflict_count == 0 && ok(! -e 'bin4/file4'
! -e 'bin4/file4'
=> q(remove invalid link owned by stow) => q(remove invalid link owned by stow)
); );
});
# subtest("Existing link is not owned by stow", sub {
# Existing link is not owned by stow plan tests => 1;
# my $stow = new_Stow();
$stow = new_Stow();
make_path('../stow/pkg5/bin5'); make_path('../stow/pkg5/bin5');
make_invalid_link('bin5', '../not-stow'); make_invalid_link('bin5', '../not-stow');
$stow->plan_unstow('pkg5'); $stow->plan_unstow('pkg5');
%conflicts = $stow->get_conflicts; my %conflicts = $stow->get_conflicts;
like( like(
$conflicts{unstow}{pkg5}[-1], $conflicts{unstow}{pkg5}[-1],
qr(existing target is not owned by stow) qr(existing target is not owned by stow)
=> q(existing link not owned by stow) => q(existing link not owned by stow)
); );
});
# subtest("Target already exists, is owned by stow, but points to a different package", sub {
# Target already exists, is owned by stow, but points to a different package plan tests => 3;
# my $stow = new_Stow();
$stow = new_Stow();
make_path('bin6'); make_path('bin6');
make_path('../stow/pkg6a/bin6'); make_path('../stow/pkg6a/bin6');
make_file('../stow/pkg6a/bin6/file6'); make_file('../stow/pkg6a/bin6/file6');
make_link('bin6/file6', '../../stow/pkg6a/bin6/file6'); make_link('bin6/file6', '../../stow/pkg6a/bin6/file6');
make_path('../stow/pkg6b/bin6'); make_path('../stow/pkg6b/bin6');
make_file('../stow/pkg6b/bin6/file6'); make_file('../stow/pkg6b/bin6/file6');
$stow->plan_unstow('pkg6b'); $stow->plan_unstow('pkg6b');
ok( is($stow->get_conflict_count, 0);
$stow->get_conflict_count == 0 && ok(-l 'bin6/file6');
-l 'bin6/file6' && is(
readlink('bin6/file6') eq '../../stow/pkg6a/bin6/file6' readlink('bin6/file6'),
'../../stow/pkg6a/bin6/file6'
=> q(ignore existing link that points to a different package) => q(ignore existing link that points to a different package)
); );
});
# subtest("Don't unlink anything under the stow directory", sub {
# Don't unlink anything under the stow directory plan tests => 4;
# make_path('stow'); # make out stow dir a subdir of target
make_path('stow'); # make out stow dir a subdir of target my $stow = new_Stow(dir => 'stow');
$stow = new_Stow(dir => 'stow');
# emulate stowing into ourself (bizarre corner case or accident) # emulate stowing into ourself (bizarre corner case or accident)
make_path('stow/pkg7a/stow/pkg7b'); make_path('stow/pkg7a/stow/pkg7b');
make_file('stow/pkg7a/stow/pkg7b/file7b'); make_file('stow/pkg7a/stow/pkg7b/file7b');
make_link('stow/pkg7b', '../stow/pkg7a/stow/pkg7b'); make_link('stow/pkg7b', '../stow/pkg7a/stow/pkg7b');
$stow->plan_unstow('pkg7b'); $stow->plan_unstow('pkg7b');
is($stow->get_tasks, 0, 'no tasks to process when unstowing pkg7b'); is($stow->get_tasks, 0, 'no tasks to process when unstowing pkg7b');
ok( is($stow->get_conflict_count, 0);
$stow->get_conflict_count == 0 && ok(-l 'stow/pkg7b');
-l 'stow/pkg7b' && is(
readlink('stow/pkg7b') eq '../stow/pkg7a/stow/pkg7b' readlink('stow/pkg7b'),
'../stow/pkg7a/stow/pkg7b'
=> q(don't unlink any nodes under the stow directory) => q(don't unlink any nodes under the stow directory)
); );
});
subtest("Don't unlink any nodes under another stow directory", sub {
plan tests => 5;
my $stow = new_Stow(dir => 'stow');
# make_path('stow2'); # make our alternate stow dir a subdir of target
# Don't unlink any nodes under another stow directory make_file('stow2/.stow');
#
$stow = new_Stow(dir => 'stow');
make_path('stow2'); # make our alternate stow dir a subdir of target # emulate stowing into ourself (bizarre corner case or accident)
make_file('stow2/.stow'); make_path('stow/pkg8a/stow2/pkg8b');
make_file('stow/pkg8a/stow2/pkg8b/file8b');
make_link('stow2/pkg8b', '../stow/pkg8a/stow2/pkg8b');
# emulate stowing into ourself (bizarre corner case or accident) stderr_like(
make_path('stow/pkg8a/stow2/pkg8b');
make_file('stow/pkg8a/stow2/pkg8b/file8b');
make_link('stow2/pkg8b', '../stow/pkg8a/stow2/pkg8b');
stderr_like(
sub { $stow->plan_unstow('pkg8a'); }, sub { $stow->plan_unstow('pkg8a'); },
qr/WARNING: skipping marked Stow directory stow2/ qr/WARNING: skipping marked Stow directory stow2/
=> "unstowing from ourself should skip stow" => "unstowing from ourself should skip stow"
); );
is($stow->get_tasks, 0, 'no tasks to process when unstowing pkg8a'); is($stow->get_tasks, 0, 'no tasks to process when unstowing pkg8a');
ok( is($stow->get_conflict_count, 0);
$stow->get_conflict_count == 0 && ok(-l 'stow2/pkg8b');
-l 'stow2/pkg8b' && is(
readlink('stow2/pkg8b') eq '../stow/pkg8a/stow2/pkg8b' readlink('stow2/pkg8b'),
'../stow/pkg8a/stow2/pkg8b'
=> q(don't unlink any nodes under another stow directory) => q(don't unlink any nodes under another stow directory)
); );
});
# subtest("overriding already stowed documentation", sub {
# overriding already stowed documentation plan tests => 2;
# my $stow = new_Stow(override => ['man9', 'info9']);
$stow = new_Stow(override => ['man9', 'info9']); make_file('stow/.stow');
make_file('stow/.stow');
make_path('../stow/pkg9a/man9/man1'); make_path('../stow/pkg9a/man9/man1');
make_file('../stow/pkg9a/man9/man1/file9.1'); make_file('../stow/pkg9a/man9/man1/file9.1');
make_path('man9/man1'); make_path('man9/man1');
make_link('man9/man1/file9.1' => '../../../stow/pkg9a/man9/man1/file9.1'); # emulate stow make_link('man9/man1/file9.1' => '../../../stow/pkg9a/man9/man1/file9.1'); # emulate stow
make_path('../stow/pkg9b/man9/man1'); make_path('../stow/pkg9b/man9/man1');
make_file('../stow/pkg9b/man9/man1/file9.1'); make_file('../stow/pkg9b/man9/man1/file9.1');
$stow->plan_unstow('pkg9b'); $stow->plan_unstow('pkg9b');
$stow->process_tasks(); $stow->process_tasks();
ok( is($stow->get_conflict_count, 0);
$stow->get_conflict_count == 0 && ok(!-l 'man9/man1/file9.1'
!-l 'man9/man1/file9.1'
=> 'overriding existing documentation files' => 'overriding existing documentation files'
); );
});
# subtest("deferring to already stowed documentation", sub {
# deferring to already stowed documentation plan tests => 3;
# my $stow = new_Stow(defer => ['man10', 'info10']);
$stow = new_Stow(defer => ['man10', 'info10']);
make_path('../stow/pkg10a/man10/man1'); make_path('../stow/pkg10a/man10/man1');
make_file('../stow/pkg10a/man10/man1/file10a.1'); make_file('../stow/pkg10a/man10/man1/file10a.1');
make_path('man10/man1'); make_path('man10/man1');
make_link('man10/man1/file10a.1' => '../../../stow/pkg10a/man10/man1/file10a.1'); make_link('man10/man1/file10a.1' => '../../../stow/pkg10a/man10/man1/file10a.1');
# need this to block folding # need this to block folding
make_path('../stow/pkg10b/man10/man1'); make_path('../stow/pkg10b/man10/man1');
make_file('../stow/pkg10b/man10/man1/file10b.1'); make_file('../stow/pkg10b/man10/man1/file10b.1');
make_link('man10/man1/file10b.1' => '../../../stow/pkg10b/man10/man1/file10b.1'); make_link('man10/man1/file10b.1' => '../../../stow/pkg10b/man10/man1/file10b.1');
make_path('../stow/pkg10c/man10/man1'); make_path('../stow/pkg10c/man10/man1');
make_file('../stow/pkg10c/man10/man1/file10a.1'); make_file('../stow/pkg10c/man10/man1/file10a.1');
$stow->plan_unstow('pkg10c'); $stow->plan_unstow('pkg10c');
is($stow->get_tasks, 0, 'no tasks to process when unstowing pkg10c'); is($stow->get_tasks, 0, 'no tasks to process when unstowing pkg10c');
ok( is($stow->get_conflict_count, 0);
$stow->get_conflict_count == 0 && is(
readlink('man10/man1/file10a.1') eq '../../../stow/pkg10a/man10/man1/file10a.1' readlink('man10/man1/file10a.1'),
'../../../stow/pkg10a/man10/man1/file10a.1'
=> 'defer to existing documentation files' => 'defer to existing documentation files'
); );
});
# subtest("Ignore temp files", sub {
# Ignore temp files plan tests => 2;
# my $stow = new_Stow(ignore => ['~', '\.#.*']);
$stow = new_Stow(ignore => ['~', '\.#.*']);
make_path('../stow/pkg12/man12/man1'); make_path('../stow/pkg12/man12/man1');
make_file('../stow/pkg12/man12/man1/file12.1'); make_file('../stow/pkg12/man12/man1/file12.1');
make_file('../stow/pkg12/man12/man1/file12.1~'); make_file('../stow/pkg12/man12/man1/file12.1~');
make_file('../stow/pkg12/man12/man1/.#file12.1'); make_file('../stow/pkg12/man12/man1/.#file12.1');
make_path('man12/man1'); make_path('man12/man1');
make_link('man12/man1/file12.1' => '../../../stow/pkg12/man12/man1/file12.1'); make_link('man12/man1/file12.1' => '../../../stow/pkg12/man12/man1/file12.1');
$stow->plan_unstow('pkg12'); $stow->plan_unstow('pkg12');
$stow->process_tasks(); $stow->process_tasks();
ok( is($stow->get_conflict_count, 0);
$stow->get_conflict_count == 0 && ok(!-e 'man12/man1/file12.1' => 'ignore temp files');
!-e 'man12/man1/file12.1' });
=> 'ignore temp files'
);
# subtest("Unstow an already unstowed package", sub {
# Unstow an already unstowed package plan tests => 2;
# my $stow = new_Stow();
$stow = new_Stow(); $stow->plan_unstow('pkg12');
$stow->plan_unstow('pkg12'); is($stow->get_tasks, 0, 'no tasks to process when unstowing pkg12');
is($stow->get_tasks, 0, 'no tasks to process when unstowing pkg12'); is(
ok( $stow->get_conflict_count, 0
$stow->get_conflict_count == 0
=> 'unstow already unstowed package pkg12' => 'unstow already unstowed package pkg12'
); );
});
# subtest("Unstow a never stowed package", sub {
# Unstow a never stowed package plan tests => 2;
#
eval { remove_dir("$TEST_DIR/target"); }; eval { remove_dir("$TEST_DIR/target"); };
mkdir("$TEST_DIR/target"); mkdir("$TEST_DIR/target");
$stow = new_Stow(); my $stow = new_Stow();
$stow->plan_unstow('pkg12'); $stow->plan_unstow('pkg12');
is($stow->get_tasks, 0, 'no tasks to process when unstowing pkg12 which was never stowed'); is($stow->get_tasks, 0, 'no tasks to process when unstowing pkg12 which was never stowed');
ok( is(
$stow->get_conflict_count == 0 $stow->get_conflict_count,
0
=> 'unstow never stowed package pkg12' => 'unstow never stowed package pkg12'
); );
});
# subtest("Unstowing when target contains a real file shouldn't be an issue", sub {
# Unstowing when target contains a real file shouldn't be an issue. plan tests => 3;
# make_file('man12/man1/file12.1');
make_file('man12/man1/file12.1');
$stow = new_Stow(); my $stow = new_Stow();
$stow->plan_unstow('pkg12'); $stow->plan_unstow('pkg12');
is($stow->get_tasks, 0, 'no tasks to process when unstowing pkg12 for third time'); is($stow->get_tasks, 0, 'no tasks to process when unstowing pkg12 for third time');
%conflicts = $stow->get_conflicts; my %conflicts = $stow->get_conflicts;
ok( is($stow->get_conflict_count, 1);
$stow->get_conflict_count == 1 && like(
$conflicts{unstow}{pkg12}[0] $conflicts{unstow}{pkg12}[0],
=~ m!existing target is neither a link nor a directory: man12/man1/file12\.1! qr!existing target is neither a link nor a directory: man12/man1/file12\.1!
=> 'unstow pkg12 for third time' => 'unstow pkg12 for third time'
); );
});
# subtest("unstow a simple tree minimally when cwd isn't target", sub {
# unstow a simple tree minimally when cwd isn't target plan tests => 3;
# cd('../..');
cd('../..'); my $stow = new_Stow(dir => "$TEST_DIR/stow", target => "$TEST_DIR/target");
$stow = new_Stow(dir => "$TEST_DIR/stow", target => "$TEST_DIR/target");
make_path("$TEST_DIR/stow/pkg13/bin13"); make_path("$TEST_DIR/stow/pkg13/bin13");
make_file("$TEST_DIR/stow/pkg13/bin13/file13"); make_file("$TEST_DIR/stow/pkg13/bin13/file13");
make_link("$TEST_DIR/target/bin13", '../stow/pkg13/bin13'); make_link("$TEST_DIR/target/bin13", '../stow/pkg13/bin13');
$stow->plan_unstow('pkg13'); $stow->plan_unstow('pkg13');
$stow->process_tasks(); $stow->process_tasks();
ok( is($stow->get_conflict_count, 0);
$stow->get_conflict_count == 0 && ok(-f "$TEST_DIR/stow/pkg13/bin13/file13");
-f "$TEST_DIR/stow/pkg13/bin13/file13" && ! -e "$TEST_DIR/target/bin13" ok(! -e "$TEST_DIR/target/bin13" => 'unstow a simple tree');
=> 'unstow a simple tree' });
);
# subtest("unstow a simple tree minimally with absolute stow dir when cwd isn't target", sub {
# unstow a simple tree minimally with absolute stow dir when cwd isn't plan tests => 3;
# target my $stow = new_Stow(dir => canon_path("$TEST_DIR/stow"),
#
$stow = new_Stow(dir => canon_path("$TEST_DIR/stow"),
target => "$TEST_DIR/target"); target => "$TEST_DIR/target");
make_path("$TEST_DIR/stow/pkg14/bin14"); make_path("$TEST_DIR/stow/pkg14/bin14");
make_file("$TEST_DIR/stow/pkg14/bin14/file14"); make_file("$TEST_DIR/stow/pkg14/bin14/file14");
make_link("$TEST_DIR/target/bin14", '../stow/pkg14/bin14'); make_link("$TEST_DIR/target/bin14", '../stow/pkg14/bin14');
$stow->plan_unstow('pkg14'); $stow->plan_unstow('pkg14');
$stow->process_tasks(); $stow->process_tasks();
ok( is($stow->get_conflict_count, 0);
$stow->get_conflict_count == 0 && ok(-f "$TEST_DIR/stow/pkg14/bin14/file14");
-f "$TEST_DIR/stow/pkg14/bin14/file14" && ! -e "$TEST_DIR/target/bin14" ok(! -e "$TEST_DIR/target/bin14"
=> 'unstow a simple tree with absolute stow dir' => 'unstow a simple tree with absolute stow dir'
); );
});
# subtest("unstow a simple tree minimally with absolute stow AND target dirs when cwd isn't target", sub {
# unstow a simple tree minimally with absolute stow AND target dirs plan tests => 3;
# when cwd isn't target my $stow = new_Stow(dir => canon_path("$TEST_DIR/stow"),
#
$stow = new_Stow(dir => canon_path("$TEST_DIR/stow"),
target => canon_path("$TEST_DIR/target")); target => canon_path("$TEST_DIR/target"));
make_path("$TEST_DIR/stow/pkg15/bin15"); make_path("$TEST_DIR/stow/pkg15/bin15");
make_file("$TEST_DIR/stow/pkg15/bin15/file15"); make_file("$TEST_DIR/stow/pkg15/bin15/file15");
make_link("$TEST_DIR/target/bin15", '../stow/pkg15/bin15'); make_link("$TEST_DIR/target/bin15", '../stow/pkg15/bin15');
$stow->plan_unstow('pkg15'); $stow->plan_unstow('pkg15');
$stow->process_tasks(); $stow->process_tasks();
ok( is($stow->get_conflict_count, 0);
$stow->get_conflict_count == 0 && ok(-f "$TEST_DIR/stow/pkg15/bin15/file15");
-f "$TEST_DIR/stow/pkg15/bin15/file15" && ! -e "$TEST_DIR/target/bin15" ok(! -e "$TEST_DIR/target/bin15"
=> 'unstow a simple tree with absolute stow and target dirs' => 'unstow a simple tree with absolute stow and target dirs'
); );
});
# #
# unstow a tree with no-folding enabled - # unstow a tree with no-folding enabled -
@ -427,7 +416,7 @@ foreach my $pkg (qw{a b}) {
create_and_stow_pkg('no-folding', $pkg); create_and_stow_pkg('no-folding', $pkg);
} }
$stow = new_Stow('no-folding' => 1); my $stow = new_Stow('no-folding' => 1);
$stow->plan_unstow('no-folding-b'); $stow->plan_unstow('no-folding-b');
is_deeply([ $stow->get_conflicts ], [] => 'no conflicts with --no-folding'); is_deeply([ $stow->get_conflicts ], [] => 'no conflicts with --no-folding');
use Data::Dumper; use Data::Dumper;