2010-05-14 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Fri, 14 May 2010 07:28:26 +0000 (07:28 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Fri, 14 May 2010 07:28:26 +0000 (07:28 -0000)
* BindingContext.cs : actually clone is needed everywhere else too.
* CustomBinding.cs : remove extra field.

* BindingContextTest.cs : add a couple of tests with related to
  RemainingBindingElements use. Some tests by Andreia Gaita.

svn path=/trunk/mcs/; revision=157350

mcs/class/System.ServiceModel/System.ServiceModel.Channels/BindingContext.cs
mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog
mcs/class/System.ServiceModel/System.ServiceModel.Channels/CustomBinding.cs
mcs/class/System.ServiceModel/Test/System.ServiceModel.Channels/BindingContextTest.cs
mcs/class/System.ServiceModel/Test/System.ServiceModel.Channels/ChangeLog

index 910321fb398cdcc856488e5876eb32118a4c27f6..ad0742ce8de18c2ccdd27831f53e9bf0b8b4aa36 100644 (file)
@@ -80,7 +80,7 @@ namespace System.ServiceModel.Channels
                        string listenUriRelativeAddress,
                        ListenUriMode listenUriMode)
                {
-                       this.binding = binding;
+                       this.binding = new CustomBinding (binding);
                        parameters = new BindingParameterCollection ();
                        foreach (var item in parms)
                                parameters.Add (item);
@@ -145,7 +145,8 @@ namespace System.ServiceModel.Channels
                public IChannelFactory<TChannel>
                        BuildInnerChannelFactory<TChannel> ()
                {
-                       return DequeueBindingElement ().BuildChannelFactory<TChannel> (this);
+                       BindingContext ctx = this.Clone ();
+                       return ctx.DequeueBindingElement ().BuildChannelFactory<TChannel> (ctx);
                }
 
 #if !NET_2_1
@@ -153,10 +154,11 @@ namespace System.ServiceModel.Channels
                        BuildInnerChannelListener<TChannel> ()
                        where TChannel : class, IChannel
                {
-                       var be = DequeueBindingElement (false);
+                       BindingContext ctx = this.Clone ();
+                       var be = ctx.DequeueBindingElement (false);
                        if (be == null)
                                throw new InvalidOperationException ("There is likely no TransportBindingElement that can build a channel listener in this binding context");
-                       return be.BuildChannelListener<TChannel> (this);
+                       return be.BuildChannelListener<TChannel> (ctx);
                }
 #endif
 
@@ -170,17 +172,19 @@ namespace System.ServiceModel.Channels
                public bool CanBuildInnerChannelListener<TChannel> ()
                        where TChannel : class, IChannel
                {
-                       var be = DequeueBindingElement (false);
+                       BindingContext ctx = this.Clone ();
+                       var be = ctx.DequeueBindingElement (false);
                        if (be == null)
                                throw new InvalidOperationException ("There is likely no TransportBindingElement that can build a channel listener in this binding context");
-                       return be.CanBuildChannelListener<TChannel> (this);
+                       return be.CanBuildChannelListener<TChannel> (ctx);
                }
 #endif
 
                public T GetInnerProperty<T> () where T : class
                {
-                       BindingElement e = DequeueBindingElement (false);
-                       return e == null ? default (T) : e.GetProperty<T> (this);
+                       BindingContext ctx = this.Clone ();
+                       BindingElement e = ctx.DequeueBindingElement (false);
+                       return e == null ? default (T) : e.GetProperty<T> (ctx);
                }
 
                public BindingContext Clone ()
index 1bc2981a55e075e02a39fff96c75f9fb9d31b458..b8758176f703cfdfae98c212dfb0c9640cebacfc 100755 (executable)
@@ -1,3 +1,8 @@
+2010-05-14  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * BindingContext.cs : actually clone is needed everywhere else too.
+       * CustomBinding.cs : remove extra field.
+
 2010-05-14  Andreia Gaita  <avidigal@novell.com>
 
        * BindingContext.cs: Copy elements from the original binding only when
index aa9196b59479252e63a89f3e0dcbb3432b9b8c54..cecbb8ccb120f20d974ebc7ef45dd543a33b4915 100644 (file)
@@ -40,7 +40,6 @@ namespace System.ServiceModel.Channels
                const string default_ns = "http://tempuri.org";
 
                BindingElementCollection elements;
-               Binding binding;
                ISecurityCapabilities security;
                string scheme = "";
 
@@ -61,7 +60,6 @@ namespace System.ServiceModel.Channels
                        : this (binding.CreateBindingElements (),
                                binding.Name, binding.Namespace)
                {
-                       this.binding = binding;
                        OpenTimeout = binding.OpenTimeout;
                        CloseTimeout = binding.CloseTimeout;
                        SendTimeout = binding.SendTimeout;
index 581ff846e3a943246b862c7417cb5f0add027b83..6458fda34cb0c56e843c4ba9a2779cfc544e5f7a 100644 (file)
@@ -120,5 +120,101 @@ namespace MonoTests.System.ServiceModel.Channels
                        ctx = new BindingContext (binding, pl);
                        Assert.IsNull (ctx.GetInnerProperty<ClientCredentials> ());
                }
+
+               [Test]
+               public void RemainingBindingElements ()
+               {
+                       var b = new CustomBinding (
+                               new BinaryMessageEncodingBindingElement (),
+                               new InterceptorBindingElement2 (),
+                               new HttpTransportBindingElement ());
+                       Assert.AreEqual (3, new BindingContext (b, new BindingParameterCollection ()).RemainingBindingElements.Count, "#1");
+                       Assert.IsTrue (b.CanBuildChannelFactory<IRequestChannel> (), "#2");
+                       
+               }
+               
+               [Test]
+               public void RemainingBindingElements2 ()
+               {
+                       var b = new CustomBinding (
+                               new BindingElement2 (),
+                               new InterceptorBindingElement3 (),
+                               new BindingElement3 ());
+
+                       Assert.AreEqual (3, new BindingContext (b, new BindingParameterCollection ()).RemainingBindingElements.Count, "New BindingContext element count");
+                       Assert.IsTrue (b.CanBuildChannelFactory<IRequestChannel> (), "supports IRequestChannel?");
+               }
+
+               public class InterceptorBindingElement2 : BindingElement
+               {
+                       public override bool CanBuildChannelFactory<TChannel> (BindingContext bc)
+                       {
+                               Assert.AreEqual (1, bc.Clone ().RemainingBindingElements.Count, "#i1");
+                               Assert.IsNull (bc.GetInnerProperty<MessageEncodingBindingElement> (), "#i2");
+                               Assert.IsNull (bc.GetInnerProperty<MessageEncoder> (), "#i3");
+                               Assert.IsNull (bc.GetInnerProperty<MessageEncoderFactory> (), "#i4");
+                               Assert.AreEqual (1, bc.RemainingBindingElements.Count, "#i5");
+                               Assert.IsTrue (bc.RemainingBindingElements [0] is HttpTransportBindingElement, "#i6");
+                               Assert.AreEqual (3, bc.Binding.CreateBindingElements ().Count, "#i7");
+                               return base.CanBuildChannelFactory<TChannel> (bc);
+                       }
+
+                       public override BindingElement Clone ()
+                       {
+                               return new InterceptorBindingElement2 ();
+                       }
+
+                       public override T GetProperty<T> (BindingContext bc)
+                       {
+                               return null;
+                       }
+               }
+
+               public class InterceptorBindingElement3 : BindingElement {
+                       public override bool CanBuildChannelFactory<TChannel> (BindingContext bc) {
+                               if (this is BindingElement2) {
+                                       Assert.AreEqual (2, bc.Clone ().RemainingBindingElements.Count, "1- Cloned context element count");
+                                       Assert.AreEqual (3, bc.Binding.CreateBindingElements ().Count, "1- Original binding element count");
+                                       Assert.IsTrue (bc.RemainingBindingElements [0] is InterceptorBindingElement3, "1- binding element 1 type");
+                                       Assert.IsTrue (bc.RemainingBindingElements [1] is BindingElement3, "1- binding element 2 type");
+                               } else {
+                                       Assert.AreEqual (1, bc.Clone ().RemainingBindingElements.Count, "2- Cloned context element count");
+                                       Assert.AreEqual (3, bc.Binding.CreateBindingElements ().Count, "2- Original binding element count");
+                                       Assert.IsTrue (bc.RemainingBindingElements [0] is BindingElement3, "2- binding element 1 type");
+                               }
+                               return base.CanBuildChannelFactory<TChannel> (bc);
+                       }
+                       public override BindingElement Clone () {
+                               return new InterceptorBindingElement3 ();
+                       }
+
+                       public override T GetProperty<T> (BindingContext bc) {
+                               return null;
+                       }
+               }
+
+               public class BindingElement2 : InterceptorBindingElement3 {
+
+                       public override BindingElement Clone () {
+                               return new BindingElement2 ();
+                       }
+                       public override bool CanBuildChannelFactory<TChannel> (BindingContext bc) {
+                               return base.CanBuildChannelFactory<TChannel> (bc);
+                       }
+
+               }
+
+               public class BindingElement3 : HttpTransportBindingElement {
+
+                       public override BindingElement Clone () {
+                               return new BindingElement3 ();
+                       }
+                       public override bool CanBuildChannelFactory<TChannel> (BindingContext bc) {
+                               return base.CanBuildChannelFactory<TChannel> (bc);
+                       }
+
+               }
+
        }
 }
+
index 54cb53aaaac4510ac2e6ac0aa0a22f7d4bd4170c..046fd5105eef480970fdb7f5c4017f67dd3d2034 100644 (file)
@@ -1,3 +1,8 @@
+2010-05-14  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * BindingContextTest.cs : add a couple of tests with related to
+         RemainingBindingElements use. Some tests by Andreia Gaita.
+
 2010-04-21  Atsushi Enomoto  <atsushi@ximian.com>
 
        * CustomBindingTest.cs : enable BuildChannelListener test for no-