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:
Itamar Turner-Trauring 2020-12-18 16:29:02 -05:00 committed by GitHub
commit 99b02a9310
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 106 additions and 34 deletions

0
newsfragments/3565.minor Normal file
View File

View File

@ -464,6 +464,7 @@ class StorageFarmBroker(service.MultiService):
@implementer(IDisplayableServer)
class StubServer(object):
def __init__(self, serverid):
assert isinstance(serverid, bytes)
self.serverid = serverid # binary tubid
def get_serverid(self):
return self.serverid

View File

@ -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

View File

@ -1,6 +1,16 @@
"""
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
@ -163,7 +173,7 @@ class RenderExceptionTests(SyncTestCase):
BeautifulSoup(value, 'html5lib'),
"meta",
{"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

View File

@ -1,6 +1,16 @@
"""
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 twisted.web.template import flattenString
@ -143,12 +153,12 @@ class DownloadStatusElementTests(TrialTestCase):
See if we can render the page almost fully.
"""
status = FakeDownloadStatus(
"si-1", 123,
["s-1", "s-2", "s-3"],
{"s-1": "unknown problem"},
{"s-1": [1], "s-2": [1,2], "s-3": [2,3]},
b"si-1", 123,
[b"s-1", b"s-2", b"s-3"],
{b"s-1": "unknown problem"},
{b"s-1": [1], b"s-2": [1,2], b"s-3": [2,3]},
{"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)

View File

@ -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 allmydata.web import status, common
from ..common import ShouldFailMixin

View File

@ -90,7 +90,7 @@ class FakeNodeMaker(NodeMaker):
return FakeMutableFileNode(None, None,
self.encoding_params, None,
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):
n = FakeMutableFileNode(None, None, self.encoding_params, None,
self.all_contents)
@ -105,7 +105,7 @@ class FakeUploader(service.Service):
d = uploadable.get_size()
d.addCallback(lambda size: uploadable.read(size))
def _got_data(datav):
data = "".join(datav)
data = b"".join(datav)
n = create_chk_filenode(data, self.all_contents)
ur = upload.UploadResults(file_size=len(data),
ciphertext_fetched=0,
@ -127,12 +127,12 @@ class FakeUploader(service.Service):
def build_one_ds():
ds = DownloadStatus("storage_index", 1234)
ds = DownloadStatus(b"storage_index", 1234)
now = time.time()
serverA = StubServer(hashutil.tagged_hash("foo", "serverid_a")[:20])
serverB = StubServer(hashutil.tagged_hash("foo", "serverid_b")[:20])
storage_index = hashutil.storage_index_hash("SI")
serverA = StubServer(hashutil.tagged_hash(b"foo", b"serverid_a")[:20])
serverB = StubServer(hashutil.tagged_hash(b"foo", b"serverid_b")[:20])
storage_index = hashutil.storage_index_hash(b"SI")
e0 = ds.add_segment_request(0, now)
e0.activate(now+0.5)
e0.deliver(now+1, 0, 100, 0.5) # when, start,len, decodetime
@ -261,7 +261,7 @@ class FakeClient(_Client):
# minimal subset
service.MultiService.__init__(self)
self.all_contents = {}
self.nodeid = "fake_nodeid"
self.nodeid = b"fake_nodeid"
self.nickname = u"fake_nickname \u263A"
self.introducer_furls = []
self.introducer_clients = []
@ -277,7 +277,7 @@ class FakeClient(_Client):
# fake knowledge of another server
self.storage_broker.test_add_server("other_nodeid",
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))
self.storage_broker.test_add_server("disconnected_nodeid",
FakeDisplayableServer(

View File

@ -154,6 +154,7 @@ PORTED_TEST_MODULES = [
"allmydata.test.test_immutable",
"allmydata.test.test_introducer",
"allmydata.test.test_iputil",
"allmydata.test.test_json_metadata",
"allmydata.test.test_log",
"allmydata.test.test_monitor",
"allmydata.test.test_netstring",
@ -178,4 +179,7 @@ PORTED_TEST_MODULES = [
"allmydata.test.test_upload",
"allmydata.test.test_uri",
"allmydata.test.test_util",
"allmydata.test.web.test_common",
"allmydata.test.web.test_util",
"allmydata.test.web.test_status",
]

View File

@ -208,28 +208,44 @@ def compute_rate(bytes, seconds):
return 1.0 * bytes / seconds
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:
return ""
return u""
r = float(data)
if r > 1000000:
return "%1.2fMBps" % (r/1000000)
return u"%1.2fMBps" % (r/1000000)
if r > 1000:
return "%.1fkBps" % (r/1000)
return "%.0fBps" % r
return u"%.1fkBps" % (r/1000)
return u"%.0fBps" % r
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:
return ""
return u""
r = float(data)
if r > 1000000000:
return "%1.2fGB" % (r/1000000000)
return u"%1.2fGB" % (r/1000000000)
if r > 1000000:
return "%1.2fMB" % (r/1000000)
return u"%1.2fMB" % (r/1000000)
if r > 1000:
return "%.1fkB" % (r/1000)
return "%.0fB" % r
return u"%.1fkB" % (r/1000)
return u"%.0fB" % r
def plural(sequence_or_length):
if isinstance(sequence_or_length, int):
@ -562,7 +578,7 @@ def _finish(result, render, request):
Message.log(
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:
Message.log(
message_type=u"allmydata:web:common-render:None",

View File

@ -95,16 +95,23 @@ class MultiFormatResource(resource.Resource, object):
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
if data is None:
return ""
return u""
s = float(data)
if s >= 10:
return abbreviate.abbreviate_time(data)
if s >= 1.0:
return "%.2fs" % s
return u"%.2fs" % s
if s >= 0.01:
return "%.0fms" % (1000*s)
return u"%.0fms" % (1000*s)
if s >= 0.001:
return "%.1fms" % (1000*s)
return "%.0fus" % (1000000*s)
return u"%.1fms" % (1000*s)
return u"%.0fus" % (1000000*s)

View File

@ -1,3 +1,4 @@
from past.builtins import long, unicode
import pprint
import itertools
@ -1297,6 +1298,7 @@ class Status(MultiFormatResource):
except ValueError:
raise WebError("no '-' in '{}'".format(path))
count = int(count_s)
stype = unicode(stype, "ascii")
if stype == "up":
for s in itertools.chain(h.list_all_upload_statuses(),
h.list_all_helper_statuses()):
@ -1335,7 +1337,7 @@ class Status(MultiFormatResource):
active = [s
for s in self._get_all_statuses()
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()
return active
@ -1343,7 +1345,7 @@ class Status(MultiFormatResource):
recent = [s
for s in self._get_all_statuses()
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()
return recent
@ -1373,7 +1375,6 @@ class StatusElement(Element):
started_s = render_time(op.get_started())
result["started"] = started_s
si_s = base32.b2a_or_none(op.get_storage_index())
if si_s is None:
si_s = "(None)"