Wed Feb 24 15:47:16 CET 2010 Paolo Molaro <lupus@ximian.com>
[mono.git] / mcs / class / System.ServiceModel / Test / System.ServiceModel / ServiceHostBaseTest.cs
1 //
2 // ServiceHostBaseTest.cs
3 //
4 // Author:
5 //      Igor Zelmanovich <igorz@mainsoft.com>
6 //
7 // Copyright (C) 2008 Mainsoft, Inc.  http://www.mainsoft.com
8 //
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:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
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.
27 //
28
29 using System;
30 using System.Collections.Generic;
31 using System.Text;
32 using NUnit.Framework;
33 using System.ServiceModel;
34 using System.ServiceModel.Description;
35 using System.ServiceModel.Dispatcher;
36 using SMMessage = System.ServiceModel.Channels.Message;
37 using System.ServiceModel.Channels;
38
39 namespace MonoTests.System.ServiceModel
40 {
41         [TestFixture]
42         public class ServiceHostBaseTest
43         {
44                 class Poker : ServiceHostBase
45                 {
46                         public event EventHandler OnApplyConfiguration;
47
48                         protected override ServiceDescription CreateDescription (out IDictionary<string, ContractDescription> implementedContracts) {
49                                 implementedContracts = new Dictionary<string, ContractDescription> ();
50                                 ServiceDescription description = new ServiceDescription ();
51                                 description.ServiceType = typeof (MyService);
52                                 description.Behaviors.Add (new ServiceBehaviorAttribute ());
53                                 return description;
54                         }
55
56                         protected override void ApplyConfiguration () {
57                                 if (OnApplyConfiguration != null)
58                                         OnApplyConfiguration (this, EventArgs.Empty);
59                                 base.ApplyConfiguration ();
60                         }
61
62                         public void CallInitializeDescription () {
63                                 InitializeDescription (new UriSchemeKeyedCollection ());
64                         }
65
66                         protected override void InitializeRuntime () {
67                                 base.InitializeRuntime ();
68                         }
69
70                         public void CallInitializeRuntime () {
71                                 InitializeRuntime ();
72                         }
73
74                         public void DoAddBaseAddress (Uri uri)
75                         {
76                                 AddBaseAddress (uri);
77                         }
78                 }
79
80                 [Test]
81                 public void Ctor () {
82                         Poker host = new Poker ();
83
84                         Assert.AreEqual (null, host.Description, "Description");
85                         Assert.AreEqual (null, host.Authorization, "Authorization");
86                 }
87
88                 [Test]
89                 public void DefaultConfiguration () {
90                         Poker host = new Poker ();
91                         host.OnApplyConfiguration += delegate (object sender, EventArgs e) {
92                                 Assert.AreEqual (1, host.Description.Behaviors.Count, "Description.Behaviors.Count #1");
93                         };
94                         host.CallInitializeDescription ();
95
96                         Assert.AreEqual (true, host.Description.Behaviors.Count > 1, "Description.Behaviors.Count #2");
97
98                         Assert.IsNotNull (host.Description.Behaviors.Find<ServiceDebugBehavior> (), "ServiceDebugBehavior");
99                         Assert.IsNotNull (host.Description.Behaviors.Find<ServiceAuthorizationBehavior> (), "ServiceDebugBehavior");
100                         Assert.IsNotNull (host.Authorization, "Authorization #1");
101
102                         Assert.AreEqual (host.Description.Behaviors.Find<ServiceAuthorizationBehavior> (), host.Authorization, "Authorization #2");
103                 }
104
105                 [Test]
106                 [ExpectedException (typeof (InvalidOperationException))]
107                 public void ApplyConfigurationNoDescription () {
108                         CustomServiceHost customHost = new CustomServiceHost ();
109                         customHost.ApplyConfiguration ();
110                 }
111
112                 class CustomServiceHost : ServiceHostBase
113                 {
114
115                         public CustomServiceHost () {
116
117                         }
118
119                         public new void ApplyConfiguration () {
120                                 base.ApplyConfiguration ();
121                         }
122
123                         protected override ServiceDescription CreateDescription (out IDictionary<string, ContractDescription> implementedContracts) {
124                                 throw new NotImplementedException ();
125                         }
126                 }
127
128                 [Test]
129                 public void InitializeRuntime () {
130                         Poker host = new Poker ();
131                         host.CallInitializeDescription ();
132                         EndpointAddress address = new EndpointAddress ("http://localhost:8090/");
133                         ContractDescription contract = ContractDescription.GetContract (typeof (IMyContract));
134                         ServiceEndpoint endpoint = new ServiceEndpoint (contract, new BasicHttpBinding (), address);
135                         endpoint.ListenUri = address.Uri;
136                         host.Description.Endpoints.Add (endpoint);
137
138                         Assert.AreEqual (0, host.ChannelDispatchers.Count, "ChannelDispatchers.Count #1");
139
140                         host.CallInitializeRuntime ();
141
142                         Assert.AreEqual (1, host.ChannelDispatchers.Count, "ChannelDispatchers.Count #1");
143                         Assert.AreEqual (CommunicationState.Created, host.ChannelDispatchers [0].State, "ChannelDispatchers.Count #1");
144                 }
145
146                 [ServiceContract]
147                 interface IMyContract
148                 {
149                         [OperationContract]
150                         string GetData ();
151                 }
152
153                 class MyService : IMyContract
154                 {
155                         public string GetData () {
156                                 return "Hello World";
157                         }
158                 }
159
160                 [Test]
161                 public void ChannelDispatchers_NoDebug () {
162                         ServiceHost h = new ServiceHost (typeof (AllActions), new Uri ("http://localhost:8080"));
163                         h.AddServiceEndpoint (typeof (AllActions).FullName, new BasicHttpBinding (), "address");
164
165                         ServiceDebugBehavior b = h.Description.Behaviors.Find<ServiceDebugBehavior> ();
166                         b.HttpHelpPageEnabled = false;                                          
167
168                         h.Open ();
169                         try {
170                         Assert.AreEqual (h.ChannelDispatchers.Count, 1);
171                         ChannelDispatcher channelDispatcher =  h.ChannelDispatchers[0] as ChannelDispatcher;
172                         Assert.IsNotNull (channelDispatcher, "#1");
173                         Assert.IsTrue (channelDispatcher.Endpoints.Count == 1, "#2");
174                         EndpointAddressMessageFilter filter = channelDispatcher.Endpoints [0].AddressFilter as EndpointAddressMessageFilter;
175                         Assert.IsNotNull (filter, "#3");
176                         Assert.IsTrue (filter.Address.Equals (new EndpointAddress ("http://localhost:8080/address")), "#4");
177                         Assert.IsFalse (filter.IncludeHostNameInComparison, "#5");
178                         Assert.IsTrue (channelDispatcher.Endpoints [0].ContractFilter is MatchAllMessageFilter, "#6");
179                         } finally {
180                         h.Close ();
181                         }
182                 }
183
184                 [Test]
185                 public void ChannelDispatchers_WithDebug () {
186                         ServiceHost h = new ServiceHost (typeof (AllActions), new Uri ("http://localhost:8080"));
187                         h.AddServiceEndpoint (typeof (AllActions).FullName, new BasicHttpBinding (), "address");
188                         ServiceMetadataBehavior b = new ServiceMetadataBehavior ();
189                         b.HttpGetEnabled = true;
190                         b.HttpGetUrl = new Uri( "http://localhost:8080" );
191                         h.Description.Behaviors.Add (b);
192                         h.Open ();
193
194                         Assert.AreEqual (h.ChannelDispatchers.Count, 2, "#1");
195                         ChannelDispatcher channelDispatcher = h.ChannelDispatchers[1] as ChannelDispatcher;
196                         Assert.IsNotNull (channelDispatcher, "#2");
197                         Assert.IsTrue (channelDispatcher.Endpoints.Count == 1, "#3");
198                         EndpointAddressMessageFilter filter = channelDispatcher.Endpoints [0].AddressFilter as EndpointAddressMessageFilter;
199                         Assert.IsNotNull (filter, "#4");
200                         Assert.IsTrue (filter.Address.Equals (new EndpointAddress ("http://localhost:8080")), "#5");
201                         Assert.IsFalse (filter.IncludeHostNameInComparison, "#6");
202                         Assert.IsTrue (channelDispatcher.Endpoints [0].ContractFilter is MatchAllMessageFilter, "#7");
203                         h.Close ();
204                 }
205
206                 [Test]
207                 public void SpecificActionTest ()
208                 {
209                         //EndpointDispatcher d = new EndpointDispatcher(
210                         ServiceHost h = new ServiceHost (typeof (SpecificAction), new Uri ("http://localhost:8080"));
211                         h.AddServiceEndpoint (typeof (Action1Interface), new BasicHttpBinding (), "address");
212                                                 
213                         h.Open ();
214                         ChannelDispatcher d = h.ChannelDispatchers [0] as ChannelDispatcher;
215                         EndpointDispatcher ed = d.Endpoints [0] as EndpointDispatcher;
216                         ActionMessageFilter actionFilter = ed.ContractFilter as ActionMessageFilter;
217                         Assert.IsNotNull (actionFilter, "#1");
218                         Assert.IsTrue (actionFilter.Actions.Count == 1, "#2");
219                         h.Close();
220                 }
221
222                 [Test]
223                 public void InitializeRuntimeBehaviors1 () {
224                         HostState st = new HostState ();
225                         ServiceHost h = new ServiceHost (typeof (SpecificAction2), new Uri ("http://localhost:8080"));
226                         h.AddServiceEndpoint (typeof (SpecificAction2), new BasicHttpBinding (), "temp");                       
227
228                         h.Description.Behaviors.Add (new MyServiceBehavior (st, h));
229
230                         h.Description.Endpoints [0].Behaviors.Add (new MyEndpointBehavior (st, h));
231                         h.Description.Endpoints [0].Contract.Behaviors.Add (new MyContractBehavior (st, h));
232                         h.Description.Endpoints [0].Contract.Operations [0].Behaviors.Add (new MyOperationBehavior (st, h));
233                         
234                         h.Open ();
235                         h.Close ();
236                         
237                         string expected = "Start, IServiceBehavior.Validate, IContractBehavior.Validate, IEndpointBehavior.Validate, IOperationBehavior.ApplyDispatchBehavior, IServiceBehavior.AddBindingParameters, IContractBehavior.AddBindingParameters, IEndpointBehavior.AddBindingParameters, IOperationBehavior.AddBindingParameters, IServiceBehavior.ApplyDispatchBehavior, IContractBehavior.ApplyDispatchBehavior, IEndpointBehavior.ApplyDispatchBehavior, IOperationBehavior.ApplyDispatchBehavior";
238                         Assert.AreEqual (expected, st.CurrentStage);
239                 }
240
241                 [Test]
242                 public void InitializeRuntimeBehaviors2 () {
243                         HostState st = new HostState ();
244                         ServiceHost h = new ServiceHost (typeof (SpecificAction), new Uri ("http://localhost:8080"));
245                         h.AddServiceEndpoint (typeof (Action1Interface), new BasicHttpBinding (), "temp");
246                         h.AddServiceEndpoint (typeof (Action2Interface), new BasicHttpBinding (), "temp2");
247
248                         h.Description.Behaviors.Add (new MyServiceBehavior (st, h));                    
249                         
250                         h.Description.Endpoints [0].Behaviors.Add (new MyEndpointBehavior (st, h));
251                         h.Description.Endpoints [0].Contract.Behaviors.Add (new MyContractBehavior (st, h));
252                         h.Description.Endpoints [0].Contract.Operations [0].Behaviors.Add (new MyOperationBehavior (st, h));
253
254                         h.Description.Endpoints [1].Behaviors.Add (new MyEndpointBehavior (st, h));
255                         h.Description.Endpoints [1].Contract.Behaviors.Add (new MyContractBehavior (st, h));
256                         h.Description.Endpoints [1].Contract.Operations [0].Behaviors.Add (new MyOperationBehavior (st, h));
257                         h.Open ();
258                         h.Close ();
259
260                         string expected = "Start, IServiceBehavior.Validate, IContractBehavior.Validate, IEndpointBehavior.Validate, IOperationBehavior.ApplyDispatchBehavior, IContractBehavior.Validate, IEndpointBehavior.Validate, IOperationBehavior.ApplyDispatchBehavior, IServiceBehavior.AddBindingParameters, IContractBehavior.AddBindingParameters, IEndpointBehavior.AddBindingParameters, IOperationBehavior.AddBindingParameters, IServiceBehavior.AddBindingParameters, IContractBehavior.AddBindingParameters, IEndpointBehavior.AddBindingParameters, IOperationBehavior.AddBindingParameters, IServiceBehavior.ApplyDispatchBehavior, IContractBehavior.ApplyDispatchBehavior, IEndpointBehavior.ApplyDispatchBehavior, IOperationBehavior.ApplyDispatchBehavior, IContractBehavior.ApplyDispatchBehavior, IEndpointBehavior.ApplyDispatchBehavior, IOperationBehavior.ApplyDispatchBehavior";
261                         Assert.AreEqual (expected, st.CurrentStage);
262                 }
263
264                 [Test]
265                 public void AddBaseAddress ()
266                 {
267                         var host = new Poker ();
268                         Assert.AreEqual (0, host.BaseAddresses.Count, "#1");
269                         host.DoAddBaseAddress (new Uri ("http://localhost:37564"));
270                         Assert.AreEqual (1, host.BaseAddresses.Count, "#1");
271                         host.DoAddBaseAddress (new Uri ("net.tcp://localhost:893"));
272                         Assert.AreEqual (2, host.BaseAddresses.Count, "#1");
273                 }
274
275                 [Test]
276                 [ExpectedException (typeof (ArgumentException))]
277                 public void AddBaseAddress2 ()
278                 {
279                         var host = new Poker ();
280                         Assert.AreEqual (0, host.BaseAddresses.Count, "#1");
281                         host.DoAddBaseAddress (new Uri ("http://localhost:37564"));
282                         // http base address is already added.
283                         host.DoAddBaseAddress (new Uri ("http://localhost:893"));
284                 }
285
286                 [Test]
287                 public void AddServiceEndpointUri ()
288                 {
289                         var host = new ServiceHost (typeof (AllActions),
290                                 new Uri ("http://localhost:37564"));
291                         var se = host.AddServiceEndpoint (typeof (AllActions),
292                                 new BasicHttpBinding (), "foobar");
293                         Assert.AreEqual ("http://localhost:37564/foobar", se.Address.Uri.AbsoluteUri, "#1");
294                         Assert.AreEqual ("http://localhost:37564/foobar", se.ListenUri.AbsoluteUri, "#2");
295                 }
296
297                 [Test]
298                 public void AddServiceEndpointUri2 ()
299                 {
300                         var host = new ServiceHost (typeof (AllActions),
301                                 new Uri ("http://localhost:37564"));
302                         var se = host.AddServiceEndpoint (typeof (AllActions),
303                                 new BasicHttpBinding (), String.Empty);
304                         Assert.AreEqual ("http://localhost:37564/", se.Address.Uri.AbsoluteUri, "#1");
305                         Assert.AreEqual ("http://localhost:37564/", se.ListenUri.AbsoluteUri, "#2");
306                 }
307
308                 [Test]
309                 [ExpectedException (typeof (InvalidOperationException))]
310                 public void AddServiceEndpointOnlyMex ()
311                 {
312                         var host = new ServiceHost (typeof (AllActions),
313                                 new Uri ("http://localhost:37564"));
314                         host.Description.Behaviors.Add (new ServiceMetadataBehavior ());
315                         host.AddServiceEndpoint ("IMetadataExchange",
316                                 new BasicHttpBinding (), "/wsdl");
317                         host.Open ();
318                         try {
319                                 // to make sure that throwing IOE from here does not count.
320                                 host.Close ();
321                         } catch {
322                         }
323                         Assert.Fail ("should not open");
324                 }
325
326                 #region helpers
327
328                 public enum Stage
329                 {
330                 }
331
332                 public class HostState
333                 {
334                         public string CurrentStage = "Start";
335                 }
336
337                 public class MyServiceBehavior : IServiceBehavior
338                 {
339                         #region IServiceBehavior Members
340
341                         HostState _state;
342                         ServiceHost _host;
343                         public MyServiceBehavior (HostState state, ServiceHost h) {
344                                 _state = state;
345                                 _host = h;
346                         }
347
348                         public void AddBindingParameters (ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, global::System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) {                         
349                                 _state.CurrentStage += ", IServiceBehavior.AddBindingParameters";                               
350                                 bindingParameters.Add (this);
351                         }
352
353                         public void ApplyDispatchBehavior (ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) {                            
354                                 _state.CurrentStage += ", IServiceBehavior.ApplyDispatchBehavior";                              
355                         }
356
357                         public void Validate (ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) {
358                                 _state.CurrentStage += ", IServiceBehavior.Validate";
359                                 Assert.AreEqual (_host.ChannelDispatchers.Count, 0);
360                         }
361
362                         #endregion
363                 }
364
365                 public class MyEndpointBehavior : IEndpointBehavior
366                 {
367                         #region IEndpointBehavior Members
368                         HostState _state;
369                         ServiceHost _host;
370                         public MyEndpointBehavior (HostState state, ServiceHost h) {
371                                 _state = state;
372                                 _host = h;
373                         }
374
375                         public void AddBindingParameters (ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) {
376                                 Console.WriteLine ("IEndpointBehavior - AddBindingParameters " + _host.ChannelDispatchers.Count);
377                                 _state.CurrentStage += ", IEndpointBehavior.AddBindingParameters";                              
378                                 bindingParameters.Add (this);
379                         }
380
381                         public void ApplyClientBehavior (ServiceEndpoint endpoint, ClientRuntime clientRuntime) {
382                                 Console.WriteLine ("IEndpointBehavior - ApplyClientBehavior " + _host.ChannelDispatchers.Count);
383                         }
384
385                         public void ApplyDispatchBehavior (ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) {
386                                 Console.WriteLine ("IEndpointBehavior - ApplyDispatchBehavior " + _host.ChannelDispatchers.Count);
387                                 _state.CurrentStage += ", IEndpointBehavior.ApplyDispatchBehavior";                             
388                         }
389
390                         public void Validate (ServiceEndpoint endpoint) {
391                                 Console.WriteLine ("IEndpointBehavior - Validate " + _host.ChannelDispatchers.Count);
392                                 _state.CurrentStage += ", IEndpointBehavior.Validate";
393                                 Assert.AreEqual (_host.ChannelDispatchers.Count, 0);                            
394                         }
395
396                         #endregion
397                 }
398
399                 public class MyContractBehavior : IContractBehavior
400                 {
401                         #region IContractBehavior Members
402                         HostState _state;
403                         ServiceHost _host;
404                         public MyContractBehavior (HostState state, ServiceHost h) {
405                                 _state = state;
406                                 _host = h;
407                         }
408
409                         public void AddBindingParameters (ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) {
410                                 Console.WriteLine ("Contract - AddBindingParameters " + _host.ChannelDispatchers.Count);
411                                 _state.CurrentStage += ", IContractBehavior.AddBindingParameters";                              
412                                 bindingParameters.Add (this);
413                         }
414
415                         public void ApplyClientBehavior (ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime) {
416                                 Console.WriteLine ("Contract - ApplyClientBehavior " + _host.ChannelDispatchers.Count);
417                         }
418
419                         public void ApplyDispatchBehavior (ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime) {
420                                 Console.WriteLine ("Contract - ApplyDispatchBehavior " + _host.ChannelDispatchers.Count);
421                                 _state.CurrentStage += ", IContractBehavior.ApplyDispatchBehavior";                             
422                         }
423
424                         public void Validate (ContractDescription contractDescription, ServiceEndpoint endpoint) {
425                                 Console.WriteLine ("Contract - Validate " + _host.ChannelDispatchers.Count);
426                                 _state.CurrentStage += ", IContractBehavior.Validate";          
427                                 Assert.AreEqual (_host.ChannelDispatchers.Count, 0);                            
428                         }
429
430                         #endregion
431                 }
432
433                 public class MyOperationBehavior : IOperationBehavior
434                 {
435                         #region IOperationBehavior Members
436                         HostState _state;
437                         ServiceHost _host;
438                         public MyOperationBehavior (HostState state, ServiceHost h) {
439                                 _state = state;
440                                 _host = h;
441                         }
442
443                         public void AddBindingParameters (OperationDescription operationDescription, BindingParameterCollection bindingParameters) {
444                                 Console.WriteLine ("IOperationBehavior - AddBindingParameters " + _host.ChannelDispatchers.Count);
445                                 _state.CurrentStage += ", IOperationBehavior.AddBindingParameters";                                     
446                                 bindingParameters.Add (this);
447                         }
448
449                         public void ApplyClientBehavior (OperationDescription operationDescription, ClientOperation clientOperation) {
450                                 Console.WriteLine ("IOperationBehavior - ApplyClientBehavior " + _host.ChannelDispatchers.Count);
451                         }
452
453                         public void ApplyDispatchBehavior (OperationDescription operationDescription, DispatchOperation dispatchOperation) {
454                                 Console.WriteLine ("IOperationBehavior - ApplyDispatchBehavior " + _host.ChannelDispatchers.Count);
455                                 _state.CurrentStage += ", IOperationBehavior.ApplyDispatchBehavior";                            
456                         }
457
458                         public void Validate (OperationDescription operationDescription) {
459                                 Console.WriteLine ("IOperationBehavior - Validate " + _host.ChannelDispatchers.Count);
460                                 _state.CurrentStage += ", IOperationBehavior.ApplyDispatchBehavior";
461                                 Assert.AreEqual (_host.ChannelDispatchers.Count, 0);
462                         }
463
464                         #endregion
465                 }
466
467                 [ServiceContract]
468                 class AllActions
469                 {
470                         [OperationContract (Action = "*", ReplyAction = "*")]
471                         public SMMessage Get (SMMessage req) {
472                                 return null;
473                         }
474                 }
475
476                 [ServiceContract]
477                 interface Action1Interface
478                 {
479                         [OperationContract (Action = "Specific1", ReplyAction = "*")]
480                         SMMessage GetMessage1 (SMMessage req);
481                 }
482
483                 [ServiceContract]
484                 interface Action2Interface
485                 {
486                         [OperationContract (Action = "Specific2", ReplyAction = "*")]
487                         SMMessage GetMessage2 (SMMessage req);
488                 }
489                 
490                 class SpecificAction : Action1Interface, Action2Interface
491                 {                       
492                         public SMMessage GetMessage1 (SMMessage req) {
493                                 return null;
494                         }
495
496                         public SMMessage GetMessage2 (SMMessage req) {
497                                 return null;
498                         }
499                 }
500
501                 [ServiceContract]
502                 class SpecificAction2
503                 {
504                         [OperationContract (Action = "Specific", ReplyAction = "*")]
505                         public SMMessage GetMessage1 (SMMessage req) {
506                                 return null;
507                         }
508                 }
509
510                 class MyChannelDispatcher : ChannelDispatcher
511                 {
512                         public bool Attached = false;
513
514                         public MyChannelDispatcher (IChannelListener l) : base (l) { }
515                         protected override void Attach (ServiceHostBase host) {
516                                 base.Attach (host);
517                                 Attached = true;
518                         }
519                 }
520
521                 class MyChannelListener : IChannelListener
522                 {
523                         #region IChannelListener Members
524
525                         public IAsyncResult BeginWaitForChannel (TimeSpan timeout, AsyncCallback callback, object state) {
526                                 throw new NotImplementedException ();
527                         }
528
529                         public bool EndWaitForChannel (IAsyncResult result) {
530                                 throw new NotImplementedException ();
531                         }
532
533                         public T GetProperty<T> () where T : class {
534                                 throw new NotImplementedException ();
535                         }
536
537                         public Uri Uri {
538                                 get { throw new NotImplementedException (); }
539                         }
540
541                         public bool WaitForChannel (TimeSpan timeout) {
542                                 throw new NotImplementedException ();
543                         }
544
545                         #endregion
546
547                         #region ICommunicationObject Members
548
549                         public void Abort () {
550                                 throw new NotImplementedException ();
551                         }
552
553                         public IAsyncResult BeginClose (TimeSpan timeout, AsyncCallback callback, object state) {
554                                 throw new NotImplementedException ();
555                         }
556
557                         public IAsyncResult BeginClose (AsyncCallback callback, object state) {
558                                 throw new NotImplementedException ();
559                         }
560
561                         public IAsyncResult BeginOpen (TimeSpan timeout, AsyncCallback callback, object state) {
562                                 throw new NotImplementedException ();
563                         }
564
565                         public IAsyncResult BeginOpen (AsyncCallback callback, object state) {
566                                 throw new NotImplementedException ();
567                         }
568
569                         public void Close (TimeSpan timeout) {
570                                 throw new NotImplementedException ();
571                         }
572
573                         public void Close () {
574                                 throw new NotImplementedException ();
575                         }
576
577                         public event EventHandler Closed;
578
579                         public event EventHandler Closing;
580
581                         public void EndClose (IAsyncResult result) {
582                                 throw new NotImplementedException ();
583                         }
584
585                         public void EndOpen (IAsyncResult result) {
586                                 throw new NotImplementedException ();
587                         }
588
589                         public event EventHandler Faulted;
590
591                         public void Open (TimeSpan timeout) {
592                                 throw new NotImplementedException ();
593                         }
594
595                         public void Open () {
596                                 throw new NotImplementedException ();
597                         }
598
599                         public event EventHandler Opened;
600
601                         public event EventHandler Opening;
602
603                         public CommunicationState State {
604                                 get { throw new NotImplementedException (); }
605                         }
606
607                         #endregion
608                 }
609                 #endregion
610
611         }
612 }