1 //
2 // MonoTests.System.Resources.ResourceReaderTest.cs
3 //
4 // Author:
5 //   Nick Drochak (ndrochak@gol.com)
6 //
7 // (C) 2001 Nick Drochak II
8 // Copyright (C) 2004 Novell (http://www.novell.com)
9 //
10 
11 using System;
12 using System.Collections;
13 using System.IO;
14 using System.Reflection;
15 using System.Resources;
16 
17 using NUnit.Framework;
18 
19 namespace MonoTests.System.Resources
20 {
21 	[TestFixture]
22 	public class ResourceReaderTest
23 	{
24 		internal static string m_ResourceFile;
25 		private static string m_BadResourceFile;
26 		private string _tempResourceFile;
27 
28 		[TestFixtureSetUp]
FixtureSetUp()29 		public void FixtureSetUp ()
30 		{
31 			string base_path = Path.Combine (Directory.GetCurrentDirectory (), Path.Combine ("Test", "resources"));
32 			m_ResourceFile = Path.Combine (base_path, "MyResources.resources");
33 			m_BadResourceFile = Path.Combine (base_path, "Empty.resources");
34 		}
35 
36 		[SetUp]
SetUp()37 		public void SetUp ()
38 		{
39 			_tempResourceFile = Path.GetTempFileName ();
40 		}
41 
42 		[TearDown]
TearDown()43 		public void TearDown ()
44 		{
45 			File.Delete (_tempResourceFile);
46 		}
47 
48 		[Test]
ConstructorString_Path_Null()49 		public void ConstructorString_Path_Null ()
50 		{
51 			try {
52 				new ResourceReader ((string) null);
53 				Assert.Fail ("#1");
54 			} catch (ArgumentNullException ex) {
55 				Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
56 				Assert.IsNull (ex.InnerException, "#3");
57 				Assert.IsNotNull (ex.Message, "#4");
58 				Assert.IsNotNull (ex.ParamName, "#5");
59 				Assert.AreEqual ("path", ex.ParamName, "#6");
60 			}
61 		}
62 
63 		[Test]
ConstructorString_Path_Empty()64 		public void ConstructorString_Path_Empty ()
65 		{
66 			try {
67 				new ResourceReader (String.Empty);
68 				Assert.Fail ("#1");
69 			} catch (ArgumentException ex) {
70 				// Empty path name is not legal
71 				Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
72 				Assert.IsNull (ex.InnerException, "#3");
73 				Assert.IsNotNull (ex.Message, "#4");
74 				Assert.IsNull (ex.ParamName, "#5");
75 			}
76 		}
77 
78 		[Test]
79 		[ExpectedException (typeof (FileNotFoundException))]
ConstructorString_NotFound()80 		public void ConstructorString_NotFound ()
81 		{
82 			// use a file name that is *very* unlikely to exsist
83 			new ResourceReader ("j38f8axvnn9h38hfa9nxn93f8hav4zvag87vvah32o");
84 		}
85 
86 		[Test]
87 		[Category ("MobileNotWorking")]
88 		[ExpectedException (typeof (BadImageFormatException))]
ConstructorString_Bad()89 		public void ConstructorString_Bad ()
90 		{
91 			Assert.IsTrue (File.Exists (m_BadResourceFile));
92 			new ResourceReader (m_BadResourceFile);
93 		}
94 
95 		[Test]
96 		[Category ("MobileNotWorking")]
ConstructorString()97 		public void ConstructorString ()
98 		{
99 			if (!File.Exists (m_ResourceFile)) {
100 				Assert.Fail ("Resource file is not where it should be:" + Path.Combine (Directory.GetCurrentDirectory (), m_ResourceFile));
101 			}
102 			ResourceReader r = new ResourceReader (m_ResourceFile);
103 			Assert.IsNotNull (r, "ResourceReader");
104 			r.Close ();
105 		}
106 
107 		[Test]
ConstructorStream_Null()108 		public void ConstructorStream_Null ()
109 		{
110 			try {
111 				new ResourceReader ((Stream) null);
112 				Assert.Fail ("#1");
113 			} catch (ArgumentNullException ex) {
114 				Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
115 				Assert.IsNull (ex.InnerException, "#3");
116 				Assert.IsNotNull (ex.Message, "#4");
117 				Assert.IsNotNull (ex.ParamName, "#5");
118 				Assert.AreEqual ("stream", ex.ParamName, "#6");
119 			}
120 		}
121 
122 		[Test]
123 		[Category ("MobileNotWorking")]
ConstructorStream_Closed()124 		public void ConstructorStream_Closed ()
125 		{
126 			Stream stream = new FileStream (m_ResourceFile, FileMode.Open);
127 			stream.Close ();
128 
129 			try {
130 				new ResourceReader (stream);
131 				Assert.Fail ("#1");
132 			} catch (ArgumentException ex) {
133 				// Stream was not readable
134 				Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
135 				Assert.IsNull (ex.InnerException, "#3");
136 				Assert.IsNotNull (ex.Message, "#4");
137 				Assert.IsNull (ex.ParamName, "#5");
138 			}
139 		}
140 
141 		[Test]
142 		[Category ("MobileNotWorking")]
Stream()143 		public void Stream ()
144 		{
145 			Stream stream = new FileStream (m_ResourceFile, FileMode.Open);
146 			ResourceReader r = new ResourceReader (stream);
147 			Assert.IsNotNull (r, "ResourceReader");
148 			r.Close ();
149 		}
150 
151 		[Test]
152 		[Category ("MobileNotWorking")]
Close()153 		public void Close ()
154 		{
155 			Stream stream = new FileStream (m_ResourceFile, FileMode.Open);
156 			ResourceReader r = new ResourceReader (stream);
157 			r.Close ();
158 
159 			stream = new FileStream (m_ResourceFile, FileMode.Open);
160 			Assert.IsNotNull (stream, "FileStream");
161 			stream.Close ();
162 		}
163 
164 		[Test]
165 		[Category ("MobileNotWorking")]
Enumerator()166 		public void Enumerator ()
167 		{
168 			Stream stream = new FileStream (m_ResourceFile, FileMode.Open);
169 			ResourceReader reader = new ResourceReader (stream);
170 
171 			IDictionaryEnumerator en = reader.GetEnumerator ();
172 			// Goes through the enumerator, printing out the key and value pairs.
173 			while (en.MoveNext ()) {
174 				DictionaryEntry de = (DictionaryEntry) en.Current;
175 				Assert.IsTrue (String.Empty != (string) de.Key, "Current.Key should not be empty");
176 				Assert.IsTrue (String.Empty != (string) de.Value, "Current.Value should not be empty");
177 				Assert.IsTrue (String.Empty != (string) en.Key, "Entry.Key should not be empty");
178 				Assert.IsTrue (String.Empty != (string) en.Value, "Entry.Value should not be empty");
179 			}
180 			reader.Close ();
181 		}
182 
183 		[Test] // bug #81757
ReadNullResource()184 		public void ReadNullResource ()
185 		{
186 			MemoryStream stream = new MemoryStream ();
187 			object value = null;
188 			ResourceWriter rw = new ResourceWriter (stream);
189 			rw.AddResource ("NullTest", value);
190 			rw.Generate ();
191 			stream.Position = 0;
192 
193 			using (ResourceReader rr = new ResourceReader (stream)) {
194 				int entryCount = 0;
195 				foreach (DictionaryEntry de in rr) {
196 					Assert.AreEqual ("NullTest", de.Key, "#1");
197 					Assert.IsNull (de.Value, "#2");
198 					Assert.AreEqual (0, entryCount, "#3");
199 					entryCount++;
200 				}
201 				Assert.AreEqual (1, entryCount, "#4");
202 			}
203 		}
204 
205 		[Test] // bug #79976
ByteArray()206 		public void ByteArray ()
207 		{
208 			byte [] content = new byte [] { 1, 2, 3, 4, 5, 6 };
209 
210 			Stream stream = null;
211 
212 			// we currently do not support writing v2 resource files
213 			stream = new MemoryStream ();
214 			stream.Write (byte_resource_v2, 0, byte_resource_v2.Length);
215 			stream.Position = 0;
216 
217 			using (stream) {
218 				int entryCount = 0;
219 				using (IResourceReader rr = new ResourceReader (stream)) {
220 					foreach (DictionaryEntry de in rr) {
221 						Assert.AreEqual ("byteArrayTest", de.Key, "#1");
222 						Assert.AreEqual (content, de.Value, "#2");
223 						entryCount++;
224 					}
225 				}
226 				Assert.AreEqual (1, entryCount, "#3");
227 			}
228 		}
229 
230 		[Test]
231 		[Category ("MobileNotWorking")]
GetResourceDataNullName()232 		public void GetResourceDataNullName ()
233 		{
234 			ResourceReader r = new ResourceReader ("Test/resources/StreamTest.resources");
235 			string type;
236 			byte [] bytes;
237 
238 			try {
239 				r.GetResourceData (null, out type, out bytes);
240 				Assert.Fail ("#1");
241 			} catch (ArgumentNullException ex) {
242 				Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
243 				Assert.IsNull (ex.InnerException, "#3");
244 				Assert.IsNotNull (ex.Message, "#4");
245 				Assert.IsNotNull (ex.ParamName, "#5");
246 				Assert.AreEqual ("resourceName", ex.ParamName, "#6");
247 			} finally {
248 				r.Close ();
249 			}
250 		}
251 
252 		[Test]
253 		[Category ("MobileNotWorking")]
GetResourceData()254 		public void GetResourceData ()
255 		{
256 			byte [] t1 = new byte [] {0x16, 0x00, 0x00, 0x00, 0x76, 0x65, 0x72, 0x69, 0x74, 0x61, 0x73, 0x20, 0x76, 0x6F, 0x73, 0x20, 0x6C, 0x69, 0x62, 0x65, 0x72, 0x61, 0x62, 0x69, 0x74, 0x0A};
257 			byte [] t2 = new byte [] {0x0A, 0x73, 0x6F, 0x6D, 0x65, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67};
258 			byte [] t3 = new byte [] {0x0E, 0x00, 0x00, 0x00, 0x73, 0x68, 0x61, 0x72, 0x64, 0x65, 0x6E, 0x66, 0x72, 0x65, 0x75, 0x64, 0x65, 0x0A};
259 
260 			ResourceReader r = new ResourceReader ("Test/resources/StreamTest.resources");
261 			Hashtable items = new Hashtable ();
262 			foreach (DictionaryEntry de in r) {
263 				string type;
264 				byte [] bytes;
265 				r.GetResourceData ((string) de.Key, out type, out bytes);
266 				items [de.Key] = new DictionaryEntry (type, bytes);
267 			}
268 
269 			DictionaryEntry p = (DictionaryEntry) items ["test"];
270 			Assert.AreEqual ("ResourceTypeCode.Stream", p.Key as string, "#1-1");
271 			Assert.AreEqual (t1, p.Value as byte [], "#1-2");
272 
273 			p = (DictionaryEntry) items ["test2"];
274 			Assert.AreEqual ("ResourceTypeCode.String", p.Key as string, "#2-1");
275 			Assert.AreEqual (t2, p.Value as byte [], "#2-2");
276 
277 			p = (DictionaryEntry) items ["test3"];
278 			Assert.AreEqual ("ResourceTypeCode.ByteArray", p.Key as string, "#3-1");
279 			Assert.AreEqual (t3, p.Value as byte [], "#3-2");
280 
281 			r.Close ();
282 		}
283 
284 		[Test]
285 		[Category ("MobileNotWorking")]
GetResourceData2()286 		public void GetResourceData2 ()
287 		{
288 			byte [] expected = new byte [] {
289 				0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
290 				0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291 				0x00, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x51, 0x53,
292 				0x79, 0x73, 0x74, 0x65, 0x6D, 0x2E, 0x44, 0x72,
293 				0x61, 0x77, 0x69, 0x6E, 0x67, 0x2C, 0x20, 0x56,
294 				0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x32,
295 				0x2E, 0x30, 0x2E, 0x30, 0x2E, 0x30, 0x2C, 0x20,
296 				0x43, 0x75, 0x6C, 0x74, 0x75, 0x72, 0x65, 0x3D,
297 				0x6E, 0x65, 0x75, 0x74, 0x72, 0x61, 0x6C, 0x2C,
298 				0x20, 0x50, 0x75, 0x62, 0x6C, 0x69, 0x63, 0x4B,
299 				0x65, 0x79, 0x54, 0x6F, 0x6B, 0x65, 0x6E, 0x3D,
300 				0x62, 0x30, 0x33, 0x66, 0x35, 0x66, 0x37, 0x66,
301 				0x31, 0x31, 0x64, 0x35, 0x30, 0x61, 0x33, 0x61,
302 				0x05, 0x01, 0x00, 0x00, 0x00, 0x13, 0x53, 0x79,
303 				0x73, 0x74, 0x65, 0x6D, 0x2E, 0x44, 0x72, 0x61,
304 				0x77, 0x69, 0x6E, 0x67, 0x2E, 0x53, 0x69, 0x7A,
305 				0x65, 0x02, 0x00, 0x00, 0x00, 0x05, 0x77, 0x69,
306 				0x64, 0x74, 0x68, 0x06, 0x68, 0x65, 0x69, 0x67,
307 				0x68, 0x74, 0x00, 0x00, 0x08, 0x08, 0x02, 0x00,
308 				0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00,
309 				0x00, 0x00, 0x0B};
310 			ResourceReader r = new ResourceReader ("Test/resources/bug81759.resources");
311 			string type;
312 			byte [] bytes;
313 			r.GetResourceData ("imageList.ImageSize", out type, out bytes);
314 			// Note that const should not be used here.
315 			Assert.AreEqual ("System.Drawing.Size, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", type, "#1");
316 			Assert.AreEqual (expected, bytes, "#2");
317 			r.Close ();
318 		}
319 
320 		// we currently do not support writing v2 resource files
321 		private static readonly byte [] byte_resource_v2 = new byte [] {
322 			0xce, 0xca, 0xef, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00,
323 			0x00, 0x6c, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x52, 0x65,
324 			0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73,
325 			0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x61, 0x64, 0x65, 0x72,
326 			0x2c, 0x20, 0x6d, 0x73, 0x63, 0x6f, 0x72, 0x6c, 0x69, 0x62, 0x2c,
327 			0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x32, 0x2e,
328 			0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x43, 0x75, 0x6c, 0x74,
329 			0x75, 0x72, 0x65, 0x3d, 0x6e, 0x65, 0x75, 0x74, 0x72, 0x61, 0x6c,
330 			0x2c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79,
331 			0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x3d, 0x62, 0x37, 0x37, 0x61, 0x35,
332 			0x63, 0x35, 0x36, 0x31, 0x39, 0x33, 0x34, 0x65, 0x30, 0x38, 0x39,
333 			0x23, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x52, 0x65, 0x73,
334 			0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x74,
335 			0x69, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
336 			0x53, 0x65, 0x74, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
337 			0x00, 0x00, 0x00, 0x00, 0x50, 0x41, 0x44, 0x50, 0x41, 0x44, 0x50,
338 			0x80, 0x88, 0x5a, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00,
339 			0x00, 0x1a, 0x62, 0x00, 0x79, 0x00, 0x74, 0x00, 0x65, 0x00, 0x41,
340 			0x00, 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x54, 0x00,
341 			0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
342 			0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
343 	}
344 }
345