ResXDataNodeSerializedGetValueTests.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. //
  2. // ResXDataNodeSerializedGetValueTests.cs
  3. //
  4. // Author:
  5. // Gary Barnett ([email protected])
  6. //
  7. // Copyright (C) Gary Barnett (2012)
  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. using System;
  28. using System.IO;
  29. using System.Resources;
  30. using System.Collections;
  31. using NUnit.Framework;
  32. using System.ComponentModel.Design;
  33. using System.Runtime.Serialization.Formatters.Soap;
  34. using System.Reflection;
  35. using System.Text;
  36. using System.Runtime.Serialization;
  37. namespace MonoTests.System.Resources {
  38. [TestFixture]
  39. public class ResXDataNodeSerializedGetValueTests : ResourcesTestHelper {
  40. [Test]
  41. public void ITRSOnlyUsedFirstTimeWithNodeFromReader ()
  42. {
  43. ResXDataNode originalNode, returnedNode;
  44. originalNode = GetNodeEmdeddedSerializable ();
  45. returnedNode = GetNodeFromResXReader (originalNode);
  46. Assert.IsNotNull (returnedNode, "#A1");
  47. object defaultVal = returnedNode.GetValue ((ITypeResolutionService) null);
  48. Assert.IsInstanceOfType (typeof (serializable), defaultVal, "#A2");
  49. Assert.IsNotInstanceOfType (typeof (serializableSubClass), defaultVal, "#A3");
  50. object newVal = returnedNode.GetValue (new ReturnSerializableSubClassITRS ());
  51. Assert.IsNotInstanceOfType (typeof (serializableSubClass), newVal, "#A4");
  52. Assert.IsInstanceOfType (typeof (serializable), newVal, "#A5");
  53. }
  54. [Test]
  55. public void ITRSUsedWhenNodeReturnedFromReader ()
  56. {
  57. ResXDataNode originalNode, returnedNode;
  58. originalNode = GetNodeEmdeddedSerializable ();
  59. returnedNode = GetNodeFromResXReader (originalNode);
  60. Assert.IsNotNull (returnedNode, "#A1");
  61. object val = returnedNode.GetValue (new ReturnSerializableSubClassITRS ());
  62. Assert.IsInstanceOfType (typeof (serializableSubClass), val, "#A2");
  63. }
  64. [Test]
  65. public void ITRSIsIgnoredIfGetValueTypeNameAlreadyCalledWithAnotherITRS ()
  66. {
  67. // check that first call to GetValueTypeName sets the type for GetValue
  68. ResXDataNode originalNode, returnedNode;
  69. originalNode = GetNodeEmdeddedSerializable ();
  70. returnedNode = GetNodeFromResXReader (originalNode);
  71. Assert.IsNotNull (returnedNode, "#A1");
  72. //get value type passing params
  73. string newType = returnedNode.GetValueTypeName (new ReturnSerializableSubClassITRS ());
  74. Assert.AreEqual ((typeof (serializableSubClass)).AssemblyQualifiedName, newType, "#A2");
  75. Assert.AreNotEqual ((typeof (serializable)).AssemblyQualifiedName, newType, "#A3");
  76. // get value passing null params
  77. object val = returnedNode.GetValue ((ITypeResolutionService) null);
  78. // Assert.IsNotInstanceOfType (typeof (serializable), val, "#A5"); this would fail as subclasses are id-ed as instances of parents
  79. Assert.IsInstanceOfType (typeof (serializableSubClass), val, "#A4");
  80. }
  81. [Test]
  82. public void ITRSNotTouchedWhenNodeCreatedNew ()
  83. {
  84. // check supplied params to GetValue are not touched
  85. // for an instance created manually
  86. ResXDataNode node = GetNodeEmdeddedSerializable ();
  87. //would raise exception if param used
  88. Object obj = node.GetValue (new ExceptionalITRS ());
  89. Assert.IsInstanceOfType (typeof (serializable), obj, "#A1");
  90. }
  91. [Test, ExpectedException (typeof (SerializationException))]
  92. public void DeserializationError ()
  93. {
  94. ResXDataNode node = GetNodeFromResXReader (serializedResXCorruped);
  95. Assert.IsNotNull (node, "#A1");
  96. object val = node.GetValue ((AssemblyName []) null);
  97. }
  98. [Test]
  99. public void InvalidMimeTypeFromReaderReturnsNull ()
  100. {
  101. ResXDataNode node = GetNodeFromResXReader (serializedResXInvalidMimeType);
  102. Assert.IsNotNull (node, "#A1");
  103. object val = node.GetValue ((AssemblyName []) null);
  104. Assert.IsNull (val, "#A2");
  105. }
  106. [Test]
  107. public void SoapFormattedObject ()
  108. {
  109. ResXDataNode node = GetNodeFromResXReader (serializedResXSOAP);
  110. Assert.IsNotNull (node, "#A1");
  111. // hard coded assembly name value refers to that generated under 2.0 prefix, so use compatible available class
  112. object val = node.GetValue (new ReturnSerializableSubClassITRS ());
  113. Assert.AreEqual ("name=aname;value=avalue", val.ToString (), "#A2");
  114. }
  115. [Test]
  116. public void AssemblyAutomaticallyLoaded ()
  117. {
  118. // DummyAssembly must be in the same directory as current assembly to work correctly
  119. ResXDataNode node = GetNodeFromResXReader (anotherSerializableFromDummyAssembly);
  120. Assert.IsNotNull (node, "#A1");
  121. object value = node.GetValue ((AssemblyName []) null);
  122. Assert.AreEqual ("DummyAssembly.AnotherSerializable, DummyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", value.GetType ().AssemblyQualifiedName, "#A2");
  123. }
  124. [Test, ExpectedException (typeof (ArgumentException))]
  125. public void ErrorWhenAssemblyMissing ()
  126. {
  127. ResXDataNode node = GetNodeFromResXReader (missingSerializableFromMissingAssembly);
  128. Assert.IsNotNull (node, "#A1");
  129. object val = node.GetValue ((AssemblyName []) null);
  130. }
  131. [Test]
  132. public void RefToSameObjectNotHeld ()
  133. {
  134. ResXDataNode node = GetNodeEmdeddedSerializable ();
  135. ResXDataNode returnedNode = GetNodeFromResXReader (node);
  136. Assert.IsNotNull (returnedNode, "#A1");
  137. serializable ser1 = (serializable) returnedNode.GetValue ((AssemblyName []) null);
  138. ser1.name = "beenchanged";
  139. serializable ser2 = (serializable) returnedNode.GetValue ((AssemblyName []) null);
  140. Assert.AreNotSame (ser1, ser2, "#A2");
  141. }
  142. static string serializedResXInvalidMimeType =
  143. @"<?xml version=""1.0"" encoding=""utf-8""?>
  144. <root>
  145. <resheader name=""resmimetype"">
  146. <value>text/microsoft-resx</value>
  147. </resheader>
  148. <resheader name=""version"">
  149. <value>2.0</value>
  150. </resheader>
  151. <resheader name=""reader"">
  152. <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  153. </resheader>
  154. <resheader name=""writer"">
  155. <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  156. </resheader>
  157. <data name=""test"" mimetype=""application/xxxx"">
  158. <value>
  159. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  160. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  161. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  162. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  163. </value>
  164. </data>
  165. </root>";
  166. static string serializedResXCorruped =
  167. @"<?xml version=""1.0"" encoding=""utf-8""?>
  168. <root>
  169. <resheader name=""resmimetype"">
  170. <value>text/microsoft-resx</value>
  171. </resheader>
  172. <resheader name=""version"">
  173. <value>2.0</value>
  174. </resheader>
  175. <resheader name=""reader"">
  176. <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  177. </resheader>
  178. <resheader name=""writer"">
  179. <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  180. </resheader>
  181. <data name=""test"" mimetype=""application/x-microsoft.net.object.binary.base64"">
  182. <value>
  183. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  184. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  185. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  186. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  187. </value>
  188. </data>
  189. </root>";
  190. static string soapSerializedSerializable =
  191. @"<SOAP-ENV:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:SOAP-ENC=""http://schemas.xmlsoap.org/soap/encoding/"" xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:clr=""http://schemas.microsoft.com/soap/encoding/clr/1.0"" SOAP-ENV:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/"">
  192. <SOAP-ENV:Body>
  193. <a1:serializable id=""ref-1"" xmlns:a1=""http://schemas.microsoft.com/clr/nsassem/MonoTests.System.Resources/System.Windows.Forms_test_net_2_0%2C%20Version%3D0.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"">
  194. <sername id=""ref-3"">aname</sername>
  195. <servalue id=""ref-4"">avalue</servalue>
  196. </a1:serializable>
  197. </SOAP-ENV:Body>
  198. </SOAP-ENV:Envelope>";
  199. static string serializedResXSOAP =
  200. @"<?xml version=""1.0"" encoding=""utf-8""?>
  201. <root>
  202. <resheader name=""resmimetype"">
  203. <value>text/microsoft-resx</value>
  204. </resheader>
  205. <resheader name=""version"">
  206. <value>2.0</value>
  207. </resheader>
  208. <resheader name=""reader"">
  209. <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  210. </resheader>
  211. <resheader name=""writer"">
  212. <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  213. </resheader>
  214. <data name=""test"" mimetype=""application/x-microsoft.net.object.soap.base64"">
  215. <value>
  216. PFNPQVAtRU5WOkVudmVsb3BlIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2Ui
  217. IHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOlNPQVAtRU5DPSJodHRwOi8vc2No
  218. ZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgeG1sbnM6U09BUC1FTlY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAu
  219. b3JnL3NvYXAvZW52ZWxvcGUvIiB4bWxuczpjbHI9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vc29hcC9lbmNvZGlu
  220. Zy9jbHIvMS4wIiBTT0FQLUVOVjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29k
  221. aW5nLyI+DQo8U09BUC1FTlY6Qm9keT4NCjxhMTpzZXJpYWxpemFibGUgaWQ9InJlZi0xIiB4bWxuczphMT0iaHR0cDovL3Nj
  222. aGVtYXMubWljcm9zb2Z0LmNvbS9jbHIvbnNhc3NlbS9Nb25vVGVzdHMuU3lzdGVtLlJlc291cmNlcy9TeXN0ZW0uV2luZG93
  223. cy5Gb3Jtc190ZXN0X25ldF8yXzAlMkMlMjBWZXJzaW9uJTNEMC4wLjAuMCUyQyUyMEN1bHR1cmUlM0RuZXV0cmFsJTJDJTIw
  224. UHVibGljS2V5VG9rZW4lM0RudWxsIj4NCjxzZXJuYW1lIGlkPSJyZWYtMyI+YW5hbWU8L3Nlcm5hbWU+DQo8c2VydmFsdWUg
  225. aWQ9InJlZi00Ij5hdmFsdWU8L3NlcnZhbHVlPg0KPC9hMTpzZXJpYWxpemFibGU+DQo8L1NPQVAtRU5WOkJvZHk+DQo8L1NP
  226. QVAtRU5WOkVudmVsb3BlPg==
  227. </value>
  228. </data>
  229. </root>";
  230. static string missingSerializableFromMissingAssembly =
  231. @"<?xml version=""1.0"" encoding=""utf-8""?>
  232. <root>
  233. <resheader name=""resmimetype"">
  234. <value>text/microsoft-resx</value>
  235. </resheader>
  236. <resheader name=""version"">
  237. <value>2.0</value>
  238. </resheader>
  239. <resheader name=""reader"">
  240. <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  241. </resheader>
  242. <resheader name=""writer"">
  243. <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  244. </resheader>
  245. <data name=""aname"" mimetype=""application/x-microsoft.net.object.binary.base64"">
  246. <value>
  247. AAEAAAD/////AQAAAAAAAAAMAgAAAEZNaXNzaW5nQXNzZW1ibHksIFZlcnNpb249MS4wLjAuMCwgQ3Vs
  248. dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBQEAAAAhRHVtbXlBc3NlbWJseS5NaXNzaW5n
  249. U2VyaWFsaXphYmxlAgAAAAdzZXJuYW1lCHNlcnZhbHVlAQECAAAABgMAAAAFYW5hbWUGBAAAAAZhdmFs
  250. dWUL
  251. </value>
  252. </data>
  253. </root>";
  254. static string anotherSerializableFromDummyAssembly =
  255. @"<?xml version=""1.0"" encoding=""utf-8""?>
  256. <root>
  257. <resheader name=""resmimetype"">
  258. <value>text/microsoft-resx</value>
  259. </resheader>
  260. <resheader name=""version"">
  261. <value>2.0</value>
  262. </resheader>
  263. <resheader name=""reader"">
  264. <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  265. </resheader>
  266. <resheader name=""writer"">
  267. <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  268. </resheader>
  269. <data name=""aname"" mimetype=""application/x-microsoft.net.object.binary.base64"">
  270. <value>
  271. AAEAAAD/////AQAAAAAAAAAMAgAAAEREdW1teUFzc2VtYmx5LCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1
  272. cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAIUR1bW15QXNzZW1ibHkuQW5vdGhlclNl
  273. cmlhbGl6YWJsZQIAAAAHc2VybmFtZQhzZXJ2YWx1ZQEBAgAAAAYDAAAABWFuYW1lBgQAAAAGYXZhbHVl
  274. Cw==
  275. </value>
  276. </data>
  277. </root>";
  278. static string convertableResXWithoutAssemblyName =
  279. @"<?xml version=""1.0"" encoding=""utf-8""?>
  280. <root>
  281. <resheader name=""resmimetype"">
  282. <value>text/microsoft-resx</value>
  283. </resheader>
  284. <resheader name=""version"">
  285. <value>2.0</value>
  286. </resheader>
  287. <resheader name=""reader"">
  288. <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  289. </resheader>
  290. <resheader name=""writer"">
  291. <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  292. </resheader>
  293. <data name=""test"" type=""DummyAssembly.Convertable"">
  294. <value>im a name im a value</value>
  295. </data>
  296. </root>";
  297. static string thisAssemblyConvertableResXWithoutAssemblyName =
  298. @"<?xml version=""1.0"" encoding=""utf-8""?>
  299. <root>
  300. <resheader name=""resmimetype"">
  301. <value>text/microsoft-resx</value>
  302. </resheader>
  303. <resheader name=""version"">
  304. <value>2.0</value>
  305. </resheader>
  306. <resheader name=""reader"">
  307. <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  308. </resheader>
  309. <resheader name=""writer"">
  310. <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  311. </resheader>
  312. <data name=""test"" type=""MonoTests.System.Resources.ThisAssemblyConvertable"">
  313. <value>im a name im a value</value>
  314. </data>
  315. </root>";
  316. }
  317. }