WsdlExporterTest.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765
  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. public void ExportMessageContract ()
  186. {
  187. WsdlExporter we = new WsdlExporter ();
  188. ContractDescription cd = ContractDescription.GetContract (typeof (IFoo2));
  189. we.ExportContract (cd);
  190. }
  191. [Test]
  192. [Category ("NotWorking")]
  193. //FIXME: One check not working, BeginGetResult
  194. public void ExportMexContract ()
  195. {
  196. WsdlExporter we = new WsdlExporter ();
  197. ContractDescription cd = ContractDescription.GetContract (typeof (IMetadataExchange));
  198. we.ExportContract (cd);
  199. MetadataSet ms = we.GetGeneratedMetadata ();
  200. WSServiceDescription sd = GetServiceDescription (ms, "http://schemas.microsoft.com/2006/04/mex", "ExportMexContract");
  201. CheckMessage (sd, "IMetadataExchange_Get_InputMessage", "request", "http://schemas.microsoft.com/Message:MessageBody", true, "#exc0");
  202. CheckMessage (sd, "IMetadataExchange_Get_OutputMessage", "GetResult", "http://schemas.microsoft.com/Message:MessageBody", true, "#exc1");
  203. //PortType
  204. PortType port_type = sd.PortTypes ["IMetadataExchange"];
  205. Assert.IsNotNull (port_type, "#exc2, PortType named IMetadataExchange not found.");
  206. Assert.AreEqual (1, port_type.Operations.Count, "#exc3");
  207. Operation op = port_type.Operations [0];
  208. Assert.AreEqual ("Get", op.Name, "#exc4");
  209. Assert.AreEqual (2, op.Messages.Count, "#exc5");
  210. CheckOperationMessage (op.Messages [0], "http://schemas.microsoft.com/2006/04/mex:IMetadataExchange_Get_InputMessage",
  211. typeof (OperationInput), "http://schemas.xmlsoap.org/ws/2004/09/transfer/Get");
  212. CheckOperationMessage (op.Messages [1], "http://schemas.microsoft.com/2006/04/mex:IMetadataExchange_Get_OutputMessage",
  213. typeof (OperationOutput), "http://schemas.xmlsoap.org/ws/2004/09/transfer/GetResponse");
  214. CheckSpecialMessage (ms, "#exc6");
  215. Assert.AreEqual (1, we.GeneratedWsdlDocuments.Count, "GeneratedWsdlDocuments.Count");
  216. Assert.AreEqual (1, we.GeneratedXmlSchemas.Count, "GeneratedXmlSchemas.Count");
  217. }
  218. [Test]
  219. public void ExportBar1Contract ()
  220. {
  221. WsdlExporter we = new WsdlExporter ();
  222. ContractDescription cd = ContractDescription.GetContract (typeof (Bar1));
  223. we.ExportContract (cd);
  224. }
  225. //Helper methods
  226. //Checks the ComplexType emitted for CLR type Message
  227. void CheckSpecialMessage (MetadataSet ms, string label)
  228. {
  229. //Check ComplexType MessageBody
  230. XmlSchema xs = GetXmlSchema (ms, "http://schemas.microsoft.com/Message", label + " #csm0");
  231. foreach (XmlSchemaObject o in xs.SchemaTypes.Values) {
  232. XmlSchemaComplexType complex_type = o as XmlSchemaComplexType;
  233. if (complex_type == null)
  234. continue;
  235. if (complex_type.Name != "MessageBody")
  236. continue;
  237. //MessageBody
  238. Assert.IsNotNull (complex_type.Particle, label + " #cms1");
  239. Assert.AreEqual (typeof (XmlSchemaSequence), complex_type.Particle.GetType (), label + " #cms2");
  240. XmlSchemaSequence seq = (XmlSchemaSequence) complex_type.Particle;
  241. Assert.AreEqual (1, seq.Items.Count, label + " #cms3");
  242. Assert.AreEqual (typeof (XmlSchemaAny), seq.Items [0].GetType (), label + " #cms4");
  243. XmlSchemaAny any = (XmlSchemaAny) seq.Items [0];
  244. Assert.AreEqual ("##any", any.Namespace, label + " #cms5");
  245. Assert.AreEqual (0, any.MinOccurs, label + " #cms6");
  246. Assert.AreEqual ("unbounded", any.MaxOccursString, label + " #cms6");
  247. }
  248. }
  249. //somebody fix this name!
  250. void ExportContractExpectException (WsdlExporter we, ContractDescription cd, Type exception_type, string msg)
  251. {
  252. try {
  253. we.ExportContract (cd);
  254. } catch (Exception e) {
  255. if (e.GetType () == exception_type)
  256. return;
  257. Assert.Fail (String.Format ("[{0}] Expected {1}, but got : {2}", msg, exception_type, e));
  258. }
  259. Assert.Fail (String.Format ("[{0}] Expected {1}", msg, exception_type));
  260. }
  261. WSServiceDescription GetServiceDescription (MetadataSet ms, string ns, string msg)
  262. {
  263. foreach (MetadataSection section in ms.MetadataSections) {
  264. WSServiceDescription sd = section.Metadata as WSServiceDescription;
  265. if (sd == null)
  266. continue;
  267. if (sd.TargetNamespace == ns) {
  268. /*Assert.AreEqual ("http://schemas.xmlsoap.org/wsdl/", section.Dialect, msg + " Dialect");
  269. Assert.AreEqual (id, section.Identifier, msg + "Identifier");
  270. Assert.AreEqual (0, section.Attributes.Count, "#cw4");*/
  271. return sd;
  272. }
  273. }
  274. Assert.Fail (String.Format ("[{0}] ServiceDescription for ns : {1} not found.", msg, ns));
  275. return null;
  276. }
  277. XmlSchema GetXmlSchema (MetadataSet ms, string ns, string msg)
  278. {
  279. foreach (MetadataSection section in ms.MetadataSections) {
  280. XmlSchema xs = section.Metadata as XmlSchema;
  281. if (xs == null)
  282. continue;
  283. if (xs.TargetNamespace == ns) {
  284. /*Assert.AreEqual ("http://schemas.xmlsoap.org/wxsl/", section.Dialect, msg + " Dialect");
  285. Assert.AreEqual (id, section.Identifier, msg + "Identifier");
  286. Assert.AreEqual (0, section.Attributes.Count, "#cw4");*/
  287. return xs;
  288. }
  289. }
  290. Assert.Fail (String.Format ("[{0}] XmlSchema for tns : {1} not found.", msg, ns));
  291. return null;
  292. }
  293. Service GetService (WSServiceDescription sd, string name, string label)
  294. {
  295. Service ret = sd.Services [name];
  296. if (ret == null)
  297. Assert.Fail (String.Format ("[{0}] Service named '{1}' not found.", label, name));
  298. return ret;
  299. }
  300. WSBinding GetBinding (WSServiceDescription sd, string name, string label)
  301. {
  302. WSBinding ret = sd.Bindings [name];
  303. if (ret == null)
  304. Assert.Fail (String.Format ("[{0}] Binding named '{1}' not found.", label, name));
  305. return ret;
  306. }
  307. OperationBinding GetOperationBinding (WSBinding b, string name, string label)
  308. {
  309. foreach (OperationBinding op in b.Operations)
  310. if (op.Name == name)
  311. return op;
  312. Assert.Fail (String.Format ("[{0}] OperationBinding named '{1}' not found.", label, name));
  313. return null;
  314. }
  315. void CheckBasicHttpBinding (WSServiceDescription wsd, string binding_name, XmlQualifiedName binding_type,
  316. string operation_name, string action, bool has_input, bool has_output, string label)
  317. {
  318. WSBinding b = GetBinding (wsd, binding_name, label);
  319. OperationBinding op = GetOperationBinding (b, operation_name, label + " CheckBasicHttpBinding");
  320. Assert.AreEqual (binding_type, b.Type, label + " #cbh0");
  321. if (has_input) {
  322. InputBinding inb = op.Input;
  323. Assert.IsNotNull (inb, label + " #cbh1");
  324. Assert.AreEqual (1, inb.Extensions.Count, label + " #cbh2");
  325. Assert.AreEqual (typeof (SoapBodyBinding), inb.Extensions [0].GetType (), label + " #cbh3");
  326. SoapBodyBinding soap_binding = (SoapBodyBinding) inb.Extensions [0];
  327. Assert.AreEqual (SoapBindingUse.Literal, soap_binding.Use, label + " #cbh4");
  328. if (action != null) {
  329. Assert.AreEqual (1, op.Extensions.Count, label + " #chb5");
  330. Assert.AreEqual (typeof (SoapOperationBinding), op.Extensions [0].GetType (), label + " #cbh6");
  331. SoapOperationBinding sopb = (SoapOperationBinding) op.Extensions [0];
  332. Assert.AreEqual (action, sopb.SoapAction, label + " #cbh7");
  333. }
  334. }
  335. if (has_output) {
  336. OutputBinding outb = op.Output;
  337. Assert.IsNotNull (outb, label + " #cbh10");
  338. Assert.AreEqual (1, outb.Extensions.Count, label + " #cbh11");
  339. Assert.AreEqual (typeof (SoapBodyBinding), outb.Extensions [0].GetType (), label + " #cbh12");
  340. SoapBodyBinding soap_binding = (SoapBodyBinding) outb.Extensions [0];
  341. Assert.AreEqual (SoapBindingUse.Literal, soap_binding.Use, label + " #cbh13");
  342. }
  343. Assert.AreEqual (1, b.Extensions.Count, label + " #cbh20");
  344. Assert.AreEqual (typeof (SoapBinding), b.Extensions [0].GetType (), label + " #cbh21");
  345. SoapBinding sb = (SoapBinding) b.Extensions [0];
  346. Assert.AreEqual (SoapBinding.HttpTransport, sb.Transport, label + " #cbh22");
  347. }
  348. void CheckServicePort (Service svc, string port_name, XmlQualifiedName binding_name, string address, string label)
  349. {
  350. Port port = svc.Ports [port_name];
  351. Assert.IsNotNull (port, label + " #csp0");
  352. Assert.AreEqual (port.Binding, binding_name, label + " #csp1");
  353. Assert.AreEqual (1, port.Extensions.Count, label + " #csp2");
  354. Assert.AreEqual (typeof (SoapAddressBinding), port.Extensions [0].GetType (), label + " #csp3");
  355. SoapAddressBinding sab = (SoapAddressBinding) port.Extensions [0];
  356. Assert.AreEqual (address, sab.Location, label + " #csp3");
  357. }
  358. void CheckContract_IEchoService2 (MetadataSet ms, string label)
  359. {
  360. WSServiceDescription wsd = GetServiceDescription (ms, "http://tempuri.org/", label + "#a1");
  361. Assert.AreEqual (3, wsd.Messages.Count, "#cw5");
  362. Assert.IsNotNull (wsd.Messages [0]);
  363. // WSMessage m = wsd.Messages [0];
  364. CheckMessage (wsd, "ThisIsEchoService_Echo_InputMessage", "http://tempuri.org/:Echo");
  365. CheckMessage (wsd, "ThisIsEchoService_Echo_OutputMessage", "http://tempuri.org/:EchoResponse");
  366. CheckMessage (wsd, "ThisIsEchoService_DoubleIt_InputMessage", "http://tempuri.org/:DoubleIt");
  367. //PortTypes
  368. Assert.AreEqual (1, wsd.PortTypes.Count, "#cw6");
  369. PortType port = wsd.PortTypes [0];
  370. Assert.AreEqual ("ThisIsEchoService", port.Name, "#cw7");
  371. //Operations
  372. Assert.AreEqual (2, port.Operations.Count, "#cw8");
  373. //Operations [0]
  374. Operation op = port.Operations [0];
  375. Assert.AreEqual ("Echo", op.Name, "#co1");
  376. Assert.AreEqual (0, op.Extensions.Count, "#co2");
  377. Assert.IsNull (op.ParameterOrder, "#co3");
  378. Assert.AreEqual ("", op.ParameterOrderString, "#co4");
  379. Assert.AreEqual (0, op.Faults.Count, "#co5");
  380. //OperationMessages
  381. Assert.AreEqual (2, op.Messages.Count, "#co6");
  382. Assert.AreEqual (OperationFlow.RequestResponse, op.Messages.Flow, "#co7");
  383. CheckOperationMessage (op.Messages [0], "http://tempuri.org/:ThisIsEchoService_Echo_InputMessage",
  384. typeof (OperationInput), "http://tempuri.org/ThisIsEchoService/Echo");
  385. CheckOperationMessage (op.Messages [1], "http://tempuri.org/:ThisIsEchoService_Echo_OutputMessage",
  386. typeof (OperationOutput), "http://tempuri.org/ThisIsEchoService/EchoResponse");
  387. op = port.Operations [1];
  388. Assert.AreEqual ("DoubleIt", op.Name, "#co8");
  389. Assert.AreEqual (0, op.Extensions.Count, "#co9");
  390. Assert.IsNull (op.ParameterOrder, "#co10");
  391. Assert.AreEqual ("", op.ParameterOrderString, "#co11");
  392. Assert.AreEqual (0, op.Faults.Count, "#co12");
  393. //OperationMessages
  394. Assert.AreEqual (1, op.Messages.Count, "#co13");
  395. Assert.AreEqual (OperationFlow.OneWay, op.Messages.Flow, "#co14");
  396. CheckOperationMessage (op.Messages [0], "http://tempuri.org/:ThisIsEchoService_DoubleIt_InputMessage",
  397. typeof (OperationInput), "http://tempuri.org/ThisIsEchoService/DoubleIt");
  398. /* FIXME: Assert.AreEqual (1, wsd.Types.Schemas.Count, "#co20");
  399. XmlSchema xs = wsd.Types.Schemas [0];
  400. Assert.AreEqual (4, xs.Includes.Count);
  401. //FIXME: Check the imports.. */
  402. }
  403. void CheckContract_IEchoService (MetadataSet ms, string label)
  404. {
  405. WSServiceDescription wsd = GetServiceDescription (ms, "http://myns/echo", label + "#a0");
  406. Assert.AreEqual (4, wsd.Messages.Count, "#cw5");
  407. Assert.IsNotNull (wsd.Messages [0]);
  408. //WSMessage m = wsd.Messages [0];
  409. CheckMessage (wsd, "IEchoService_Echo_InputMessage", "http://myns/echo:Echo");
  410. CheckMessage (wsd, "IEchoService_Echo_OutputMessage", "http://myns/echo:EchoResponse");
  411. CheckMessage (wsd, "IEchoService_DoubleIt_InputMessage", "http://myns/echo:DoubleIt");
  412. CheckMessage (wsd, "IEchoService_DoubleIt_OutputMessage", "http://myns/echo:DoubleItResponse");
  413. //PortTypes
  414. Assert.AreEqual (1, wsd.PortTypes.Count, "#cw6");
  415. PortType port = wsd.PortTypes [0];
  416. Assert.AreEqual ("IEchoService", port.Name, "#cw7");
  417. //Operations
  418. Assert.AreEqual (2, port.Operations.Count, "#cw8");
  419. //Operations [0]
  420. Operation op = port.Operations [0];
  421. Assert.AreEqual ("Echo", op.Name, "#co1");
  422. Assert.AreEqual (0, op.Extensions.Count, "#co2");
  423. Assert.IsNull (op.ParameterOrder, "#co3");
  424. Assert.AreEqual ("", op.ParameterOrderString, "#co4");
  425. Assert.AreEqual (0, op.Faults.Count, "#co5");
  426. //OperationMessages
  427. Assert.AreEqual (2, op.Messages.Count, "#co6");
  428. Assert.AreEqual (OperationFlow.RequestResponse, op.Messages.Flow, "#co7");
  429. CheckOperationMessage (op.Messages [0], "http://myns/echo:IEchoService_Echo_InputMessage", typeof (OperationInput), "http://myns/echo/IEchoService/Echo");
  430. CheckOperationMessage (op.Messages [1], "http://myns/echo:IEchoService_Echo_OutputMessage", typeof (OperationOutput), "http://myns/echo/IEchoService/EchoResponse");
  431. op = port.Operations [1];
  432. Assert.AreEqual ("DoubleIt", op.Name, "#co8");
  433. Assert.AreEqual (0, op.Extensions.Count, "#co9");
  434. Assert.IsNull (op.ParameterOrder, "#co10");
  435. Assert.AreEqual ("", op.ParameterOrderString, "#co11");
  436. Assert.AreEqual (0, op.Faults.Count, "#co12");
  437. //OperationMessages
  438. Assert.AreEqual (2, op.Messages.Count, "#co13");
  439. Assert.AreEqual (OperationFlow.RequestResponse, op.Messages.Flow, "#co14");
  440. CheckOperationMessage (op.Messages [0], "http://myns/echo:IEchoService_DoubleIt_InputMessage", typeof (OperationInput), "http://myns/echo/IEchoService/DoubleIt");
  441. CheckOperationMessage (op.Messages [1], "http://myns/echo:IEchoService_DoubleIt_OutputMessage", typeof (OperationOutput), "http://myns/echo/IEchoService/DoubleItResponse");
  442. /* FIXME: Assert.AreEqual (1, wsd.Types.Schemas.Count, "#co20");
  443. XmlSchema xs = wsd.Types.Schemas [0];
  444. Assert.AreEqual (4, xs.Includes.Count);
  445. //FIXME: Check the imports.. */
  446. }
  447. void CheckOperationMessage (OperationMessage opmsg, string msg, Type type, string action)
  448. {
  449. Assert.AreEqual (type, opmsg.GetType (), "#com1");
  450. Assert.AreEqual (msg, opmsg.Message.ToString (), "#com2");
  451. Assert.AreEqual (0, opmsg.Extensions.Count, "#com3");
  452. Assert.AreEqual (1, opmsg.ExtensibleAttributes.Length, "#com4");
  453. Assert.IsNull (opmsg.Name, "#com5");
  454. XmlAttribute attr = opmsg.ExtensibleAttributes [0];
  455. Assert.AreEqual ("Action", attr.LocalName, "#ca1");
  456. Assert.AreEqual ("http://www.w3.org/2006/05/addressing/wsdl", attr.NamespaceURI, "#ca2");
  457. Assert.AreEqual (action, attr.Value, "#ca3");
  458. }
  459. void CheckMessage (WSServiceDescription sd, string msg_name, string part_type)
  460. {
  461. CheckMessage (sd, msg_name, "parameters", part_type, false, "");
  462. }
  463. void CheckMessage (WSServiceDescription sd, string msg_name, string part_name, string part_type, bool is_type, string label)
  464. {
  465. WSMessage m = sd.Messages [msg_name];
  466. Assert.IsNotNull (m, label + " : Message named " + msg_name + " not found.");
  467. Assert.AreEqual (msg_name, m.Name, label + " #cm1");
  468. Assert.AreEqual (0, m.Extensions.Count, label + " #cm2");
  469. Assert.IsNull (m.ExtensibleAttributes, label + " #cm3a");
  470. Assert.AreEqual (1, m.Parts.Count, label + " #cm3");
  471. Assert.AreEqual (part_name, m.Parts [0].Name, label + " #cm9");
  472. if (is_type) {
  473. Assert.AreEqual ("", m.Parts [0].Element.ToString (), label + " #cm4");
  474. Assert.AreEqual (part_type, m.Parts [0].Type.ToString (), label + " #cm4a");
  475. } else {
  476. Assert.AreEqual ("", m.Parts [0].Type.ToString (), label + " #cm5");
  477. Assert.AreEqual (part_type, m.Parts [0].Element.ToString (), label + " #cm5a");
  478. }
  479. Assert.IsNull (m.Parts [0].ExtensibleAttributes, label + " #cm6");
  480. Assert.AreEqual (0, m.Parts [0].Extensions.Count, label + " #cm7");
  481. }
  482. void WriteTo (WsdlExporter we, string name)
  483. {
  484. using (XmlTextWriter xw = new XmlTextWriter (name, Encoding.UTF8)) {
  485. xw.Formatting = Formatting.Indented;
  486. we.GetGeneratedMetadata ().WriteTo (xw);
  487. }
  488. }
  489. [Test]
  490. public void ExportEndpointTest5 () {
  491. WsdlExporter we = new WsdlExporter ();
  492. ServiceEndpoint se = new ServiceEndpoint (ContractDescription.GetContract (typeof (IEchoService)));
  493. se.Binding = new BasicHttpBinding ();
  494. se.Address = new EndpointAddress ("http://localhost:8080");
  495. we.ExportEndpoint (se);
  496. MetadataSet ms = we.GetGeneratedMetadata ();
  497. Assert.AreEqual (6, ms.MetadataSections.Count);
  498. WSServiceDescription wsd = GetServiceDescription (ms, "http://tempuri.org/", "ExportEndpointTest5#1");
  499. SoapBinding soapBinding = (SoapBinding) wsd.Bindings [0].Extensions [0];
  500. Assert.AreEqual (SoapBindingStyle.Document, soapBinding.Style, "soapBinding.Style");
  501. Assert.AreEqual (SoapBinding.HttpTransport, soapBinding.Transport, "soapBinding.Transport");
  502. }
  503. }
  504. [DataContract]
  505. public class dc
  506. {
  507. [DataMember]
  508. string foo;
  509. /* [DataMember]
  510. dc me;
  511. [DataMember]
  512. some_enum en;
  513. [DataMember]
  514. NotReferenced nr;*/
  515. [DataMember]
  516. public FooNS.bar bb;
  517. }
  518. [ServiceContract (Namespace = "http://myns/echo")]
  519. public interface IEchoService
  520. {
  521. [OperationContract]
  522. string Echo (string msg, int num, dc d);
  523. [OperationContract]
  524. void DoubleIt (int it, string prefix);
  525. /*[OperationContract]
  526. void foo ();*/
  527. }
  528. [ServiceContract (Name = "ThisIsEchoService")]
  529. public interface IEchoService2
  530. {
  531. [OperationContract]
  532. string Echo (string msg, int num, dc d);
  533. [OperationContract (IsOneWay = true)]
  534. void DoubleIt (int it, string prefix);
  535. /*[OperationContract]
  536. void foo ();*/
  537. }
  538. [ServiceContract (Name = "AnotherService")]
  539. public interface IEchoService3
  540. {
  541. [OperationContract]
  542. string Echo (string msg, int num, dc d);
  543. [OperationContract (IsOneWay = true)]
  544. void DoubleIt (int it, string prefix);
  545. /*[OperationContract]
  546. void foo ();*/
  547. }
  548. [ServiceContract]
  549. public class Bar1
  550. {
  551. [OperationContract]
  552. public void Foo (SMMessage msg, string s)
  553. {
  554. }
  555. }
  556. [ServiceContract]
  557. public interface IFoo1
  558. {
  559. //Same DataContract used in different operations
  560. [OperationContract]
  561. void Op1 (dc d);
  562. [OperationContract]
  563. void Op2 (dc d);
  564. }
  565. //Used to check whether both IFoo1 & IFoo1a
  566. //can be exported
  567. //Operations are not Service scoped
  568. [ServiceContract]
  569. public interface IFoo1a
  570. {
  571. [OperationContract]
  572. void Op1 (string s);
  573. }
  574. [ServiceContract]
  575. public interface IFoo2
  576. {
  577. // FIXME: it does not pass yet
  578. [OperationContract]
  579. OregoMessage Nanoda (OregoMessage msg);
  580. // FIXME: it does not pass yet
  581. [OperationContract]
  582. Mona NewMona (Mona source);
  583. }
  584. [MessageContract]
  585. public class OregoMessage
  586. {
  587. [MessageBodyMember]
  588. public string Neutral;
  589. [MessageBodyMember]
  590. public Assembly Huh;
  591. [MessageBodyMember] // it should be ignored ...
  592. public string Setter { set { } }
  593. public string NonMember;
  594. }
  595. [DataContract]
  596. public class Mona
  597. {
  598. [DataMember]
  599. public string OmaeMona;
  600. [DataMember]
  601. public string OreMona;
  602. }
  603. }
  604. namespace FooNS
  605. {
  606. [DataContract]
  607. public class bar
  608. {
  609. [DataMember]
  610. public string foo;
  611. }
  612. }