Преглед на файлове

Ongoing discovery client and service implementation.

Atsushi Eno преди 15 години
родител
ревизия
7e69bd34a9

+ 3 - 1
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery/DiscoveryClientBindingElement.cs

@@ -15,6 +15,8 @@ namespace System.ServiceModel.Discovery
 
 		public DiscoveryClientBindingElement ()
 		{
+			DiscoveryEndpointProvider = DiscoveryEndpointProvider.CreateDefault ();
+			FindCriteria = new FindCriteria (); // empty
 		}
 
 		public DiscoveryClientBindingElement (DiscoveryEndpointProvider discoveryEndpointProvider, FindCriteria findCriteria)
@@ -58,7 +60,7 @@ namespace System.ServiceModel.Discovery
 
 		public override T GetProperty<T> (BindingContext context)
 		{
-			throw new NotImplementedException ();
+			return context.GetInnerProperty<T> ();
 		}
 	}
 }

+ 5 - 0
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery/DiscoveryEndpointProvider.cs

@@ -34,6 +34,11 @@ namespace System.ServiceModel.Discovery
 {
 	public abstract class DiscoveryEndpointProvider
 	{
+		internal static DiscoveryEndpointProvider CreateDefault ()
+		{
+			return new UdpDiscoveryEndpointProvider ();
+		}
+
 		public abstract DiscoveryEndpoint GetDiscoveryEndpoint ();
 	}
 

+ 17 - 1
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery/DiscoveryOperationContextExtension.cs

@@ -11,8 +11,24 @@ namespace System.ServiceModel.Discovery
 	[MonoTODO]
 	public class DiscoveryOperationContextExtension : IExtension<OperationContext>
 	{
-		internal DiscoveryOperationContextExtension ()
+		internal DiscoveryOperationContextExtension (DiscoveryEndpoint endpoint)
 		{
+			this.endpoint = endpoint;
+		}
+		
+		DiscoveryEndpoint endpoint;
+
+		public ServiceDiscoveryMode DiscoveryMode {
+			get { return endpoint.DiscoveryMode; }
+		}
+
+		public DiscoveryVersion DiscoveryVersion {
+			get { return endpoint.DiscoveryVersion; }
+		}
+
+		public TimeSpan MaxResponseDelay {
+			get { return endpoint.MaxResponseDelay; }
+			internal set { endpoint.MaxResponseDelay = value; }
 		}
 
 		void IExtension<OperationContext>.Attach (OperationContext owner)

+ 9 - 3
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery/DynamicEndpoint.cs

@@ -8,18 +8,24 @@ using System.ServiceModel.Dispatcher;
 
 namespace System.ServiceModel.Discovery
 {
-	[MonoTODO]
 	public class DynamicEndpoint : ServiceEndpoint
 	{
 		public DynamicEndpoint (ContractDescription contract, Binding binding)
-			: base (contract, binding, new EndpointAddress ("http://schemas.microsoft.com/discovery/dynamic"))
+			: base (contract, CreateBinding (binding), new EndpointAddress ("http://schemas.microsoft.com/discovery/dynamic"))
 		{
 			if (binding == null)
 				throw new ArgumentNullException ("binding");
-			DiscoveryEndpointProvider = new UdpDiscoveryEndpointProvider ();
+			DiscoveryEndpointProvider = DiscoveryEndpointProvider.CreateDefault ();
 			FindCriteria = new FindCriteria (contract.ContractType);
 		}
 
+		static CustomBinding CreateBinding (Binding source)
+		{
+			var bec = source.CreateBindingElements ();
+			bec.Insert (0, new DiscoveryClientBindingElement ());
+			return new CustomBinding (bec);
+		}
+
 		public DiscoveryEndpointProvider DiscoveryEndpointProvider { get; set; }
 		public FindCriteria FindCriteria { get; set; }
 	}

+ 1 - 0
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery_test.dll.sources

@@ -12,6 +12,7 @@ System.ServiceModel.Discovery/EndpointDiscoveryBehaviorTest.cs
 System.ServiceModel.Discovery/EndpointDiscoveryMetadataTest.cs
 System.ServiceModel.Discovery/FindCriteriaTest.cs
 System.ServiceModel.Discovery/InspectionBehaviors.cs
+System.ServiceModel.Discovery/MyDiscoveryServiceTypes.cs
 System.ServiceModel.Discovery/ServiceDiscoveryBehaviorTest.cs
 System.ServiceModel.Discovery/UdpAnnouncementEndpointTest.cs
 System.ServiceModel.Discovery/UdpDiscoveryEndpointTest.cs

+ 19 - 0
mcs/class/System.ServiceModel.Discovery/Test/System.ServiceModel.Discovery/DiscoveryClientBindingElementTest.cs

@@ -69,6 +69,11 @@ namespace MonoTests.System.ServiceModel.Discovery
 			Assert.AreEqual (new UdpDiscoveryEndpoint ().MulticastAddress, die.ListenUri, "#7");
 			Assert.AreEqual (ListenUriMode.Explicit, die.ListenUriMode, "#8");
 			Assert.AreEqual (5, die.Behaviors.Count, "#9");
+
+			// default constructor
+			be = new DiscoveryClientBindingElement ();
+			Assert.IsNotNull (be.FindCriteria, "#11");
+			Assert.IsNotNull (be.DiscoveryEndpointProvider, "#12");
 		}
 
 		[Test]
@@ -85,5 +90,19 @@ namespace MonoTests.System.ServiceModel.Discovery
 			Assert.IsTrue (be.CanBuildChannelFactory<IRequestChannel> (bc), "#2");
 			Assert.IsFalse (be.CanBuildChannelFactory<IDuplexSessionChannel> (bc), "#3");
 		}
+
+		[Test]
+		public void GetProperty ()
+		{
+			var de = CreateDynamicEndpoint ();
+			// it is channel dependent - i.e. this binding element does not affect.
+			var be = new DiscoveryClientBindingElement ();
+			var bc = new BindingContext (new CustomBinding (new HttpTransportBindingElement ()), new BindingParameterCollection ());
+			// so, they are not part of GetProperty<T>() return values.
+			Assert.IsNull (be.GetProperty<FindCriteria> (bc), "#1");
+			Assert.IsNull (be.GetProperty<DiscoveryEndpointProvider> (bc), "#2");
+
+			Assert.IsNull (be.GetProperty<DiscoveryEndpoint> (bc), "#3");
+		}
 	}
 }

