]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blobdiff - src/allmydata/test/test_cli_cp.py
cp: trailing slash on source filename is an error, just like on targets
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / test / test_cli_cp.py
index 7c36b1c2f64d739e7b32385aa3c7641b2474ae64..03abcc4595cb344122ecec23b2b1fe68e462d369 100644 (file)
@@ -1,4 +1,4 @@
-import os.path, simplejson, shutil
+import os.path, simplejson
 from twisted.trial import unittest
 from twisted.python import usage
 from twisted.internet import defer
@@ -7,6 +7,7 @@ from allmydata.scripts import cli
 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
 
@@ -655,8 +656,11 @@ starting copy, 2 files, 1 directories
             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
+# trailing slash on target files should cause error
+# trailing slash on source directory should not matter, test a few
+# trailing slash on source files should cause error
 
 COPYOUT_TESTCASES = """
 cp    $FILECAP          to/existing-file : to/existing-file
@@ -677,17 +681,23 @@ cp -r $DIRCAP           to/existing-file/ : E7-BADSLASH
 cp    $FILECAP $DIRCAP  to/existing-file/ : E4-NEED-R
 cp -r $FILECAP $DIRCAP  to/existing-file/ : E7-BADSLASH
 
-
-cp    $FILECAP       to : E2-DESTNAME
-cp -r $FILECAP       to : E2-DESTNAME
-cp    $DIRCAP/file   to : to/file
-cp -r $DIRCAP/file   to : to/file
-cp    $PARENTCAP/dir to : E4-NEED-R
-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
+# 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 $DIRCAP/file    to : to/file
+# these two are errors
+cp    $DIRCAP/file/   to : E8-BADSLASH
+cp -r $DIRCAP/file/   to : E8-BADSLASH
+cp    $PARENTCAP/dir  to : E4-NEED-R
+cp -r $PARENTCAP/dir  to : to/dir/file
+# but these two should ignore the trailing source slash
+cp    $PARENTCAP/dir/ to : E4-NEED-R
+cp -r $PARENTCAP/dir/ to : to/dir/file
+cp    $DIRCAP         to : E4-NEED-R
+cp -r $DIRCAP         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
@@ -697,14 +707,14 @@ cp    $PARENTCAP/dir to/ : E4-NEED-R
 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
@@ -712,10 +722,10 @@ cp -r $PARENTCAP/dir3/file3 $DIRCAP $PARENTCAP/dir2          to : to/file3,to/fi
 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
@@ -732,8 +742,8 @@ cp    $PARENTCAP/dir to/missing : E4-NEED-R
 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
@@ -743,15 +753,35 @@ cp    $PARENTCAP/dir to/missing/ : E4-NEED-R
 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/
@@ -866,9 +896,7 @@ class CopyOut(GridTestMixin, CLITestMixin, unittest.TestCase):
             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:
@@ -883,16 +911,16 @@ class CopyOut(GridTestMixin, CLITestMixin, unittest.TestCase):
                .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":
@@ -921,16 +949,18 @@ class CopyOut(GridTestMixin, CLITestMixin, unittest.TestCase):
                     return set(["E6-MANYONE"])
                 if err == "target is not a directory, but ends with a slash":
                     return set(["E7-BADSLASH"])
+                if err == "source is not a directory, but ends with a slash":
+                    return set(["E8-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("/")
@@ -965,7 +995,7 @@ class CopyOut(GridTestMixin, CLITestMixin, unittest.TestCase):
                 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))