Skip to content

Commit

Permalink
add_channel must not overwrite existing channel
Browse files Browse the repository at this point in the history
  • Loading branch information
hackaugusto authored and LefterisJP committed Aug 31, 2017
1 parent d5a024c commit 229045e
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 21 deletions.
42 changes: 26 additions & 16 deletions raiden/network/channelgraph.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,8 +195,7 @@ def __init__(
channelmanager_address,
token_address,
edge_list,
channels_details,
block_number):
channels_details):

if not isaddress(token_address):
raise ValueError('token_address must be a valid address')
Expand Down Expand Up @@ -236,21 +235,32 @@ def __ne__(self, other):
return not self.__eq__(other)

def add_channel(self, details):
""" Instantiate a channel this node participates and add to the graph.
If the channel is already registered do nothing.
"""
channel_address = details.channel_address
partner_state = details.partner_state

channel = Channel(
details.our_state,
partner_state,
details.external_state,
self.token_address,
details.reveal_timeout,
details.settle_timeout,
)
self.add_path(details.our_state.address, partner_state.address)

self.partneraddress_to_channel[partner_state.address] = channel
self.address_to_channel[channel_address] = channel

if details.our_state.address != self.our_address:
raise ValueError(
"Address mismatch, our_address doesn't match the channel details"
)

if channel_address not in self.address_to_channel:
partner_state = details.partner_state

channel = Channel(
details.our_state,
partner_state,
details.external_state,
self.token_address,
details.reveal_timeout,
details.settle_timeout,
)
self.add_path(details.our_state.address, partner_state.address)

self.partneraddress_to_channel[partner_state.address] = channel
self.address_to_channel[channel_address] = channel

def get_channel_by_contract_address(self, netting_channel_address):
""" Return the channel with `netting_channel_address`.
Expand Down
5 changes: 0 additions & 5 deletions raiden/raiden_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -640,8 +640,6 @@ def register_registry(self, registry_address):
# some events might be applied twice.
self.pyethapp_blockchain_events.add_proxies_listeners(proxies)

block_number = self.get_block_number()

for manager in proxies.channel_managers:
token_address = manager.token_address()
manager_address = manager.address
Expand All @@ -659,7 +657,6 @@ def register_registry(self, registry_address):
token_address,
edge_list,
channels_detail,
block_number,
)

self.manager_to_token[manager_address] = token_address
Expand Down Expand Up @@ -700,14 +697,12 @@ def register_channel_manager(self, manager_address):
for channel in netting_channels
]

block_number = self.get_block_number()
graph = ChannelGraph(
self.address,
manager_address,
token_address,
edge_list,
channels_detail,
block_number,
)

self.manager_to_token[manager_address] = token_address
Expand Down
63 changes: 63 additions & 0 deletions raiden/tests/unit/test_channelgraph.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-
from raiden.network.channelgraph import ChannelGraph, ChannelDetails
from raiden.tests.utils.factories import make_address


class ParticipantStateMock(object):
def __init__(self, address):
self.address = address


class NettingChannelMock(object):
def __init__(self, address):
self.address = address


class ExternalStateMock(object):
def __init__(self, netting_channel):
self.netting_channel = netting_channel
self.settled_block = 0
self.closed_block = 0
self.opened_block = 0


def test_addchannel_must_not_overwrite(): # pylint: disable=too-many-locals
""" Calling add_channel for an existing channel must not overwrite it. """
our_address = make_address()
partner_address = make_address()
channel_manager_address = make_address()
token_address = make_address()
channel_address = make_address()

our_state = ParticipantStateMock(our_address)
partner_state = ParticipantStateMock(partner_address)
netting_channel = NettingChannelMock(channel_address)
external_state = ExternalStateMock(netting_channel)
reveal_timeout = 5
settle_timeout = 10

channel_detail = ChannelDetails(
channel_address,
our_state,
partner_state,
external_state,
reveal_timeout,
settle_timeout,
)

edge_list = []
channel_detail_list = [channel_detail]

graph = ChannelGraph(
our_address,
channel_manager_address,
token_address,
edge_list,
channel_detail_list,
)

first_instance = graph.address_to_channel[channel_address]

graph.add_channel(channel_detail)

assert first_instance is graph.address_to_channel[channel_address]

0 comments on commit 229045e

Please sign in to comment.