+ 34 - 1
mcs/class/System.ServiceModel.Discovery/Test/System.ServiceModel.Discovery/DynamicEndpointTest.cs

@@ -25,6 +25,8 @@
 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
+using System.Linq;
+using System.Net.Sockets;
 using System.ServiceModel;
 using System.ServiceModel.Channels;
 using System.ServiceModel.Description;
@@ -49,7 +51,38 @@ namespace MonoTests.System.ServiceModel.Discovery
 			Assert.AreEqual (1, fc.ContractTypeNames.Count, "#2-2");
 			Assert.AreEqual (0, fc.Scopes.Count, "#2-3");
 			Assert.AreEqual (0, fc.Extensions.Count, "#2-4");
-			Assert.IsNotNull (de.DiscoveryEndpointProvider, "#3");
+
+			var dep = de.DiscoveryEndpointProvider;
+			Assert.IsNotNull (dep, "#3");
+			var dise = dep.GetDiscoveryEndpoint ();
+			TestDiscoveryEndpoint (dise);
+
+			Assert.IsNotNull (de.Contract, "#11"); // for ITestService
+			Assert.AreEqual ("http://tempuri.org/", de.Contract.Namespace, "#11-2");
+			Assert.AreEqual ("ITestService", de.Contract.Name, "#11-3");
+			Assert.IsNotNull (de.Binding, "#12"); // Custom{DiscoveryClient|BasicHttpBinding-elements}
+			Assert.IsNotNull (de.Binding.CreateBindingElements ().FirstOrDefault (be => be is DiscoveryClientBindingElement), "#12-2");
+			Assert.IsNotNull (de.Binding.CreateBindingElements ().FirstOrDefault (be => be is HttpTransportBindingElement), "#12-3");
+			Assert.IsNotNull (de.Address, "#13");
+			Assert.AreEqual (DiscoveryClientBindingElement.DiscoveryEndpointAddress, de.Address, "#13-2");
+			Assert.AreEqual (DiscoveryClientBindingElement.DiscoveryEndpointAddress.Uri, de.ListenUri, "#14");
+			Assert.AreEqual (0, de.Behaviors.Count, "#15");
+		}
+
+		// copied from UdpDiscoveryEndpointTest.
+		public void TestDiscoveryEndpoint (DiscoveryEndpoint de)
+		{
+			Assert.AreEqual (DiscoveryVersion.WSDiscovery11, de.DiscoveryVersion, "#1");
+			Assert.AreEqual (ServiceDiscoveryMode.Adhoc, de.DiscoveryMode, "#2");
+			Assert.AreEqual (TimeSpan.FromMilliseconds (500), de.MaxResponseDelay, "#3");
+			var cd = de.Contract;
+			Assert.IsNotNull (cd, "#11");
+			Assert.IsNotNull (de.Binding, "#12");
+			TransportBindingElement tbe;
+			Assert.IsTrue (de.Binding.CreateBindingElements ().Any (be => (tbe = be as TransportBindingElement) != null && tbe.Scheme == "soap.udp"), "#12-2");
+			Assert.IsNotNull (de.Address, "#13");
+			Assert.AreEqual (DiscoveryVersion.WSDiscovery11.AdhocAddress, de.Address.Uri, "#13-2");
+			Assert.AreEqual (Socket.SupportsIPv4 ? UdpDiscoveryEndpoint.DefaultIPv4MulticastAddress : UdpDiscoveryEndpoint.DefaultIPv6MulticastAddress, de.ListenUri, "#14");
 		}
 	}
 }

