- d.addCallback(_check)
- return d
-
-
-class Mv(GridTestMixin, CLITestMixin, unittest.TestCase):
- def test_mv_behavior(self):
- self.basedir = "cli/Mv/mv_behavior"
- self.set_up_grid()
- fn1 = os.path.join(self.basedir, "file1")
- DATA1 = "Nuclear launch codes"
- fileutil.write(fn1, DATA1)
- fn2 = os.path.join(self.basedir, "file2")
- DATA2 = "UML diagrams"
- fileutil.write(fn2, DATA2)
- # copy both files to the grid
- d = self.do_cli("create-alias", "tahoe")
- d.addCallback(lambda res:
- self.do_cli("cp", fn1, "tahoe:"))
- d.addCallback(lambda res:
- self.do_cli("cp", fn2, "tahoe:"))
-
- # do mv file1 file3
- # (we should be able to rename files)
- d.addCallback(lambda res:
- self.do_cli("mv", "tahoe:file1", "tahoe:file3"))
- d.addCallback(lambda (rc, out, err):
- self.failUnlessIn("OK", out, "mv didn't rename a file"))
-
- # do mv file3 file2
- # (This should succeed without issue)
- d.addCallback(lambda res:
- self.do_cli("mv", "tahoe:file3", "tahoe:file2"))
- # Out should contain "OK" to show that the transfer worked.
- d.addCallback(lambda (rc,out,err):
- self.failUnlessIn("OK", out, "mv didn't output OK after mving"))
-
- # Next, make a remote directory.
- d.addCallback(lambda res:
- self.do_cli("mkdir", "tahoe:directory"))
-
- # mv file2 directory
- # (should fail with a descriptive error message; the CLI mv
- # client should support this)
- d.addCallback(lambda res:
- self.do_cli("mv", "tahoe:file2", "tahoe:directory"))
- d.addCallback(lambda (rc, out, err):
- self.failUnlessIn(
- "Error: You can't overwrite a directory with a file", err,
- "mv shouldn't overwrite directories" ))
-
- # mv file2 directory/
- # (should succeed by making file2 a child node of directory)
- d.addCallback(lambda res:
- self.do_cli("mv", "tahoe:file2", "tahoe:directory/"))
- # We should see an "OK"...
- d.addCallback(lambda (rc, out, err):
- self.failUnlessIn("OK", out,
- "mv didn't mv a file into a directory"))
- # ... and be able to GET the file
- d.addCallback(lambda res:
- self.do_cli("get", "tahoe:directory/file2", self.basedir + "new"))
- d.addCallback(lambda (rc, out, err):
- self.failUnless(os.path.exists(self.basedir + "new"),
- "mv didn't write the destination file"))
- # ... and not find the file where it was before.
- d.addCallback(lambda res:
- self.do_cli("get", "tahoe:file2", "file2"))
- d.addCallback(lambda (rc, out, err):
- self.failUnlessIn("404", err,
- "mv left the source file intact"))
-
- # Let's build:
- # directory/directory2/some_file
- # directory3
- d.addCallback(lambda res:
- self.do_cli("mkdir", "tahoe:directory/directory2"))
- d.addCallback(lambda res:
- self.do_cli("cp", fn2, "tahoe:directory/directory2/some_file"))
- d.addCallback(lambda res:
- self.do_cli("mkdir", "tahoe:directory3"))
-
- # Let's now try to mv directory/directory2/some_file to
- # directory3/some_file
- d.addCallback(lambda res:
- self.do_cli("mv", "tahoe:directory/directory2/some_file",
- "tahoe:directory3/"))
- # We should have just some_file in tahoe:directory3
- d.addCallback(lambda res:
- self.do_cli("get", "tahoe:directory3/some_file", "some_file"))
- d.addCallback(lambda (rc, out, err):
- self.failUnless("404" not in err,
- "mv didn't handle nested directories correctly"))
- d.addCallback(lambda res:
- self.do_cli("get", "tahoe:directory3/directory", "directory"))
- d.addCallback(lambda (rc, out, err):
- self.failUnlessIn("404", err,
- "mv moved the wrong thing"))
- return d
-
- def test_mv_without_alias(self):
- # doing 'tahoe mv' without explicitly specifying an alias or
- # creating the default 'tahoe' alias should fail with a useful
- # error message.
- self.basedir = "cli/Mv/mv_without_alias"
- self.set_up_grid()
- d = self.do_cli("mv", "afile", "anotherfile")
- def _check((rc, out, err)):
- self.failUnlessEqual(rc, 1)
- self.failUnlessIn("error:", err)
- d.addCallback(_check)
- # check to see that the validation extends to the
- # target argument by making an alias that will work with the first
- # one.
- d.addCallback(lambda ign: self.do_cli("create-alias", "havasu"))
- def _create_a_test_file(ign):
- self.test_file_path = os.path.join(self.basedir, "afile")
- f = open(self.test_file_path, "wb")
- f.write("puppies" * 100)
- f.close()
- d.addCallback(_create_a_test_file)
- d.addCallback(lambda ign: self.do_cli("put", self.test_file_path,
- "havasu:afile"))
- d.addCallback(lambda ign: self.do_cli("mv", "havasu:afile",
- "anotherfile"))
- d.addCallback(_check)
- return d
-
- def test_mv_with_nonexistent_alias(self):
- # doing 'tahoe mv' with an alias that doesn't exist should fail
- # with an informative error message.
- self.basedir = "cli/Mv/mv_with_nonexistent_alias"
- self.set_up_grid()
- d = self.do_cli("mv", "fake:afile", "fake:anotherfile")
- def _check((rc, out, err)):
- self.failUnlessEqual(rc, 1)
- self.failUnlessIn("error:", err)
- self.failUnlessIn("fake", err)
- d.addCallback(_check)
- # check to see that the validation extends to the
- # target argument by making an alias that will work with the first
- # one.
- d.addCallback(lambda ign: self.do_cli("create-alias", "havasu"))
- def _create_a_test_file(ign):
- self.test_file_path = os.path.join(self.basedir, "afile")
- f = open(self.test_file_path, "wb")
- f.write("puppies" * 100)
- f.close()
- d.addCallback(_create_a_test_file)
- d.addCallback(lambda ign: self.do_cli("put", self.test_file_path,
- "havasu:afile"))
- d.addCallback(lambda ign: self.do_cli("mv", "havasu:afile",
- "fake:anotherfile"))
- d.addCallback(_check)
- return d
-
-
-class Cp(GridTestMixin, CLITestMixin, unittest.TestCase):
-
- def test_not_enough_args(self):
- o = cli.CpOptions()
- self.failUnlessRaises(usage.UsageError,
- o.parseOptions, ["onearg"])
-
- def test_unicode_filename(self):
- skip_non_unicode_fs()
- skip_non_unicode_stdout()
-
- self.basedir = "cli/Cp/unicode_filename"
- self.set_up_grid()
- d = self.do_cli("create-alias", "tahoe")
-
- # Use unicode strings when calling os functions
- fn1 = os.path.join(self.basedir, u"Ärtonwall")
- DATA1 = "unicode file content"
- fileutil.write(fn1, DATA1)
-
- d.addCallback(lambda res: self.do_cli("cp", fn1.encode('utf-8'), "tahoe:"))
-
- d.addCallback(lambda res: self.do_cli("get", "tahoe:Ärtonwall"))
- d.addCallback(lambda (rc,out,err): self.failUnlessEqual(out, DATA1))
-
- fn2 = os.path.join(self.basedir, u"Metallica")
- DATA2 = "non-unicode file content"
- fileutil.write(fn2, DATA2)
-
- d.addCallback(lambda res: self.do_cli("cp", fn2.encode('utf-8'), "tahoe:"))
-
- d.addCallback(lambda res: self.do_cli("get", "tahoe:Metallica"))
- d.addCallback(lambda (rc,out,err): self.failUnlessEqual(out, DATA2))
-
- d.addCallback(lambda res: self.do_cli("ls", "tahoe:"))
- d.addCallback(lambda (rc,out,err): self.failUnlessEqual(out, "Metallica\nÄrtonwall\n"))
-
- return d
-
- def test_dangling_symlink_vs_recursion(self):
- if not hasattr(os, 'symlink'):
- raise unittest.SkipTest("There is no symlink on this platform.")
- # cp -r on a directory containing a dangling symlink shouldn't assert
- self.basedir = "cli/Cp/dangling_symlink_vs_recursion"
- self.set_up_grid()
- dn = os.path.join(self.basedir, "dir")
- os.mkdir(dn)
- fn = os.path.join(dn, "Fakebandica")
- ln = os.path.join(dn, "link")
- os.symlink(fn, ln)
-
- d = self.do_cli("create-alias", "tahoe")
- d.addCallback(lambda res: self.do_cli("cp", "--recursive",
- dn, "tahoe:"))
- return d
-
- def test_copy_using_filecap(self):
- self.basedir = "cli/Cp/test_copy_using_filecap"
- self.set_up_grid()
- outdir = os.path.join(self.basedir, "outdir")
- os.mkdir(outdir)
- fn1 = os.path.join(self.basedir, "Metallica")
- fn2 = os.path.join(outdir, "Not Metallica")
- fn3 = os.path.join(outdir, "test2")
- DATA1 = "puppies" * 10000
- fileutil.write(fn1, DATA1)
-
- d = self.do_cli("create-alias", "tahoe")
- d.addCallback(lambda ign: self.do_cli("put", fn1))
- def _put_file((rc, out, err)):
- self.failUnlessEqual(rc, 0)
- # keep track of the filecap
- self.filecap = out.strip()
- d.addCallback(_put_file)
-
- # Let's try copying this to the disk using the filecap
- # cp FILECAP filename
- d.addCallback(lambda ign: self.do_cli("cp", self.filecap, fn2))
- def _copy_file((rc, out, err)):
- self.failUnlessEqual(rc, 0)
- results = fileutil.read(fn2)
- self.failUnlessEqual(results, DATA1)
- d.addCallback(_copy_file)
-
- # Test with ./ (see #761)
- # cp FILECAP localdir
- d.addCallback(lambda ign: self.do_cli("cp", self.filecap, outdir))
- def _resp((rc, out, err)):
- self.failUnlessEqual(rc, 1)
- self.failUnlessIn("error: you must specify a destination filename",
- err)
- d.addCallback(_resp)
-
- # Create a directory, linked at tahoe:test
- d.addCallback(lambda ign: self.do_cli("mkdir", "tahoe:test"))
- def _get_dir((rc, out, err)):
- self.failUnlessEqual(rc, 0)
- self.dircap = out.strip()
- d.addCallback(_get_dir)
-
- # Upload a file to the directory
- d.addCallback(lambda ign:
- self.do_cli("put", fn1, "tahoe:test/test_file"))
- d.addCallback(lambda (rc, out, err): self.failUnlessEqual(rc, 0))
-
- # cp DIRCAP/filename localdir
- d.addCallback(lambda ign:
- self.do_cli("cp", self.dircap + "/test_file", outdir))
- def _get_resp((rc, out, err)):
- self.failUnlessEqual(rc, 0)
- results = fileutil.read(os.path.join(outdir, "test_file"))
- self.failUnlessEqual(results, DATA1)
- d.addCallback(_get_resp)
-
- # cp -r DIRCAP/filename filename2
- d.addCallback(lambda ign:
- self.do_cli("cp", self.dircap + "/test_file", fn3))
- def _get_resp2((rc, out, err)):
- self.failUnlessEqual(rc, 0)
- results = fileutil.read(fn3)
- self.failUnlessEqual(results, DATA1)
- d.addCallback(_get_resp2)
- return d
-
- def test_cp_with_nonexistent_alias(self):
- # when invoked with an alias or aliases that don't exist, 'tahoe cp'
- # should output a sensible error message rather than a stack trace.
- self.basedir = "cli/Cp/cp_with_nonexistent_alias"
- self.set_up_grid()
- d = self.do_cli("cp", "fake:file1", "fake:file2")
- def _check((rc, out, err)):
- self.failUnlessEqual(rc, 1)
- self.failUnlessIn("error:", err)
- d.addCallback(_check)
- # 'tahoe cp' actually processes the target argument first, so we need
- # to check to make sure that validation extends to the source
- # argument.
- d.addCallback(lambda ign: self.do_cli("create-alias", "tahoe"))
- d.addCallback(lambda ign: self.do_cli("cp", "fake:file1",
- "tahoe:file2"))