New tests.
[mono.git] / mcs / class / System.ServiceModel / Test / System.ServiceModel.Dispatcher / DispatchOperationTest.cs
1 //
2 // DispatchOperationTest.cs
3 //
4 // Author:
5 //      Atsushi Enomoto <atsushi@ximian.com>
6 //
7 // Copyright (C) 2006 Novell, Inc.  http://www.novell.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.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;
37 using System.Xml;
38 using NUnit.Framework;
39
40 namespace MonoTests.System.ServiceModel.Dispatcher
41 {
42         [TestFixture]
43         public class DispatchOperationTest
44         {
45                 [Test]
46                 [ExpectedException (typeof (ArgumentNullException))]
47                 public void TestConstructorNullName ()
48                 {
49                         new DispatchOperation (CreateRuntime (), null, null);
50                 }
51
52                 [Test]
53                 public void TestConstructorNullAction ()
54                 {
55                         DispatchRuntime r = CreateRuntime ();
56                         // null Action is allowed.
57                         new DispatchOperation (r, String.Empty, null);
58                         // null ReplyAction as well.
59                         new DispatchOperation (r, String.Empty, null, null);
60                 }
61
62                 [Test]
63                 public void TestConstructor ()
64                 {
65                         DispatchOperation o = new DispatchOperation (
66                                 CreateRuntime (), String.Empty, null, null);
67                         Assert.IsTrue (o.DeserializeRequest, "#1");
68                         Assert.IsTrue (o.SerializeReply, "#2");
69                         Assert.IsNull (o.Formatter, "#3");
70                         Assert.AreEqual (0, o.FaultContractInfos.Count, "#4");
71                         Assert.IsNull (o.Invoker, "#5");
72                         Assert.IsFalse (o.IsOneWay, "#6");
73                         Assert.IsFalse (o.IsTerminating, "#7");
74                         Assert.IsFalse (o.ReleaseInstanceBeforeCall, "#8");
75                         Assert.IsFalse (o.ReleaseInstanceAfterCall, "#9");
76                         Assert.IsFalse (o.TransactionAutoComplete, "#10");
77                         Assert.IsFalse (o.TransactionRequired, "#11");
78                         Assert.AreEqual (0, o.ParameterInspectors.Count, "#12");
79                 }
80
81                 DispatchRuntime CreateRuntime ()
82                 {
83                         return new EndpointDispatcher (
84                                 new EndpointAddress ("http://localhost:8080"), "IFoo", "urn:foo").DispatchRuntime;
85                 }
86
87                 [Test]
88                 public void FaultContractInfos ()
89                 {
90                         var host = new ServiceHost (typeof (TestFaultContract));
91                         host.Description.Behaviors.Find<ServiceDebugBehavior> ().IncludeExceptionDetailInFaults = true;
92                         host.AddServiceEndpoint (typeof (ITestFaultContract), new BasicHttpBinding (), new Uri ("http://localhost:37564"));
93                         host.Open ();
94                         try {
95                                 var cf = new ChannelFactory<ITestFaultContract> (new BasicHttpBinding (), new EndpointAddress ("http://localhost:37564"));
96                                 var cli = cf.CreateChannel ();
97                                 cli.Run ("test");
98                         } catch (FaultException<PrivateAffairError> ex) {
99                                 var p  = ex.Detail;
100                                 Assert.AreEqual (5, p.ErrorCode, "#1");
101                                 Assert.AreEqual ("foobarerror", p.Text, "#2");
102                         } finally {
103                                 host.Close ();
104                         }
105                 }
106
107                 [ServiceContract]
108                 public interface ITestFaultContract
109                 {
110                         [OperationContract]
111                         [FaultContract (typeof (PrivateAffairError), Action = "urn:myfault")]
112                         string Run (string input);
113                 }
114
115                 class TestFaultContract : ITestFaultContract
116                 {
117                         public string Run (string input)
118                         {
119                                 Assert.AreEqual (1, ContractDescription.GetContract (typeof (TestFaultContract)).Operations [0].Faults.Count, "s#0");
120
121                                 var dr = OperationContext.Current.EndpointDispatcher.DispatchRuntime;
122                                 Assert.AreEqual (1, dr.Operations.Count);
123                                 var dop = dr.Operations [0];
124                                 Assert.AreEqual ("Run", dop.Name, "s#1");
125                                 Assert.AreEqual (1, dop.FaultContractInfos.Count, "s#2");
126                                 var fci = dop.FaultContractInfos [0];
127                                 Assert.AreEqual (typeof (PrivateAffairError), fci.Detail, "s#3");
128                                 throw new FaultException<PrivateAffairError> (new PrivateAffairError () { ErrorCode = 5, Text = "foobarerror" });
129                         }
130                 }
131
132                 [DataContract]
133                 class PrivateAffairError
134                 {
135                         [DataMember]
136                         public int ErrorCode { get; set; }
137                         [DataMember]
138                         public string Text { get; set; }
139                 }
140         }
141 }