2 // DispatchRuntimeTest.cs
5 // Atsushi Enomoto <atsushi@ximian.com>
7 // Copyright (C) 2006 Novell, Inc. http://www.novell.com
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System.Collections.Generic;
31 using System.Runtime.Serialization;
32 using System.ServiceModel;
33 using System.ServiceModel.Channels;
34 using System.ServiceModel.Description;
35 using System.ServiceModel.Dispatcher;
36 using System.ServiceModel.Security;
38 using NUnit.Framework;
39 using System.Collections.ObjectModel;
40 using SMMessage = System.ServiceModel.Channels.Message;
41 using System.Threading;
43 using MonoTests.Helpers;
45 namespace MonoTests.System.ServiceModel.Dispatcher
48 public class DispatchRuntimeTest
51 public void TestConstructor ()
53 // This test is rather to just detect implementation
54 // differences than digging in-depth meanings, so feel
55 // free to change if MS implementation does not make
57 DispatchRuntime r = new EndpointDispatcher (
58 new EndpointAddress ("http://localhost:30158"), "IFoo", "urn:foo").DispatchRuntime;
59 Assert.AreEqual (AuditLogLocation.Default,
60 r.SecurityAuditLogLocation, "#1");
62 Assert.IsTrue (r.AutomaticInputSessionShutdown, "#2");
63 Assert.IsNotNull (r.CallbackClientRuntime, "#3");
64 Assert.IsNull (r.ExternalAuthorizationPolicies, "#4");
65 Assert.IsFalse (r.IgnoreTransactionMessageProperty, "#5");
66 Assert.IsFalse (r.ImpersonateCallerForAllOperations, "#6");
67 Assert.AreEqual (0, r.InputSessionShutdownHandlers.Count, "#7");
68 Assert.AreEqual (0, r.InstanceContextInitializers.Count, "#8");
69 //Assert.AreEqual (0, r.InstanceContextLifetimes.Count, "#9");
70 Assert.IsNull (r.InstanceProvider, "#10");
71 Assert.IsNull (r.InstanceContextProvider, "#10-2");
72 Assert.AreEqual (AuditLevel.None,
73 r.MessageAuthenticationAuditLevel, "#11");
74 Assert.AreEqual (0, r.MessageInspectors.Count, "#12");
75 Assert.AreEqual (0, r.Operations.Count, "#13");
76 Assert.IsNull (r.OperationSelector, "#14");
77 // This is silly, but anyways there will be similar
78 // functionality that just represents unix "Groups".
79 Assert.AreEqual (PrincipalPermissionMode.UseWindowsGroups,
80 r.PrincipalPermissionMode, "#15");
81 Assert.IsFalse (r.ReleaseServiceInstanceOnTransactionComplete, "#16");
82 Assert.IsNull (r.RoleProvider, "#17");
83 Assert.AreEqual (AuditLevel.None, r.ServiceAuthorizationAuditLevel, "#18");
84 Assert.IsNull (r.ServiceAuthorizationManager, "#19");
85 Assert.IsTrue (r.SuppressAuditFailure, "#20");
86 Assert.IsNull (r.SynchronizationContext, "#21");
87 Assert.IsFalse (r.TransactionAutoCompleteOnSessionClose, "#22");
88 Assert.IsNull (r.Type, "#23");
89 Assert.IsNotNull (r.UnhandledDispatchOperation, "#24");
90 DispatchOperation udo = r.UnhandledDispatchOperation;
91 Assert.AreEqual ("*", udo.Name, "#24-2");
92 Assert.AreEqual ("*", udo.Action, "#24-3");
93 Assert.AreEqual ("*", udo.ReplyAction, "#24-4");
94 Assert.IsFalse (udo.IsOneWay, "#24-5");
98 public void TestInstanceBehavior1 ()
101 Result res = new Result ();
102 MessageInspectBehavior b = new MessageInspectBehavior ();
103 b.instanceCtxInitializer = new MyInstanceContextInitializer (res);
104 b.instanceCtxProvider = new MyInstanceContextProvider (null, res);
105 //b.instanceProvider = new MyInstanceProvider (null, res);
106 b.msgInspect = new MyMessageInspector (res);
107 string expected = "GetExistingInstanceContext , InitializeInstanceContext , OperationContext , InstanceContext = Opening , Initialize , OperationContext , InstanceContext = Opening , AfterReceiveRequest , OperationContext , InstanceContext = Opened , BeforeSendReply , OperationContext , InstanceContext = Opened , IsIdle , OperationContext , InstanceContext = Opened , NotifyIdle , OperationContext , InstanceContext = Opened , ";
108 TestInstanceBehavior (b, expected, res, 1);
109 Assert.IsTrue (res.Done, "done");
113 public void TestInstanceBehavior2 ()
115 Result res = new Result ();
116 MessageInspectBehavior b = new MessageInspectBehavior ();
117 b.instanceCtxInitializer = new MyInstanceContextInitializer (res);
118 b.instanceCtxProvider = new MyInstanceContextProvider (null, res);
119 b.instanceProvider = new MyInstanceProvider (new AllActions (res), res);
120 b.msgInspect = new MyMessageInspector (res);
121 string expected = "GetExistingInstanceContext , InitializeInstanceContext , OperationContext , InstanceContext = Opening , Initialize , OperationContext , InstanceContext = Opening , AfterReceiveRequest , OperationContext , InstanceContext = Opened , GetInstance1 , OperationContext , InstanceContext = Opened , BeforeSendReply , OperationContext , InstanceContext = Opened , ReleaseInstance , OperationContext , InstanceContext = Opened , IsIdle , OperationContext , InstanceContext = Opened , NotifyIdle , OperationContext , InstanceContext = Opened , ";
122 TestInstanceBehavior (b, expected, res, 1);
123 Assert.IsTrue (res.Done, "done");
127 public void TestInstanceBehavior3 ()
129 Result res = new Result ();
130 MessageInspectBehavior b = new MessageInspectBehavior ();
131 b.instanceCtxInitializer = new MyInstanceContextInitializer (res);
133 InstanceContext c = new InstanceContext (new AllActions (res));
135 b.instanceCtxProvider = new MyInstanceContextProvider (c, res);
136 b.instanceProvider = new MyInstanceProvider (new AllActions (res), res);
137 b.msgInspect = new MyMessageInspector (res);
138 string expected = "GetExistingInstanceContext , InitializeInstanceContext , OperationContext , InstanceContext = Opening , Initialize , OperationContext , InstanceContext = Opening , AfterReceiveRequest , OperationContext , InstanceContext = Opened , BeforeSendReply , OperationContext , InstanceContext = Opened , ";
139 TestInstanceBehavior (b, expected, res, 1); Assert.IsTrue (res.Done, "done");
143 public void TestInstanceBehavior4 ()
145 Result res = new Result ();
146 MessageInspectBehavior b = new MessageInspectBehavior ();
147 b.instanceCtxInitializer = new MyInstanceContextInitializer (res);
149 b.instanceCtxProvider = new MyInstanceContextProvider (null, res);
150 b.instanceProvider = new MyInstanceProvider (new AllActions (res), res);
151 b.msgInspect = new MyMessageInspector (res);
152 string expected = "GetExistingInstanceContext , InitializeInstanceContext , OperationContext , InstanceContext = Opening , Initialize , OperationContext , InstanceContext = Opening , AfterReceiveRequest , OperationContext , InstanceContext = Opened , GetInstance1 , OperationContext , InstanceContext = Opened , BeforeSendReply , OperationContext , InstanceContext = Opened , ReleaseInstance , OperationContext , InstanceContext = Opened , IsIdle , OperationContext , InstanceContext = Opened , NotifyIdle , OperationContext , InstanceContext = Opened , GetExistingInstanceContext , InitializeInstanceContext , OperationContext , InstanceContext = Opening , Initialize , OperationContext , InstanceContext = Opening , AfterReceiveRequest , OperationContext , InstanceContext = Opened , GetInstance1 , OperationContext , InstanceContext = Opened , BeforeSendReply , OperationContext , InstanceContext = Opened , ReleaseInstance , OperationContext , InstanceContext = Opened , IsIdle , OperationContext , InstanceContext = Opened , NotifyIdle , OperationContext , InstanceContext = Opened , ";
153 TestInstanceBehavior (b, expected, res, 2); Assert.IsTrue (res.Done, "done");
156 void TestInstanceBehavior (MessageInspectBehavior b, string expected, Result actual, int invocations)
158 var port = NetworkHelpers.FindFreePort ();
159 ServiceHost h = new ServiceHost (typeof (AllActions), new Uri ("http://localhost:" + port));
161 h.AddServiceEndpoint (typeof (IAllActions).FullName, new BasicHttpBinding (), "AllActions");
162 h.Description.Behaviors.Add (b);
163 ServiceDebugBehavior db = h.Description.Behaviors.Find<ServiceDebugBehavior> ();
164 db.IncludeExceptionDetailInFaults = true;
166 foreach (ChannelDispatcher cd in h.ChannelDispatchers) {
167 foreach (var ed in cd.Endpoints) {
168 if (ed.ContractName == "IHttpGetHelpPageAndMetadataContract")
170 Assert.AreEqual (typeof (AllActions), ed.DispatchRuntime.Type, "Type property: " + ed.ContractName);
173 AllActionsProxy p = new AllActionsProxy (new BasicHttpBinding () { SendTimeout = TimeSpan.FromSeconds (5), ReceiveTimeout = TimeSpan.FromSeconds (5) }, new EndpointAddress ("http://localhost:" + port + "/AllActions"));
175 for (int i = 0; i < invocations; ++i)
179 //let ther server finish his work
181 Assert.AreEqual (expected, actual.string_res);
193 #region message inspectors
195 public class MessageInspectBehavior : IServiceBehavior
197 public MyMessageInspector msgInspect;
198 public MyInstanceContextProvider instanceCtxProvider;
199 public MyInstanceProvider instanceProvider;
200 public MyInstanceContextInitializer instanceCtxInitializer;
202 public void AddBindingParameters (ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) {
206 public void ApplyDispatchBehavior (ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) {
207 ChannelDispatcher d = serviceHostBase.ChannelDispatchers [0] as ChannelDispatcher;
208 d.Endpoints [0].DispatchRuntime.MessageInspectors.Add (msgInspect);
209 d.Endpoints [0].DispatchRuntime.InstanceContextProvider = instanceCtxProvider;
210 d.Endpoints [0].DispatchRuntime.InstanceProvider = instanceProvider;
211 d.Endpoints [0].DispatchRuntime.InstanceContextInitializers.Add (instanceCtxInitializer);
214 public void Validate (ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) {
219 public class MyMessageInspector : IDispatchMessageInspector
223 public MyMessageInspector (Result result) {
226 #region IDispatchMessageInspector Members
228 public object AfterReceiveRequest (ref Message request, IClientChannel channel, InstanceContext instanceContext) {
229 res.string_res += "AfterReceiveRequest , ";
230 res.AddCurrentOperationContextInfo ();
234 public void BeforeSendReply (ref Message reply, object correlationState) {
235 res.string_res += "BeforeSendReply , ";
236 res.AddCurrentOperationContextInfo ();
244 #region InstanceProvider
246 public class MyInstanceProvider : IInstanceProvider
251 public MyInstanceProvider (object obj, Result result) {
256 #region IInstanceProvider Members
258 public object GetInstance (InstanceContext instanceContext, Message message) {
259 res.string_res += "GetInstance1 , ";
260 res.AddCurrentOperationContextInfo ();
264 public object GetInstance (InstanceContext instanceContext) {
265 res.string_res += "GetInstance2 , ";
266 res.AddCurrentOperationContextInfo ();
270 public void ReleaseInstance (InstanceContext instanceContext, object instance) {
271 res.string_res += "ReleaseInstance , ";
272 res.AddCurrentOperationContextInfo ();
280 #region InstanceContextProvider
282 public class MyInstanceContextProvider : IInstanceContextProvider
285 InstanceContext existing;
288 public MyInstanceContextProvider (InstanceContext exist, Result result) {
293 #region IInstanceContextProvider Members
295 public InstanceContext GetExistingInstanceContext (Message message, IContextChannel channel) {
296 res.string_res += "GetExistingInstanceContext , ";
297 res.AddCurrentOperationContextInfo ();
301 public void InitializeInstanceContext (InstanceContext instanceContext, Message message, IContextChannel channel) {
302 res.string_res += "InitializeInstanceContext , ";
303 res.AddCurrentOperationContextInfo ();
306 public bool IsIdle (InstanceContext instanceContext) {
307 res.string_res += "IsIdle , ";
308 res.AddCurrentOperationContextInfo ();
312 public void NotifyIdle (InstanceContextIdleCallback callback, InstanceContext instanceContext) {
313 res.string_res += "NotifyIdle , ";
314 res.AddCurrentOperationContextInfo ();
322 #region InstanceContextInitializer
324 public class MyInstanceContextInitializer : IInstanceContextInitializer
328 public MyInstanceContextInitializer (Result result) {
332 public void Initialize (InstanceContext instanceContext, Message message) {
333 res.string_res += "Initialize , ";
334 res.AddCurrentOperationContextInfo ();
345 public string string_res = "";
347 public void AddCurrentOperationContextInfo()
349 if (OperationContext.Current != null) {
350 string_res += "OperationContext , ";
351 if (OperationContext.Current.InstanceContext != null) {
352 string_res += ("InstanceContext = " + OperationContext.Current.InstanceContext.State + " , ");
353 //if (OperationContext.Current.InstanceContext != null)
354 // string_res += ("Instance = " + OperationContext.Current.InstanceContext.GetServiceInstance () + " , ");
360 class AllActions : IAllActions, IDisposable
364 public AllActions () { }
366 public AllActions (Result result) {
370 [OperationBehavior (ReleaseInstanceMode = ReleaseInstanceMode.BeforeAndAfterCall)]
371 public int Get(int i)
376 public void Dispose () {
378 res.string_res += "Disposed , ";
382 [ServiceContract (Namespace = "http://MonoTests.System.ServiceModel.Dispatcher")]
383 public interface IAllActions
393 public class AllActionsProxy : ClientBase<IAllActions>, IAllActions
395 public AllActionsProxy (Binding binding, EndpointAddress remoteAddress) :
396 base (binding, remoteAddress)
400 public int Get (int i) {
401 return base.Channel.Get (i);