#!./perl -w BEGIN { # We're not going to chdir() into 't' because we don't know if # chdir() works! Instead, we'll hedge our bets and put both # possibilities into @INC. @INC = qw(t . lib ../lib); } use Config; require "test.pl"; plan(tests => 48); my $IsVMS = $^O eq 'VMS'; my $IsMacOS = $^O eq 'MacOS'; # For an op regression test, I don't want to rely on "use constant" working. my $has_fchdir = ($Config{d_fchdir} || "") eq "define"; # Might be a little early in the testing process to start using these, # but I can't think of a way to write this test without them. use File::Spec::Functions qw(:DEFAULT splitdir rel2abs splitpath); # Can't use Cwd::abs_path() because it has different ideas about # path separators than File::Spec. sub abs_path { my $d = rel2abs(curdir); $d = uc($d) if $IsVMS; $d = lc($d) if $^O =~ /^uwin/; $d; } my $Cwd = abs_path; # Let's get to a known position SKIP: { my ($vol,$dir) = splitpath(abs_path,1); my $test_dir = $IsVMS ? 'T' : 't'; skip("Already in t/", 2) if (splitdir($dir))[-1] eq $test_dir; ok( chdir($test_dir), 'chdir($test_dir)'); is( abs_path, catdir($Cwd, $test_dir), ' abs_path() agrees' ); } $Cwd = abs_path; SKIP: { skip("no fchdir", 16) unless $has_fchdir; my $has_dirfd = ($Config{d_dirfd} || $Config{d_dir_dd_fd} || "") eq "define"; ok(opendir(my $dh, "."), "opendir ."); ok(open(my $fh, "<", "op"), "open op"); ok(chdir($fh), "fchdir op"); ok(-f "chdir.t", "verify that we are in op"); if ($has_dirfd) { ok(chdir($dh), "fchdir back"); } else { eval { chdir($dh); }; like($@, qr/^The dirfd function is unimplemented at/, "dirfd is unimplemented"); chdir ".." or die $!; } # same with bareword file handles no warnings 'once'; *DH = $dh; *FH = $fh; ok(chdir FH, "fchdir op bareword"); ok(-f "chdir.t", "verify that we are in op"); if ($has_dirfd) { ok(chdir DH, "fchdir back bareword"); } else { eval { chdir(DH); }; like($@, qr/^The dirfd function is unimplemented at/, "dirfd is unimplemented"); chdir ".." or die $!; } ok(-d "op", "verify that we are back"); # And now the ambiguous case { no warnings qw; ok(opendir(H, "op"), "opendir op") or diag $!; ok(open(H, "<", "base"), "open base") or diag $!; } if ($has_dirfd) { ok(chdir(H), "fchdir to op"); ok(-f "chdir.t", "verify that we are in 'op'"); chdir ".." or die $!; } else { eval { chdir(H); }; like($@, qr/^The dirfd function is unimplemented at/, "dirfd is unimplemented"); SKIP: { skip("dirfd is unimplemented"); } } ok(closedir(H), "closedir"); ok(chdir(H), "fchdir to base"); ok(-f "cond.t", "verify that we are in 'base'"); chdir ".." or die $!; } SKIP: { skip("has fchdir", 1) if $has_fchdir; opendir(my $dh, "op"); eval { chdir($dh); }; like($@, qr/^The fchdir function is unimplemented at/, "fchdir is unimplemented"); } # The environment variables chdir() pays attention to. my @magic_envs = qw(HOME LOGDIR SYS$LOGIN); sub check_env { my($key) = @_; # Make sure $ENV{'SYS$LOGIN'} is only honored on VMS. if( $key eq 'SYS$LOGIN' && !$IsVMS && !$IsMacOS ) { ok( !chdir(), "chdir() on $^O ignores only \$ENV{$key} set" ); is( abs_path, $Cwd, ' abs_path() did not change' ); pass( " no need to test SYS\$LOGIN on $^O" ) for 1..7; } else { ok( chdir(), "chdir() w/ only \$ENV{$key} set" ); is( abs_path, $ENV{$key}, ' abs_path() agrees' ); chdir($Cwd); is( abs_path, $Cwd, ' and back again' ); my $warning = ''; local $SIG{__WARN__} = sub { $warning .= join '', @_ }; # Check the deprecated chdir(undef) feature. #line 64 ok( chdir(undef), "chdir(undef) w/ only \$ENV{$key} set" ); is( abs_path, $ENV{$key}, ' abs_path() agrees' ); is( $warning, <