Browse Source

2010-05-14 Atsushi Enomoto <[email protected]>

	* 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
Atsushi Eno 15 years ago
parent
commit
bc0d9e7627

+ 12 - 8
mcs/class/System.ServiceModel/System.ServiceModel.Channels/BindingContext.cs

@@ -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 ()

+ 5 - 0
mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog

@@ -1,3 +1,8 @@
+2010-05-14  Atsushi Enomoto  <[email protected]>
+
+	* BindingContext.cs : actually clone is needed everywhere else too.
+	* CustomBinding.cs : remove extra field.
+
 2010-05-14  Andreia Gaita  <[email protected]>
 
 	* BindingContext.cs: Copy elements from the original binding only when

+ 0 - 2
mcs/class/System.ServiceModel/System.ServiceModel.Channels/CustomBinding.cs

@@ -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;

+ 96 - 0
mcs/class/System.ServiceModel/Test/System.ServiceModel.Channels/BindingContextTest.cs

@@ -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);
+			}
+
+		}
+
 	}
 }
+

+ 5 - 0
mcs/class/System.ServiceModel/Test/System.ServiceModel.Channels/ChangeLog

@@ -1,3 +1,8 @@
+2010-05-14  Atsushi Enomoto  <[email protected]>
+
+	* BindingContextTest.cs : add a couple of tests with related to
+	  RemainingBindingElements use. Some tests by Andreia Gaita.
+
 2010-04-21  Atsushi Enomoto  <[email protected]>
 
 	* CustomBindingTest.cs : enable BuildChannelListener test for no-