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 | }
|
---|