-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
100 additions
and
19 deletions.
There are no files selected for viewing
64 changes: 55 additions & 9 deletions
64
ShareClipbrd/ShareClipbrd.Core.Tests/Services/AddressResolverTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,38 +1,84 @@ | ||
using ShareClipbrd.Core.Services; | ||
using ShareClipbrd.Core.Helpers; | ||
using ShareClipbrd.Core.Services; | ||
|
||
namespace ShareClipbrd.Core.Tests.Services { | ||
public class AddressResolverTests { | ||
[Test] | ||
public void UseAddressDiscoveryService_When_Invalid_Address_Return_False() { | ||
string id; | ||
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService(":55542", out id)); | ||
int? mandatoryPort; | ||
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService(":55542", out id, out mandatoryPort)); | ||
Assert.That(id, Is.Empty); | ||
Assert.That(mandatoryPort, Is.Null); | ||
|
||
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService(string.Empty, out id)); | ||
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService(string.Empty, out id, out mandatoryPort)); | ||
Assert.That(id, Is.Empty); | ||
Assert.That(mandatoryPort, Is.Null); | ||
|
||
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns 1234", out id)); | ||
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns 1234", out id, out mandatoryPort)); | ||
Assert.That(id, Is.Empty); | ||
Assert.That(mandatoryPort, Is.Null); | ||
|
||
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns", out id)); | ||
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns", out id, out mandatoryPort)); | ||
Assert.That(id, Is.Empty); | ||
Assert.That(mandatoryPort, Is.Null); | ||
|
||
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns:", out id)); | ||
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns:", out id, out mandatoryPort)); | ||
Assert.That(id, Is.Empty); | ||
Assert.That(mandatoryPort, Is.Null); | ||
|
||
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns: ", out id, out mandatoryPort)); | ||
Assert.That(id, Is.Empty); | ||
Assert.That(mandatoryPort, Is.Null); | ||
} | ||
|
||
[Test] | ||
public void UseAddressDiscoveryService_Valid_Address_Return_True_And_Id() { | ||
string id; | ||
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:a", out id)); | ||
int? mandatoryPort; | ||
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:a", out id, out mandatoryPort)); | ||
Assert.That(id, Is.EqualTo("a")); | ||
Assert.That(mandatoryPort, Is.Null); | ||
|
||
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:55542", out id)); | ||
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:55542", out id, out mandatoryPort)); | ||
Assert.That(id, Is.EqualTo("55542")); | ||
Assert.That(mandatoryPort, Is.Null); | ||
|
||
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", out id)); | ||
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", out id, out mandatoryPort)); | ||
Assert.That(id, Is.EqualTo("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")); | ||
Assert.That(mandatoryPort, Is.Null); | ||
} | ||
|
||
[Test] | ||
public void UseAddressDiscoveryService_When_Invalid_Ports_Throws_ArgumentException() { | ||
string id; | ||
int? mandatoryPort; | ||
Assert.Throws<ArgumentException>(() => AddressResolver.UseAddressDiscoveryService("mdns:abcde:", out id, out mandatoryPort)); | ||
Assert.Throws<ArgumentException>(() => AddressResolver.UseAddressDiscoveryService("mdns:abcde: ", out id, out mandatoryPort)); | ||
Assert.Throws<ArgumentException>(() => AddressResolver.UseAddressDiscoveryService("mdns:abcde:-1", out id, out mandatoryPort)); | ||
Assert.Throws<ArgumentException>(() => AddressResolver.UseAddressDiscoveryService("mdns:abcde:65536", out id, out mandatoryPort)); | ||
|
||
Assert.IsFalse(AddressResolver.UseAddressDiscoveryService("mdns::1", out id, out mandatoryPort)); | ||
Assert.That(id, Is.Empty); | ||
Assert.That(mandatoryPort, Is.Null); | ||
} | ||
|
||
[Test] | ||
public void UseAddressDiscoveryService_Valid_Ports_And_Entire_Id_Extracting_Tests() { | ||
string id; | ||
int? mandatoryPort; | ||
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:abcde:0", out id, out mandatoryPort)); | ||
Assert.That(id, Is.EqualTo("abcde")); | ||
Assert.That(mandatoryPort, Is.EqualTo(0)); | ||
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:abcde 12345:1", out id, out mandatoryPort)); | ||
Assert.That(id, Is.EqualTo("abcde 12345")); | ||
Assert.That(mandatoryPort, Is.EqualTo(1)); | ||
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:abcde:65535", out id, out mandatoryPort)); | ||
Assert.That(id, Is.EqualTo("abcde")); | ||
Assert.That(mandatoryPort, Is.EqualTo(65535)); | ||
Assert.IsTrue(AddressResolver.UseAddressDiscoveryService("mdns:abcde: 65535", out id, out mandatoryPort)); | ||
Assert.That(id, Is.EqualTo("abcde")); | ||
Assert.That(mandatoryPort, Is.EqualTo(65535)); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
32 changes: 30 additions & 2 deletions
32
ShareClipbrd/ShareClipbrd.Core/Services/AddressResolver.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,20 +1,48 @@ | ||
namespace ShareClipbrd.Core.Services { | ||
using System.Net; | ||
|
||
namespace ShareClipbrd.Core.Services { | ||
public class AddressResolver { | ||
public const string TagDiscoveryService = "mdns:"; | ||
|
||
public static bool UseAddressDiscoveryService(string address, out string id) { | ||
static void MandatoryPort(ref string id, out int? mandatoryPort) { | ||
int portStart = id.LastIndexOf(':'); | ||
int port; | ||
if(portStart < 0) { | ||
mandatoryPort = null; | ||
return; | ||
} | ||
|
||
if(int.TryParse(id[(portStart + 1)..], out port)) { | ||
try { | ||
_ = new IPEndPoint(IPAddress.Any, port); | ||
id = id[..portStart]; | ||
mandatoryPort = port; | ||
return; | ||
} catch(ArgumentOutOfRangeException) { | ||
} | ||
} | ||
throw new ArgumentException("mdns port for the partner address is not needed"); | ||
} | ||
|
||
public static bool UseAddressDiscoveryService(string address, out string id, out int? mandatoryPort) { | ||
if(!address.StartsWith(TagDiscoveryService)) { | ||
id = string.Empty; | ||
mandatoryPort = null; | ||
return false; | ||
} | ||
|
||
var s = address.Replace(TagDiscoveryService, string.Empty); | ||
|
||
MandatoryPort(ref s, out mandatoryPort); | ||
s = s.Trim(); | ||
if(string.IsNullOrEmpty(s)) { | ||
id = string.Empty; | ||
mandatoryPort = null; | ||
return false; | ||
} | ||
id = s; | ||
return true; | ||
} | ||
|
||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters