more coverage: parse_hint_argv

This commit is contained in:
Brian Warner 2016-12-30 23:58:28 -05:00
parent fe6ff466d8
commit 1abe733a81
2 changed files with 38 additions and 6 deletions

View File

@ -132,6 +132,8 @@ class Misc(unittest.TestCase):
portno = transit.allocate_tcp_port()
self.assertIsInstance(portno, int)
UnknownHint = namedtuple("UnknownHint", ["stuff"])
class Hints(unittest.TestCase):
def test_endpoint_from_hint_obj(self):
c = transit.Common("")
@ -153,7 +155,6 @@ class Hints(unittest.TestCase):
("tor_ep", "host2.onion", 1234))
self.assertEqual(efho(transit.DirectTCPV1Hint("non-public", 1234)),
None)
UnknownHint = namedtuple("UnknownHint", ["stuff"])
self.assertEqual(efho(UnknownHint("foo")), None)
def test_comparable(self):
@ -185,6 +186,37 @@ class Hints(unittest.TestCase):
"port": "not a number"}),
None) # invalid port
def test_parse_hint_argv(self):
def p(hint):
stderr = io.StringIO()
value = transit.parse_hint_argv(hint, stderr=stderr)
return value, stderr.getvalue()
h,stderr = p("tcp:host:1234")
self.assertEqual(h, transit.DirectTCPV1Hint("host", 1234))
self.assertEqual(stderr, "")
h,stderr = p("$!@#^")
self.assertEqual(h, None)
self.assertEqual(stderr, "unparseable hint '$!@#^'\n")
h,stderr = p("unknown:stuff")
self.assertEqual(h, None)
self.assertEqual(stderr,
"unknown hint type 'unknown' in 'unknown:stuff'\n")
h,stderr = p("tcp:host:number")
self.assertEqual(h, None)
self.assertEqual(stderr,
"unparseable TCP hint 'tcp:host:number'\n")
def test_describe_hint_obj(self):
d = transit.describe_hint_obj
self.assertEqual(d(transit.DirectTCPV1Hint("host", 1234)),
"tcp:host:1234")
self.assertEqual(d(transit.TorTCPV1Hint("host", 1234)),
"tor:host:1234")
self.assertEqual(d(UnknownHint("stuff")), str(UnknownHint("stuff")))
class Basic(unittest.TestCase):
@inlineCallbacks
def test_relay_hints(self):

View File

@ -103,27 +103,27 @@ def describe_hint_obj(hint):
else:
return str(hint)
def parse_hint_argv(hint):
def parse_hint_argv(hint, stderr=sys.stderr):
assert isinstance(hint, type(u""))
# return tuple or None for an unparseable hint
mo = re.search(r'^([a-zA-Z0-9]+):(.*)$', hint)
if not mo:
print("unparseable hint '%s'" % (hint,))
print("unparseable hint '%s'" % (hint,), file=stderr)
return None
hint_type = mo.group(1)
if hint_type != "tcp":
print("unknown hint type '%s' in '%s'" % (hint_type, hint))
print("unknown hint type '%s' in '%s'" % (hint_type, hint), file=stderr)
return None
hint_value = mo.group(2)
mo = re.search(r'^(.*):(\d+)$', hint_value)
if not mo:
print("unparseable TCP hint '%s'" % (hint,))
print("unparseable TCP hint '%s'" % (hint,), file=stderr)
return None
hint_host = mo.group(1)
try:
hint_port = int(mo.group(2))
except ValueError:
print("non-numeric port in TCP hint '%s'" % (hint,))
print("non-numeric port in TCP hint '%s'" % (hint,), file=stderr)
return None
return DirectTCPV1Hint(hint_host, hint_port)