Beispiel #1
0
    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)
Beispiel #2
0
    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
Beispiel #4
0
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)
Beispiel #5
0
    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()
Beispiel #6
0
    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
Beispiel #7
0
    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)
Beispiel #8
0
    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()
Beispiel #10
0
 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
Beispiel #12
0
 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)
Beispiel #13
0
    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)
Beispiel #14
0
    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
Beispiel #16
0
    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)
Beispiel #17
0
    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
Beispiel #19
0
    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
Beispiel #20
0
    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)
Beispiel #21
0
    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()
Beispiel #24
0
    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()
Beispiel #25
0
 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))
Beispiel #26
0
 def test_unicode_to_argv_py3(self):
     """unicode_to_argv() is noop on Python 3."""
     self.assertEqual(unicode_to_argv("abc"), "abc")
Beispiel #27
0
def maybe_unicode_to_argv(o):
    """Convert object to argv form if necessary."""
    if isinstance(o, str):
        return unicode_to_argv(o)
    return o