+ 103 - 0
mcs/class/System.ServiceModel.Discovery/Test/System.ServiceModel.Discovery/MyDiscoveryServiceTypes.cs

@@ -0,0 +1,103 @@
+//
+// Author: Atsushi Enomoto <[email protected]>
+//
+// Copyright (C) 2010 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+using System.ServiceModel.Description;
+using System.ServiceModel.Discovery;
+using System.ServiceModel.Dispatcher;
+using NUnit.Framework;
+
+namespace System.ServiceModel.Discovery
+{
+	public class MyServiceDiscoveryBehavior : ServiceDiscoveryBehavior, IServiceBehavior
+	{
+		IServiceBehavior GetBase ()
+		{
+			var sdb = (ServiceDiscoveryBehavior) this;
+			return (IServiceBehavior) sdb;
+		}
+
+		void IServiceBehavior.AddBindingParameters (ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
+		{
+			GetBase ().AddBindingParameters (serviceDescription, serviceHostBase, endpoints, bindingParameters);
+		}
+
+		void IServiceBehavior.ApplyDispatchBehavior (ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
+		{
+			GetBase ().ApplyDispatchBehavior (serviceDescription, serviceHostBase);
+		}
+
+		void IServiceBehavior.Validate (ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
+		{
+			if (serviceHostBase == null)
+				throw new ArgumentNullException ("serviceHostBase");
+			var dse = serviceHostBase.Extensions.Find<DiscoveryServiceExtension> ();
+			if (dse == null) {
+				dse = new MyDiscoveryServiceExtension ();
+				serviceHostBase.Extensions.Add (dse);
+			}
+
+			GetBase ().Validate (serviceDescription, serviceHostBase);
+		}
+	}
+
+	public class MyDiscoveryServiceExtension : DiscoveryServiceExtension
+	{
+		protected override DiscoveryService GetDiscoveryService ()
+		{
+			return new MyDiscoveryService ();
+		}
+	}
+
+	public class MyDiscoveryService : DiscoveryService
+	{
+		protected override IAsyncResult OnBeginFind (FindRequestContext findRequestContext, AsyncCallback callback, Object state)
+		{
+			Console.Error.WriteLine ("OnBeginFind");
+			throw new Exception ("1");
+		}
+
+		protected override IAsyncResult OnBeginResolve (ResolveCriteria resolveCriteria, AsyncCallback callback, Object state)
+		{
+			Console.Error.WriteLine ("OnBeginResolve");
+			throw new Exception ("2");
+		}
+
+		protected override void OnEndFind (IAsyncResult result)
+		{
+			Console.Error.WriteLine ("OnEndFind");
+			throw new Exception ("3");
+		}
+
+		protected override EndpointDiscoveryMetadata OnEndResolve (IAsyncResult result)
+		{
+			Console.Error.WriteLine ("OnEndResolve");
+			throw new Exception ("4");
+		}
+	}
+}