| 1 | #!./perl
|
|---|
| 2 |
|
|---|
| 3 | BEGIN {
|
|---|
| 4 | chdir 't' if -d 't';
|
|---|
| 5 | @INC = '../lib';
|
|---|
| 6 | }
|
|---|
| 7 |
|
|---|
| 8 | use Test::More;
|
|---|
| 9 |
|
|---|
| 10 | my $TB = Test::More->builder;
|
|---|
| 11 |
|
|---|
| 12 | plan tests => 60;
|
|---|
| 13 |
|
|---|
| 14 | # We're going to override rename() later on but Perl has to see an override
|
|---|
| 15 | # at compile time to honor it.
|
|---|
| 16 | BEGIN { *CORE::GLOBAL::rename = sub { CORE::rename($_[0], $_[1]) }; }
|
|---|
| 17 |
|
|---|
| 18 |
|
|---|
| 19 | use File::Copy;
|
|---|
| 20 | use Config;
|
|---|
| 21 |
|
|---|
| 22 |
|
|---|
| 23 | foreach my $code ("copy()", "copy('arg')", "copy('arg', 'arg', 'arg', 'arg')",
|
|---|
| 24 | "move()", "move('arg')", "move('arg', 'arg', 'arg')"
|
|---|
| 25 | )
|
|---|
| 26 | {
|
|---|
| 27 | eval $code;
|
|---|
| 28 | like $@, qr/^Usage: /;
|
|---|
| 29 | }
|
|---|
| 30 |
|
|---|
| 31 |
|
|---|
| 32 | for my $cross_partition_test (0..1) {
|
|---|
| 33 | {
|
|---|
| 34 | # Simulate a cross-partition copy/move by forcing rename to
|
|---|
| 35 | # fail.
|
|---|
| 36 | no warnings 'redefine';
|
|---|
| 37 | *CORE::GLOBAL::rename = sub { 0 } if $cross_partition_test;
|
|---|
| 38 | }
|
|---|
| 39 |
|
|---|
| 40 | # First we create a file
|
|---|
| 41 | open(F, ">file-$$") or die;
|
|---|
| 42 | binmode F; # for DOSISH platforms, because test 3 copies to stdout
|
|---|
| 43 | printf F "ok\n";
|
|---|
| 44 | close F;
|
|---|
| 45 |
|
|---|
| 46 | copy "file-$$", "copy-$$";
|
|---|
| 47 |
|
|---|
| 48 | open(F, "copy-$$") or die;
|
|---|
| 49 | $foo = <F>;
|
|---|
| 50 | close(F);
|
|---|
| 51 |
|
|---|
| 52 | is -s "file-$$", -s "copy-$$";
|
|---|
| 53 |
|
|---|
| 54 | is $foo, "ok\n";
|
|---|
| 55 |
|
|---|
| 56 | binmode STDOUT unless $^O eq 'VMS'; # Copy::copy works in binary mode
|
|---|
| 57 | # This outputs "ok" so its a test.
|
|---|
| 58 | copy "copy-$$", \*STDOUT;
|
|---|
| 59 | $TB->current_test($TB->current_test + 1);
|
|---|
| 60 | unlink "copy-$$" or die "unlink: $!";
|
|---|
| 61 |
|
|---|
| 62 | open(F,"file-$$");
|
|---|
| 63 | copy(*F, "copy-$$");
|
|---|
| 64 | open(R, "copy-$$") or die "open copy-$$: $!"; $foo = <R>; close(R);
|
|---|
| 65 | is $foo, "ok\n";
|
|---|
| 66 | unlink "copy-$$" or die "unlink: $!";
|
|---|
| 67 |
|
|---|
| 68 | open(F,"file-$$");
|
|---|
| 69 | copy(\*F, "copy-$$");
|
|---|
| 70 | close(F) or die "close: $!";
|
|---|
| 71 | open(R, "copy-$$") or die; $foo = <R>; close(R) or die "close: $!";
|
|---|
| 72 | is $foo, "ok\n";
|
|---|
| 73 | unlink "copy-$$" or die "unlink: $!";
|
|---|
| 74 |
|
|---|
| 75 | require IO::File;
|
|---|
| 76 | $fh = IO::File->new(">copy-$$") or die "Cannot open copy-$$:$!";
|
|---|
| 77 | binmode $fh or die;
|
|---|
| 78 | copy("file-$$",$fh);
|
|---|
| 79 | $fh->close or die "close: $!";
|
|---|
| 80 | open(R, "copy-$$") or die; $foo = <R>; close(R);
|
|---|
| 81 | is $foo, "ok\n";
|
|---|
| 82 | unlink "copy-$$" or die "unlink: $!";
|
|---|
| 83 |
|
|---|
| 84 | require FileHandle;
|
|---|
| 85 | my $fh = FileHandle->new(">copy-$$") or die "Cannot open copy-$$:$!";
|
|---|
| 86 | binmode $fh or die;
|
|---|
| 87 | copy("file-$$",$fh);
|
|---|
| 88 | $fh->close;
|
|---|
| 89 | open(R, "copy-$$") or die; $foo = <R>; close(R);
|
|---|
| 90 | is $foo, "ok\n";
|
|---|
| 91 | unlink "file-$$" or die "unlink: $!";
|
|---|
| 92 |
|
|---|
| 93 | ok !move("file-$$", "copy-$$"), "move on missing file";
|
|---|
| 94 | ok -e "copy-$$", ' target still there';
|
|---|
| 95 |
|
|---|
| 96 | # Doesn't really matter what time it is as long as its not now.
|
|---|
| 97 | my $time = 1000000000;
|
|---|
| 98 | utime( $time, $time, "copy-$$" );
|
|---|
| 99 |
|
|---|
| 100 | # Recheck the mtime rather than rely on utime in case we're on a
|
|---|
| 101 | # system where utime doesn't work or there's no mtime at all.
|
|---|
| 102 | # The destination file will reflect the same difficulties.
|
|---|
| 103 | my $mtime = (stat("copy-$$"))[9];
|
|---|
| 104 |
|
|---|
| 105 | ok move("copy-$$", "file-$$"), 'move';
|
|---|
| 106 | ok -e "file-$$", ' destination exists';
|
|---|
| 107 | ok !-e "copy-$$", ' source does not';
|
|---|
| 108 | open(R, "file-$$") or die; $foo = <R>; close(R);
|
|---|
| 109 | is $foo, "ok\n";
|
|---|
| 110 |
|
|---|
| 111 | TODO: {
|
|---|
| 112 | local $TODO = 'mtime only preserved on ODS-5 with POSIX dates and DECC$EFS_FILE_TIMESTAMPS enabled' if $^O eq 'VMS';
|
|---|
| 113 |
|
|---|
| 114 | my $dest_mtime = (stat("file-$$"))[9];
|
|---|
| 115 | is $dest_mtime, $mtime,
|
|---|
| 116 | "mtime preserved by copy()".
|
|---|
| 117 | ($cross_partition_test ? " while testing cross-partition" : "");
|
|---|
| 118 | }
|
|---|
| 119 |
|
|---|
| 120 | copy "file-$$", "lib";
|
|---|
| 121 | open(R, "lib/file-$$") or die; $foo = <R>; close(R);
|
|---|
| 122 | is $foo, "ok\n";
|
|---|
| 123 | unlink "lib/file-$$" or die "unlink: $!";
|
|---|
| 124 |
|
|---|
| 125 | # Do it twice to ensure copying over the same file works.
|
|---|
| 126 | copy "file-$$", "lib";
|
|---|
| 127 | open(R, "lib/file-$$") or die; $foo = <R>; close(R);
|
|---|
| 128 | is $foo, "ok\n";
|
|---|
| 129 | unlink "lib/file-$$" or die "unlink: $!";
|
|---|
| 130 |
|
|---|
| 131 | {
|
|---|
| 132 | my $warnings = '';
|
|---|
| 133 | local $SIG{__WARN__} = sub { $warnings .= join '', @_ };
|
|---|
| 134 | ok copy("file-$$", "file-$$");
|
|---|
| 135 |
|
|---|
| 136 | like $warnings, qr/are identical/;
|
|---|
| 137 | ok -s "file-$$";
|
|---|
| 138 | }
|
|---|
| 139 |
|
|---|
| 140 | move "file-$$", "lib";
|
|---|
| 141 | open(R, "lib/file-$$") or die "open lib/file-$$: $!"; $foo = <R>; close(R);
|
|---|
| 142 | is $foo, "ok\n";
|
|---|
| 143 | ok !-e "file-$$";
|
|---|
| 144 | unlink "lib/file-$$" or die "unlink: $!";
|
|---|
| 145 |
|
|---|
| 146 | SKIP: {
|
|---|
| 147 | skip "Testing symlinks", 3 unless $Config{d_symlink};
|
|---|
| 148 |
|
|---|
| 149 | open(F, ">file-$$") or die $!;
|
|---|
| 150 | print F "dummy content\n";
|
|---|
| 151 | close F;
|
|---|
| 152 | symlink("file-$$", "symlink-$$") or die $!;
|
|---|
| 153 |
|
|---|
| 154 | my $warnings = '';
|
|---|
| 155 | local $SIG{__WARN__} = sub { $warnings .= join '', @_ };
|
|---|
| 156 | ok !copy("file-$$", "symlink-$$");
|
|---|
| 157 |
|
|---|
| 158 | like $warnings, qr/are identical/;
|
|---|
| 159 | ok !-z "file-$$",
|
|---|
| 160 | 'rt.perl.org 5196: copying to itself would truncate the file';
|
|---|
| 161 |
|
|---|
| 162 | unlink "symlink-$$";
|
|---|
| 163 | unlink "file-$$";
|
|---|
| 164 | }
|
|---|
| 165 |
|
|---|
| 166 | SKIP: {
|
|---|
| 167 | skip "Testing hard links", 3 if !$Config{d_link} or $^O eq 'MSWin32';
|
|---|
| 168 |
|
|---|
| 169 | open(F, ">file-$$") or die $!;
|
|---|
| 170 | print F "dummy content\n";
|
|---|
| 171 | close F;
|
|---|
| 172 | link("file-$$", "hardlink-$$") or die $!;
|
|---|
| 173 |
|
|---|
| 174 | my $warnings = '';
|
|---|
| 175 | local $SIG{__WARN__} = sub { $warnings .= join '', @_ };
|
|---|
| 176 | ok !copy("file-$$", "hardlink-$$");
|
|---|
| 177 |
|
|---|
| 178 | like $warnings, qr/are identical/;
|
|---|
| 179 | ok ! -z "file-$$",
|
|---|
| 180 | 'rt.perl.org 5196: copying to itself would truncate the file';
|
|---|
| 181 |
|
|---|
| 182 | unlink "hardlink-$$";
|
|---|
| 183 | unlink "file-$$";
|
|---|
| 184 | }
|
|---|
| 185 | }
|
|---|
| 186 |
|
|---|
| 187 |
|
|---|
| 188 | END {
|
|---|
| 189 | 1 while unlink "file-$$";
|
|---|
| 190 | 1 while unlink "lib/file-$$";
|
|---|
| 191 | }
|
|---|