Skip to content

Commit 0261a08

Browse files
author
Miloslav Metelka
committed
[GR-13245] Added file.copy tests.
PullRequest: fastr/1868
2 parents a3d140b + 0c7b54d commit 0261a08

File tree

5 files changed

+136
-5
lines changed

5 files changed

+136
-5
lines changed

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ConnectionFunctions.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -260,7 +260,7 @@ protected RAbstractIntVector file(String description, String openArg, boolean bl
260260
try {
261261
return new FileRConnection(description, path, open, blocking, encoding, raw, true).asVector();
262262
} catch (IOException ex) {
263-
warning(RError.Message.CANNOT_OPEN_FILE, description, ex.getMessage());
263+
warning(RError.Message.NO_SUCH_FILE, description);
264264
throw error(RError.Message.CANNOT_OPEN_CONNECTION);
265265
} catch (IllegalCharsetNameException ex) {
266266
throw error(RError.Message.UNSUPPORTED_ENCODING_CONVERSION, encoding, "");

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/FileFunctions.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -988,7 +988,17 @@ protected RLogicalVector fileCopy(RAbstractStringVector vecFrom, RAbstractString
988988
if (recursive) {
989989
assert toDir != null;
990990
// to is just one dir (checked above)
991-
status[i] = RRuntime.asLogical(copyDir(fromPath, toPath, copyOptions));
991+
boolean copyDirResult;
992+
if (!overwrite) {
993+
try {
994+
copyDirResult = copyDir(fromPath, toPath, copyOptions);
995+
} catch (FileAlreadyExistsException ex) { // Ignore
996+
copyDirResult = false;
997+
}
998+
} else {
999+
copyDirResult = copyDir(fromPath, toPath, copyOptions);
1000+
}
1001+
status[i] = RRuntime.asLogical(copyDirResult);
9921002
}
9931003
} else {
9941004
// copy to existing files is skipped unless overWrite
@@ -1027,6 +1037,7 @@ public FileVisitResult preVisitDirectory(TruffleFile dir, BasicFileAttributes at
10271037
try {
10281038
dir.copy(newDir, copyOptions);
10291039
} catch (FileAlreadyExistsException x) {
1040+
error = true;
10301041
// ok
10311042
} catch (DirectoryNotEmptyException x) {
10321043
// ok
@@ -1040,7 +1051,12 @@ public FileVisitResult preVisitDirectory(TruffleFile dir, BasicFileAttributes at
10401051
@Override
10411052
public FileVisitResult visitFile(TruffleFile file, BasicFileAttributes attrs) throws IOException {
10421053
TruffleFile newFile = toDir.resolve(fromDir.relativize(file).getPath());
1043-
file.copy(newFile, copyOptions);
1054+
try {
1055+
file.copy(newFile, copyOptions);
1056+
} catch (FileAlreadyExistsException x) {
1057+
error = true;
1058+
// ok
1059+
}
10441060
return FileVisitResult.CONTINUE;
10451061
}
10461062

com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30758,6 +30758,10 @@ numeric(0)
3075830758
#{ class(expression(1)) }
3075930759
[1] "expression"
3076030760

30761+
##com.oracle.truffle.r.test.builtins.TestBuiltin_expression.testExpression#Ignored.OutputFormatting#
30762+
#{ expression(a=1, 2, b=3) }
30763+
expression(a = 1, 2, b = 3)
30764+
3076130765
##com.oracle.truffle.r.test.builtins.TestBuiltin_expression.testExpression#
3076230766
#{ f <- function(z) {z}; e<-c(expression(f), 7); eval(e) }
3076330767
[1] 7
@@ -30766,6 +30770,10 @@ numeric(0)
3076630770
#{ f <- function(z) {z}; e<-expression(f); e2<-c(e, 7); eval(e2) }
3076730771
[1] 7
3076830772

30773+
##com.oracle.truffle.r.test.builtins.TestBuiltin_expression.testExpression#
30774+
#{ names(expression(a=1, 2, b=3)) }
30775+
[1] "a" "" "b"
30776+
3076930777
##com.oracle.truffle.r.test.builtins.TestBuiltin_expression.testExpression#
3077030778
#{ x<-expression(1); typeof(x[[1]]) }
3077130779
[1] "double"
@@ -31590,6 +31598,48 @@ integer(0)
3159031598
#argv <- list('/home/lzhao/R/x86_64-unknown-linux-gnu-library/3.0/FALSE', 5); .Internal(file.access(argv[[1]], argv[[2]]))
3159131599
[1] -1
3159231600

31601+
##com.oracle.truffle.r.test.builtins.TestBuiltin_filecopy.testfilecopy#
31602+
#baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcD<-paste0(baseD, '/src'); srcF<-paste0(srcD, nameF); dstD<-paste0(baseD, '/dst'); dstF<-paste0(dstD, '/src', nameF); tryCatch({dir.create(paste0(dstD, '/src'), rec=TRUE); dir.create(srcD, rec=TRUE); cat('New\n', file=srcF); cat('Old\n', file=dstF); print(file.copy(from=srcD, to=dstD, recursive=TRUE, overwrite=FALSE)); print(readLines(dstF)); }, finally=unlink(baseD, recursive=TRUE))
31603+
[1] FALSE
31604+
[1] "Old"
31605+
31606+
##com.oracle.truffle.r.test.builtins.TestBuiltin_filecopy.testfilecopy#
31607+
#baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcD<-paste0(baseD, '/src'); srcF<-paste0(srcD, nameF); dstD<-paste0(baseD, '/dst'); dstF<-paste0(dstD, '/src', nameF); tryCatch({dir.create(paste0(dstD, '/src'), rec=TRUE); dir.create(srcD, rec=TRUE); cat('New\n', file=srcF); cat('Old\n', file=dstF); print(file.copy(from=srcD, to=dstD, recursive=TRUE, overwrite=TRUE)); print(readLines(dstF)) }, finally=unlink(baseD, recursive=TRUE))
31608+
[1] TRUE
31609+
[1] "New"
31610+
31611+
##com.oracle.truffle.r.test.builtins.TestBuiltin_filecopy.testfilecopy#
31612+
#baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcD<-paste0(baseD, '/src'); srcF<-paste0(srcD, nameF); dstD<-paste0(baseD, '/dst'); dstF<-paste0(dstD, nameF); tryCatch({dir.create(dstD, rec=TRUE); dir.create(srcD, rec=TRUE); cat('Hello\n', file=srcF); print(file.copy(from=srcD, to=dstD)); print(file.exists(dstF)) }, finally=unlink(baseD, recursive=TRUE))
31613+
[1] FALSE
31614+
[1] FALSE
31615+
31616+
##com.oracle.truffle.r.test.builtins.TestBuiltin_filecopy.testfilecopy#
31617+
#baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcD<-paste0(baseD, '/src'); srcF<-paste0(srcD, nameF); dstD<-paste0(baseD, '/dst'); dstSrcD<-paste0(dstD, '/src'); dstSrcF<-paste0(dstSrcD, nameF); tryCatch({dir.create(dstD, rec=TRUE); dir.create(srcD, rec=TRUE); cat('Hello\n', file=srcF); print(file.copy(from=srcD, to=dstD, rec=TRUE)); print(file.exists(dstSrcD)); print(readLines(dstSrcF)); }, finally=unlink(baseD, recursive=TRUE))
31618+
[1] TRUE
31619+
[1] TRUE
31620+
[1] "Hello"
31621+
31622+
##com.oracle.truffle.r.test.builtins.TestBuiltin_filecopy.testfilecopy#
31623+
#baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcD<-paste0(baseD, '/src'); srcF<-paste0(srcD, nameF); srcF2<-paste0(srcD, nameF, '2'); dstD<-paste0(baseD, '/dst'); dstF<-paste0(dstD, '/src', nameF); dstF2<-paste0(dstD, '/src', nameF, '2');tryCatch({dir.create(paste0(dstD, '/src'), rec=TRUE); dir.create(srcD, rec=TRUE); cat('New\n', file=srcF); cat('New2\n', file=srcF2); cat('Old\n', file=dstF); print(file.copy(from=srcD, to=dstD, recursive=TRUE, overwrite=FALSE)); print(readLines(dstF)); print(readLines(dstF2)) }, finally=unlink(baseD, recursive=TRUE))
31624+
[1] FALSE
31625+
[1] "Old"
31626+
[1] "New2"
31627+
31628+
##com.oracle.truffle.r.test.builtins.TestBuiltin_filecopy.testfilecopy#
31629+
#baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcF<-paste0(baseD, nameF); dstD<-paste0(baseD, '/dst'); dstF<-paste0(dstD, nameF); tryCatch({dir.create(dstD, rec=TRUE); cat('Hello\n', file=srcF); print(file.copy(from=srcF, to=dstD)); print(readLines(dstF)) }, finally=unlink(baseD, recursive=TRUE))
31630+
[1] TRUE
31631+
[1] "Hello"
31632+
31633+
##com.oracle.truffle.r.test.builtins.TestBuiltin_filecopy.testfilecopy#
31634+
#baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcF<-paste0(baseD, nameF); dstD<-paste0(baseD, '/dst'); dstF<-paste0(dstD, nameF); tryCatch({dir.create(dstD, rec=TRUE); cat('New\n', file=srcF); cat('Old\n', file=dstF); print(file.copy(from=srcF, to=dstD)); print(readLines(dstF)) }, finally=unlink(baseD, recursive=TRUE))
31635+
[1] FALSE
31636+
[1] "Old"
31637+
31638+
##com.oracle.truffle.r.test.builtins.TestBuiltin_filecopy.testfilecopy#
31639+
#baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcF<-paste0(baseD, nameF); dstD<-paste0(baseD, '/dst'); dstF<-paste0(dstD, nameF); tryCatch({dir.create(dstD, rec=TRUE); cat('New\n', file=srcF); cat('Old\n', file=dstF); print(file.copy(from=srcF, to=dstD, overwrite=TRUE)); print(readLines(dstF)) }, finally=unlink(baseD, recursive=TRUE))
31640+
[1] TRUE
31641+
[1] "New"
31642+
3159331643
##com.oracle.truffle.r.test.builtins.TestBuiltin_filecreate.testfilecreate1#
3159431644
#argv <- list('codetools-manual.log', TRUE); .Internal(file.create(argv[[1]], argv[[2]]))
3159531645
[1] TRUE
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 3 only, as
7+
* published by the Free Software Foundation.
8+
*
9+
* This code is distributed in the hope that it will be useful, but WITHOUT
10+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
* version 3 for more details (a copy is included in the LICENSE file that
13+
* accompanied this code).
14+
*
15+
* You should have received a copy of the GNU General Public License version
16+
* 3 along with this work; if not, write to the Free Software Foundation,
17+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18+
*
19+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20+
* or visit www.oracle.com if you need additional information or have any
21+
* questions.
22+
*/
23+
package com.oracle.truffle.r.test.builtins;
24+
25+
import org.junit.Test;
26+
27+
import com.oracle.truffle.r.test.TestBase;
28+
29+
// Checkstyle: stop line length check
30+
public class TestBuiltin_filecopy extends TestBase {
31+
32+
@Test
33+
public void testfilecopy() {
34+
// Copy file into existing destination dir
35+
assertEval("baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcF<-paste0(baseD, nameF); dstD<-paste0(baseD, '/dst'); dstF<-paste0(dstD, nameF); " +
36+
"tryCatch({dir.create(dstD, rec=TRUE); cat('Hello\\n', file=srcF); print(file.copy(from=srcF, to=dstD)); print(readLines(dstF)) }, finally=unlink(baseD, recursive=TRUE))");
37+
// Copy file into destination dir where target file exists (overwrite=FALSE => original file
38+
// retained)
39+
assertEval("baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcF<-paste0(baseD, nameF); dstD<-paste0(baseD, '/dst'); dstF<-paste0(dstD, nameF); " +
40+
"tryCatch({dir.create(dstD, rec=TRUE); cat('New\\n', file=srcF); cat('Old\\n', file=dstF); print(file.copy(from=srcF, to=dstD)); print(readLines(dstF)) }, finally=unlink(baseD, recursive=TRUE))");
41+
// Copy file into destination dir where target file exists (overwrite=TRUE => original file
42+
// overwritten)
43+
assertEval("baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcF<-paste0(baseD, nameF); dstD<-paste0(baseD, '/dst'); dstF<-paste0(dstD, nameF); " +
44+
"tryCatch({dir.create(dstD, rec=TRUE); cat('New\\n', file=srcF); cat('Old\\n', file=dstF); print(file.copy(from=srcF, to=dstD, overwrite=TRUE)); print(readLines(dstF)) }, finally=unlink(baseD, recursive=TRUE))");
45+
// Copy src dir with a file into existing destination dir - no recursive flag
46+
assertEval("baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcD<-paste0(baseD, '/src'); srcF<-paste0(srcD, nameF); dstD<-paste0(baseD, '/dst'); dstF<-paste0(dstD, nameF); " +
47+
"tryCatch({dir.create(dstD, rec=TRUE); dir.create(srcD, rec=TRUE); cat('Hello\\n', file=srcF); print(file.copy(from=srcD, to=dstD)); print(file.exists(dstF)) }, finally=unlink(baseD, recursive=TRUE))");
48+
// Copy src dir with a file into existing destination dir - recursive flag
49+
assertEval("baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcD<-paste0(baseD, '/src'); srcF<-paste0(srcD, nameF); dstD<-paste0(baseD, '/dst'); dstSrcD<-paste0(dstD, '/src'); dstSrcF<-paste0(dstSrcD, nameF); " +
50+
"tryCatch({dir.create(dstD, rec=TRUE); dir.create(srcD, rec=TRUE); cat('Hello\\n', file=srcF); print(file.copy(from=srcD, to=dstD, rec=TRUE)); print(file.exists(dstSrcD)); print(readLines(dstSrcF)); }, finally=unlink(baseD, recursive=TRUE))");
51+
// Copy src dir with a file into destination dir - recursive flag and no overwrite flag
52+
assertEval("baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcD<-paste0(baseD, '/src'); srcF<-paste0(srcD, nameF); dstD<-paste0(baseD, '/dst'); dstF<-paste0(dstD, '/src', nameF); " +
53+
"tryCatch({dir.create(paste0(dstD, '/src'), rec=TRUE); dir.create(srcD, rec=TRUE); cat('New\\n', file=srcF); cat('Old\\n', file=dstF); print(file.copy(from=srcD, to=dstD, recursive=TRUE, overwrite=FALSE)); print(readLines(dstF)); }, finally=unlink(baseD, recursive=TRUE))");
54+
// Copy src dir with a file into destination dir - recursive flag and no overwrite flag; one
55+
// file exists at the destination another not
56+
assertEval("baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcD<-paste0(baseD, '/src'); srcF<-paste0(srcD, nameF); srcF2<-paste0(srcD, nameF, '2'); dstD<-paste0(baseD, '/dst'); dstF<-paste0(dstD, '/src', nameF); dstF2<-paste0(dstD, '/src', nameF, '2');" +
57+
"tryCatch({dir.create(paste0(dstD, '/src'), rec=TRUE); dir.create(srcD, rec=TRUE); cat('New\\n', file=srcF); cat('New2\\n', file=srcF2); cat('Old\\n', file=dstF); print(file.copy(from=srcD, to=dstD, recursive=TRUE, overwrite=FALSE)); print(readLines(dstF)); print(readLines(dstF2)) }, finally=unlink(baseD, recursive=TRUE))");
58+
// Copy src dir with a file into destination dir (overwrite=FALSE => original file retained)
59+
assertEval("baseD<-paste0(tempdir(), '/file.copy.test'); nameF<-'/srcFile.txt'; srcD<-paste0(baseD, '/src'); srcF<-paste0(srcD, nameF); dstD<-paste0(baseD, '/dst'); dstF<-paste0(dstD, '/src', nameF); " +
60+
"tryCatch({dir.create(paste0(dstD, '/src'), rec=TRUE); dir.create(srcD, rec=TRUE); cat('New\\n', file=srcF); cat('Old\\n', file=dstF); print(file.copy(from=srcD, to=dstD, recursive=TRUE, overwrite=TRUE)); print(readLines(dstF)) }, finally=unlink(baseD, recursive=TRUE))");
61+
// Copy src dir with a file into destination dir (overwrite=TRUE => original file
62+
// overwritten)
63+
}
64+
65+
}

com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestConditionHandling.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it

0 commit comments

Comments
 (0)