Ver Fonte

feat: Dispose Proxy only if ownedProxy is true (#279)

Kation L há 1 mês atrás
pai
commit
a7a375d1a2

+ 7 - 3
src/STUN/Client/StunClient3489.cs

@@ -23,15 +23,17 @@ public class StunClient3489 : IUdpStunClient
 	private readonly IPEndPoint _remoteEndPoint;
 
 	private readonly IUdpProxy _proxy;
+	private readonly bool _ownedProxy;
 
 	public ClassicStunResult State { get; private set; } = new();
 
-	public StunClient3489(IPEndPoint server, IPEndPoint local, IUdpProxy? proxy = null)
+	public StunClient3489(IPEndPoint server, IPEndPoint local, IUdpProxy? proxy = null, bool ownedProxy = true)
 	{
 		Requires.NotNull(server, nameof(server));
 		Requires.NotNull(local, nameof(local));
 
 		_proxy = proxy ?? new NoneUdpProxy(local);
+		_ownedProxy = ownedProxy;
 
 		_remoteEndPoint = server;
 
@@ -226,8 +228,10 @@ public class StunClient3489 : IUdpStunClient
 
 	public void Dispose()
 	{
-		_proxy.Dispose();
-
+		if (_ownedProxy)
+		{
+			_proxy.Dispose();
+		}
 		GC.SuppressFinalize(this);
 	}
 }

+ 7 - 2
src/STUN/Client/StunClient5389TCP.cs

@@ -20,15 +20,17 @@ public class StunClient5389TCP : IStunClient5389
 	private IPEndPoint _lastLocalEndPoint;
 
 	private readonly ITcpProxy _proxy;
+	private readonly bool _ownedProxy;
 
 	public StunResult5389 State { get; private set; } = new();
 
-	public StunClient5389TCP(IPEndPoint server, IPEndPoint local, ITcpProxy? proxy = default)
+	public StunClient5389TCP(IPEndPoint server, IPEndPoint local, ITcpProxy? proxy = default, bool ownedProxy = true)
 	{
 		Requires.NotNull(server, nameof(server));
 		Requires.NotNull(local, nameof(local));
 
 		_proxy = proxy ?? new DirectTcpProxy();
+		_ownedProxy = ownedProxy;
 
 		_remoteEndPoint = server;
 
@@ -232,7 +234,10 @@ public class StunClient5389TCP : IStunClient5389
 
 	public void Dispose()
 	{
-		_proxy.Dispose();
+		if (_ownedProxy)
+		{
+			_proxy.Dispose();
+		}
 
 		GC.SuppressFinalize(this);
 	}

+ 8 - 2
src/STUN/Client/StunClient5389UDP.cs

@@ -25,14 +25,17 @@ public class StunClient5389UDP : IStunClient5389, IUdpStunClient
 
 	private readonly IUdpProxy _proxy;
 
+	private readonly bool _ownedProxy;
+
 	public StunResult5389 State { get; private set; } = new();
 
-	public StunClient5389UDP(IPEndPoint server, IPEndPoint local, IUdpProxy? proxy = default)
+	public StunClient5389UDP(IPEndPoint server, IPEndPoint local, IUdpProxy? proxy = default, bool ownedProxy = true)
 	{
 		Requires.NotNull(server, nameof(server));
 		Requires.NotNull(local, nameof(local));
 
 		_proxy = proxy ?? new NoneUdpProxy(local);
+		_ownedProxy = ownedProxy;
 
 		_remoteEndPoint = server;
 
@@ -293,7 +296,10 @@ public class StunClient5389UDP : IStunClient5389, IUdpStunClient
 
 	public void Dispose()
 	{
-		_proxy.Dispose();
+		if (_ownedProxy)
+		{
+			_proxy.Dispose();
+		}
 
 		GC.SuppressFinalize(this);
 	}

+ 20 - 20
src/tests/UnitTest/StunClien5389UDPTest.cs

@@ -65,7 +65,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task MappingBehaviorTestFailAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 fail = new() { BindingTestResult = BindingTestResult.Fail };
@@ -85,7 +85,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task MappingBehaviorTestUnsupportedServerAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -134,7 +134,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task MappingBehaviorTestDirectAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 response = new()
@@ -160,7 +160,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task MappingBehaviorTestEndpointIndependentAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -184,7 +184,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task MappingBehaviorTest2FailAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -211,7 +211,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task MappingBehaviorTestAddressDependentAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -252,7 +252,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task MappingBehaviorTestAddressAndPortDependentAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -293,7 +293,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task MappingBehaviorTest3FailAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -328,7 +328,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task FilteringBehaviorTestFailAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 fail = new() { BindingTestResult = BindingTestResult.Fail };
@@ -348,7 +348,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task FilteringBehaviorTestUnsupportedServerAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -397,7 +397,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task FilteringBehaviorTestEndpointIndependentAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -424,7 +424,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task FilteringBehaviorTest2UnsupportedServerAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -451,7 +451,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task FilteringBehaviorTestAddressAndPortDependentAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -478,7 +478,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task FilteringBehaviorTestAddressDependentAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -506,7 +506,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task FilteringBehaviorTest3UnsupportedServerAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -534,7 +534,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task QueryFailTestAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 fail = new() { BindingTestResult = BindingTestResult.Fail };
@@ -554,7 +554,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task QueryUnsupportedServerTestAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -578,7 +578,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task QueryMappingBehaviorDirectTestAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -605,7 +605,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task QueryMappingBehaviorEndpointIndependentTestAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -632,7 +632,7 @@ public class StunClien5389UDPTest
 	[TestMethod]
 	public async Task QueryMappingBehaviorAddressAndPortDependentTestAsync()
 	{
-		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389UDP> mock = new(ServerAddress, Any, default!, true);
 		StunClient5389UDP client = mock.Object;
 
 		StunResult5389 r1 = new()

+ 6 - 6
src/tests/UnitTest/StunClient3489Test.cs

@@ -35,7 +35,7 @@ public class StunClient3489Test
 	[TestMethod]
 	public async Task UdpBlockedTestAsync()
 	{
-		Mock<StunClient3489> mock = new(Any, Any, default!);
+		Mock<StunClient3489> mock = new(Any, Any, default!, true);
 		StunClient3489 client = mock.Object;
 
 		mock.Setup(x => x.Test1Async(It.IsAny<CancellationToken>())).ReturnsAsync(default(StunResponse?));
@@ -47,7 +47,7 @@ public class StunClient3489Test
 	[TestMethod]
 	public async Task UnsupportedServerTestAsync()
 	{
-		Mock<StunClient3489> mock = new(Any, Any, default!);
+		Mock<StunClient3489> mock = new(Any, Any, default!, true);
 		StunClient3489 client = mock.Object;
 
 		mock.Setup(x => x.LocalEndPoint).Returns(LocalAddress1);
@@ -83,7 +83,7 @@ public class StunClient3489Test
 	[TestMethod]
 	public async Task NoNatTestAsync()
 	{
-		Mock<StunClient3489> mock = new(Any, Any, default!);
+		Mock<StunClient3489> mock = new(Any, Any, default!, true);
 		StunClient3489 client = mock.Object;
 
 		StunResponse openInternetTest1Response = new(
@@ -114,7 +114,7 @@ public class StunClient3489Test
 	[TestMethod]
 	public async Task FullConeTestAsync()
 	{
-		Mock<StunClient3489> mock = new(Any, Any, default!);
+		Mock<StunClient3489> mock = new(Any, Any, default!, true);
 		StunClient3489 client = mock.Object;
 
 		StunResponse test1Response = new(
@@ -172,7 +172,7 @@ public class StunClient3489Test
 	[TestMethod]
 	public async Task SymmetricTestAsync()
 	{
-		Mock<StunClient3489> mock = new(Any, Any, default!);
+		Mock<StunClient3489> mock = new(Any, Any, default!, true);
 		StunClient3489 client = mock.Object;
 
 		StunResponse test1Response = new(
@@ -203,7 +203,7 @@ public class StunClient3489Test
 	[TestMethod]
 	public async Task RestrictedConeTestAsync()
 	{
-		Mock<StunClient3489> mock = new(Any, Any, default!);
+		Mock<StunClient3489> mock = new(Any, Any, default!, true);
 		StunClient3489 client = mock.Object;
 
 		StunResponse test1Response = new(

+ 9 - 9
src/tests/UnitTest/StunClient5389TCPTest.cs

@@ -153,7 +153,7 @@ public class StunClient5389TCPTest
 	[TestMethod]
 	public async Task MappingBehaviorTestFailAsync()
 	{
-		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!, true);
 		IStunClient5389 client = mock.Object;
 
 		StunResult5389 fail = new() { BindingTestResult = BindingTestResult.Fail };
@@ -173,7 +173,7 @@ public class StunClient5389TCPTest
 	[TestMethod]
 	public async Task MappingBehaviorTestUnsupportedServerAsync()
 	{
-		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!, true);
 		IStunClient5389 client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -222,7 +222,7 @@ public class StunClient5389TCPTest
 	[TestMethod]
 	public async Task MappingBehaviorTestDirectAsync()
 	{
-		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!, true);
 		IStunClient5389 client = mock.Object;
 
 		StunResult5389 response = new()
@@ -248,7 +248,7 @@ public class StunClient5389TCPTest
 	[TestMethod]
 	public async Task MappingBehaviorTestEndpointIndependentAsync()
 	{
-		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!, true);
 		IStunClient5389 client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -272,7 +272,7 @@ public class StunClient5389TCPTest
 	[TestMethod]
 	public async Task MappingBehaviorTest2FailAsync()
 	{
-		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!, true);
 		IStunClient5389 client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -299,7 +299,7 @@ public class StunClient5389TCPTest
 	[TestMethod]
 	public async Task MappingBehaviorTestAddressDependentAsync()
 	{
-		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!, true);
 		IStunClient5389 client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -341,7 +341,7 @@ public class StunClient5389TCPTest
 	[TestMethod]
 	public async Task MappingBehaviorTestAddressAndPortDependentAsync()
 	{
-		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!, true);
 		IStunClient5389 client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -383,7 +383,7 @@ public class StunClient5389TCPTest
 	[TestMethod]
 	public async Task MappingBehaviorTest3FailAsync()
 	{
-		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!, true);
 		IStunClient5389 client = mock.Object;
 
 		StunResult5389 r1 = new()
@@ -419,7 +419,7 @@ public class StunClient5389TCPTest
 	[TestMethod]
 	public async Task FilteringBehaviorTestAsync()
 	{
-		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!);
+		Mock<StunClient5389TCP> mock = new(ServerAddress, Any, default!, true);
 		IStunClient5389 client = mock.Object;
 
 		await Assert.ThrowsExactlyAsync<NotSupportedException>(async () => await client.FilteringBehaviorTestAsync(CancellationToken));