diff options
author | Atsushi Eno <atsushi@ximian.com> | 2011-04-27 10:41:34 +0400 |
---|---|---|
committer | Atsushi Eno <atsushi@ximian.com> | 2011-04-27 10:41:34 +0400 |
commit | 01ad2d49137603af8fdd243e9fe462c53a1c6ffa (patch) | |
tree | 581d9d895e8443f0abb67bc0962bb333d1db341e /mcs/class/System.ServiceModel.Discovery | |
parent | 064cd53a8d038dcc2d9971e7b307e62ae41ebc7e (diff) |
Use FindCritera/ResolveCriteria Duration properties for DiscoveryEndpoint timeout.
Diffstat (limited to 'mcs/class/System.ServiceModel.Discovery')
4 files changed, 41 insertions, 10 deletions
diff --git a/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.Version11/DiscoveryTargetClient11.cs b/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.Version11/DiscoveryTargetClient11.cs index 2ccf43518a1..93c2b207962 100644 --- a/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.Version11/DiscoveryTargetClient11.cs +++ b/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.Version11/DiscoveryTargetClient11.cs @@ -80,7 +80,8 @@ namespace System.ServiceModel.Discovery.Version11 Channel.EndFind (result); }, null); - if (!reply_find_handle.WaitOne (InnerChannel.OperationTimeout)) + var timeout = InnerChannel.OperationTimeout < criteria.Duration ? InnerChannel.OperationTimeout : criteria.Duration; + if (!reply_find_handle.WaitOne (timeout)) throw new EndpointNotFoundException ("The discovery client could not receive Find operation response within the operation timeout."); try { var ir = find_completed (); @@ -118,7 +119,8 @@ namespace System.ServiceModel.Discovery.Version11 Channel.EndResolve (result); }, null); - if (!reply_resolve_handle.WaitOne (InnerChannel.OperationTimeout)) + var timeout = InnerChannel.OperationTimeout < criteria.Duration ? InnerChannel.OperationTimeout : criteria.Duration; + if (!reply_find_handle.WaitOne (timeout)) throw new TimeoutException (); try { var ir = resolve_completed (); diff --git a/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.VersionApril2005/DiscoveryTargetClientApril2005.cs b/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.VersionApril2005/DiscoveryTargetClientApril2005.cs index 1c640b10d33..6f783f1655a 100644 --- a/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.VersionApril2005/DiscoveryTargetClientApril2005.cs +++ b/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.VersionApril2005/DiscoveryTargetClientApril2005.cs @@ -80,7 +80,8 @@ namespace System.ServiceModel.Discovery.VersionApril2005 Channel.EndFind (result); }, null); - if (!reply_find_handle.WaitOne (InnerChannel.OperationTimeout)) + var timeout = InnerChannel.OperationTimeout < criteria.Duration ? InnerChannel.OperationTimeout : criteria.Duration; + if (!reply_find_handle.WaitOne (timeout)) throw new EndpointNotFoundException ("The discovery client could not receive Find operation response within the operation timeout."); try { var ir = find_completed (); @@ -118,7 +119,8 @@ namespace System.ServiceModel.Discovery.VersionApril2005 Channel.EndResolve (result); }, null); - if (!reply_resolve_handle.WaitOne (InnerChannel.OperationTimeout)) + var timeout = InnerChannel.OperationTimeout < criteria.Duration ? InnerChannel.OperationTimeout : criteria.Duration; + if (!reply_find_handle.WaitOne (timeout)) throw new TimeoutException (); try { var ir = resolve_completed (); diff --git a/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.VersionCD1/DiscoveryTargetClientCD1.cs b/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.VersionCD1/DiscoveryTargetClientCD1.cs index b36c7fc9e09..7d1f9b4c60b 100644 --- a/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.VersionCD1/DiscoveryTargetClientCD1.cs +++ b/mcs/class/System.ServiceModel.Discovery/System.ServiceModel.Discovery.VersionCD1/DiscoveryTargetClientCD1.cs @@ -80,7 +80,8 @@ namespace System.ServiceModel.Discovery.VersionCD1 Channel.EndFind (result); }, null); - if (!reply_find_handle.WaitOne (InnerChannel.OperationTimeout)) + var timeout = InnerChannel.OperationTimeout < criteria.Duration ? InnerChannel.OperationTimeout : criteria.Duration; + if (!reply_find_handle.WaitOne (timeout)) throw new EndpointNotFoundException ("The discovery client could not receive Find operation response within the operation timeout."); try { var ir = find_completed (); @@ -118,7 +119,8 @@ namespace System.ServiceModel.Discovery.VersionCD1 Channel.EndResolve (result); }, null); - if (!reply_resolve_handle.WaitOne (InnerChannel.OperationTimeout)) + var timeout = InnerChannel.OperationTimeout < criteria.Duration ? InnerChannel.OperationTimeout : criteria.Duration; + if (!reply_find_handle.WaitOne (timeout)) throw new TimeoutException (); try { var ir = resolve_completed (); diff --git a/mcs/class/System.ServiceModel.Discovery/Test/System.ServiceModel.Discovery/DiscoveryClientBindingElementTest.cs b/mcs/class/System.ServiceModel.Discovery/Test/System.ServiceModel.Discovery/DiscoveryClientBindingElementTest.cs index e7aa00d6ef6..26083822660 100644 --- a/mcs/class/System.ServiceModel.Discovery/Test/System.ServiceModel.Discovery/DiscoveryClientBindingElementTest.cs +++ b/mcs/class/System.ServiceModel.Discovery/Test/System.ServiceModel.Discovery/DiscoveryClientBindingElementTest.cs @@ -145,32 +145,57 @@ namespace MonoTests.System.ServiceModel.Discovery Assert.AreEqual (DiscoveryClientBindingElement.DiscoveryEndpointAddress, ch.RemoteAddress, "#1"); } - // This test takes a while, so I in fact don't want to enable it ... + class MyDiscoveryEndpointProvider2 : DiscoveryEndpointProvider + { + public MyDiscoveryEndpointProvider2 (DiscoveryEndpoint endpoint) + { + this.endpoint = endpoint; + } + + DiscoveryEndpoint endpoint; + + public override DiscoveryEndpoint GetDiscoveryEndpoint () + { + return endpoint; + } + } + [Test] [ExpectedException (typeof (EndpointNotFoundException))] public void RequestChannelOpenFails () { var be = new DiscoveryClientBindingElement (); + // Note that this explicitly sets shorter timeout than open timeout for the channel. + // If it is longer, then TimeoutException will occur instgead, + // as the client doesn't expect longer than FindCriteria.Duration. + be.FindCriteria.Duration = TimeSpan.FromSeconds (3); + var bc = new BindingContext (new CustomBinding (be, new HttpTransportBindingElement ()), new BindingParameterCollection ()); var cf = be.BuildChannelFactory<IRequestChannel> (bc); cf.Open (); Assert.IsNull (cf.GetProperty<DiscoveryEndpoint> (), "#1"); var ch = cf.CreateChannel (DiscoveryClientBindingElement.DiscoveryEndpointAddress); Assert.IsNull (ch.GetProperty<DiscoveryEndpoint> (), "#2"); - ch.Open (TimeSpan.FromSeconds (80)); + DateTime start = DateTime.Now; + ch.Open (TimeSpan.FromSeconds (5)); + Assert.IsTrue (DateTime.Now - start < TimeSpan.FromSeconds (15), "It is likely that FindCriteria.Duration is ignored"); } - // This test takes a while, so I in fact don't want to enable it ... [Test] [ExpectedException (typeof (EndpointNotFoundException))] public void RequestChannelOpenFails2 () { var be = new DiscoveryClientBindingElement (); + // (The comment on RequestChannelOpenFails() applies here too.) + be.FindCriteria.Duration = TimeSpan.FromSeconds (3); + var bc = new BindingContext (new CustomBinding (be, new TcpTransportBindingElement ()), new BindingParameterCollection ()); var cf = be.BuildChannelFactory<IDuplexSessionChannel> (bc); cf.Open (); var ch = cf.CreateChannel (DiscoveryClientBindingElement.DiscoveryEndpointAddress); - ch.Open (TimeSpan.FromSeconds (80)); + DateTime start = DateTime.Now; + ch.Open (TimeSpan.FromSeconds (5)); + Assert.IsTrue (DateTime.Now - start < TimeSpan.FromSeconds (15), "It is likely that FindCriteria.Duration is ignored"); } [Test] |