Skip to content

Commit d813df3

Browse files
authored
Merge pull request #12 from Sendspin/task/fix-discoveredserver-equals
Include Host, Port, and IPs in DiscoveredServer.Equals
2 parents 06520f0 + 6f5630d commit d813df3

File tree

3 files changed

+96
-5
lines changed

3 files changed

+96
-5
lines changed

src/Sendspin.SDK/Discovery/DiscoveredServer.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,12 @@ public Uri GetWebSocketUri()
6969

7070
public override bool Equals(object? obj)
7171
{
72-
return obj is DiscoveredServer other && ServerId == other.ServerId;
72+
return obj is DiscoveredServer other
73+
&& ServerId == other.ServerId
74+
&& Host == other.Host
75+
&& Port == other.Port
76+
&& IpAddresses.SequenceEqual(other.IpAddresses);
7377
}
7478

75-
public override int GetHashCode() => ServerId.GetHashCode();
79+
public override int GetHashCode() => HashCode.Combine(ServerId, Host, Port);
7680
}

src/Sendspin.SDK/Discovery/MdnsServerDiscovery.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -355,9 +355,18 @@ private void UpdateServer(DiscoveredServer server)
355355
{
356356
if (_servers.TryGetValue(server.ServerId, out var existing))
357357
{
358-
// Update last seen time
359-
existing.LastSeenAt = DateTimeOffset.UtcNow;
360-
ServerUpdated?.Invoke(this, existing);
358+
if (!existing.Equals(server))
359+
{
360+
// Connection details changed (IP, port, or host) — replace the entry
361+
_servers[server.ServerId] = server;
362+
_logger.LogInformation("Server updated: {Server} (connection details changed)", server);
363+
}
364+
else
365+
{
366+
existing.LastSeenAt = DateTimeOffset.UtcNow;
367+
}
368+
369+
ServerUpdated?.Invoke(this, _servers[server.ServerId]);
361370
}
362371
else
363372
{
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
using Sendspin.SDK.Discovery;
2+
3+
namespace Sendspin.SDK.Tests.Discovery;
4+
5+
public class DiscoveredServerTests
6+
{
7+
private static DiscoveredServer CreateServer(
8+
string id = "server-1",
9+
string host = "test.local",
10+
int port = 8927,
11+
IReadOnlyList<string>? ips = null)
12+
{
13+
return new DiscoveredServer
14+
{
15+
ServerId = id,
16+
Name = "Test Server",
17+
Host = host,
18+
Port = port,
19+
IpAddresses = ips ?? new List<string> { "192.168.1.100" },
20+
};
21+
}
22+
23+
[Fact]
24+
public void Equals_SameServerIdAndDetails_ReturnsTrue()
25+
{
26+
var a = CreateServer();
27+
var b = CreateServer();
28+
Assert.Equal(a, b);
29+
}
30+
31+
[Fact]
32+
public void Equals_DifferentServerId_ReturnsFalse()
33+
{
34+
var a = CreateServer(id: "server-1");
35+
var b = CreateServer(id: "server-2");
36+
Assert.NotEqual(a, b);
37+
}
38+
39+
[Fact]
40+
public void Equals_SameIdDifferentPort_ReturnsFalse()
41+
{
42+
var a = CreateServer(port: 8927);
43+
var b = CreateServer(port: 9000);
44+
Assert.NotEqual(a, b);
45+
}
46+
47+
[Fact]
48+
public void Equals_SameIdDifferentHost_ReturnsFalse()
49+
{
50+
var a = CreateServer(host: "old.local");
51+
var b = CreateServer(host: "new.local");
52+
Assert.NotEqual(a, b);
53+
}
54+
55+
[Fact]
56+
public void Equals_SameIdDifferentIps_ReturnsFalse()
57+
{
58+
var a = CreateServer(ips: new List<string> { "192.168.1.100" });
59+
var b = CreateServer(ips: new List<string> { "10.0.0.50" });
60+
Assert.NotEqual(a, b);
61+
}
62+
63+
[Fact]
64+
public void GetHashCode_SameIdDifferentPort_DifferentHash()
65+
{
66+
var a = CreateServer(port: 8927);
67+
var b = CreateServer(port: 9000);
68+
Assert.NotEqual(a.GetHashCode(), b.GetHashCode());
69+
}
70+
71+
[Fact]
72+
public void GetHashCode_IdenticalServers_SameHash()
73+
{
74+
var a = CreateServer();
75+
var b = CreateServer();
76+
Assert.Equal(a.GetHashCode(), b.GetHashCode());
77+
}
78+
}

0 commit comments

Comments
 (0)