def test_list_unicode_mismatch(self): self.basedir = "cli/ListAlias/test_list_unicode_mismatch" skip_if_cannot_represent_argv(u"tahoe\u263A") self.set_up_grid(oneshare=True) rc, stdout, stderr = yield self.do_cli( "create-alias", unicode_to_argv(u"tahoe\u263A"), ) def boom(out): print("boom {}".format(out)) return out raise UnicodeEncodeError("foo", u"foo", 3, 5, "foo") with patch("allmydata.scripts.tahoe_add_alias.unicode_to_output", boom): self.failUnless(unicode_to_argv(u"Alias 'tahoe\u263A' created") in stdout) self.failIf(stderr) aliases = get_aliases(self.get_clientdir()) self.failUnless(u"tahoe\u263A" in aliases) self.failUnless(aliases[u"tahoe\u263A"].startswith("URI:DIR2:")) rc, stdout, stderr = yield self.do_cli("list-aliases") self.assertEqual(1, rc) self.assertIn("could not be converted", stderr)
def test_list_unicode_mismatch_json(self): """ pretty hack-y test, but we want to cover the 'except' on Unicode errors paths and I can't come up with a nicer way to trigger this """ self.basedir = "cli/ListAlias/test_list_unicode_mismatch_json" skip_if_cannot_represent_argv(u"tahoe\u263A") self.set_up_grid(oneshare=True) rc, stdout, stderr = yield self.do_cli( "create-alias", unicode_to_argv(u"tahoe\u263A"), ) self.failUnless(unicode_to_argv(u"Alias 'tahoe\u263A' created") in stdout) self.failIf(stderr) booms = [] def boom(out, indent=4): if not len(booms): booms.append(out) raise UnicodeEncodeError("foo", u"foo", 3, 5, "foo") return str(out) with patch("allmydata.scripts.tahoe_add_alias.json.dumps", boom): aliases = get_aliases(self.get_clientdir()) self.failUnless(u"tahoe\u263A" in aliases) self.failUnless(aliases[u"tahoe\u263A"].startswith("URI:DIR2:")) rc, stdout, stderr = yield self.do_cli("list-aliases", "--json") self.assertEqual(1, rc) self.assertIn("could not be converted", stderr)
def create_invite_join_magic_folder(self, nickname, local_dir): nickname_arg = unicode_to_argv(nickname) local_dir_arg = unicode_to_argv(local_dir) d = self.do_cli("magic-folder", "create", "magic:", nickname_arg, local_dir_arg) def _done((rc, stdout, stderr)): self.failUnlessEqual(rc, 0, stdout + stderr) client = self.get_client() self.collective_dircap, self.upload_dircap = self.get_caps_from_files(0) self.collective_dirnode = client.create_node_from_uri(self.collective_dircap) self.upload_dirnode = client.create_node_from_uri(self.upload_dircap) d.addCallback(_done) d.addCallback(lambda ign: self.check_joined_config(0, self.upload_dircap)) d.addCallback(lambda ign: self.check_config(0, local_dir)) return d
def run_bintahoe(extra_argv, python_options=None): """ Run the main Tahoe entrypoint in a child process with the given additional arguments. :param [unicode] extra_argv: More arguments for the child process argv. :return: A three-tuple of stdout (unicode), stderr (unicode), and the child process "returncode" (int). """ executable = ensure_text(sys.executable) argv = [executable] if python_options is not None: argv.extend(python_options) argv.extend([u"-b", u"-m", u"allmydata.scripts.runner"]) argv.extend(extra_argv) argv = list(unicode_to_argv(arg) for arg in argv) p = Popen(argv, stdout=PIPE, stderr=PIPE) if PY2: encoding = "utf-8" else: encoding = locale.getpreferredencoding(False) out = p.stdout.read().decode(encoding) err = p.stderr.read().decode(encoding) returncode = p.wait() return (out, err, returncode)
def do_join(self, client_num, local_dir, invite_code): action = start_action( action_type=u"join-magic-folder", client_num=client_num, local_dir=local_dir, invite_code=invite_code, ) with action.context(): precondition(isinstance(local_dir, unicode), local_dir=local_dir) precondition(isinstance(invite_code, str), invite_code=invite_code) local_dir_arg = unicode_to_argv(local_dir) d = DeferredContext( self.do_cli( "magic-folder", "join", "--author", "test-dummy", invite_code, local_dir_arg, client_num=client_num, )) def _done(args): (rc, stdout, stderr) = args self.assertEqual(rc, 0) self.assertEqual(stdout, "") self.assertEqual(stderr, "") return (rc, stdout, stderr) d.addCallback(_done) return d.addActionFinish()
def test_unlinked_immutable_from_file(self): # tahoe put file.txt # tahoe put ./file.txt # tahoe put /tmp/file.txt # tahoe put ~/file.txt self.basedir = "cli/Put/unlinked_immutable_from_file" self.set_up_grid(oneshare=True) rel_fn = os.path.join(self.basedir, "DATAFILE") abs_fn = unicode_to_argv(abspath_expanduser_unicode(unicode(rel_fn))) # we make the file small enough to fit in a LIT file, for speed fileutil.write(rel_fn, "short file") d = self.do_cli("put", rel_fn) def _uploaded((rc, out, err)): readcap = out self.failUnless(readcap.startswith("URI:LIT:"), readcap) self.readcap = readcap d.addCallback(_uploaded) d.addCallback(lambda res: self.do_cli("put", "./" + rel_fn)) d.addCallback(lambda (rc,stdout,stderr): self.failUnlessReallyEqual(stdout, self.readcap)) d.addCallback(lambda res: self.do_cli("put", abs_fn)) d.addCallback(lambda (rc,stdout,stderr): self.failUnlessReallyEqual(stdout, self.readcap)) # we just have to assume that ~ is handled properly return d
def test_exclude_from_tilde_expansion(self): basedir = "cli/Backup/exclude_from_tilde_expansion" fileutil.make_dirs(basedir) nodeurl_path = os.path.join(basedir, 'node.url') fileutil.write(nodeurl_path, 'http://example.net:2357/') # ensure that tilde expansion is performed on exclude-from argument exclude_file = u'~/.tahoe/excludes.dummy' ns = Namespace() ns.called = False original_open = open def call_file(name, *args): if name.endswith("excludes.dummy"): ns.called = True self.failUnlessEqual(name, abspath_expanduser_unicode(exclude_file)) return StringIO() else: return original_open(name, *args) patcher = MonkeyPatcher((builtins, 'open', call_file)) patcher.runWithPatches( parse_options, basedir, "backup", ['--exclude-from', unicode_to_argv(exclude_file), 'from', 'to']) self.failUnless(ns.called)
def test_unlinked_immutable_from_file(self): # tahoe put file.txt # tahoe put ./file.txt # tahoe put /tmp/file.txt # tahoe put ~/file.txt self.basedir = "cli/Put/unlinked_immutable_from_file" self.set_up_grid(oneshare=True) rel_fn = os.path.join(self.basedir, "DATAFILE") abs_fn = unicode_to_argv(abspath_expanduser_unicode(unicode(rel_fn))) # we make the file small enough to fit in a LIT file, for speed fileutil.write(rel_fn, "short file") d = self.do_cli("put", rel_fn) def _uploaded((rc, out, err)): readcap = out self.failUnless(readcap.startswith("URI:LIT:"), readcap) self.readcap = readcap d.addCallback(_uploaded) d.addCallback(lambda res: self.do_cli("put", "./" + rel_fn)) d.addCallback(lambda (rc, stdout, stderr): self.failUnlessReallyEqual( stdout, self.readcap)) d.addCallback(lambda res: self.do_cli("put", abs_fn)) d.addCallback(lambda (rc, stdout, stderr): self.failUnlessReallyEqual( stdout, self.readcap)) # we just have to assume that ~ is handled properly return d
def do_join(self, client_num, local_dir, invite_code): action = start_action( action_type=u"join-magic-folder", client_num=client_num, local_dir=local_dir, invite_code=invite_code, ) with action.context(): precondition(isinstance(local_dir, unicode), local_dir=local_dir) precondition(isinstance(invite_code, str), invite_code=invite_code) local_dir_arg = unicode_to_argv(local_dir) d = DeferredContext( self.do_cli( "magic-folder", "join", invite_code, local_dir_arg, client_num=client_num, ) ) def _done(args): (rc, stdout, stderr) = args self.failUnlessEqual(rc, 0) self.failUnlessEqual(stdout, "") self.failUnlessEqual(stderr, "") return (rc, stdout, stderr) d.addCallback(_done) return d.addActionFinish()
def do_cli(self, verb, *args, **kwargs): # client_num is used to execute client CLI commands on a specific # client. client_num = kwargs.get("client_num", 0) client_dir = unicode_to_argv(self.get_clientdir(i=client_num)) nodeargs = [ "--node-directory", client_dir ] return run_cli(verb, nodeargs=nodeargs, *args, **kwargs)
def do_invite(self, client_num, nickname): nickname_arg = unicode_to_argv(nickname) d = self.do_cli("magic-folder", "invite", "magic:", nickname_arg, client_num=client_num) def _done((rc, stdout, stderr)): self.failUnlessEqual(rc, 0) return (rc, stdout, stderr) d.addCallback(_done) return d
def do_cli(self, verb, *args, **kwargs): # client_num is used to execute client CLI commands on a specific # client. client_num = kwargs.get("client_num", 0) client_dir = unicode_to_argv(self.get_clientdir(i=client_num)) nodeargs = [ "--node-directory", client_dir ] if verb == "magic-folder": return run_magic_folder_cli(verb, nodeargs=nodeargs, *args, **kwargs) else: return run_tahoe_cli(verb, nodeargs=nodeargs, *args, **kwargs)
def test_unicode_to_argv(self): """ unicode_to_argv() returns its unicode argument on Windows and Python 2 and converts to bytes using UTF-8 elsewhere. """ result = unicode_to_argv(lumiere_nfc) if PY3 or self.platform == "win32": expected_value = lumiere_nfc else: expected_value = lumiere_nfc.encode(self.io_encoding) self.assertIsInstance(result, type(expected_value)) self.assertEqual(result, expected_value)
def test_exclude_from_tilde_expansion(self, mock): basedir = "cli/Backup/exclude_from_tilde_expansion" fileutil.make_dirs(basedir) nodeurl_path = os.path.join(basedir, 'node.url') fileutil.write(nodeurl_path, 'http://example.net:2357/') def parse(args): return parse_options(basedir, "backup", args) # ensure that tilde expansion is performed on exclude-from argument exclude_file = u'~/.tahoe/excludes.dummy' mock.return_value = StringIO() parse(['--exclude-from', unicode_to_argv(exclude_file), 'from', 'to']) self.failUnlessIn(((abspath_expanduser_unicode(exclude_file),), {}), mock.call_args_list)
def do_join(self, client_num, local_dir, invite_code): precondition(isinstance(local_dir, unicode), local_dir=local_dir) precondition(isinstance(invite_code, str), invite_code=invite_code) local_dir_arg = unicode_to_argv(local_dir) d = self.do_cli("magic-folder", "join", invite_code, local_dir_arg, client_num=client_num) def _done((rc, stdout, stderr)): self.failUnlessEqual(rc, 0) self.failUnlessEqual(stdout, "") self.failUnlessEqual(stderr, "") return (rc, stdout, stderr) d.addCallback(_done) return d
def test_list(self): self.basedir = "cli/ListAlias/test_list" self.set_up_grid(oneshare=True) rc, stdout, stderr = yield self.do_cli( "create-alias", unicode_to_argv(u"tahoe"), ) self.failUnless(unicode_to_argv(u"Alias 'tahoe' created") in stdout) self.failIf(stderr) aliases = get_aliases(self.get_clientdir()) self.failUnless(u"tahoe" in aliases) self.failUnless(aliases[u"tahoe"].startswith("URI:DIR2:")) rc, stdout, stderr = yield self.do_cli("list-aliases", "--json") self.assertEqual(0, rc) data = json.loads(stdout) self.assertIn(u"tahoe", data) data = data[u"tahoe"] self.assertIn("readwrite", data) self.assertIn("readonly", data)
def test_unicode_arguments_and_output(self): tricky = u"\u2621" try: tricky_arg = unicode_to_argv(tricky, mangle=True) tricky_out = unicode_to_output(tricky) except UnicodeEncodeError: raise unittest.SkipTest("A non-ASCII argument/output could not be encoded on this platform.") d = self.run_bintahoe([tricky_arg]) def _cb(res): out, err, rc_or_sig = res self.failUnlessEqual(rc_or_sig, 1, str(res)) self.failUnlessIn("Unknown command: "+tricky_out, out) d.addCallback(_cb) return d
def test_unicode_arguments_and_output(self): tricky = u"\u2621" try: tricky_arg = unicode_to_argv(tricky, mangle=True) tricky_out = unicode_to_output(tricky) except UnicodeEncodeError: raise unittest.SkipTest("A non-ASCII argument/output could not be encoded on this platform.") d = self.run_bintahoe([tricky_arg]) def _cb(res): out, err, rc_or_sig = res self.failUnlessEqual(rc_or_sig, 1, str(res)) self.failUnlessIn("Unknown command: "+tricky_out, out) d.addCallback(_cb) return d
def create_invite_join_magic_folder(self, nickname, local_dir): nickname_arg = unicode_to_argv(nickname) local_dir_arg = unicode_to_argv(local_dir) # the --debug means we get real exceptions on failures d = self.do_cli("magic-folder", "--debug", "create", "magic:", nickname_arg, local_dir_arg) def _done(args): (rc, stdout, stderr) = args self.assertEqual(rc, 0, stdout + stderr) client = self.get_client() self.collective_dircap, self.upload_dircap = self.get_caps_from_files( 0) self.collective_dirnode = client.create_node_from_uri( self.collective_dircap) self.upload_dirnode = client.create_node_from_uri( self.upload_dircap) d.addCallback(_done) d.addCallback( lambda ign: self.check_joined_config(0, self.upload_dircap)) d.addCallback(lambda ign: self.check_config(0, local_dir)) return d
def test_exclude_from_tilde_expansion(self, mock): basedir = "cli/Backup/exclude_from_tilde_expansion" fileutil.make_dirs(basedir) nodeurl_path = os.path.join(basedir, 'node.url') fileutil.write(nodeurl_path, 'http://example.net:2357/') def parse(args): return parse_options(basedir, "backup", args) # ensure that tilde expansion is performed on exclude-from argument exclude_file = u'~/.tahoe/excludes.dummy' mock.return_value = StringIO() parse(['--exclude-from', unicode_to_argv(exclude_file), 'from', 'to']) self.failUnlessIn(((abspath_expanduser_unicode(exclude_file), ), {}), mock.call_args_list)
def test_unicode_arguments_and_output(self): self.skip_if_cannot_run_bintahoe() tricky = u"\u2621" try: tricky_arg = unicode_to_argv(tricky, mangle=True) tricky_out = unicode_to_output(tricky) except UnicodeEncodeError: raise unittest.SkipTest("A non-ASCII argument/output could not be encoded on this platform.") d = utils.getProcessOutputAndValue(bintahoe, args=[tricky_arg], env=os.environ) def _cb(res): out, err, rc_or_sig = res self.failUnlessEqual(rc_or_sig, 1, str(res)) self.failUnlessIn("Unknown command: "+tricky_out, out) d.addCallback(_cb) return d
def test_exclude_from_tilde_expansion(self): basedir = "cli/Backup/exclude_from_tilde_expansion" fileutil.make_dirs(basedir) nodeurl_path = os.path.join(basedir, 'node.url') fileutil.write(nodeurl_path, 'http://example.net:2357/') # ensure that tilde expansion is performed on exclude-from argument exclude_file = u'~/.tahoe/excludes.dummy' ns = Namespace() ns.called = False def call_file(name, *args): ns.called = True self.failUnlessEqual(name, abspath_expanduser_unicode(exclude_file)) return StringIO() patcher = MonkeyPatcher((__builtin__, 'file', call_file)) patcher.runWithPatches(parse_options, basedir, "backup", ['--exclude-from', unicode_to_argv(exclude_file), 'from', 'to']) self.failUnless(ns.called)
def do_invite(self, client_num, nickname): nickname_arg = unicode_to_argv(nickname) action = start_action( action_type=u"invite-to-magic-folder", client_num=client_num, nickname=nickname, ) with action.context(): d = DeferredContext( self.do_cli( "magic-folder", "invite", "magic:", nickname_arg, client_num=client_num, ) ) def _done(args): (rc, stdout, stderr) = args self.failUnlessEqual(rc, 0) return (rc, stdout, stderr) d.addCallback(_done) return d.addActionFinish()
def do_invite(self, client_num, nickname): nickname_arg = unicode_to_argv(nickname) action = start_action( action_type=u"invite-to-magic-folder", client_num=client_num, nickname=nickname, ) with action.context(): d = DeferredContext( self.do_cli( "magic-folder", "invite", "magic:", nickname_arg, client_num=client_num, )) def _done((rc, stdout, stderr)): self.failUnlessEqual(rc, 0) return (rc, stdout, stderr) d.addCallback(_done) return d.addActionFinish()
def test_unicode_to_argv_py2(self): """unicode_to_argv() converts to bytes on Python 2.""" self.assertEqual(unicode_to_argv("abc"), u"abc".encode(self.io_encoding))
def test_unicode_to_argv_py3(self): """unicode_to_argv() is noop on Python 3.""" self.assertEqual(unicode_to_argv("abc"), "abc")
def maybe_unicode_to_argv(o): """Convert object to argv form if necessary.""" if isinstance(o, str): return unicode_to_argv(o) return o