diff --git a/lbrynet/daemon/Daemon.py b/lbrynet/daemon/Daemon.py index 30376a933..d9230e58b 100644 --- a/lbrynet/daemon/Daemon.py +++ b/lbrynet/daemon/Daemon.py @@ -1897,16 +1897,12 @@ class Daemon(AuthJSONRPCServer): raise Exception('Must specify nout') tx = yield self.wallet.abandon_claim(claim_id, txid, nout) - result = { - "success": True, - "txid": tx.id, - "nout": 0, - "tx": hexlify(tx.raw), - "fee": str(Decimal(tx.fee) / COIN), - "claim_id": claim_id - } self.analytics_manager.send_claim_action('abandon') - defer.returnValue(result) + defer.returnValue({ + "success": True, + "tx": tx, + "claim_id": claim_id + }) @requires(WALLET_COMPONENT, conditions=[WALLET_IS_UNLOCKED]) @defer.inlineCallbacks diff --git a/lbrynet/daemon/auth/server.py b/lbrynet/daemon/auth/server.py index 86f809aef..cc426f179 100644 --- a/lbrynet/daemon/auth/server.py +++ b/lbrynet/daemon/auth/server.py @@ -256,8 +256,9 @@ class AuthJSONRPCServer(AuthorizedBase): if self.listening_port: self.listening_port.stopListening() self.looping_call_manager.shutdown() - for session in list(self.server.sessions.values()): - session.expire() + if self.server is not None: + for session in list(self.server.sessions.values()): + session.expire() if self.analytics_manager: self.analytics_manager.shutdown() try: diff --git a/tests/integration/wallet/test_commands.py b/tests/integration/wallet/test_commands.py index fd1e47b96..426604b8b 100644 --- a/tests/integration/wallet/test_commands.py +++ b/tests/integration/wallet/test_commands.py @@ -1,9 +1,9 @@ +import json import tempfile import logging import asyncio from types import SimpleNamespace - from twisted.internet import defer from orchstr8.testcase import IntegrationTestCase, d2f @@ -16,10 +16,10 @@ from lbrynet.daemon.Daemon import Daemon from lbrynet.wallet.manager import LbryWalletManager from lbrynet.daemon.Components import WalletComponent, DHTComponent, HashAnnouncerComponent, ExchangeRateManagerComponent from lbrynet.daemon.Components import UPnPComponent -from lbrynet.daemon.Components import REFLECTOR_COMPONENT, HASH_ANNOUNCER_COMPONENT, EXCHANGE_RATE_MANAGER_COMPONENT -from lbrynet.daemon.Components import UPNP_COMPONENT, PEER_PROTOCOL_SERVER_COMPONENT, DHT_COMPONENT -from lbrynet.daemon.Components import STREAM_IDENTIFIER_COMPONENT, HEADERS_COMPONENT, RATE_LIMITER_COMPONENT +from lbrynet.daemon.Components import REFLECTOR_COMPONENT +from lbrynet.daemon.Components import PEER_PROTOCOL_SERVER_COMPONENT from lbrynet.daemon.ComponentManager import ComponentManager +from lbrynet.daemon.auth.server import jsonrpc_dumps_pretty log = logging.getLogger(__name__) @@ -156,6 +156,12 @@ class CommandTestCase(IntegrationTestCase): def d_generate(self, blocks): return defer.Deferred.fromFuture(asyncio.ensure_future(self.generate(blocks))) + def out(self, d): + """ Converts Daemon API call results (dictionary) + to JSON and then back to a dictionary. """ + d.addCallback(lambda o: json.loads(jsonrpc_dumps_pretty(o, ledger=self.ledger))['result']) + return d + class EpicAdventuresOfChris45(CommandTestCase): @@ -177,12 +183,12 @@ class EpicAdventuresOfChris45(CommandTestCase): # While making the spamdwich he wonders... has anyone on LBRY # registered the @spam channel yet? "I should do that!" he # exclaims and goes back to his computer to do just that! - channel = yield self.daemon.jsonrpc_channel_new('@spam', 1) + channel = yield self.out(self.daemon.jsonrpc_channel_new('@spam', 1)) self.assertTrue(channel['success']) - yield self.d_confirm_tx(channel['txid']) + yield self.d_confirm_tx(channel['tx']['txid']) # Do we have it locally? - channels = yield self.daemon.jsonrpc_channel_list() + channels = yield self.out(self.daemon.jsonrpc_channel_list()) self.assertEqual(len(channels), 1) self.assertEqual(channels[0]['name'], '@spam') self.assertTrue(channels[0]['have_certificate']) @@ -228,7 +234,7 @@ class EpicAdventuresOfChris45(CommandTestCase): # at 6 confirmations and the total is correct. # And is the channel resolvable and empty? - response = yield self.daemon.jsonrpc_resolve(uri='lbry://@spam') + response = yield self.out(self.daemon.jsonrpc_resolve(uri='lbry://@spam')) self.assertIn('lbry://@spam', response) self.assertIn('certificate', response['lbry://@spam']) @@ -245,11 +251,11 @@ class EpicAdventuresOfChris45(CommandTestCase): file.write(b'yada yada yada!') file.write(b'the end') file.flush() - claim1 = yield self.daemon.jsonrpc_publish( + claim1 = yield self.out(self.daemon.jsonrpc_publish( 'hovercraft', 1, file_path=file.name, channel_name='@spam', channel_id=channel['claim_id'] - ) + )) self.assertTrue(claim1['success']) - yield self.d_confirm_tx(claim1['txid']) + yield self.d_confirm_tx(claim1['tx']['txid']) # He quickly checks the unconfirmed balance to make sure everything looks # correct. @@ -258,7 +264,7 @@ class EpicAdventuresOfChris45(CommandTestCase): # Also checks that his new story can be found on the blockchain before # giving the link to all his friends. - response = yield self.daemon.jsonrpc_resolve(uri='lbry://@spam/hovercraft') + response = yield self.out(self.daemon.jsonrpc_resolve(uri='lbry://@spam/hovercraft')) self.assertIn('lbry://@spam/hovercraft', response) self.assertIn('claim', response['lbry://@spam/hovercraft']) @@ -276,19 +282,19 @@ class EpicAdventuresOfChris45(CommandTestCase): file.write(b'[typo fixing sounds being made]') file.write(b'yada yada yada!') file.flush() - claim2 = yield self.daemon.jsonrpc_publish( + claim2 = yield self.out(self.daemon.jsonrpc_publish( 'hovercraft', 1, file_path=file.name, channel_name='@spam', channel_id=channel['claim_id'] - ) + )) self.assertTrue(claim2['success']) self.assertEqual(claim2['claim_id'], claim1['claim_id']) - yield self.d_confirm_tx(claim2['txid']) + yield self.d_confirm_tx(claim2['tx']['txid']) # After some soul searching Chris decides that his story needs more # heart and a better ending. He takes down the story and begins the rewrite. - abandon = yield self.daemon.jsonrpc_claim_abandon(claim1['claim_id']) + abandon = yield self.out(self.daemon.jsonrpc_claim_abandon(claim1['claim_id'])) self.assertTrue(abandon['success']) - yield self.d_confirm_tx(abandon['txid']) + yield self.d_confirm_tx(abandon['tx']['txid']) # And now check that the claim doesn't resolve anymore. - response = yield self.daemon.jsonrpc_resolve(uri='lbry://@spam/hovercraft') + response = yield self.out(self.daemon.jsonrpc_resolve(uri='lbry://@spam/hovercraft')) self.assertNotIn('claim', response['lbry://@spam/hovercraft'])