Merge pull request #938 from tahoe-lafs/3565.web-tests-python-3-part-1
Port web tests to Python 3, part 1 Fixes ticket:3565
This commit is contained in:
commit
99b02a9310
|
@ -464,6 +464,7 @@ class StorageFarmBroker(service.MultiService):
|
||||||
@implementer(IDisplayableServer)
|
@implementer(IDisplayableServer)
|
||||||
class StubServer(object):
|
class StubServer(object):
|
||||||
def __init__(self, serverid):
|
def __init__(self, serverid):
|
||||||
|
assert isinstance(serverid, bytes)
|
||||||
self.serverid = serverid # binary tubid
|
self.serverid = serverid # binary tubid
|
||||||
def get_serverid(self):
|
def get_serverid(self):
|
||||||
return self.serverid
|
return self.serverid
|
||||||
|
|
|
@ -1,3 +1,14 @@
|
||||||
|
"""
|
||||||
|
Ported to Python 3.
|
||||||
|
"""
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import division
|
||||||
|
from __future__ import print_function
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from future.utils import PY2
|
||||||
|
if PY2:
|
||||||
|
from future.builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401
|
||||||
|
|
||||||
from twisted.trial.unittest import TestCase
|
from twisted.trial.unittest import TestCase
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,16 @@
|
||||||
"""
|
"""
|
||||||
Tests for ``allmydata.web.common``.
|
Tests for ``allmydata.web.common``.
|
||||||
|
|
||||||
|
Ported to Python 3.
|
||||||
"""
|
"""
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import division
|
||||||
|
from __future__ import print_function
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from future.utils import PY2
|
||||||
|
if PY2:
|
||||||
|
from future.builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401
|
||||||
|
|
||||||
import gc
|
import gc
|
||||||
|
|
||||||
|
@ -163,7 +173,7 @@ class RenderExceptionTests(SyncTestCase):
|
||||||
BeautifulSoup(value, 'html5lib'),
|
BeautifulSoup(value, 'html5lib'),
|
||||||
"meta",
|
"meta",
|
||||||
{"http-equiv": "refresh",
|
{"http-equiv": "refresh",
|
||||||
"content": "0;URL={}".format(loc.encode("ascii")),
|
"content": "0;URL={}".format(loc),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
# The assertion will raise if it has a problem, otherwise
|
# The assertion will raise if it has a problem, otherwise
|
||||||
|
|
|
@ -1,6 +1,16 @@
|
||||||
"""
|
"""
|
||||||
Tests for ```allmydata.web.status```.
|
Tests for ```allmydata.web.status```.
|
||||||
|
|
||||||
|
Ported to Python 3.
|
||||||
"""
|
"""
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import division
|
||||||
|
from __future__ import print_function
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from future.utils import PY2
|
||||||
|
if PY2:
|
||||||
|
from future.builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401
|
||||||
|
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
from twisted.web.template import flattenString
|
from twisted.web.template import flattenString
|
||||||
|
@ -143,12 +153,12 @@ class DownloadStatusElementTests(TrialTestCase):
|
||||||
See if we can render the page almost fully.
|
See if we can render the page almost fully.
|
||||||
"""
|
"""
|
||||||
status = FakeDownloadStatus(
|
status = FakeDownloadStatus(
|
||||||
"si-1", 123,
|
b"si-1", 123,
|
||||||
["s-1", "s-2", "s-3"],
|
[b"s-1", b"s-2", b"s-3"],
|
||||||
{"s-1": "unknown problem"},
|
{b"s-1": "unknown problem"},
|
||||||
{"s-1": [1], "s-2": [1,2], "s-3": [2,3]},
|
{b"s-1": [1], b"s-2": [1,2], b"s-3": [2,3]},
|
||||||
{"fetch_per_server":
|
{"fetch_per_server":
|
||||||
{"s-1": [1], "s-2": [2,3], "s-3": [3,2]}}
|
{b"s-1": [1], b"s-2": [2,3], b"s-3": [3,2]}}
|
||||||
)
|
)
|
||||||
|
|
||||||
result = self._render_download_status_element(status)
|
result = self._render_download_status_element(status)
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
"""
|
||||||
|
Ported to Python 3.
|
||||||
|
"""
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import division
|
||||||
|
from __future__ import print_function
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from future.utils import PY2
|
||||||
|
if PY2:
|
||||||
|
from future.builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401
|
||||||
|
|
||||||
from twisted.trial import unittest
|
from twisted.trial import unittest
|
||||||
from allmydata.web import status, common
|
from allmydata.web import status, common
|
||||||
from ..common import ShouldFailMixin
|
from ..common import ShouldFailMixin
|
||||||
|
|
|
@ -90,7 +90,7 @@ class FakeNodeMaker(NodeMaker):
|
||||||
return FakeMutableFileNode(None, None,
|
return FakeMutableFileNode(None, None,
|
||||||
self.encoding_params, None,
|
self.encoding_params, None,
|
||||||
self.all_contents).init_from_cap(cap)
|
self.all_contents).init_from_cap(cap)
|
||||||
def create_mutable_file(self, contents="", keysize=None,
|
def create_mutable_file(self, contents=b"", keysize=None,
|
||||||
version=SDMF_VERSION):
|
version=SDMF_VERSION):
|
||||||
n = FakeMutableFileNode(None, None, self.encoding_params, None,
|
n = FakeMutableFileNode(None, None, self.encoding_params, None,
|
||||||
self.all_contents)
|
self.all_contents)
|
||||||
|
@ -105,7 +105,7 @@ class FakeUploader(service.Service):
|
||||||
d = uploadable.get_size()
|
d = uploadable.get_size()
|
||||||
d.addCallback(lambda size: uploadable.read(size))
|
d.addCallback(lambda size: uploadable.read(size))
|
||||||
def _got_data(datav):
|
def _got_data(datav):
|
||||||
data = "".join(datav)
|
data = b"".join(datav)
|
||||||
n = create_chk_filenode(data, self.all_contents)
|
n = create_chk_filenode(data, self.all_contents)
|
||||||
ur = upload.UploadResults(file_size=len(data),
|
ur = upload.UploadResults(file_size=len(data),
|
||||||
ciphertext_fetched=0,
|
ciphertext_fetched=0,
|
||||||
|
@ -127,12 +127,12 @@ class FakeUploader(service.Service):
|
||||||
|
|
||||||
|
|
||||||
def build_one_ds():
|
def build_one_ds():
|
||||||
ds = DownloadStatus("storage_index", 1234)
|
ds = DownloadStatus(b"storage_index", 1234)
|
||||||
now = time.time()
|
now = time.time()
|
||||||
|
|
||||||
serverA = StubServer(hashutil.tagged_hash("foo", "serverid_a")[:20])
|
serverA = StubServer(hashutil.tagged_hash(b"foo", b"serverid_a")[:20])
|
||||||
serverB = StubServer(hashutil.tagged_hash("foo", "serverid_b")[:20])
|
serverB = StubServer(hashutil.tagged_hash(b"foo", b"serverid_b")[:20])
|
||||||
storage_index = hashutil.storage_index_hash("SI")
|
storage_index = hashutil.storage_index_hash(b"SI")
|
||||||
e0 = ds.add_segment_request(0, now)
|
e0 = ds.add_segment_request(0, now)
|
||||||
e0.activate(now+0.5)
|
e0.activate(now+0.5)
|
||||||
e0.deliver(now+1, 0, 100, 0.5) # when, start,len, decodetime
|
e0.deliver(now+1, 0, 100, 0.5) # when, start,len, decodetime
|
||||||
|
@ -261,7 +261,7 @@ class FakeClient(_Client):
|
||||||
# minimal subset
|
# minimal subset
|
||||||
service.MultiService.__init__(self)
|
service.MultiService.__init__(self)
|
||||||
self.all_contents = {}
|
self.all_contents = {}
|
||||||
self.nodeid = "fake_nodeid"
|
self.nodeid = b"fake_nodeid"
|
||||||
self.nickname = u"fake_nickname \u263A"
|
self.nickname = u"fake_nickname \u263A"
|
||||||
self.introducer_furls = []
|
self.introducer_furls = []
|
||||||
self.introducer_clients = []
|
self.introducer_clients = []
|
||||||
|
@ -277,7 +277,7 @@ class FakeClient(_Client):
|
||||||
# fake knowledge of another server
|
# fake knowledge of another server
|
||||||
self.storage_broker.test_add_server("other_nodeid",
|
self.storage_broker.test_add_server("other_nodeid",
|
||||||
FakeDisplayableServer(
|
FakeDisplayableServer(
|
||||||
serverid="other_nodeid", nickname=u"other_nickname \u263B", connected = True,
|
serverid=b"other_nodeid", nickname=u"other_nickname \u263B", connected = True,
|
||||||
last_connect_time = 10, last_loss_time = 20, last_rx_time = 30))
|
last_connect_time = 10, last_loss_time = 20, last_rx_time = 30))
|
||||||
self.storage_broker.test_add_server("disconnected_nodeid",
|
self.storage_broker.test_add_server("disconnected_nodeid",
|
||||||
FakeDisplayableServer(
|
FakeDisplayableServer(
|
||||||
|
|
|
@ -154,6 +154,7 @@ PORTED_TEST_MODULES = [
|
||||||
"allmydata.test.test_immutable",
|
"allmydata.test.test_immutable",
|
||||||
"allmydata.test.test_introducer",
|
"allmydata.test.test_introducer",
|
||||||
"allmydata.test.test_iputil",
|
"allmydata.test.test_iputil",
|
||||||
|
"allmydata.test.test_json_metadata",
|
||||||
"allmydata.test.test_log",
|
"allmydata.test.test_log",
|
||||||
"allmydata.test.test_monitor",
|
"allmydata.test.test_monitor",
|
||||||
"allmydata.test.test_netstring",
|
"allmydata.test.test_netstring",
|
||||||
|
@ -178,4 +179,7 @@ PORTED_TEST_MODULES = [
|
||||||
"allmydata.test.test_upload",
|
"allmydata.test.test_upload",
|
||||||
"allmydata.test.test_uri",
|
"allmydata.test.test_uri",
|
||||||
"allmydata.test.test_util",
|
"allmydata.test.test_util",
|
||||||
|
"allmydata.test.web.test_common",
|
||||||
|
"allmydata.test.web.test_util",
|
||||||
|
"allmydata.test.web.test_status",
|
||||||
]
|
]
|
||||||
|
|
|
@ -208,28 +208,44 @@ def compute_rate(bytes, seconds):
|
||||||
return 1.0 * bytes / seconds
|
return 1.0 * bytes / seconds
|
||||||
|
|
||||||
def abbreviate_rate(data):
|
def abbreviate_rate(data):
|
||||||
# 21.8kBps, 554.4kBps 4.37MBps
|
"""
|
||||||
|
Convert number of bytes/second into human readable strings (unicode).
|
||||||
|
|
||||||
|
Uses metric measures, so 1000 not 1024, e.g. 21.8kBps, 554.4kBps, 4.37MBps.
|
||||||
|
|
||||||
|
:param data: Either ``None`` or integer.
|
||||||
|
|
||||||
|
:return: Unicode string.
|
||||||
|
"""
|
||||||
if data is None:
|
if data is None:
|
||||||
return ""
|
return u""
|
||||||
r = float(data)
|
r = float(data)
|
||||||
if r > 1000000:
|
if r > 1000000:
|
||||||
return "%1.2fMBps" % (r/1000000)
|
return u"%1.2fMBps" % (r/1000000)
|
||||||
if r > 1000:
|
if r > 1000:
|
||||||
return "%.1fkBps" % (r/1000)
|
return u"%.1fkBps" % (r/1000)
|
||||||
return "%.0fBps" % r
|
return u"%.0fBps" % r
|
||||||
|
|
||||||
def abbreviate_size(data):
|
def abbreviate_size(data):
|
||||||
# 21.8kB, 554.4kB 4.37MB
|
"""
|
||||||
|
Convert number of bytes into human readable strings (unicode).
|
||||||
|
|
||||||
|
Uses metric measures, so 1000 not 1024, e.g. 21.8kB, 554.4kB, 4.37MB.
|
||||||
|
|
||||||
|
:param data: Either ``None`` or integer.
|
||||||
|
|
||||||
|
:return: Unicode string.
|
||||||
|
"""
|
||||||
if data is None:
|
if data is None:
|
||||||
return ""
|
return u""
|
||||||
r = float(data)
|
r = float(data)
|
||||||
if r > 1000000000:
|
if r > 1000000000:
|
||||||
return "%1.2fGB" % (r/1000000000)
|
return u"%1.2fGB" % (r/1000000000)
|
||||||
if r > 1000000:
|
if r > 1000000:
|
||||||
return "%1.2fMB" % (r/1000000)
|
return u"%1.2fMB" % (r/1000000)
|
||||||
if r > 1000:
|
if r > 1000:
|
||||||
return "%.1fkB" % (r/1000)
|
return u"%.1fkB" % (r/1000)
|
||||||
return "%.0fB" % r
|
return u"%.0fB" % r
|
||||||
|
|
||||||
def plural(sequence_or_length):
|
def plural(sequence_or_length):
|
||||||
if isinstance(sequence_or_length, int):
|
if isinstance(sequence_or_length, int):
|
||||||
|
@ -562,7 +578,7 @@ def _finish(result, render, request):
|
||||||
Message.log(
|
Message.log(
|
||||||
message_type=u"allmydata:web:common-render:DecodedURL",
|
message_type=u"allmydata:web:common-render:DecodedURL",
|
||||||
)
|
)
|
||||||
_finish(redirectTo(str(result), request), render, request)
|
_finish(redirectTo(result.to_text().encode("utf-8"), request), render, request)
|
||||||
elif result is None:
|
elif result is None:
|
||||||
Message.log(
|
Message.log(
|
||||||
message_type=u"allmydata:web:common-render:None",
|
message_type=u"allmydata:web:common-render:None",
|
||||||
|
|
|
@ -95,16 +95,23 @@ class MultiFormatResource(resource.Resource, object):
|
||||||
|
|
||||||
|
|
||||||
def abbreviate_time(data):
|
def abbreviate_time(data):
|
||||||
|
"""
|
||||||
|
Convert number of seconds into human readable string.
|
||||||
|
|
||||||
|
:param data: Either ``None`` or integer or float, seconds.
|
||||||
|
|
||||||
|
:return: Unicode string.
|
||||||
|
"""
|
||||||
# 1.23s, 790ms, 132us
|
# 1.23s, 790ms, 132us
|
||||||
if data is None:
|
if data is None:
|
||||||
return ""
|
return u""
|
||||||
s = float(data)
|
s = float(data)
|
||||||
if s >= 10:
|
if s >= 10:
|
||||||
return abbreviate.abbreviate_time(data)
|
return abbreviate.abbreviate_time(data)
|
||||||
if s >= 1.0:
|
if s >= 1.0:
|
||||||
return "%.2fs" % s
|
return u"%.2fs" % s
|
||||||
if s >= 0.01:
|
if s >= 0.01:
|
||||||
return "%.0fms" % (1000*s)
|
return u"%.0fms" % (1000*s)
|
||||||
if s >= 0.001:
|
if s >= 0.001:
|
||||||
return "%.1fms" % (1000*s)
|
return u"%.1fms" % (1000*s)
|
||||||
return "%.0fus" % (1000000*s)
|
return u"%.0fus" % (1000000*s)
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
from past.builtins import long, unicode
|
||||||
|
|
||||||
import pprint
|
import pprint
|
||||||
import itertools
|
import itertools
|
||||||
|
@ -1297,6 +1298,7 @@ class Status(MultiFormatResource):
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise WebError("no '-' in '{}'".format(path))
|
raise WebError("no '-' in '{}'".format(path))
|
||||||
count = int(count_s)
|
count = int(count_s)
|
||||||
|
stype = unicode(stype, "ascii")
|
||||||
if stype == "up":
|
if stype == "up":
|
||||||
for s in itertools.chain(h.list_all_upload_statuses(),
|
for s in itertools.chain(h.list_all_upload_statuses(),
|
||||||
h.list_all_helper_statuses()):
|
h.list_all_helper_statuses()):
|
||||||
|
@ -1335,7 +1337,7 @@ class Status(MultiFormatResource):
|
||||||
active = [s
|
active = [s
|
||||||
for s in self._get_all_statuses()
|
for s in self._get_all_statuses()
|
||||||
if s.get_active()]
|
if s.get_active()]
|
||||||
active.sort(lambda a, b: cmp(a.get_started(), b.get_started()))
|
active.sort(key=lambda a: a.get_started())
|
||||||
active.reverse()
|
active.reverse()
|
||||||
return active
|
return active
|
||||||
|
|
||||||
|
@ -1343,7 +1345,7 @@ class Status(MultiFormatResource):
|
||||||
recent = [s
|
recent = [s
|
||||||
for s in self._get_all_statuses()
|
for s in self._get_all_statuses()
|
||||||
if not s.get_active()]
|
if not s.get_active()]
|
||||||
recent.sort(lambda a, b: cmp(a.get_started(), b.get_started()))
|
recent.sort(key=lambda a: a.get_started())
|
||||||
recent.reverse()
|
recent.reverse()
|
||||||
return recent
|
return recent
|
||||||
|
|
||||||
|
@ -1373,7 +1375,6 @@ class StatusElement(Element):
|
||||||
|
|
||||||
started_s = render_time(op.get_started())
|
started_s = render_time(op.get_started())
|
||||||
result["started"] = started_s
|
result["started"] = started_s
|
||||||
|
|
||||||
si_s = base32.b2a_or_none(op.get_storage_index())
|
si_s = base32.b2a_or_none(op.get_storage_index())
|
||||||
if si_s is None:
|
if si_s is None:
|
||||||
si_s = "(None)"
|
si_s = "(None)"
|
||||||
|
|
Loading…
Reference in New Issue