XmlDsigXsltTransformTest.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. //
  2. // XmlDsigXsltTransformTest.cs - NUnit Test Cases for XmlDsigXsltTransform
  3. //
  4. // Author:
  5. // Sebastien Pouliot <[email protected]>
  6. // Atsushi Enomoto <[email protected]>
  7. //
  8. // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
  9. // (C) 2004 Novell (http://www.novell.com)
  10. //
  11. using System;
  12. using System.IO;
  13. using System.Security.Cryptography;
  14. using System.Security.Cryptography.Xml;
  15. using System.Text;
  16. using System.Xml;
  17. using System.Xml.Xsl;
  18. using NUnit.Framework;
  19. namespace MonoTests.System.Security.Cryptography.Xml {
  20. // Note: GetInnerXml is protected in XmlDsigXsltTransform making it
  21. // difficult to test properly. This class "open it up" :-)
  22. public class UnprotectedXmlDsigXsltTransform : XmlDsigXsltTransform {
  23. public XmlNodeList UnprotectedGetInnerXml () {
  24. return base.GetInnerXml ();
  25. }
  26. }
  27. [TestFixture]
  28. public class XmlDsigXsltTransformTest : Assertion {
  29. protected UnprotectedXmlDsigXsltTransform transform;
  30. [SetUp]
  31. protected void SetUp ()
  32. {
  33. transform = new UnprotectedXmlDsigXsltTransform ();
  34. }
  35. [Test]
  36. public void Properties ()
  37. {
  38. AssertEquals ("Algorithm", "http://www.w3.org/TR/1999/REC-xslt-19991116", transform.Algorithm);
  39. Type[] input = transform.InputTypes;
  40. Assert ("Input #", (input.Length == 3));
  41. // check presence of every supported input types
  42. bool istream = false;
  43. bool ixmldoc = false;
  44. bool ixmlnl = false;
  45. foreach (Type t in input) {
  46. if (t.ToString () == "System.IO.Stream")
  47. istream = true;
  48. if (t.ToString () == "System.Xml.XmlDocument")
  49. ixmldoc = true;
  50. if (t.ToString () == "System.Xml.XmlNodeList")
  51. ixmlnl = true;
  52. }
  53. Assert ("Input Stream", istream);
  54. Assert ("Input XmlDocument", ixmldoc);
  55. Assert ("Input XmlNodeList", ixmlnl);
  56. Type[] output = transform.OutputTypes;
  57. Assert ("Output #", (output.Length == 1));
  58. // check presence of every supported output types
  59. bool ostream = false;
  60. foreach (Type t in output) {
  61. if (t.ToString () == "System.IO.Stream")
  62. ostream = true;
  63. }
  64. Assert ("Output Stream", ostream);
  65. }
  66. [Test]
  67. public void GetInnerXml ()
  68. {
  69. XmlNodeList xnl = transform.UnprotectedGetInnerXml ();
  70. AssertNull ("Default InnerXml", xnl);
  71. }
  72. private string Stream2Array (Stream s)
  73. {
  74. StringBuilder sb = new StringBuilder ();
  75. int b = s.ReadByte ();
  76. while (b != -1) {
  77. sb.Append (b.ToString("X2"));
  78. b = s.ReadByte ();
  79. }
  80. return sb.ToString ();
  81. }
  82. [Test]
  83. [ExpectedException (typeof (NullReferenceException))]
  84. public void EmptyXslt ()
  85. {
  86. string test = "<Test>XmlDsigXsltTransform</Test>";
  87. XmlDocument doc = new XmlDocument ();
  88. doc.LoadXml (test);
  89. transform.LoadInput (doc.ChildNodes);
  90. Stream s = (Stream) transform.GetOutput ();
  91. }
  92. [Test]
  93. // Note that this is _valid_ as an "embedded stylesheet".
  94. // (see XSLT spec 2.7)
  95. public void EmbeddedStylesheet ()
  96. {
  97. string test = "<Test xsl:version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>XmlDsigXsltTransform</Test>";
  98. XmlDocument doc = new XmlDocument ();
  99. doc.LoadXml (test);
  100. transform.LoadInnerXml (doc.ChildNodes);
  101. transform.LoadInput (doc);
  102. Stream s = (Stream) transform.GetOutput ();
  103. }
  104. [Test]
  105. [ExpectedException (typeof (XsltCompileException))]
  106. public void InvalidXslt ()
  107. {
  108. string test = "<xsl:element name='foo' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>XmlDsigXsltTransform</xsl:element>";
  109. XmlDocument doc = new XmlDocument ();
  110. doc.LoadXml (test);
  111. transform.LoadInnerXml (doc.ChildNodes);
  112. Stream s = (Stream) transform.GetOutput ();
  113. }
  114. [Test]
  115. [ExpectedException (typeof (NullReferenceException))]
  116. public void OnlyInner ()
  117. {
  118. string test = "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns=\"http://www.w3.org/TR/xhtml1/strict\" version=\"1.0\">";
  119. test += "<xsl:output encoding=\"UTF-8\" indent=\"no\" method=\"xml\" />";
  120. test += "<xsl:template match=\"/\"><html><head><title>Notaries</title>";
  121. test += "</head><body><table><xsl:for-each select=\"Notaries/Notary\">";
  122. test += "<tr><th><xsl:value-of select=\"@name\" /></th></tr></xsl:for-each>";
  123. test += "</table></body></html></xsl:template></xsl:stylesheet>";
  124. XmlDocument doc = new XmlDocument ();
  125. doc.LoadXml (test);
  126. transform.LoadInnerXml (doc.ChildNodes);
  127. Stream s = (Stream) transform.GetOutput ();
  128. string output = Stream2Array (s);
  129. }
  130. private XmlDocument GetXslDoc ()
  131. {
  132. string test = "<Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xslt-19991116\" xmlns='http://www.w3.org/2000/09/xmldsig#'>";
  133. test += "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns=\"http://www.w3.org/TR/xhtml1/strict\" version=\"1.0\">";
  134. test += "<xsl:output encoding=\"UTF-8\" indent=\"no\" method=\"xml\" />";
  135. test += "<xsl:template match=\"/\"><html><head><title>Notaries</title>";
  136. test += "</head><body><table><xsl:for-each select=\"Notaries/Notary\">";
  137. test += "<tr><th><xsl:value-of select=\"@name\" /></th></tr></xsl:for-each>";
  138. test += "</table></body></html></xsl:template></xsl:stylesheet></Transform>";
  139. XmlDocument doc = new XmlDocument ();
  140. doc.LoadXml (test);
  141. return doc;
  142. }
  143. [Test]
  144. public void LoadInputAsXmlDocument ()
  145. {
  146. XmlDocument doc = GetXslDoc ();
  147. transform.LoadInnerXml (doc.DocumentElement.ChildNodes);
  148. transform.LoadInput (doc);
  149. Stream s = (Stream) transform.GetOutput ();
  150. string output = Stream2Array (s);
  151. }
  152. [Test]
  153. public void LoadInputAsXmlNodeList ()
  154. {
  155. XmlDocument doc = GetXslDoc ();
  156. transform.LoadInnerXml (doc.DocumentElement.ChildNodes);
  157. transform.LoadInput (doc.ChildNodes);
  158. Stream s = (Stream) transform.GetOutput ();
  159. string output = Stream2Array (s);
  160. }
  161. [Test]
  162. public void LoadInputAsStream ()
  163. {
  164. XmlDocument doc = GetXslDoc ();
  165. transform.LoadInnerXml (doc.DocumentElement.ChildNodes);
  166. MemoryStream ms = new MemoryStream ();
  167. doc.Save (ms);
  168. ms.Position = 0;
  169. transform.LoadInput (ms);
  170. Stream s = (Stream) transform.GetOutput ();
  171. string output = Stream2Array (s);
  172. }
  173. protected void AssertEquals (string msg, XmlNodeList expected, XmlNodeList actual)
  174. {
  175. for (int i=0; i < expected.Count; i++) {
  176. if (expected[i].OuterXml != actual[i].OuterXml)
  177. Fail (msg + " [" + i + "] expected " + expected[i].OuterXml + " bug got " + actual[i].OuterXml);
  178. }
  179. }
  180. [Test]
  181. public void LoadInnerXml ()
  182. {
  183. XmlDocument doc = GetXslDoc ();
  184. transform.LoadInnerXml (doc.DocumentElement.ChildNodes);
  185. XmlNodeList xnl = transform.UnprotectedGetInnerXml ();
  186. AssertEquals ("LoadInnerXml", doc.DocumentElement.ChildNodes, xnl);
  187. }
  188. [Test]
  189. public void Load2 ()
  190. {
  191. XmlDocument doc = GetXslDoc ();
  192. transform.LoadInnerXml (doc.DocumentElement.ChildNodes);
  193. transform.LoadInput (doc);
  194. Stream s = (Stream) transform.GetOutput ();
  195. string output = Stream2Array (s);
  196. }
  197. [Test]
  198. public void UnsupportedInput ()
  199. {
  200. byte[] bad = { 0xBA, 0xD };
  201. // LAMESPEC: input MUST be one of InputType - but no exception is thrown (not documented)
  202. transform.LoadInput (bad);
  203. }
  204. [Test]
  205. [ExpectedException (typeof (ArgumentException))]
  206. public void UnsupportedOutput ()
  207. {
  208. XmlDocument doc = new XmlDocument();
  209. object o = transform.GetOutput (doc.GetType ());
  210. }
  211. }
  212. }