2019-10-30 22:07:28 +03:00
|
|
|
#if !__WATCHOS__
|
2018-09-05 15:07:10 +03:00
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Threading;
|
|
|
|
#if XAMCORE_2_0
|
|
|
|
using CoreFoundation;
|
|
|
|
using Foundation;
|
|
|
|
using Network;
|
|
|
|
using ObjCRuntime;
|
|
|
|
using Security;
|
|
|
|
#else
|
|
|
|
using MonoTouch.CoreFoundation;
|
|
|
|
using MonoTouch.Foundation;
|
|
|
|
using MonoTouch.Network;
|
|
|
|
using MonoTouch.Security;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
using NUnit.Framework;
|
2019-11-14 13:45:33 +03:00
|
|
|
using MonoTests.System.Net.Http;
|
2018-09-05 15:07:10 +03:00
|
|
|
|
|
|
|
namespace MonoTouchFixtures.Network {
|
|
|
|
|
|
|
|
[TestFixture]
|
|
|
|
[Preserve (AllMembers = true)]
|
|
|
|
public class NWParametersTest {
|
|
|
|
|
|
|
|
AutoResetEvent secureEvent; // used to let us know the handler was indeed called.
|
|
|
|
AutoResetEvent configureEvent; // used to let us know the handler was indeed called.
|
|
|
|
AutoResetEvent connectedEvent; // used to let us know when the connection was established so that we can access the NWPath
|
|
|
|
bool secureConnectionWasSet = false;
|
|
|
|
bool protocolConfigured = false;
|
|
|
|
List<NWInterface> interfaces = new List<NWInterface> ();
|
2018-09-13 02:15:33 +03:00
|
|
|
string host;
|
|
|
|
NWConnection connection;
|
2018-09-05 15:07:10 +03:00
|
|
|
|
2018-09-13 02:15:33 +03:00
|
|
|
|
|
|
|
[TestFixtureSetUp]
|
|
|
|
public void Init ()
|
2018-09-05 15:07:10 +03:00
|
|
|
{
|
|
|
|
TestRuntime.AssertXcodeVersion (10, 0);
|
2018-09-13 02:15:33 +03:00
|
|
|
// we want to use a single connection, since it is expensive
|
2018-09-05 15:07:10 +03:00
|
|
|
connectedEvent = new AutoResetEvent(false);
|
2019-11-14 13:45:33 +03:00
|
|
|
host = NetworkResources.MicrosoftUri.Host;
|
2018-09-05 15:07:10 +03:00
|
|
|
interfaces = new List<NWInterface> ();
|
|
|
|
using (var parameters = NWParameters.CreateUdp ())
|
2018-09-13 02:15:33 +03:00
|
|
|
using (var endpoint = NWEndpoint.Create (host, "80")) {
|
|
|
|
connection = new NWConnection (endpoint, parameters);
|
|
|
|
connection.SetQueue (DispatchQueue.DefaultGlobalQueue); // important, else we will get blocked
|
2018-09-05 15:07:10 +03:00
|
|
|
connection.SetStateChangeHandler (ConnectionStateHandler);
|
2018-09-13 02:15:33 +03:00
|
|
|
connection.Start ();
|
|
|
|
Assert.True (connectedEvent.WaitOne (20000), "Connection timed out.");
|
2018-09-05 15:07:10 +03:00
|
|
|
using (var path = connection.CurrentPath)
|
|
|
|
{
|
|
|
|
path.EnumerateInterfaces (EnumerateInterfacesHandler);
|
|
|
|
}
|
2018-09-13 02:15:33 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[TestFixtureTearDown]
|
|
|
|
public void Dispose()
|
|
|
|
{
|
2019-10-28 21:50:44 +03:00
|
|
|
connection.Dispose ();
|
|
|
|
foreach (var i in interfaces)
|
|
|
|
i.Dispose ();
|
2018-09-05 15:07:10 +03:00
|
|
|
}
|
|
|
|
|
2018-09-13 02:15:33 +03:00
|
|
|
[SetUp]
|
|
|
|
public void SetUp ()
|
2018-09-05 15:07:10 +03:00
|
|
|
{
|
2018-09-13 02:15:33 +03:00
|
|
|
secureEvent = new AutoResetEvent(false);
|
|
|
|
configureEvent = new AutoResetEvent(false);
|
2018-09-05 15:07:10 +03:00
|
|
|
secureConnectionWasSet = false;
|
|
|
|
protocolConfigured = false;
|
|
|
|
}
|
|
|
|
|
2018-09-13 02:15:33 +03:00
|
|
|
void ConnectionStateHandler (NWConnectionState state, NWError error)
|
|
|
|
{
|
|
|
|
switch (state){
|
|
|
|
case NWConnectionState.Ready:
|
|
|
|
connectedEvent.Set ();
|
|
|
|
break;
|
|
|
|
case NWConnectionState.Cancelled:
|
2018-09-05 15:07:10 +03:00
|
|
|
break;
|
2018-09-13 02:15:33 +03:00
|
|
|
case NWConnectionState.Invalid:
|
|
|
|
case NWConnectionState.Failed:
|
|
|
|
Assert.Inconclusive ("Network connection could not be performed.");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[TearDown]
|
|
|
|
public void TearDown ()
|
|
|
|
{
|
|
|
|
secureEvent = null;
|
|
|
|
secureConnectionWasSet = false;
|
|
|
|
protocolConfigured = false;
|
2018-09-05 15:07:10 +03:00
|
|
|
}
|
2019-10-30 22:07:28 +03:00
|
|
|
|
2018-09-05 15:07:10 +03:00
|
|
|
void EnumerateInterfacesHandler (NWInterface nwInterface)
|
|
|
|
{
|
|
|
|
interfaces.Add (nwInterface);
|
|
|
|
}
|
|
|
|
|
|
|
|
Action<NWProtocolOptions> CreateTlsHandler ()
|
|
|
|
{
|
|
|
|
return (NWProtocolOptions options) => {
|
|
|
|
secureConnectionWasSet = true;
|
|
|
|
secureEvent.Set ();
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
Action<NWProtocolOptions> CreateConfigureProtocolHandler ()
|
|
|
|
{
|
|
|
|
return (NWProtocolOptions options) => {
|
|
|
|
protocolConfigured = true;
|
|
|
|
configureEvent.Set ();
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void CreateSecureUpdTest ()
|
|
|
|
{
|
|
|
|
var setUpTls = CreateTlsHandler ();
|
|
|
|
var setUpProtocol = CreateConfigureProtocolHandler ();
|
|
|
|
|
|
|
|
using (var parameters = NWParameters.CreateSecureUdp (configureTls: setUpTls, configureUdp: setUpProtocol))
|
2019-11-14 13:45:33 +03:00
|
|
|
using (var endpoint = NWEndpoint.Create (NetworkResources.MicrosoftUri.Host, "80")) {
|
2018-09-05 15:07:10 +03:00
|
|
|
secureEvent.WaitOne ();
|
|
|
|
configureEvent.WaitOne ();
|
|
|
|
Assert.True (secureConnectionWasSet, "Configure TLS handler was not called.");
|
|
|
|
Assert.True (protocolConfigured, "Protocol configure handler was not called.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void CreateSecureUpdTestDoNotSetUpProtocol ()
|
|
|
|
{
|
|
|
|
var setUpTls = CreateTlsHandler ();
|
|
|
|
|
|
|
|
using (var parameters = NWParameters.CreateSecureUdp (configureTls: setUpTls))
|
2019-11-14 13:45:33 +03:00
|
|
|
using (var endpoint = NWEndpoint.Create (NetworkResources.MicrosoftUri.Host, "80")) {
|
2018-09-05 15:07:10 +03:00
|
|
|
secureEvent.WaitOne ();
|
|
|
|
Assert.True (secureConnectionWasSet, "Configure TLS handler was not called.");
|
|
|
|
Assert.False (protocolConfigured, "Protocol configure handler was called.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void CreateSecureUpdTestDoNotSetUpTls ()
|
|
|
|
{
|
|
|
|
var setUpProtocol = CreateConfigureProtocolHandler ();
|
|
|
|
|
|
|
|
using (var parameters = NWParameters.CreateSecureUdp (configureTls: null, configureUdp: setUpProtocol))
|
2019-11-14 13:45:33 +03:00
|
|
|
using (var endpoint = NWEndpoint.Create (NetworkResources.MicrosoftUri.Host, "80")) {
|
2018-09-05 15:07:10 +03:00
|
|
|
configureEvent.WaitOne ();
|
|
|
|
Assert.False (secureConnectionWasSet, "Configure TLS handler was not called.");
|
|
|
|
Assert.True (protocolConfigured, "Protocol configure handler was not called.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void CreateSecureTcpTest ()
|
|
|
|
{
|
|
|
|
var setUpTls = CreateTlsHandler ();
|
|
|
|
var setUpProtocol = CreateConfigureProtocolHandler ();
|
|
|
|
|
|
|
|
using (var parameters = NWParameters.CreateSecureTcp (configureTls: setUpTls, configureTcp: setUpProtocol))
|
2019-11-14 13:45:33 +03:00
|
|
|
using (var endpoint = NWEndpoint.Create (NetworkResources.MicrosoftUri.Host, "80")) {
|
2018-09-05 15:07:10 +03:00
|
|
|
secureEvent.WaitOne ();
|
|
|
|
configureEvent.WaitOne ();
|
|
|
|
Assert.True (secureConnectionWasSet, "Configure TLS handler was not called.");
|
|
|
|
Assert.True (protocolConfigured, "Protocol configure handler was not called.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void CreateSecureTcpTestDoNotSetUpProtocol ()
|
|
|
|
{
|
|
|
|
var setUpTls = CreateTlsHandler ();
|
|
|
|
var setUpProtocol = CreateConfigureProtocolHandler ();
|
|
|
|
|
|
|
|
using (var parameters = NWParameters.CreateSecureTcp (configureTls: setUpTls))
|
2019-11-14 13:45:33 +03:00
|
|
|
using (var endpoint = NWEndpoint.Create (NetworkResources.MicrosoftUri.Host, "80")) {
|
2018-09-05 15:07:10 +03:00
|
|
|
secureEvent.WaitOne ();
|
|
|
|
Assert.True (secureConnectionWasSet, "Configure TLS handler was not called.");
|
|
|
|
Assert.False (protocolConfigured, "Protocol configure handler was called.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void CreateSecureTcpTestDoNotSetUpTls ()
|
|
|
|
{
|
|
|
|
var setUpProtocol = CreateConfigureProtocolHandler ();
|
|
|
|
|
|
|
|
using (var parameters = NWParameters.CreateSecureTcp (configureTls: null, configureTcp: setUpProtocol))
|
2019-11-14 13:45:33 +03:00
|
|
|
using (var endpoint = NWEndpoint.Create (NetworkResources.MicrosoftUri.Host, "80")) {
|
2018-09-05 15:07:10 +03:00
|
|
|
configureEvent.WaitOne ();
|
|
|
|
Assert.False (secureConnectionWasSet, "Configure TLS handler was called.");
|
|
|
|
Assert.True (protocolConfigured, "Protocol configure handler was not called.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void MultiPathServicePropertyTest ()
|
|
|
|
{
|
|
|
|
using (var parameters = new NWParameters ())
|
|
|
|
{
|
|
|
|
var defaultValue = parameters.MultipathService;
|
|
|
|
Assert.AreEqual (defaultValue, NWMultiPathService.Disabled, "Default value changed.");
|
|
|
|
var newValue = NWMultiPathService.Aggregate;
|
|
|
|
parameters.MultipathService = newValue;
|
|
|
|
Assert.AreEqual (newValue, parameters.MultipathService, "New value was not stored.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void ProtocolStackPropertyTest ()
|
|
|
|
{
|
|
|
|
using (var parameters = new NWParameters ())
|
|
|
|
{
|
|
|
|
var stack = parameters.ProtocolStack;
|
|
|
|
Assert.AreNotEqual (IntPtr.Zero, stack.Handle);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void LocalOnlyPropertyTest ()
|
|
|
|
{
|
|
|
|
using (var parameters = new NWParameters ())
|
|
|
|
{
|
|
|
|
var defaultValue = parameters.LocalOnly;
|
|
|
|
Assert.False (defaultValue, "Default value changed.");
|
|
|
|
parameters.LocalOnly = true;
|
|
|
|
Assert.True (parameters.LocalOnly, "New value was not stored.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void PreferNoProxyPropertyTest ()
|
|
|
|
{
|
|
|
|
using (var parameters = new NWParameters ())
|
|
|
|
{
|
|
|
|
var defaultValue = parameters.PreferNoProxy;
|
|
|
|
Assert.False (defaultValue, "Default value changed.");
|
|
|
|
parameters.PreferNoProxy = true;
|
|
|
|
Assert.True (parameters.PreferNoProxy, "New value was not stored.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void ExpiredDnsBehaviorPropertyTest ()
|
|
|
|
{
|
|
|
|
using (var parameters = new NWParameters ())
|
|
|
|
{
|
|
|
|
var defaultValue = parameters.ExpiredDnsBehavior;
|
|
|
|
Assert.AreEqual (NWParametersExpiredDnsBehavior.Default, defaultValue, "Default value changed.");
|
|
|
|
parameters.ExpiredDnsBehavior = NWParametersExpiredDnsBehavior.Allow;
|
|
|
|
Assert.AreEqual (NWParametersExpiredDnsBehavior.Allow, parameters.ExpiredDnsBehavior, "New value was not stored.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void RequiredInterfacePropertyTest ()
|
|
|
|
{
|
|
|
|
|
|
|
|
using (var parameters = new NWParameters ())
|
|
|
|
{
|
|
|
|
var defaultValue = parameters.RequiredInterface;
|
|
|
|
Assert.IsNull (defaultValue, "Default value changed.");
|
|
|
|
// try to set a null value, we should have no issues
|
|
|
|
parameters.RequiredInterface = null;
|
|
|
|
Assert.IsNull (parameters.RequiredInterface, "Value should still be null.");
|
|
|
|
parameters.RequiredInterface = interfaces[0];
|
|
|
|
Assert.AreNotEqual (IntPtr.Zero, parameters.RequiredInterface.Handle, "New value was not set.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void ProhibitInterfaceTest ()
|
|
|
|
{
|
|
|
|
using (var parameters = new NWParameters ())
|
|
|
|
{
|
|
|
|
Assert.Throws<ArgumentNullException> (() => parameters.ProhibitInterface (null), "");
|
|
|
|
Assert.AreNotEqual (0, interfaces.Count, "No network interfaces found.");
|
|
|
|
parameters.ProhibitInterface (interfaces[0]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void RequiredInterfaceTypePropertyTest ()
|
|
|
|
{
|
|
|
|
using (var parameters = new NWParameters ())
|
|
|
|
{
|
|
|
|
var defaultValue = parameters.RequiredInterfaceType;
|
|
|
|
Assert.AreEqual (NWInterfaceType.Other, defaultValue, "Default value changed.");
|
|
|
|
parameters.RequiredInterfaceType = NWInterfaceType.Wifi;
|
|
|
|
Assert.AreEqual (NWInterfaceType.Wifi, parameters.RequiredInterfaceType, "BNe value was not stored.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void ProhibitInterfaceTypeTest ()
|
|
|
|
{
|
|
|
|
using (var parameters = new NWParameters ())
|
|
|
|
{
|
|
|
|
var types = new List<NWInterfaceType> ();
|
|
|
|
parameters.ProhibitInterfaceType (NWInterfaceType.Wifi);
|
|
|
|
parameters.IterateProhibitedInterfaces ((type) => {types.Add (type); return true;} );
|
|
|
|
Assert.True (types.Contains (NWInterfaceType.Wifi), "Type was not prohibited.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void ReuseLocalAddressPropertyTest ()
|
|
|
|
{
|
|
|
|
using (var parameters = new NWParameters ())
|
|
|
|
{
|
|
|
|
var defaultValue = parameters.ReuseLocalAddress;
|
|
|
|
Assert.False (defaultValue, "Default value changed.");
|
|
|
|
parameters.ReuseLocalAddress = true;
|
|
|
|
Assert.True (parameters.ReuseLocalAddress, "New value was not stored.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void FastOpenEnabledPropertyTest ()
|
|
|
|
{
|
|
|
|
using (var parameters = new NWParameters ())
|
|
|
|
{
|
|
|
|
var defaultValue = parameters.FastOpenEnabled;
|
|
|
|
Assert.False (defaultValue, "Defalue value changed.");
|
|
|
|
parameters.FastOpenEnabled = true;
|
|
|
|
Assert.True (parameters.FastOpenEnabled, "New value was not stored.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void ServiceClassPropertyTest ()
|
|
|
|
{
|
|
|
|
using (var parameters = new NWParameters ())
|
|
|
|
{
|
|
|
|
var defaultValue = parameters.ServiceClass;
|
|
|
|
Assert.AreEqual (NWServiceClass.BestEffort, defaultValue, "Default value changed.");
|
|
|
|
parameters.ServiceClass = NWServiceClass.InteractiveVideo;
|
|
|
|
Assert.AreEqual (NWServiceClass.InteractiveVideo, parameters.ServiceClass, "New value was not stored.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void LocalEndpointPropertyTest ()
|
|
|
|
{
|
|
|
|
Assert.Ignore ("nw_parameters_copy_local_endpoint always return null. Rdar filled 44095278.");
|
|
|
|
using (var parameters = NWParameters.CreateUdp ())
|
2019-11-14 13:45:33 +03:00
|
|
|
using (var endpoint = NWEndpoint.Create (NetworkResources.MicrosoftUri.Host, "80"))
|
2018-09-05 15:07:10 +03:00
|
|
|
{
|
|
|
|
var defaultValue = parameters.LocalEndpoint;
|
|
|
|
Assert.IsNull (defaultValue, "Default value changed.");
|
|
|
|
parameters.LocalEndpoint = endpoint;
|
|
|
|
Assert.IsNotNull (parameters.LocalEndpoint, "New value was not stored.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void IncludePeerToPeerPropertyTest ()
|
|
|
|
{
|
|
|
|
using (var parameters = new NWParameters ())
|
|
|
|
{
|
|
|
|
var defaultValue = parameters.IncludePeerToPeer;
|
|
|
|
Assert.False (defaultValue, "Default value changed.");
|
|
|
|
parameters.IncludePeerToPeer = true;
|
|
|
|
Assert.True (parameters.IncludePeerToPeer, "New value was not stored.");
|
|
|
|
}
|
|
|
|
}
|
2019-10-08 04:53:04 +03:00
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void TestProhibitConstrained ()
|
|
|
|
{
|
|
|
|
TestRuntime.AssertXcodeVersion (11, 0);
|
|
|
|
using (var parameters = new NWParameters ()) {
|
|
|
|
var defaultValue = false;
|
|
|
|
Assert.False (defaultValue, "Default value changed.");
|
|
|
|
parameters.ProhibitConstrained = true;
|
|
|
|
Assert.True (parameters.ProhibitConstrained, "New value was not stored.");
|
|
|
|
}
|
|
|
|
}
|
2018-09-05 15:07:10 +03:00
|
|
|
}
|
|
|
|
}
|
2019-10-30 22:07:28 +03:00
|
|
|
#endif
|