From 7027547ecc2d9c79653f61dd2e431dd9a64977da Mon Sep 17 00:00:00 2001 From: Jean-Paul Calderone Date: Tue, 25 Jul 2017 11:56:42 -0400 Subject: [PATCH] fix buggy test; restructure data scared about duplicate nodeids in the data getting lost, switch to a list --- src/allmydata/test/web/test_web.py | 34 ++++++++++++----- src/allmydata/web/root.py | 60 +++++++++++++++++++----------- 2 files changed, 63 insertions(+), 31 deletions(-) diff --git a/src/allmydata/test/web/test_web.py b/src/allmydata/test/web/test_web.py index 9f1ab3733..c6717e49b 100644 --- a/src/allmydata/test/web/test_web.py +++ b/src/allmydata/test/web/test_web.py @@ -262,7 +262,7 @@ class FakeClient(Client): last_connect_time = 10, last_loss_time = 20, last_rx_time = 30)) self.storage_broker.test_add_server("disconnected_nodeid", FakeDisplayableServer( - serverid="other_nodeid", nickname=u"disconnected_nickname \u263B", connected = False, + serverid="disconnected_nodeid", nickname=u"disconnected_nickname \u263B", connected = False, last_connect_time = None, last_loss_time = 25, last_rx_time = 35)) self.introducer_client = None self.history = FakeHistory() @@ -739,6 +739,7 @@ class Web(WebMixin, WebErrorMixin, testutil.StallMixin, testutil.ReallyEqualMixi def test_create(self): pass + maxDiff = None def test_welcome_json(self): """ There is a JSON version of the welcome page which can be selected with the @@ -748,16 +749,29 @@ class Web(WebMixin, WebErrorMixin, testutil.StallMixin, testutil.ReallyEqualMixi def _check(res): decoded = json.loads(res) expected = { - 'introducers': {'statuses': []}, - 'servers': { - 'other_nodeid': { - 'available_space': 123456, - 'connection_status': 'summary', - 'last_received_data': u'', - 'nickname': u'other_nickname \u263b', - 'version': '1.0', - }, + u'introducers': { + u'statuses': [], }, + u'servers': sorted([ + {u"nodeid": u'other_nodeid', + u"description": { + u'available_space': 123456, + u'connection_status': u'summary', + u'last_received_data': None, + u'nickname': u'other_nickname \u263b', + u'version': u'1.0', + }, + }, + {u"nodeid": u'disconnected_nodeid', + u"description": { + u'available_space': 123456, + u'connection_status': u'summary', + u'last_received_data': None, + u'nickname': u'disconnected_nickname \u263b', + u'version': u'1.0', + }, + }, + ]), } self.assertEqual(expected, decoded) d.addCallback(_check) diff --git a/src/allmydata/web/root.py b/src/allmydata/web/root.py index 17d7a3820..f2a23c1e1 100644 --- a/src/allmydata/web/root.py +++ b/src/allmydata/web/root.py @@ -197,32 +197,50 @@ class Root(MultiFormatPage): def data_my_nickname(self, ctx, data): return self.client.nickname + def render_JSON(self, req): req.setHeader("content-type", "application/json; charset=utf-8") intro_summaries = [s.summary for s in self.client.introducer_connection_statuses()] sb = self.client.get_storage_broker() - servers = {} - for server in sb.get_known_servers(): - server_id = server.get_serverid() - servers[server_id] = {} - servers[server_id]["connection_status"] = server.get_connection_status().summary - servers[server_id]["available_space"] = server.get_available_space() - servers[server_id]["nickname"] = server.get_nickname() - if server.get_version() is not None: - servers[server_id]["version"] = server.get_version()["application-version"] - else: - servers[server_id]["version"] = "" - if server.rref is not None: - servers[server_id]["last_received_data"] = server.rref.getDataLastReceivedAt() - else: - servers[server_id]["last_received_data"] = "" - data = { - "introducers": { - "statuses": intro_summaries, - }, - "servers": servers + servers = self._describe_known_servers(sb) + result = { + "introducers": { + "statuses": intro_summaries, + }, + "servers": servers + } + return json.dumps(result, indent=1) + "\n" + + + def _describe_known_servers(self, broker): + return sorted(list( + { + u"nodeid": server.get_serverid(), + u"description": self._describe_server(server), } - return json.dumps(data, indent=1) + "\n" + for server + in broker.get_known_servers() + )) + + + def _describe_server(self, server): + description = { + u"connection_status": server.get_connection_status().summary, + u"available_space": server.get_available_space(), + u"nickname": server.get_nickname(), + u"version": None, + u"last_received_data": None, + } + version = server.get_version() + if version is not None: + description[u"version"] = version["application-version"] + + rref = server.rref + if rref is not None: + description[u"last_received_data"] = rref.getDataLastReceivedAt() + + return description + def render_magic_folder(self, ctx, data): if self.client._magic_folder is None: