Skip to content

Commit

Permalink
feat(Swarm): PeerDisconnected event
Browse files Browse the repository at this point in the history
  • Loading branch information
richardschneider committed Apr 25, 2019
1 parent 4537bee commit 97d0fbc
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 0 deletions.
11 changes: 11 additions & 0 deletions src/ConnectionManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ public class ConnectionManager
string Key(Peer peer) => peer.Id.ToBase58();
string Key(MultiHash id) => id.ToBase58();

/// <summary>
/// Raised when a peer's connection is closed.
/// </summary>
public event EventHandler<MultiHash> PeerDisconnected;

/// <summary>
/// Gets the current connections.
/// </summary>
Expand Down Expand Up @@ -165,6 +170,10 @@ public bool Remove(PeerConnection connection)
var last = newConns.Last();
last.RemotePeer.ConnectedAddress = last.RemoteAddress;
}
else
{
PeerDisconnected?.Invoke(this, connection.RemotePeer.Id);
}
return true;
}

Expand All @@ -187,6 +196,8 @@ public bool Remove(MultiHash id)
{
conn.Dispose();
}

PeerDisconnected?.Invoke(this, id);
return true;
}

Expand Down
16 changes: 16 additions & 0 deletions src/Swarm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@ public class Swarm : IService, IPolicy<MultiAddress>
/// </summary>
public event EventHandler<Peer> PeerDiscovered;

/// <summary>
/// Raised when a peer's connection is closed.
/// </summary>
public event EventHandler<Peer> PeerDisconnected;

/// <summary>
/// The local peer.
/// </summary>
Expand Down Expand Up @@ -329,12 +334,22 @@ public Task StartAsync()
log.Warn("Peer key is missing, using unencrypted connections.");
}

Manager.PeerDisconnected += OnPeerDisconnected;
IsRunning = true;
log.Debug("Started");

return Task.CompletedTask;
}

void OnPeerDisconnected(object sender, MultiHash peerId)
{
if (!otherPeers.TryGetValue(peerId.ToBase58(), out Peer peer))
{
peer = new Peer { Id = peerId };
}
PeerDisconnected?.Invoke(this, peer);
}

/// <inheritdoc />
public async Task StopAsync()
{
Expand All @@ -349,6 +364,7 @@ public async Task StopAsync()

// Disconnect from remote peers.
Manager.Clear();
Manager.PeerDisconnected -= OnPeerDisconnected;

otherPeers.Clear();
listeners.Clear();
Expand Down
41 changes: 41 additions & 0 deletions test/ConnectionManagerTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -265,5 +265,46 @@ public void Clear()
Assert.IsNull(a.Stream);
Assert.IsNull(b.Stream);
}

[TestMethod]
public void PeerDisconnectedEvent_RemovingPeer()
{
bool gotEvent = false;
var manager = new ConnectionManager();
manager.PeerDisconnected += (s, e) => gotEvent = true;
var peerA = new Peer { Id = aId };
var a = new PeerConnection { RemotePeer = peerA, Stream = Stream.Null };
manager.Add(a);

manager.Remove(peerA.Id);
Assert.IsTrue(gotEvent);
}

[TestMethod]
public void PeerDisconnectedEvent_RemovingConnection()
{
int gotEvent = 0;
var manager = new ConnectionManager();
manager.PeerDisconnected += (s, e) => gotEvent += 1;
var peerA = new Peer { Id = aId };
var a = new PeerConnection { RemotePeer = peerA, Stream = Stream.Null };
manager.Add(a);

manager.Remove(a);
Assert.AreEqual(1, gotEvent);
}

[TestMethod]
public void PeerDisconnectedEvent_ConnectionClose()
{
int gotEvent = 0;
var manager = new ConnectionManager();
manager.PeerDisconnected += (s, e) => gotEvent += 1;
var peerA = new Peer { Id = aId };
var a = new PeerConnection { RemotePeer = peerA, Stream = Stream.Null };
manager.Add(a);
a.Dispose();
Assert.AreEqual(1, gotEvent);
}
}
}
39 changes: 39 additions & 0 deletions test/SwarmTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,45 @@ public void Connecting_To_Self()
});
}

[TestMethod]
public async Task PeerDisconnected()
{
var peerB = new Peer
{
AgentVersion = "peerB",
Id = "QmdpwjdB94eNm2Lcvp9JqoCxswo3AKQqjLuNZyLixmCM1h",
PublicKey = "CAASXjBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDlTSgVLprWaXfmxDr92DJE1FP0wOexhulPqXSTsNh5ot6j+UiuMgwb0shSPKzLx9AuTolCGhnwpTBYHVhFoBErAgMBAAE="
};
var swarmB = new Swarm { LocalPeer = peerB };
await swarmB.StartAsync();
var peerBAddress = await swarmB.StartListeningAsync("/ip4/127.0.0.1/tcp/0");

var swarm = new Swarm { LocalPeer = self };
var swarmConnections = 0;
swarm.ConnectionEstablished += (s, e) =>
{
++swarmConnections;
};
swarm.PeerDisconnected += (s, e) =>
{
--swarmConnections;
};
await swarm.StartAsync();
try
{
var remotePeer = await swarm.ConnectAsync(peerBAddress);
Assert.AreEqual(1, swarmConnections);

await swarm.StopAsync();
Assert.AreEqual(0, swarmConnections);
}
finally
{
await swarm.StopAsync();
await swarmB.StopAsync();
}
}

[TestMethod]
public async Task Listening()
{
Expand Down

0 comments on commit 97d0fbc

Please sign in to comment.