1 // 2 // ResXDataNodeSerializedGetValueTypeNameTests.cs 3 // 4 // Author: 5 // Gary Barnett (gary.barnett.mono@gmail.com) 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 28 using System; 29 using System.IO; 30 using System.Reflection; 31 using System.Resources; 32 using System.Runtime.Serialization; 33 using System.Collections; 34 using NUnit.Framework; 35 using System.ComponentModel.Design; 36 using System.Runtime.Serialization.Formatters.Binary; 37 38 namespace MonoTests.System.Resources { 39 [TestFixture] 40 public class ResXDataNodeSerializedGetValueTypeNameTests : ResourcesTestHelper { 41 [Test] ITRSUsedWithNodeFromReader()42 public void ITRSUsedWithNodeFromReader () 43 { 44 ResXDataNode originalNode, returnedNode; 45 originalNode = GetNodeEmdeddedSerializable (); 46 returnedNode = GetNodeFromResXReader (originalNode); 47 48 Assert.IsNotNull (returnedNode, "#A1"); 49 string returnedType = returnedNode.GetValueTypeName (new ReturnSerializableSubClassITRS ()); 50 Assert.AreEqual ((typeof (serializableSubClass)).AssemblyQualifiedName, returnedType, "#A2"); 51 } 52 53 [Test] ITRSOnlyUsedFirstTimeWithNodeFromReader()54 public void ITRSOnlyUsedFirstTimeWithNodeFromReader () 55 { 56 // check ITRS supplied to GetValueTypeName method for a node returned from reader are used when 57 // retrieving the value first time and returns this same value ignoring any new ITRS passed thereafter 58 ResXDataNode originalNode, returnedNode; 59 originalNode = GetNodeEmdeddedSerializable (); 60 returnedNode = GetNodeFromResXReader (originalNode); 61 62 Assert.IsNotNull (returnedNode, "#A1"); 63 string defaultType = returnedNode.GetValueTypeName ((ITypeResolutionService) null); 64 Assert.AreEqual ((typeof (serializable)).AssemblyQualifiedName, defaultType, "#A2"); 65 66 string newType = returnedNode.GetValueTypeName (new ReturnSerializableSubClassITRS ()); 67 Assert.AreNotEqual ((typeof (serializableSubClass)).AssemblyQualifiedName, newType, "#A3"); 68 Assert.AreEqual ((typeof (serializable)).AssemblyQualifiedName, newType, "#A4"); 69 } 70 71 [Test] ITRSNotUsedWhenNodeCreatedNew()72 public void ITRSNotUsedWhenNodeCreatedNew () 73 { 74 ResXDataNode node; 75 node = GetNodeEmdeddedSerializable (); 76 77 string returnedType = node.GetValueTypeName (new ReturnSerializableSubClassITRS ()); 78 Assert.AreEqual ((typeof (serializable)).AssemblyQualifiedName, returnedType, "#A1"); 79 } 80 81 [Test] ITRSIsIgnoredIfGetValueAlreadyCalledWithAnotherITRS()82 public void ITRSIsIgnoredIfGetValueAlreadyCalledWithAnotherITRS () 83 { 84 // check that first call to GetValue sets the type for GetValueTypeName 85 ResXDataNode originalNode, returnedNode; 86 originalNode = GetNodeEmdeddedSerializable (); 87 returnedNode = GetNodeFromResXReader (originalNode); 88 89 Assert.IsNotNull (returnedNode, "#A1"); 90 // get value passing no params 91 object val = returnedNode.GetValue ((ITypeResolutionService) null); 92 Assert.IsInstanceOfType (typeof (serializable), val, "#A2"); 93 AssertHelper.IsNotInstanceOfType (typeof (serializableSubClass), val, "#A3"); 94 95 //get value type passing different params 96 string newType = returnedNode.GetValueTypeName (new ReturnSerializableSubClassITRS ()); 97 Assert.AreNotEqual ((typeof (serializableSubClass)).AssemblyQualifiedName, newType, "#A4"); 98 Assert.AreEqual ((typeof (serializable)).AssemblyQualifiedName, newType, "#A5"); 99 } 100 101 [Test] SoapFormattedObject()102 public void SoapFormattedObject () 103 { 104 ResXDataNode node = GetNodeFromResXReader (serializedResXSOAP); 105 106 Assert.IsNotNull (node, "#A1"); 107 // hard coded assembly name value refers to that generated under 2.0 prefix, so use compatible available class 108 string name = node.GetValueTypeName (new ReturnSerializableSubClassITRS ()); 109 Assert.AreEqual (typeof (serializableSubClass).AssemblyQualifiedName, name, "#A2"); 110 } 111 112 [Test] DeserializationErrorReturnsObjectType()113 public void DeserializationErrorReturnsObjectType () 114 { 115 ResXDataNode node = GetNodeFromResXReader (serializedResXCorruped); 116 Assert.IsNotNull (node, "#A1"); 117 string type = node.GetValueTypeName ((AssemblyName []) null); 118 119 Assert.AreEqual (typeof (object).AssemblyQualifiedName,type, "#A2"); 120 } 121 122 [Test] InvalidMimeTypeFromReaderReturnsNull()123 public void InvalidMimeTypeFromReaderReturnsNull () 124 { 125 ResXDataNode node = GetNodeFromResXReader (serializedResXInvalidMimeType); 126 Assert.IsNotNull (node, "#A1"); 127 string type = node.GetValueTypeName ((AssemblyName []) null); 128 Assert.IsNull (type, "#A2"); 129 } 130 131 [Test] AssemblyAutomaticallyLoaded()132 public void AssemblyAutomaticallyLoaded () 133 { 134 // DummyAssembly must be in the same directory as current assembly to work correctly 135 ResXDataNode node = GetNodeFromResXReader (anotherSerializableFromDummyAssembly); 136 Assert.IsNotNull (node, "#A1"); 137 string type = node.GetValueTypeName ((AssemblyName []) null); 138 Assert.AreEqual ("DummyAssembly.AnotherSerializable, DummyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", type, "#A2"); 139 } 140 141 [Test] ReturnsObjectAssemblyMissing()142 public void ReturnsObjectAssemblyMissing () 143 { 144 ResXDataNode node = GetNodeFromResXReader (missingSerializableFromMissingAssembly); 145 Assert.IsNotNull (node, "#A1"); 146 string type = node.GetValueTypeName ((AssemblyName []) null); 147 Assert.AreEqual (typeof (object).AssemblyQualifiedName, type, "#A2"); 148 } 149 150 static string serializedResXInvalidMimeType = 151 @"<?xml version=""1.0"" encoding=""utf-8""?> 152 <root> 153 154 <resheader name=""resmimetype""> 155 <value>text/microsoft-resx</value> 156 </resheader> 157 <resheader name=""version""> 158 <value>2.0</value> 159 </resheader> 160 <resheader name=""reader""> 161 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 162 </resheader> 163 <resheader name=""writer""> 164 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 165 </resheader> 166 <data name=""test"" mimetype=""application/xxxx""> 167 <value> 168 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 169 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 170 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 171 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 172 </value> 173 </data> 174 </root>"; 175 176 static string serializedResXCorruped = 177 @"<?xml version=""1.0"" encoding=""utf-8""?> 178 <root> 179 180 <resheader name=""resmimetype""> 181 <value>text/microsoft-resx</value> 182 </resheader> 183 <resheader name=""version""> 184 <value>2.0</value> 185 </resheader> 186 <resheader name=""reader""> 187 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 188 </resheader> 189 <resheader name=""writer""> 190 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 191 </resheader> 192 <data name=""test"" mimetype=""application/x-microsoft.net.object.binary.base64""> 193 <value> 194 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 195 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 196 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 197 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 198 </value> 199 </data> 200 </root>"; 201 202 static string serializedResXSOAP = 203 @"<?xml version=""1.0"" encoding=""utf-8""?> 204 <root> 205 <resheader name=""resmimetype""> 206 <value>text/microsoft-resx</value> 207 </resheader> 208 <resheader name=""version""> 209 <value>2.0</value> 210 </resheader> 211 <resheader name=""reader""> 212 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 213 </resheader> 214 <resheader name=""writer""> 215 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 216 </resheader> 217 <data name=""test"" mimetype=""application/x-microsoft.net.object.soap.base64""> 218 <value> 219 PFNPQVAtRU5WOkVudmVsb3BlIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2Ui 220 IHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOlNPQVAtRU5DPSJodHRwOi8vc2No 221 ZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgeG1sbnM6U09BUC1FTlY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAu 222 b3JnL3NvYXAvZW52ZWxvcGUvIiB4bWxuczpjbHI9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vc29hcC9lbmNvZGlu 223 Zy9jbHIvMS4wIiBTT0FQLUVOVjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29k 224 aW5nLyI+DQo8U09BUC1FTlY6Qm9keT4NCjxhMTpzZXJpYWxpemFibGUgaWQ9InJlZi0xIiB4bWxuczphMT0iaHR0cDovL3Nj 225 aGVtYXMubWljcm9zb2Z0LmNvbS9jbHIvbnNhc3NlbS9Nb25vVGVzdHMuU3lzdGVtLlJlc291cmNlcy9TeXN0ZW0uV2luZG93 226 cy5Gb3Jtc190ZXN0X25ldF8yXzAlMkMlMjBWZXJzaW9uJTNEMC4wLjAuMCUyQyUyMEN1bHR1cmUlM0RuZXV0cmFsJTJDJTIw 227 UHVibGljS2V5VG9rZW4lM0RudWxsIj4NCjxzZXJuYW1lIGlkPSJyZWYtMyI+YW5hbWU8L3Nlcm5hbWU+DQo8c2VydmFsdWUg 228 aWQ9InJlZi00Ij5hdmFsdWU8L3NlcnZhbHVlPg0KPC9hMTpzZXJpYWxpemFibGU+DQo8L1NPQVAtRU5WOkJvZHk+DQo8L1NP 229 QVAtRU5WOkVudmVsb3BlPg== 230 </value> 231 </data> 232 </root>"; 233 234 static string missingSerializableFromMissingAssembly = 235 @"<?xml version=""1.0"" encoding=""utf-8""?> 236 <root> 237 <resheader name=""resmimetype""> 238 <value>text/microsoft-resx</value> 239 </resheader> 240 <resheader name=""version""> 241 <value>2.0</value> 242 </resheader> 243 <resheader name=""reader""> 244 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 245 </resheader> 246 <resheader name=""writer""> 247 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 248 </resheader> 249 <data name=""aname"" mimetype=""application/x-microsoft.net.object.binary.base64""> 250 <value> 251 AAEAAAD/////AQAAAAAAAAAMAgAAAEZNaXNzaW5nQXNzZW1ibHksIFZlcnNpb249MS4wLjAuMCwgQ3Vs 252 dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBQEAAAAhRHVtbXlBc3NlbWJseS5NaXNzaW5n 253 U2VyaWFsaXphYmxlAgAAAAdzZXJuYW1lCHNlcnZhbHVlAQECAAAABgMAAAAFYW5hbWUGBAAAAAZhdmFs 254 dWUL 255 </value> 256 </data> 257 </root>"; 258 259 static string anotherSerializableFromDummyAssembly = 260 @"<?xml version=""1.0"" encoding=""utf-8""?> 261 <root> 262 263 <resheader name=""resmimetype""> 264 <value>text/microsoft-resx</value> 265 </resheader> 266 <resheader name=""version""> 267 <value>2.0</value> 268 </resheader> 269 <resheader name=""reader""> 270 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 271 </resheader> 272 <resheader name=""writer""> 273 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 274 </resheader> 275 <data name=""aname"" mimetype=""application/x-microsoft.net.object.binary.base64""> 276 <value> 277 AAEAAAD/////AQAAAAAAAAAMAgAAAEREdW1teUFzc2VtYmx5LCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1 278 cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAIUR1bW15QXNzZW1ibHkuQW5vdGhlclNl 279 cmlhbGl6YWJsZQIAAAAHc2VybmFtZQhzZXJ2YWx1ZQEBAgAAAAYDAAAABWFuYW1lBgQAAAAGYXZhbHVl 280 Cw== 281 </value> 282 </data> 283 </root>"; 284 285 static string convertableResXWithoutAssemblyName = 286 @"<?xml version=""1.0"" encoding=""utf-8""?> 287 <root> 288 289 <resheader name=""resmimetype""> 290 <value>text/microsoft-resx</value> 291 </resheader> 292 <resheader name=""version""> 293 <value>2.0</value> 294 </resheader> 295 <resheader name=""reader""> 296 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 297 </resheader> 298 <resheader name=""writer""> 299 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 300 </resheader> 301 302 <data name=""test"" type=""DummyAssembly.Convertable""> 303 <value>im a name im a value</value> 304 </data> 305 </root>"; 306 307 static string thisAssemblyConvertableResXWithoutAssemblyName = 308 @"<?xml version=""1.0"" encoding=""utf-8""?> 309 <root> 310 311 <resheader name=""resmimetype""> 312 <value>text/microsoft-resx</value> 313 </resheader> 314 <resheader name=""version""> 315 <value>2.0</value> 316 </resheader> 317 <resheader name=""reader""> 318 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 319 </resheader> 320 <resheader name=""writer""> 321 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 322 </resheader> 323 324 <data name=""test"" type=""MonoTests.System.Resources.ThisAssemblyConvertable""> 325 <value>im a name im a value</value> 326 </data> 327 </root>"; 328 329 } 330 331 } 332 333