Ongoing discovery client and service implementation.
authorAtsushi Eno <atsushi@ximian.com>
Tue, 24 Aug 2010 11:22:09 +0000 (20:22 +0900)
committerAtsushi Eno <atsushi@ximian.com>
Tue, 24 Aug 2010 11:22:09 +0000 (20:22 +0900)
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery/DiscoveryClientBindingElement.cs
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery/DiscoveryEndpointProvider.cs
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery/DiscoveryOperationContextExtension.cs
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery/DynamicEndpoint.cs
mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery_test.dll.sources
mcs/class/System.ServiceModel.Discovery/Test/System.ServiceModel.Discovery/DiscoveryClientBindingElementTest.cs
mcs/class/System.ServiceModel.Discovery/Test/System.ServiceModel.Discovery/DynamicEndpointTest.cs
mcs/class/System.ServiceModel.Discovery/Test/System.ServiceModel.Discovery/MyDiscoveryServiceTypes.cs [new file with mode: 0644]

index 9134f7bd361b5e2317ed3e60f8d5e4c57635eea4..13b5163aa484e76f80902d37ba4243c0ff0247ec 100755 (executable)
@@ -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> ();
                }
        }
 }
index 2500f9dc4792b1624c724d18fa70cc5933dfc1a5..65b16833f1fa38141b9c372b81927229fef6166d 100755 (executable)
@@ -34,6 +34,11 @@ namespace System.ServiceModel.Discovery
 {
        public abstract class DiscoveryEndpointProvider
        {
+               internal static DiscoveryEndpointProvider CreateDefault ()
+               {
+                       return new UdpDiscoveryEndpointProvider ();
+               }
+
                public abstract DiscoveryEndpoint GetDiscoveryEndpoint ();
        }
 
index ccc64892c12e99f19b79719bc5234f72b6325500..dc964cba660a0039bb8b5ef12c0ad95e20674465 100755 (executable)
@@ -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)
index e22e3baa9d2c38297504d2e2e91eb8a94e199769..0883312ab8e1579222a278013e5f786d89211f58 100755 (executable)
@@ -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; }
        }
index b2b8b61309842847bae71fb5ba397b74ef52d24e..ad31a433cd38a6fe761a26b86e64d54d4a0ef9ff 100644 (file)
@@ -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
index 19207b0e1a2b193b450e32afc71796f7d850fb8f..ebf7d042ea6bc04d30af6d24f7df7e4b2ea80284 100644 (file)
@@ -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");
+               }
        }
 }
index de746935626e8b04f05c97813aa852fa16f0a6b2..848b66a817347ebd8936cfb3eef336d503039f3b 100644 (file)
@@ -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");
                }
        }
 }
diff --git a/mcs/class/System.ServiceModel.Discovery/Test/System.ServiceModel.Discovery/MyDiscoveryServiceTypes.cs b/mcs/class/System.ServiceModel.Discovery/Test/System.ServiceModel.Discovery/MyDiscoveryServiceTypes.cs
new file mode 100644 (file)
index 0000000..d3390f0
--- /dev/null
@@ -0,0 +1,103 @@
+//
+// Author: Atsushi Enomoto <atsushi@ximian.com>
+//
+// 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");
+               }
+       }
+}