WsdlExporterTest.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  1. //
  2. // WsdlExporterTest.cs
  3. //
  4. // Author:
  5. // Ankit Jain <[email protected]>
  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. using System;
  29. using System.Collections.Generic;
  30. using System.Text;
  31. using System.ServiceModel.Channels;
  32. using System.ServiceModel.Description;
  33. using NUnit.Framework;
  34. using System.Runtime.Serialization;
  35. using System.ServiceModel;
  36. using System.Web.Services;
  37. using WSServiceDescription = System.Web.Services.Description.ServiceDescription;
  38. using WSMessage = System.Web.Services.Description.Message;
  39. using WSBinding = System.Web.Services.Description.Binding;
  40. using QName = System.Xml.XmlQualifiedName;
  41. using SMMessage = System.ServiceModel.Channels.Message;
  42. using System.Xml;
  43. using System.Web.Services.Description;
  44. using System.Xml.Schema;
  45. using System.Xml.Serialization;
  46. using System.Reflection;
  47. namespace MonoTests.System.ServiceModel.Description
  48. {
  49. [TestFixture]
  50. public class WsdlExporterTest
  51. {
  52. [Test]
  53. [Category ("NotWorking")]
  54. public void Ctor1 ()
  55. {
  56. WsdlExporter we = new WsdlExporter ();
  57. Assert.IsNotNull (we.GetGeneratedMetadata ());
  58. Assert.IsNotNull (we.GeneratedWsdlDocuments, "#c1");
  59. Assert.AreEqual (0, we.GeneratedWsdlDocuments.Count, "#c2");
  60. Assert.IsNotNull (we.GeneratedXmlSchemas, "#c3");
  61. Assert.AreEqual (0, we.GeneratedXmlSchemas.Count, "#c4");
  62. }
  63. [Test]
  64. public void ExportEndpointTest ()
  65. {
  66. WsdlExporter we = new WsdlExporter ();
  67. ServiceEndpoint se = new ServiceEndpoint (ContractDescription.GetContract (typeof (IEchoService)));
  68. se.Binding = new BasicHttpBinding ();
  69. se.Address = new EndpointAddress ("http://localhost:8080");
  70. //TEST Invalid name: 5se.Name = "Service#1";
  71. //se.Name = "Service0";
  72. //se.ListenUri = new Uri ("http://localhost:8080/svc");
  73. we.ExportEndpoint (se);
  74. MetadataSet ms = we.GetGeneratedMetadata ();
  75. Assert.AreEqual (6, ms.MetadataSections.Count);
  76. CheckContract_IEchoService (ms, "#eet01");
  77. WSServiceDescription sd = GetServiceDescription (ms, "http://tempuri.org/", "ExportEndpointTest");
  78. CheckServicePort (GetService (sd, "service", "ExportEndpointTest"),
  79. "BasicHttpBinding_IEchoService", new XmlQualifiedName ("BasicHttpBinding_IEchoService", "http://tempuri.org/"),
  80. "http://localhost:8080/", "#eet02");
  81. CheckBasicHttpBinding (sd, "BasicHttpBinding_IEchoService", new XmlQualifiedName ("IEchoService", "http://myns/echo"),
  82. "Echo", "http://myns/echo/IEchoService/Echo", true, true, "#eet03");
  83. }
  84. [Test]
  85. public void ExportEndpointTest2 ()
  86. {
  87. WsdlExporter we = new WsdlExporter ();
  88. ServiceEndpoint se = new ServiceEndpoint (ContractDescription.GetContract (typeof (IEchoService2)));
  89. se.Binding = new BasicHttpBinding ();
  90. se.Address = new EndpointAddress ("http://localhost:8080");
  91. we.ExportEndpoint (se);
  92. MetadataSet ms = we.GetGeneratedMetadata ();
  93. Assert.AreEqual (5, ms.MetadataSections.Count);
  94. WSServiceDescription sd = ms.MetadataSections [0].Metadata as WSServiceDescription;
  95. CheckContract_IEchoService2 (ms, "#eet20");
  96. CheckServicePort (GetService (GetServiceDescription (ms, "http://tempuri.org/", "#eet21"), "service", "ExportEndpointTest"),
  97. "BasicHttpBinding_ThisIsEchoService", new XmlQualifiedName ("BasicHttpBinding_ThisIsEchoService", "http://tempuri.org/"),
  98. "http://localhost:8080/", "#eet22");
  99. CheckBasicHttpBinding (sd, "BasicHttpBinding_ThisIsEchoService",
  100. new XmlQualifiedName ("ThisIsEchoService", "http://tempuri.org/"),
  101. "Echo", "http://tempuri.org/ThisIsEchoService/Echo", true, true, "#eet03");
  102. //FIXME: CheckXmlSchema
  103. }
  104. [Test]
  105. public void ExportEndpointTest3 ()
  106. {
  107. WsdlExporter we = new WsdlExporter ();
  108. /*ContractDescription contract =*/ ContractDescription.GetContract (typeof (IEchoService2));
  109. ServiceEndpoint se = new ServiceEndpoint (ContractDescription.GetContract (typeof (IEchoService2)));
  110. se.Binding = new BasicHttpBinding ();
  111. se.Address = new EndpointAddress ("http://localhost:8080");
  112. we.ExportEndpoint (se);
  113. se = new ServiceEndpoint (ContractDescription.GetContract (typeof (IEchoService)));
  114. se.Binding = new BasicHttpBinding ();
  115. se.Address = new EndpointAddress ("http://somehost");
  116. we.ExportEndpoint (se);
  117. MetadataSet ms = we.GetGeneratedMetadata ();
  118. Assert.AreEqual (7, ms.MetadataSections.Count);
  119. Service svc = GetService (
  120. GetServiceDescription (ms, "http://tempuri.org/", "ExportEndpointTest"),
  121. "service", "ExportEndpointTest");
  122. CheckContract_IEchoService (ms, "#eet31");
  123. CheckServicePort (svc, "BasicHttpBinding_IEchoService",
  124. new XmlQualifiedName ("BasicHttpBinding_IEchoService", "http://tempuri.org/"),
  125. "http://somehost/", "#eet32");
  126. CheckContract_IEchoService2 (ms, "#eet33");
  127. CheckServicePort (svc, "BasicHttpBinding_ThisIsEchoService",
  128. new XmlQualifiedName ("BasicHttpBinding_ThisIsEchoService", "http://tempuri.org/"),
  129. "http://localhost:8080/", "#eet34");
  130. WSServiceDescription sd = ms.MetadataSections [0].Metadata as WSServiceDescription;
  131. CheckBasicHttpBinding (sd, "BasicHttpBinding_IEchoService", new XmlQualifiedName ("IEchoService", "http://myns/echo"),
  132. "Echo", "http://myns/echo/IEchoService/Echo", true, true, "#eet35");
  133. CheckBasicHttpBinding (sd, "BasicHttpBinding_ThisIsEchoService", new XmlQualifiedName ("ThisIsEchoService", "http://tempuri.org/"),
  134. "Echo", "http://tempuri.org/ThisIsEchoService/Echo", true, true, "#eet36");
  135. //FIXME: CheckXmlSchema
  136. }
  137. [Test]
  138. public void ExportContractInvalid1 ()
  139. {
  140. WsdlExporter we = new WsdlExporter ();
  141. we.ExportContract (ContractDescription.GetContract (typeof (IEchoService2)));
  142. //Duplicate contract QNames not allowed
  143. ExportContractExpectException (we, ContractDescription.GetContract (typeof (IEchoService2)),
  144. typeof (ArgumentException), "ExportContractInvalid1");
  145. }
  146. [Test]
  147. public void ExportContractInvalid2 ()
  148. {
  149. WsdlExporter we = new WsdlExporter ();
  150. we.ExportContract (ContractDescription.GetContract (typeof (IEchoService2)));
  151. //Invalid as IEchoService3.Echo is http://tempuri.org/Echo message which has already been exported
  152. //Even though, the service name is different
  153. ExportContractExpectException (we, ContractDescription.GetContract (typeof (IEchoService3)),
  154. typeof (InvalidOperationException), "ExportContractInvalid2");
  155. }
  156. [Test]
  157. public void ExportContract1 ()
  158. {
  159. WsdlExporter we = new WsdlExporter ();
  160. we.ExportContract (ContractDescription.GetContract (typeof (IEchoService)));
  161. MetadataSet ms = we.GetGeneratedMetadata ();
  162. Assert.AreEqual (5, ms.MetadataSections.Count);
  163. CheckContract_IEchoService (ms, "ExportContract1");
  164. }
  165. [Test]
  166. public void ExportContract2 ()
  167. {
  168. WsdlExporter we = new WsdlExporter ();
  169. we.ExportContract (ContractDescription.GetContract (typeof (IFoo1)));
  170. MetadataSet ms = we.GetGeneratedMetadata ();
  171. Assert.AreEqual (5, ms.MetadataSections.Count);
  172. }
  173. [Test]
  174. public void ExportContract2a ()
  175. {
  176. WsdlExporter we = new WsdlExporter ();
  177. we.ExportContract (ContractDescription.GetContract (typeof (IFoo1)));
  178. //IFoo1a.Op1 is the same operations as IFoo1.Op1, so cant be exported
  179. //the message element for both is the same
  180. //(Compared by names not signature)
  181. ExportContractExpectException (we, ContractDescription.GetContract (typeof (IFoo1a)),
  182. typeof (InvalidOperationException), "ExportContract2a");
  183. }
  184. [Test]
  185. [Category ("NotWorking")]
  186. // System.Xml.Schema.XmlSchemaException : XmlSchema error: Named item
  187. // http://schemas.datacontract.org/2004/07/System.Reflection:ArrayOfTypeInfo was already contained
  188. // in the schema object table. Consider setting MONO_STRICT_MS_COMPLIANT to 'yes' to mimic
  189. // MS implementation. Related schema item SourceUri: , Line 0, Position 0.
  190. public void ExportMessageContract ()
  191. {
  192. WsdlExporter we = new WsdlExporter ();
  193. ContractDescription cd = ContractDescription.GetContract (typeof (IFoo2));
  194. we.ExportContract (cd);
  195. }
  196. [Test]
  197. [Category ("NotWorking")]
  198. //FIXME: One check not working, BeginGetResult
  199. public void ExportMexContract ()
  200. {
  201. WsdlExporter we = new WsdlExporter ();
  202. ContractDescription cd = ContractDescription.GetContract (typeof (IMetadataExchange));
  203. we.ExportContract (cd);
  204. MetadataSet ms = we.GetGeneratedMetadata ();
  205. WSServiceDescription sd = GetServiceDescription (ms, "http://schemas.microsoft.com/2006/04/mex", "ExportMexContract");
  206. CheckMessage (sd, "IMetadataExchange_Get_InputMessage", "request", "http://schemas.microsoft.com/Message:MessageBody", true, "#exc0");
  207. CheckMessage (sd, "IMetadataExchange_Get_OutputMessage", "GetResult", "http://schemas.microsoft.com/Message:MessageBody", true, "#exc1");
  208. //PortType
  209. PortType port_type = sd.PortTypes ["IMetadataExchange"];
  210. Assert.IsNotNull (port_type, "#exc2, PortType named IMetadataExchange not found.");
  211. Assert.AreEqual (1, port_type.Operations.Count, "#exc3");
  212. Operation op = port_type.Operations [0];
  213. Assert.AreEqual ("Get", op.Name, "#exc4");
  214. Assert.AreEqual (2, op.Messages.Count, "#exc5");
  215. CheckOperationMessage (op.Messages [0], "http://schemas.microsoft.com/2006/04/mex:IMetadataExchange_Get_InputMessage",
  216. typeof (OperationInput), "http://schemas.xmlsoap.org/ws/2004/09/transfer/Get");
  217. CheckOperationMessage (op.Messages [1], "http://schemas.microsoft.com/2006/04/mex:IMetadataExchange_Get_OutputMessage",
  218. typeof (OperationOutput), "http://schemas.xmlsoap.org/ws/2004/09/transfer/GetResponse");
  219. CheckSpecialMessage (ms, "#exc6");
  220. Assert.AreEqual (1, we.GeneratedWsdlDocuments.Count, "GeneratedWsdlDocuments.Count");
  221. Assert.AreEqual (1, we.GeneratedXmlSchemas.Count, "GeneratedXmlSchemas.Count");
  222. }
  223. [Test]
  224. public void ExportBar1Contract ()
  225. {
  226. WsdlExporter we = new WsdlExporter ();
  227. ContractDescription cd = ContractDescription.GetContract (typeof (Bar1));
  228. we.ExportContract (cd);
  229. }
  230. //Helper methods
  231. //Checks the ComplexType emitted for CLR type Message
  232. void CheckSpecialMessage (MetadataSet ms, string label)
  233. {
  234. //Check ComplexType MessageBody
  235. XmlSchema xs = GetXmlSchema (ms, "http://schemas.microsoft.com/Message", label + " #csm0");
  236. foreach (XmlSchemaObject o in xs.SchemaTypes.Values) {
  237. XmlSchemaComplexType complex_type = o as XmlSchemaComplexType;
  238. if (complex_type == null)
  239. continue;
  240. if (complex_type.Name != "MessageBody")
  241. continue;
  242. //MessageBody
  243. Assert.IsNotNull (complex_type.Particle, label + " #cms1");
  244. Assert.AreEqual (typeof (XmlSchemaSequence), complex_type.Particle.GetType (), label + " #cms2");
  245. XmlSchemaSequence seq = (XmlSchemaSequence) complex_type.Particle;
  246. Assert.AreEqual (1, seq.Items.Count, label + " #cms3");
  247. Assert.AreEqual (typeof (XmlSchemaAny), seq.Items [0].GetType (), label + " #cms4");
  248. XmlSchemaAny any = (XmlSchemaAny) seq.Items [0];
  249. Assert.AreEqual ("##any", any.Namespace, label + " #cms5");
  250. Assert.AreEqual (0, any.MinOccurs, label + " #cms6");
  251. Assert.AreEqual ("unbounded", any.MaxOccursString, label + " #cms6");
  252. }
  253. }
  254. //somebody fix this name!
  255. void ExportContractExpectException (WsdlExporter we, ContractDescription cd, Type exception_type, string msg)
  256. {
  257. try {
  258. we.ExportContract (cd);
  259. } catch (Exception e) {
  260. if (e.GetType () == exception_type)
  261. return;
  262. Assert.Fail (String.Format ("[{0}] Expected {1}, but got : {2}", msg, exception_type, e));
  263. }
  264. Assert.Fail (String.Format ("[{0}] Expected {1}", msg, exception_type));
  265. }
  266. WSServiceDescription GetServiceDescription (MetadataSet ms, string ns, string msg)
  267. {
  268. foreach (MetadataSection section in ms.MetadataSections) {
  269. WSServiceDescription sd = section.Metadata as WSServiceDescription;
  270. if (sd == null)
  271. continue;
  272. if (sd.TargetNamespace == ns) {
  273. /*Assert.AreEqual ("http://schemas.xmlsoap.org/wsdl/", section.Dialect, msg + " Dialect");
  274. Assert.AreEqual (id, section.Identifier, msg + "Identifier");
  275. Assert.AreEqual (0, section.Attributes.Count, "#cw4");*/
  276. return sd;
  277. }
  278. }
  279. Assert.Fail (String.Format ("[{0}] ServiceDescription for ns : {1} not found.", msg, ns));
  280. return null;
  281. }
  282. XmlSchema GetXmlSchema (MetadataSet ms, string ns, string msg)
  283. {
  284. foreach (MetadataSection section in ms.MetadataSections) {
  285. XmlSchema xs = section.Metadata as XmlSchema;
  286. if (xs == null)
  287. continue;
  288. if (xs.TargetNamespace == ns) {
  289. /*Assert.AreEqual ("http://schemas.xmlsoap.org/wxsl/", section.Dialect, msg + " Dialect");
  290. Assert.AreEqual (id, section.Identifier, msg + "Identifier");
  291. Assert.AreEqual (0, section.Attributes.Count, "#cw4");*/
  292. return xs;
  293. }
  294. }
  295. Assert.Fail (String.Format ("[{0}] XmlSchema for tns : {1} not found.", msg, ns));
  296. return null;
  297. }
  298. Service GetService (WSServiceDescription sd, string name, string label)
  299. {
  300. Service ret = sd.Services [name];
  301. if (ret == null)
  302. Assert.Fail (String.Format ("[{0}] Service named '{1}' not found.", label, name));
  303. return ret;
  304. }
  305. WSBinding GetBinding (WSServiceDescription sd, string name, string label)
  306. {
  307. WSBinding ret = sd.Bindings [name];
  308. if (ret == null)
  309. Assert.Fail (String.Format ("[{0}] Binding named '{1}' not found.", label, name));
  310. return ret;
  311. }
  312. OperationBinding GetOperationBinding (WSBinding b, string name, string label)
  313. {
  314. foreach (OperationBinding op in b.Operations)
  315. if (op.Name == name)
  316. return op;
  317. Assert.Fail (String.Format ("[{0}] OperationBinding named '{1}' not found.", label, name));
  318. return null;
  319. }
  320. void CheckBasicHttpBinding (WSServiceDescription wsd, string binding_name, XmlQualifiedName binding_type,
  321. string operation_name, string action, bool has_input, bool has_output, string label)
  322. {
  323. WSBinding b = GetBinding (wsd, binding_name, label);
  324. OperationBinding op = GetOperationBinding (b, operation_name, label + " CheckBasicHttpBinding");
  325. Assert.AreEqual (binding_type, b.Type, label + " #cbh0");
  326. if (has_input) {
  327. InputBinding inb = op.Input;
  328. Assert.IsNotNull (inb, label + " #cbh1");
  329. Assert.AreEqual (1, inb.Extensions.Count, label + " #cbh2");
  330. Assert.AreEqual (typeof (SoapBodyBinding), inb.Extensions [0].GetType (), label + " #cbh3");
  331. SoapBodyBinding soap_binding = (SoapBodyBinding) inb.Extensions [0];
  332. Assert.AreEqual (SoapBindingUse.Literal, soap_binding.Use, label + " #cbh4");
  333. if (action != null) {
  334. Assert.AreEqual (1, op.Extensions.Count, label + " #chb5");
  335. Assert.AreEqual (typeof (SoapOperationBinding), op.Extensions [0].GetType (), label + " #cbh6");
  336. SoapOperationBinding sopb = (SoapOperationBinding) op.Extensions [0];
  337. Assert.AreEqual (action, sopb.SoapAction, label + " #cbh7");
  338. }
  339. }
  340. if (has_output) {
  341. OutputBinding outb = op.Output;
  342. Assert.IsNotNull (outb, label + " #cbh10");
  343. Assert.AreEqual (1, outb.Extensions.Count, label + " #cbh11");
  344. Assert.AreEqual (typeof (SoapBodyBinding), outb.Extensions [0].GetType (), label + " #cbh12");
  345. SoapBodyBinding soap_binding = (SoapBodyBinding) outb.Extensions [0];
  346. Assert.AreEqual (SoapBindingUse.Literal, soap_binding.Use, label + " #cbh13");
  347. }
  348. Assert.AreEqual (1, b.Extensions.Count, label + " #cbh20");
  349. Assert.AreEqual (typeof (SoapBinding), b.Extensions [0].GetType (), label + " #cbh21");
  350. SoapBinding sb = (SoapBinding) b.Extensions [0];
  351. Assert.AreEqual (SoapBinding.HttpTransport, sb.Transport, label + " #cbh22");
  352. }
  353. void CheckServicePort (Service svc, string port_name, XmlQualifiedName binding_name, string address, string label)
  354. {
  355. Port port = svc.Ports [port_name];
  356. Assert.IsNotNull (port, label + " #csp0");
  357. Assert.AreEqual (port.Binding, binding_name, label + " #csp1");
  358. Assert.AreEqual (1, port.Extensions.Count, label + " #csp2");
  359. Assert.AreEqual (typeof (SoapAddressBinding), port.Extensions [0].GetType (), label + " #csp3");
  360. SoapAddressBinding sab = (SoapAddressBinding) port.Extensions [0];
  361. Assert.AreEqual (address, sab.Location, label + " #csp3");
  362. }
  363. void CheckContract_IEchoService2 (MetadataSet ms, string label)
  364. {
  365. WSServiceDescription wsd = GetServiceDescription (ms, "http://tempuri.org/", label + "#a1");
  366. Assert.AreEqual (3, wsd.Messages.Count, "#cw5");
  367. Assert.IsNotNull (wsd.Messages [0]);
  368. // WSMessage m = wsd.Messages [0];
  369. CheckMessage (wsd, "ThisIsEchoService_Echo_InputMessage", "http://tempuri.org/:Echo");
  370. CheckMessage (wsd, "ThisIsEchoService_Echo_OutputMessage", "http://tempuri.org/:EchoResponse");
  371. CheckMessage (wsd, "ThisIsEchoService_DoubleIt_InputMessage", "http://tempuri.org/:DoubleIt");
  372. //PortTypes
  373. Assert.AreEqual (1, wsd.PortTypes.Count, "#cw6");
  374. PortType port = wsd.PortTypes [0];
  375. Assert.AreEqual ("ThisIsEchoService", port.Name, "#cw7");
  376. //Operations
  377. Assert.AreEqual (2, port.Operations.Count, "#cw8");
  378. //Operations [0]
  379. Operation op = port.Operations [0];
  380. Assert.AreEqual ("Echo", op.Name, "#co1");
  381. Assert.AreEqual (0, op.Extensions.Count, "#co2");
  382. Assert.IsNull (op.ParameterOrder, "#co3");
  383. Assert.AreEqual ("", op.ParameterOrderString, "#co4");
  384. Assert.AreEqual (0, op.Faults.Count, "#co5");
  385. //OperationMessages
  386. Assert.AreEqual (2, op.Messages.Count, "#co6");
  387. Assert.AreEqual (OperationFlow.RequestResponse, op.Messages.Flow, "#co7");
  388. CheckOperationMessage (op.Messages [0], "http://tempuri.org/:ThisIsEchoService_Echo_InputMessage",
  389. typeof (OperationInput), "http://tempuri.org/ThisIsEchoService/Echo");
  390. CheckOperationMessage (op.Messages [1], "http://tempuri.org/:ThisIsEchoService_Echo_OutputMessage",
  391. typeof (OperationOutput), "http://tempuri.org/ThisIsEchoService/EchoResponse");
  392. op = port.Operations [1];
  393. Assert.AreEqual ("DoubleIt", op.Name, "#co8");
  394. Assert.AreEqual (0, op.Extensions.Count, "#co9");
  395. Assert.IsNull (op.ParameterOrder, "#co10");
  396. Assert.AreEqual ("", op.ParameterOrderString, "#co11");
  397. Assert.AreEqual (0, op.Faults.Count, "#co12");
  398. //OperationMessages
  399. Assert.AreEqual (1, op.Messages.Count, "#co13");
  400. Assert.AreEqual (OperationFlow.OneWay, op.Messages.Flow, "#co14");
  401. CheckOperationMessage (op.Messages [0], "http://tempuri.org/:ThisIsEchoService_DoubleIt_InputMessage",
  402. typeof (OperationInput), "http://tempuri.org/ThisIsEchoService/DoubleIt");
  403. /* FIXME: Assert.AreEqual (1, wsd.Types.Schemas.Count, "#co20");
  404. XmlSchema xs = wsd.Types.Schemas [0];
  405. Assert.AreEqual (4, xs.Includes.Count);
  406. //FIXME: Check the imports.. */
  407. }
  408. void CheckContract_IEchoService (MetadataSet ms, string label)
  409. {
  410. WSServiceDescription wsd = GetServiceDescription (ms, "http://myns/echo", label + "#a0");
  411. Assert.AreEqual (4, wsd.Messages.Count, "#cw5");
  412. Assert.IsNotNull (wsd.Messages [0]);
  413. //WSMessage m = wsd.Messages [0];
  414. CheckMessage (wsd, "IEchoService_Echo_InputMessage", "http://myns/echo:Echo");
  415. CheckMessage (wsd, "IEchoService_Echo_OutputMessage", "http://myns/echo:EchoResponse");
  416. CheckMessage (wsd, "IEchoService_DoubleIt_InputMessage", "http://myns/echo:DoubleIt");
  417. CheckMessage (wsd, "IEchoService_DoubleIt_OutputMessage", "http://myns/echo:DoubleItResponse");
  418. //PortTypes
  419. Assert.AreEqual (1, wsd.PortTypes.Count, "#cw6");
  420. PortType port = wsd.PortTypes [0];
  421. Assert.AreEqual ("IEchoService", port.Name, "#cw7");
  422. //Operations
  423. Assert.AreEqual (2, port.Operations.Count, "#cw8");
  424. //Operations [0]
  425. Operation op = port.Operations [0];
  426. Assert.AreEqual ("Echo", op.Name, "#co1");
  427. Assert.AreEqual (0, op.Extensions.Count, "#co2");
  428. Assert.IsNull (op.ParameterOrder, "#co3");
  429. Assert.AreEqual ("", op.ParameterOrderString, "#co4");
  430. Assert.AreEqual (0, op.Faults.Count, "#co5");
  431. //OperationMessages
  432. Assert.AreEqual (2, op.Messages.Count, "#co6");
  433. Assert.AreEqual (OperationFlow.RequestResponse, op.Messages.Flow, "#co7");
  434. CheckOperationMessage (op.Messages [0], "http://myns/echo:IEchoService_Echo_InputMessage", typeof (OperationInput), "http://myns/echo/IEchoService/Echo");
  435. CheckOperationMessage (op.Messages [1], "http://myns/echo:IEchoService_Echo_OutputMessage", typeof (OperationOutput), "http://myns/echo/IEchoService/EchoResponse");
  436. op = port.Operations [1];
  437. Assert.AreEqual ("DoubleIt", op.Name, "#co8");
  438. Assert.AreEqual (0, op.Extensions.Count, "#co9");
  439. Assert.IsNull (op.ParameterOrder, "#co10");
  440. Assert.AreEqual ("", op.ParameterOrderString, "#co11");
  441. Assert.AreEqual (0, op.Faults.Count, "#co12");
  442. //OperationMessages
  443. Assert.AreEqual (2, op.Messages.Count, "#co13");
  444. Assert.AreEqual (OperationFlow.RequestResponse, op.Messages.Flow, "#co14");
  445. CheckOperationMessage (op.Messages [0], "http://myns/echo:IEchoService_DoubleIt_InputMessage", typeof (OperationInput), "http://myns/echo/IEchoService/DoubleIt");
  446. CheckOperationMessage (op.Messages [1], "http://myns/echo:IEchoService_DoubleIt_OutputMessage", typeof (OperationOutput), "http://myns/echo/IEchoService/DoubleItResponse");
  447. /* FIXME: Assert.AreEqual (1, wsd.Types.Schemas.Count, "#co20");
  448. XmlSchema xs = wsd.Types.Schemas [0];
  449. Assert.AreEqual (4, xs.Includes.Count);
  450. //FIXME: Check the imports.. */
  451. }
  452. void CheckOperationMessage (OperationMessage opmsg, string msg, Type type, string action)
  453. {
  454. Assert.AreEqual (type, opmsg.GetType (), "#com1");
  455. Assert.AreEqual (msg, opmsg.Message.ToString (), "#com2");
  456. Assert.AreEqual (0, opmsg.Extensions.Count, "#com3");
  457. Assert.AreEqual (1, opmsg.ExtensibleAttributes.Length, "#com4");
  458. Assert.IsNull (opmsg.Name, "#com5");
  459. XmlAttribute attr = opmsg.ExtensibleAttributes [0];
  460. Assert.AreEqual ("Action", attr.LocalName, "#ca1");
  461. Assert.AreEqual ("http://www.w3.org/2006/05/addressing/wsdl", attr.NamespaceURI, "#ca2");
  462. Assert.AreEqual (action, attr.Value, "#ca3");
  463. }
  464. void CheckMessage (WSServiceDescription sd, string msg_name, string part_type)
  465. {
  466. CheckMessage (sd, msg_name, "parameters", part_type, false, "");
  467. }
  468. void CheckMessage (WSServiceDescription sd, string msg_name, string part_name, string part_type, bool is_type, string label)
  469. {
  470. WSMessage m = sd.Messages [msg_name];
  471. Assert.IsNotNull (m, label + " : Message named " + msg_name + " not found.");
  472. Assert.AreEqual (msg_name, m.Name, label + " #cm1");
  473. Assert.AreEqual (0, m.Extensions.Count, label + " #cm2");
  474. Assert.IsNull (m.ExtensibleAttributes, label + " #cm3a");
  475. Assert.AreEqual (1, m.Parts.Count, label + " #cm3");
  476. Assert.AreEqual (part_name, m.Parts [0].Name, label + " #cm9");
  477. if (is_type) {
  478. Assert.AreEqual ("", m.Parts [0].Element.ToString (), label + " #cm4");
  479. Assert.AreEqual (part_type, m.Parts [0].Type.ToString (), label + " #cm4a");
  480. } else {
  481. Assert.AreEqual ("", m.Parts [0].Type.ToString (), label + " #cm5");
  482. Assert.AreEqual (part_type, m.Parts [0].Element.ToString (), label + " #cm5a");
  483. }
  484. Assert.IsNull (m.Parts [0].ExtensibleAttributes, label + " #cm6");
  485. Assert.AreEqual (0, m.Parts [0].Extensions.Count, label + " #cm7");
  486. }
  487. void WriteTo (WsdlExporter we, string name)
  488. {
  489. using (XmlTextWriter xw = new XmlTextWriter (name, Encoding.UTF8)) {
  490. xw.Formatting = Formatting.Indented;
  491. we.GetGeneratedMetadata ().WriteTo (xw);
  492. }
  493. }
  494. [Test]
  495. public void ExportEndpointTest5 () {
  496. WsdlExporter we = new WsdlExporter ();
  497. ServiceEndpoint se = new ServiceEndpoint (ContractDescription.GetContract (typeof (IEchoService)));
  498. se.Binding = new BasicHttpBinding ();
  499. se.Address = new EndpointAddress ("http://localhost:8080");
  500. we.ExportEndpoint (se);
  501. MetadataSet ms = we.GetGeneratedMetadata ();
  502. Assert.AreEqual (6, ms.MetadataSections.Count);
  503. WSServiceDescription wsd = GetServiceDescription (ms, "http://tempuri.org/", "ExportEndpointTest5#1");
  504. SoapBinding soapBinding = (SoapBinding) wsd.Bindings [0].Extensions [0];
  505. Assert.AreEqual (SoapBindingStyle.Document, soapBinding.Style, "soapBinding.Style");
  506. Assert.AreEqual (SoapBinding.HttpTransport, soapBinding.Transport, "soapBinding.Transport");
  507. }
  508. }
  509. [DataContract]
  510. public class dc
  511. {
  512. [DataMember]
  513. string foo;
  514. /* [DataMember]
  515. dc me;
  516. [DataMember]
  517. some_enum en;
  518. [DataMember]
  519. NotReferenced nr;*/
  520. [DataMember]
  521. public FooNS.bar bb;
  522. }
  523. [ServiceContract (Namespace = "http://myns/echo")]
  524. public interface IEchoService
  525. {
  526. [OperationContract]
  527. string Echo (string msg, int num, dc d);
  528. [OperationContract]
  529. void DoubleIt (int it, string prefix);
  530. /*[OperationContract]
  531. void foo ();*/
  532. }
  533. [ServiceContract (Name = "ThisIsEchoService")]
  534. public interface IEchoService2
  535. {
  536. [OperationContract]
  537. string Echo (string msg, int num, dc d);
  538. [OperationContract (IsOneWay = true)]
  539. void DoubleIt (int it, string prefix);
  540. /*[OperationContract]
  541. void foo ();*/
  542. }
  543. [ServiceContract (Name = "AnotherService")]
  544. public interface IEchoService3
  545. {
  546. [OperationContract]
  547. string Echo (string msg, int num, dc d);
  548. [OperationContract (IsOneWay = true)]
  549. void DoubleIt (int it, string prefix);
  550. /*[OperationContract]
  551. void foo ();*/
  552. }
  553. [ServiceContract]
  554. public class Bar1
  555. {
  556. [OperationContract]
  557. public void Foo (SMMessage msg, string s)
  558. {
  559. }
  560. }
  561. [ServiceContract]
  562. public interface IFoo1
  563. {
  564. //Same DataContract used in different operations
  565. [OperationContract]
  566. void Op1 (dc d);
  567. [OperationContract]
  568. void Op2 (dc d);
  569. }
  570. //Used to check whether both IFoo1 & IFoo1a
  571. //can be exported
  572. //Operations are not Service scoped
  573. [ServiceContract]
  574. public interface IFoo1a
  575. {
  576. [OperationContract]
  577. void Op1 (string s);
  578. }
  579. [ServiceContract]
  580. public interface IFoo2
  581. {
  582. // FIXME: it does not pass yet
  583. [OperationContract]
  584. OregoMessage Nanoda (OregoMessage msg);
  585. // FIXME: it does not pass yet
  586. [OperationContract]
  587. Mona NewMona (Mona source);
  588. }
  589. [MessageContract]
  590. public class OregoMessage
  591. {
  592. [MessageBodyMember]
  593. public string Neutral;
  594. [MessageBodyMember]
  595. public Assembly Huh;
  596. [MessageBodyMember] // it should be ignored ...
  597. public string Setter { set { } }
  598. public string NonMember;
  599. }
  600. [DataContract]
  601. public class Mona
  602. {
  603. [DataMember]
  604. public string OmaeMona;
  605. [DataMember]
  606. public string OreMona;
  607. }
  608. }
  609. namespace FooNS
  610. {
  611. [DataContract]
  612. public class bar
  613. {
  614. [DataMember]
  615. public string foo;
  616. }
  617. }