-import os.path, simplejson, shutil
+import os.path, simplejson
from twisted.trial import unittest
from twisted.python import usage
from twisted.internet import defer
from allmydata.util import fileutil
from allmydata.util.encodingutil import (quote_output, get_io_encoding,
unicode_to_output, to_str)
+from allmydata.util.assertutil import _assert
from .no_network import GridTestMixin
from .test_cli import CLITestMixin
self.failUnlessIn("Success: file copied", out, str(res))
return d
+# these test cases come from ticket #2329 comment 40
# trailing slash on target *directory* should not matter, test both
# trailing slash on files should cause error
cp $FILECAP $DIRCAP to/existing-file/ : E4-NEED-R
cp -r $FILECAP $DIRCAP to/existing-file/ : E7-BADSLASH
-
+# single source to a (present) target directory
cp $FILECAP to : E2-DESTNAME
cp -r $FILECAP to : E2-DESTNAME
cp $DIRCAP/file to : to/file
cp -r $PARENTCAP/dir to : to/dir/file
cp $DIRCAP to : E4-NEED-R
cp -r $DIRCAP to : to/file
-cp $ALIAS to : E4-NEED-R
-cp -r $ALIAS to : to/file
+cp $DIRALIAS to : E4-NEED-R
+cp -r $DIRALIAS to : to/file
cp $FILECAP to/ : E2-DESTNAME
cp -r $FILECAP to/ : E2-DESTNAME
cp -r $PARENTCAP/dir to/ : to/dir/file
cp $DIRCAP to/ : E4-NEED-R
cp -r $DIRCAP to/ : to/file
-cp $ALIAS to/ : E4-NEED-R
-cp -r $ALIAS to/ : to/file
-
-
-cp $DIRCAP/file $PARENTCAP/dir2/file2 to : to/file,to/file2
-cp $DIRCAP/file $FILECAP to : E2-DESTNAME
-cp $DIRCAP $FILECAP to : E4-NEED-R
-cp -r $DIRCAP $FILECAP to : E2-DESTNAME
+cp $DIRALIAS to/ : E4-NEED-R
+cp -r $DIRALIAS to/ : to/file
+
+# multiple sources to a (present) target directory
+cp $DIRCAP/file $PARENTCAP/dir2/file2 to : to/file,to/file2
+cp $DIRCAP/file $FILECAP to : E2-DESTNAME
+cp $DIRCAP $FILECAP to : E4-NEED-R
+cp -r $DIRCAP $FILECAP to : E2-DESTNAME
# namedfile, unnameddir, nameddir
cp $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2 to : E4-NEED-R
cp -r $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2 to : to/file3,to/file,to/dir2/file2
cp $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2 $FILECAP to : E4-NEED-R
cp -r $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2 $FILECAP to : E2-DESTNAME
-cp $DIRCAP/file $PARENTCAP/dir2/file2 to/ : to/file,to/file2
-cp $DIRCAP/file $FILECAP to/ : E2-DESTNAME
-cp $DIRCAP $FILECAP to/ : E4-NEED-R
-cp -r $DIRCAP $FILECAP to/ : E2-DESTNAME
+cp $DIRCAP/file $PARENTCAP/dir2/file2 to/ : to/file,to/file2
+cp $DIRCAP/file $FILECAP to/ : E2-DESTNAME
+cp $DIRCAP $FILECAP to/ : E4-NEED-R
+cp -r $DIRCAP $FILECAP to/ : E2-DESTNAME
# namedfile, unnameddir, nameddir
cp $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2 to/ : E4-NEED-R
cp -r $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2 to/ : to/file3,to/file,to/dir2/file2
cp -r $PARENTCAP/dir to/missing : to/missing/dir/file
cp $DIRCAP to/missing : E4-NEED-R
cp -r $DIRCAP to/missing : to/missing/file
-cp $ALIAS to/missing : E4-NEED-R
-cp -r $ALIAS to/missing : to/missing/file
+cp $DIRALIAS to/missing : E4-NEED-R
+cp -r $DIRALIAS to/missing : to/missing/file
cp $FILECAP to/missing/ : E7-BADSLASH
cp -r $FILECAP to/missing/ : E7-BADSLASH
cp -r $PARENTCAP/dir to/missing/ : to/missing/dir/file
cp $DIRCAP to/missing/ : E4-NEED-R
cp -r $DIRCAP to/missing/ : to/missing/file
-cp $ALIAS to/missing/ : E4-NEED-R
-cp -r $ALIAS to/missing/ : to/missing/file
+cp $DIRALIAS to/missing/ : E4-NEED-R
+cp -r $DIRALIAS to/missing/ : to/missing/file
-# multiple files to a missing target: should mkdir
+# multiple things to a missing target: should mkdir
cp $DIRCAP/file $PARENTCAP/dir2/file2 to/missing : to/missing/file,to/missing/file2
cp -r $DIRCAP/file $PARENTCAP/dir2/file2 to/missing : to/missing/file,to/missing/file2
+cp $DIRCAP/file $FILECAP to/missing : E2-DESTNAME
+cp -r $DIRCAP/file $FILECAP to/missing : E2-DESTNAME
+cp $DIRCAP $FILECAP to/missing : E4-NEED-R
+cp -r $DIRCAP $FILECAP to/missing : E2-DESTNAME
+ # namedfile, unnameddir, nameddir
+cp $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2 to/missing : E4-NEED-R
+cp -r $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2 to/missing : to/missing/file3,to/missing/file,to/missing/dir2/file2
+ # namedfile, unnameddir, nameddir, unnamedfile
+cp $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2 $FILECAP to/missing : E4-NEED-R
+cp -r $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2 $FILECAP to/missing : E2-DESTNAME
cp $DIRCAP/file $PARENTCAP/dir2/file2 to/missing/ : to/missing/file,to/missing/file2
cp -r $DIRCAP/file $PARENTCAP/dir2/file2 to/missing/ : to/missing/file,to/missing/file2
+cp $DIRCAP/file $FILECAP to/missing/ : E2-DESTNAME
+cp -r $DIRCAP/file $FILECAP to/missing/ : E2-DESTNAME
+cp $DIRCAP $FILECAP to/missing/ : E4-NEED-R
+cp -r $DIRCAP $FILECAP to/missing/ : E2-DESTNAME
+ # namedfile, unnameddir, nameddir
+cp $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2 to/missing/ : E4-NEED-R
+cp -r $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2 to/missing/ : to/missing/file3,to/missing/file,to/missing/dir2/file2
+ # namedfile, unnameddir, nameddir, unnamedfile
+cp $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2 $FILECAP to/missing/ : E4-NEED-R
+cp -r $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2 $FILECAP to/missing/ : E2-DESTNAME
# make sure empty directories are copied too
cp -r $PARENTCAP/dir4 to : to/dir4/emptydir/
here = "/".join(dirpath.split(os.sep)[len(top.split(os.sep))-1:])
results.add(here+"/")
for fn in filenames:
- f = open(os.path.join(dirpath, fn), "rb")
- contents = f.read()
- f.close()
+ contents = fileutil.read(os.path.join(dirpath, fn))
if contents == self.FILE_CONTENTS:
results.add("%s/%s" % (here, fn))
elif contents == self.FILE_CONTENTS_5:
.replace("$DIRCAP5", self.DIRCAP5)
.replace("$DIRCAP6", self.DIRCAP6)
.replace("$DIRCAP", self.DIRCAP)
- .replace("$ALIAS", "ALIAS:")
+ .replace("$DIRALIAS", "ALIAS:")
.replace("$FILECAP", self.FILECAP)
.split())
target = cmd[-1]
+ _assert(target == "to" or target.startswith("to/"), target)
cmd[-1] = os.path.abspath(os.path.join(self.basedir, cmd[-1]))
# reset
targetdir = os.path.abspath(os.path.join(self.basedir, "to"))
- if os.path.exists(targetdir):
- shutil.rmtree(targetdir)
+ fileutil.rm_dir(targetdir)
os.mkdir(targetdir)
if target.rstrip("/") == "to/existing-file":
return set(["E5-DIRTOFILE"])
if err == "copying multiple things requires target be a directory":
return set(["E6-MANYONE"])
- if err == "target is not a directory, but has a slash":
+ if err == "target is not a directory, but ends with a slash":
return set(["E7-BADSLASH"])
self.fail("unrecognized error ('%s') %s" % (case, res))
d.addCallback(_check)
return d
- def do_one_test(self, case, expected):
- expected = expected.copy()
+ def do_one_test(self, case, orig_expected):
+ expected = set(orig_expected)
printable_expected = ",".join(sorted(expected))
#print "---", case, ":", printable_expected
- for f in list(expected):
+ for f in orig_expected:
# f is "dir/file" or "dir/sub/file" or "dir/" or "dir/sub/"
# we want all parent directories in the set, with trailing /
pieces = f.rstrip("/").split("/")
continue
case, expected = line.split(":")
case = case.strip()
- expected = set(expected.strip().split(","))
+ expected = frozenset(expected.strip().split(","))
d.addCallback(lambda ign, case=case, expected=expected:
self.do_one_test(case, expected))