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