73b29df048dc9f396fa844d4e2fcf39873505180
[mono.git] / mcs / class / corlib / Test / System.Reflection / AssemblyNameTest.cs
1 //
2 // AssemblyNameTest.cs - NUnit Test Cases for AssemblyName
3 //
4 // Author:
5 //      Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // (C) 2002 Motus Technologies Inc. (http://www.motus.com)
8 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
9 //
10
11 using NUnit.Framework;
12 using System;
13 using System.Configuration.Assemblies;
14 using System.IO;
15 using System.Reflection;
16 using System.Reflection.Emit;
17 using System.Runtime.Serialization;
18 using System.Threading;
19 using System.Globalization;
20 using System.Runtime.Serialization.Formatters.Binary;
21 using System.Security;
22
23 namespace MonoTests.System.Reflection {
24
25 [TestFixture]
26 public class AssemblyNameTest {
27         static public void AssertEqualsByteArrays (string msg, byte[] array1, byte[] array2) 
28         {
29                 if ((array1 == null) && (array2 == null))
30                         return;
31                 if (array1 == null)
32                         Assert.Fail (msg + " -> First array is NULL");
33                 if (array2 == null)
34                         Assert.Fail (msg + " -> Second array is NULL");
35
36                 bool a = (array1.Length == array2.Length);
37                 if (a) {
38                         for (int i = 0; i < array1.Length; i++) {
39                                 if (array1 [i] != array2 [i]) {
40                                         a = false;
41                                         break;
42                                 }
43                         }
44                 }
45                 msg += " -> Expected " + (array1.Length > 0 ? BitConverter.ToString (array1, 0) : "<empty>");
46                 msg += " is different than " + (array2.Length > 0 ? BitConverter.ToString (array2, 0) : "<empty>");
47                 Assert.IsTrue (a, msg);
48         }
49
50         private AssemblyName an;
51
52         private string tempDir = Path.Combine (Path.GetTempPath (), "MonoTests.System.Reflection.AssemblyNameTest");
53
54         private AppDomain domain;
55
56         // created with "sn -o test.snk test.txt"
57         static byte[] publicKey = { 0x07, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x52, 0x53, 0x41, 0x32, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3D, 0xBD, 0x72, 0x08, 0xC6, 0x2B, 0x0E, 0xA8, 0xC1, 0xC0, 0x58, 0x07, 0x2B, 0x63, 0x5F, 0x7C, 0x9A, 0xBD, 0xCB, 0x22, 0xDB, 0x20, 0xB2, 0xA9, 0xDA, 0xDA, 0xEF, 0xE8, 0x00, 0x64, 0x2F, 0x5D, 0x8D, 0xEB, 0x78, 0x02, 0xF7, 0xA5, 0x36, 0x77, 0x28, 0xD7, 0x55, 0x8D, 0x14, 0x68, 0xDB, 0xEB, 0x24, 0x09, 0xD0, 0x2B, 0x13, 0x1B, 0x92, 0x6E, 0x2E, 0x59, 0x54, 0x4A, 0xAC, 0x18, 0xCF, 0xC9, 0x09, 0x02, 0x3F, 0x4F, 0xA8, 0x3E, 0x94, 0x00, 0x1F, 0xC2, 0xF1, 0x1A, 0x27, 0x47, 0x7D, 0x10, 0x84, 0xF5, 0x14, 0xB8, 0x61, 0x62, 0x1A, 0x0C, 0x66, 0xAB, 0xD2, 0x4C, 0x4B, 0x9F, 0xC9, 0x0F, 0x3C, 0xD8, 0x92, 0x0F, 0xF5, 0xFF, 0xCE, 0xD7, 0x6E, 0x5C, 0x6F, 0xB1, 0xF5, 0x7D, 0xD3, 0x56, 0xF9, 0x67, 0x27, 0xA4, 0xA5, 0x48, 0x5B, 0x07, 0x93, 0x44, 0x00, 0x4A, 0xF8, 0xFF, 0xA4, 0xCB, 0x73, 0xC0, 0x6A, 0x62, 0xB4, 0xB7, 0xC8, 0x92, 0x58, 0x87, 0xCD, 0x07,
58                 0x0C, 0x7D, 0x6C, 0xC1, 0x4A, 0xFC, 0x82, 0x57, 0x0E, 0x43, 0x85, 0x09, 0x75, 0x98, 0x51, 0xBB, 0x35, 0xF5, 0x64, 0x83, 0xC7, 0x79, 0x89, 0x5C, 0x55, 0x36, 0x66, 0xAB, 0x27, 0xA4, 0xD9, 0xD4, 0x7E, 0x6B, 0x67, 0x64, 0xC1, 0x54, 0x4E, 0x37, 0xF1, 0x4E, 0xCA, 0xB3, 0xE5, 0x63, 0x91, 0x57, 0x12, 0x14, 0xA6, 0xEA, 0x8F, 0x8F, 0x2B, 0xFE, 0xF3, 0xE9, 0x16, 0x08, 0x2B, 0x86, 0xBC, 0x26, 0x0D, 0xD0, 0xC6, 0xC4, 0x1A, 0x72, 0x43, 0x76, 0xDC, 0xFF, 0x28, 0x52, 0xA1, 0xDE, 0x8D, 0xFA, 0xD5, 0x1F, 0x0B, 0xB5, 0x4F, 0xAF, 0x06, 0x79, 0x11, 0xEE, 0xA8, 0xEC, 0xD3, 0x74, 0x55, 0xA2, 0x80, 0xFC, 0xF8, 0xD9, 0x50, 0x69, 0x48, 0x01, 0xC2, 0x5A, 0x04, 0x56, 0xB4, 0x3E, 0x24, 0x32, 0x20, 0xB5, 0x2C, 0xDE, 0xBB, 0xBD, 0x13, 0xFD, 0x13, 0xF7, 0x03, 0x3E, 0xE3, 0x37, 0x84, 0x74, 0xE7, 0xD0, 0x5E, 0x9E, 0xB6, 0x26, 0xAE, 0x6E, 0xB0, 0x55, 0x6A, 0x52, 0x63, 0x6F, 0x5A, 0x9D, 0xF2, 0x67, 0xD6, 0x61, 0x4F, 0x7A, 0x45, 0xEE, 0x5C, 0x3D, 0x2B, 0x7C, 0xB2, 0x40, 0x79, 0x54, 0x84, 0xD1, 
59                 0xBE, 0x61, 0x3E, 0x5E, 0xD6, 0x18, 0x8E, 0x14, 0x98, 0xFC, 0x35, 0xBF, 0x5F, 0x1A, 0x20, 0x2E, 0x1A, 0xD8, 0xFF, 0xC4, 0x6B, 0xC0, 0xC9, 0x7D, 0x06, 0xEF, 0x09, 0xF9, 0xF3, 0x69, 0xFC, 0xBC, 0xA2, 0xE6, 0x80, 0x22, 0xB9, 0x79, 0x7E, 0xEF, 0x57, 0x9F, 0x49, 0xE1, 0xBC, 0x0D, 0xB6, 0xA1, 0xFE, 0x8D, 0xBC, 0xBB, 0xA3, 0x05, 0x02, 0x6B, 0x04, 0x45, 0xF7, 0x5D, 0xEE, 0x43, 0x06, 0xD6, 0x9C, 0x94, 0x48, 0x1A, 0x0B, 0x9C, 0xBC, 0xB4, 0x4E, 0x93, 0x60, 0x87, 0xCD, 0x58, 0xD6, 0x9A, 0x39, 0xA6, 0xC0, 0x7F, 0x8E, 0xFF, 0x25, 0xC1, 0xD7, 0x2C, 0xF6, 0xF4, 0x6F, 0x24, 0x52, 0x0B, 0x39, 0x42, 0x1B, 0x0D, 0x04, 0xC1, 0x93, 0x2A, 0x19, 0x1C, 0xF0, 0xB1, 0x9B, 0xC1, 0x24, 0x6D, 0x1B, 0x0B, 0xDA, 0x1C, 0x8B, 0x72, 0x48, 0xF0, 0x3E, 0x52, 0xBF, 0x0A, 0x84, 0x3A, 0x9B, 0xC8, 0x6D, 0x13, 0x1E, 0x72, 0xF4, 0x46, 0x93, 0x88, 0x1A, 0x5F, 0x4C, 0x3C, 0xE5, 0x9D, 0x6E, 0xBB, 0x4E, 0xDD, 0x5D, 0x1F, 0x11, 0x40, 0xF4, 0xD7, 0xAF, 0xB3, 0xAB, 0x9A, 0x99, 0x15, 0xF0, 0xDC, 0xAA, 0xFF,
60                 0x9F, 0x2D, 0x9E, 0x56, 0x4F, 0x35, 0x5B, 0xBA, 0x06, 0x99, 0xEA, 0xC6, 0xB4, 0x48, 0x51, 0x17, 0x1E, 0xD1, 0x95, 0x84, 0x81, 0x18, 0xC0, 0xF1, 0x71, 0xDE, 0x44, 0x42, 0x02, 0x06, 0xAC, 0x0E, 0xA8, 0xE2, 0xF3, 0x1F, 0x96, 0x1F, 0xBE, 0xB6, 0x1F, 0xB5, 0x3E, 0xF6, 0x81, 0x05, 0x20, 0xFA, 0x2E, 0x40, 0x2E, 0x4D, 0xA0, 0x0E, 0xDA, 0x42, 0x9C, 0x05, 0xAA, 0x9E, 0xAF, 0x5C, 0xF7, 0x3A, 0x3F, 0xBB, 0x91, 0x73, 0x45, 0x27, 0xA8, 0xA2, 0x07, 0x4A, 0xEF, 0x59, 0x1E, 0x97, 0x9D, 0xE0, 0x30, 0x5A, 0x83, 0xCE, 0x1E, 0x57, 0x32, 0x89, 0x43, 0x41, 0x28, 0x7D, 0x14, 0x8D, 0x8B, 0x41, 0x1A, 0x56, 0x76, 0x43, 0xDB, 0x64, 0x86, 0x41, 0x64, 0x8D, 0x4C, 0x91, 0x83, 0x4E, 0xF5, 0x6C };
61
62         static byte[] token = { 0xFF, 0xEF, 0x94, 0x53, 0x67, 0x69, 0xDA, 0x06 };
63
64         [SetUp]
65         public void SetUp () 
66         {
67                 try {
68                         if (Directory.Exists (tempDir))
69                                 Directory.Delete (tempDir, true);
70                 }
71                 catch (Exception) {
72                 }
73
74                 Directory.CreateDirectory (tempDir);
75
76                 domain = Thread.GetDomain ();
77         }
78
79         [TearDown]
80         public void TearDown () 
81         {
82                 try {
83                         if (Directory.Exists (tempDir))
84                                 Directory.Delete (tempDir, true);
85                 }
86                 catch (Exception) {
87                         // This can happen on windows when the directory contains
88                         // files opened by the CLR
89                 }
90         }
91
92         [Test]
93 #if NET_2_0
94         [Category ("NotWorking")]
95 #endif
96         public void EmptyAssembly () 
97         {
98                 an = new AssemblyName ();
99                 Assert.IsNull (an.CodeBase, "CodeBase");
100                 Assert.IsNull (an.CultureInfo, "CultureInfo");
101                 Assert.IsNull (an.EscapedCodeBase, "EscapedCodeBase");
102                 Assert.AreEqual (AssemblyNameFlags.None, an.Flags, "Flags");
103 #if NET_2_0
104                 Assert.AreEqual (String.Empty, an.FullName, "FullName");
105 #else
106                 Assert.IsNull (an.FullName, "FullName");
107 #endif
108                 Assert.AreEqual (AssemblyHashAlgorithm.None, an.HashAlgorithm, "HashAlgorithm");
109                 Assert.IsNull (an.KeyPair, "KeyPair");
110                 Assert.IsNull (an.Name, "Name");
111                 Assert.IsNull (an.Version, "Version");
112                 Assert.AreEqual (AssemblyVersionCompatibility.SameMachine, 
113                         an.VersionCompatibility, "VersionCompatibility");
114         }
115
116         [Test]
117 #if NET_2_0
118         [Category ("NotWorking")]
119         [ExpectedException (typeof (SecurityException))]
120 #endif
121         public void PublicKey () 
122         {
123                 an = new AssemblyName ();
124                 Assert.IsNull (an.GetPublicKey (), "PublicKey(empty)");
125                 an.SetPublicKey (publicKey);
126
127                 Assert.AreEqual (AssemblyNameFlags.PublicKey, an.Flags, "Flags");
128                 // strangly it doesn't affect the KeyPair ?
129                 Assert.IsNull (an.KeyPair, "KeyPair");
130                 AssertEqualsByteArrays ("PublicKey", publicKey, an.GetPublicKey ());
131                 AssertEqualsByteArrays ("PublicKeyToken", token, an.GetPublicKeyToken ());
132         }
133
134         [Test]
135         public void PublicKeyToken () 
136         {
137                 an = new AssemblyName ();
138                 an.SetPublicKeyToken (token);
139
140                 Assert.AreEqual (AssemblyNameFlags.None, an.Flags, "Flags");
141                 Assert.IsNull (an.KeyPair, "KeyPair");
142                 Assert.IsNull (an.GetPublicKey (), "PublicKey");
143                 AssertEqualsByteArrays ("PublicKeyToken", token, an.GetPublicKeyToken ());
144         }
145
146         [Test]
147         public void KeyPair () 
148         {
149                 an = new AssemblyName ();
150                 an.KeyPair = new StrongNameKeyPair (publicKey);
151
152                 Assert.AreEqual (AssemblyNameFlags.None, an.Flags, "Flags");
153                 Assert.IsNotNull (an.KeyPair, "KeyPair");
154                 Assert.IsNull (an.GetPublicKey (), "PublicKey");
155                 Assert.IsNull (an.GetPublicKeyToken (), "PublicKeyToken");
156         }
157
158         // !!! this assembly MUST NOT use a StrongName !!!
159         [Test]
160         [Category ("NotWorking")] // in other cases null is returned
161         public void Self () 
162         {
163                 Assembly a = Assembly.GetExecutingAssembly ();
164                 AssemblyName an = a.GetName ();
165
166                 Assert.IsNotNull (an.GetPublicKey (), "PublicKey(self)");
167                 Assert.AreEqual (0, an.GetPublicKey ().Length, "PublicKey.Length");
168         }
169
170         [Test]
171         public void FullName1 ()
172         {
173                 // !!! we assume the mscorlib has a strong name !!!
174                 AssemblyName an = typeof(int).Assembly.GetName ();
175                 Assert.IsNotNull (an.FullName, "FullName1#1");
176                 Assert.IsTrue (an.FullName.IndexOf ("Version=") != -1, "FullName1#2");
177                 Assert.IsTrue (an.FullName.IndexOf("Culture=") != -1, "FullName1#3");
178                 Assert.IsTrue (an.FullName.IndexOf ("PublicKeyToken=") != -1, "FullName1#4");
179         }
180
181         [Test]
182         public void FullName2 ()
183         {
184                 const string assemblyName = "TestAssembly";
185
186                 // tests for AssemblyName with only name
187                 AssemblyName an = new AssemblyName ();
188                 an.Name = assemblyName;
189                 Assert.IsNotNull (an.FullName, "FullName2#1");
190                 Assert.AreEqual (an.Name, an.FullName, "FullName2#2");
191                 Assert.AreEqual (-1, an.FullName.IndexOf ("Culture="), "FullName2#3");
192                 Assert.AreEqual (-1, an.FullName.IndexOf ("PublicKeyToken="), "FullName2#4");
193         }
194
195         [Test]
196         public void FullName3 ()
197         {
198                 const string assemblyName = "TestAssembly";
199                 const string assemblyVersion = "1.2";
200
201                 // tests for AssemblyName with name and version
202                 AssemblyName an = new AssemblyName ();
203                 an.Name = assemblyName;
204                 an.Version = new Version (assemblyVersion);
205                 Assert.AreEqual (assemblyName + ", Version=" + assemblyVersion, an.FullName, "FullName3#1");
206         }
207
208         [Test]
209         public void FullName4 ()
210         {
211                 const string assemblyName = "TestAssembly";
212
213                 // tests for AssemblyName with name and neutral culture
214                 AssemblyName an = new AssemblyName ();
215                 an.Name = assemblyName;
216                 an.CultureInfo = CultureInfo.InvariantCulture;
217                 Assert.AreEqual (assemblyName + ", Culture=neutral", an.FullName, "FullName4#1");
218         }
219
220         [Test]
221 #if NET_2_0
222         [Category ("NotWorking")]
223         [ExpectedException (typeof (SecurityException))]
224 #endif
225         public void FullName5 ()
226         {
227                 const string assemblyName = "TestAssembly";
228
229                 // tests for AssemblyName with name and public key
230                 AssemblyName an = new AssemblyName ();
231                 an.Name = assemblyName;
232                 an.SetPublicKey (publicKey);
233                 Assert.AreEqual (assemblyName + ", PublicKeyToken=" + GetTokenString(token), an.FullName, "FullName5#1");
234         }
235
236         [Test]
237         public void FullName6 ()
238         {
239                 const string assemblyName = "TestAssembly";
240                 const string assemblyVersion = "1.2";
241
242                 // tests for AssemblyName with name, version and neutral culture
243                 AssemblyName an = new AssemblyName ();
244                 an.Name = assemblyName;
245                 an.Version = new Version (assemblyVersion);
246                 an.CultureInfo = CultureInfo.InvariantCulture;
247                 Assert.AreEqual (assemblyName + ", Version=" + assemblyVersion 
248                         + ", Culture=neutral", an.FullName, "FullName6#1");
249         }
250
251         [Test]
252 #if NET_2_0
253         [Category ("NotWorking")]
254         [ExpectedException (typeof (SecurityException))]
255 #endif
256         public void FullName7 ()
257         {
258                 const string assemblyName = "TestAssembly";
259                 const string assemblyVersion = "1.2";
260
261                 // tests for AssemblyName with name, version and public key
262                 AssemblyName an = new AssemblyName ();
263                 an.Name = assemblyName;
264                 an.Version = new Version (assemblyVersion);
265                 an.SetPublicKey (publicKey);
266                 Assert.AreEqual (assemblyName + ", Version=" + assemblyVersion
267                         + ", PublicKeyToken=" + GetTokenString (token), 
268                         an.FullName, "FullName7#1");
269         }
270
271         [Test]
272 #if NET_2_0
273         [Category ("NotWorking")]
274         [ExpectedException (typeof (SecurityException))]
275 #endif
276         public void FullName8 ()
277         {
278                 const string assemblyName = "TestAssembly";
279
280                 // tests for AssemblyName with name, culture and public key
281                 AssemblyName an = new AssemblyName ();
282                 an.Name = assemblyName;
283                 an.CultureInfo = CultureInfo.InvariantCulture;
284                 an.SetPublicKey (publicKey);
285                 Assert.AreEqual (assemblyName + ", Culture=neutral"
286                         + ", PublicKeyToken=" + GetTokenString (token),
287                         an.FullName, "FullName8#1");
288         }
289
290         static int nameIndex = 0;
291
292         private AssemblyName GenAssemblyName () 
293         {
294                 AssemblyName assemblyName = new AssemblyName();
295                 assemblyName.Name = "MonoTests.System.Reflection.AssemblyNameTest" + (nameIndex ++);
296                 return assemblyName;
297         }
298
299         private Assembly GenerateAssembly (AssemblyName name) 
300         {
301                 AssemblyBuilder ab = domain.DefineDynamicAssembly (
302                         name,
303                         AssemblyBuilderAccess.RunAndSave,
304                         tempDir);
305                 ab.DefineDynamicModule ("def_module");
306                 ab.Save (name.Name + ".dll");
307
308                 return Assembly.LoadFrom (Path.Combine (tempDir, name.Name + ".dll"));
309         }
310
311         private AssemblyBuilder GenerateDynamicAssembly (AssemblyName name)
312         {
313                 AssemblyBuilder ab = domain.DefineDynamicAssembly (
314                                 name,
315                                 AssemblyBuilderAccess.Run);
316
317                 return ab;
318         }
319
320         [Test]
321         public void TestCultureInfo ()
322         {
323                 AssemblyName name = GenAssemblyName ();
324                 name.CultureInfo = CultureInfo.CreateSpecificCulture ("ar-DZ");
325
326                 Assembly a = GenerateAssembly (name);
327                 Assert.AreEqual (a.GetName ().CultureInfo.Name, "ar-DZ");
328         }
329
330         [Test]
331         public void Version ()
332         {
333                 AssemblyName name = GenAssemblyName ();
334                 name.Version = new Version (1, 2, 3, 4);
335
336                 Assembly a = GenerateAssembly (name);
337                 Assert.AreEqual ("1.2.3.4", a.GetName ().Version.ToString (), "1.2.3.4 normal");
338
339                 name = GenAssemblyName ();
340                 name.Version = new Version (1, 2, 3);
341
342                 a = GenerateAssembly (name);
343                 Assert.AreEqual ("1.2.3.0", a.GetName ().Version.ToString (), "1.2.3.0 normal");
344
345                 name = GenAssemblyName ();
346                 name.Version = new Version (1, 2);
347
348                 a = GenerateAssembly (name);
349                 Assert.AreEqual ("1.2.0.0", a.GetName ().Version.ToString (), "1.2.0.0 normal");
350         }
351
352         [Test]
353         [Category ("NotWorking")]
354         public void Version_Dynamic ()
355         {
356                 AssemblyName name = GenAssemblyName ();
357                 name.Version = new Version (1, 2, 3, 4);
358
359                 AssemblyBuilder ab = GenerateDynamicAssembly (name);
360                 Assert.AreEqual ("1.2.3.4", ab.GetName ().Version.ToString (), "1.2.3.4 dynamic");
361
362                 name = GenAssemblyName ();
363                 name.Version = new Version (1, 2, 3);
364
365                 ab = GenerateDynamicAssembly (name);
366 #if NET_2_0
367                 Assert.AreEqual ("1.2.3.0", ab.GetName ().Version.ToString (), "1.2.3.0 dynamic");
368 #else
369                 Assert.AreEqual ("1.2.3.65535", ab.GetName ().Version.ToString (), "1.2.3.0 dynamic");
370 #endif
371
372                 name = GenAssemblyName ();
373                 name.Version = new Version (1, 2);
374
375                 ab = GenerateDynamicAssembly (name);
376 #if NET_2_0
377                 Assert.AreEqual ("1.2.0.0", ab.GetName ().Version.ToString (), "1.2.0.0 dynamic");
378 #else
379                 Assert.AreEqual ("1.2.65535.65535", ab.GetName ().Version.ToString (), "1.2.0.0 dynamic");
380 #endif
381         }
382
383         [Test]
384         public void HashAlgorithm ()
385         {
386                 Assert.AreEqual (AssemblyHashAlgorithm.SHA1, 
387                         typeof (int).Assembly.GetName ().HashAlgorithm);
388         }
389
390         [Test]
391         public void Serialization ()
392         {
393                 AssemblyName an = new AssemblyName ();
394                 an.CodeBase = "http://www.test.com/test.dll";
395                 an.CultureInfo = CultureInfo.InvariantCulture;
396                 an.Flags = AssemblyNameFlags.PublicKey;
397                 an.HashAlgorithm = AssemblyHashAlgorithm.MD5;
398                 an.KeyPair = new StrongNameKeyPair (publicKey);
399                 an.Name = "TestAssembly";
400                 an.Version = new Version (1, 5);
401                 an.VersionCompatibility = AssemblyVersionCompatibility.SameProcess;
402
403                 MemoryStream ms = new MemoryStream ();
404                 BinaryFormatter bf = new BinaryFormatter ();
405                 bf.Serialize (ms, an);
406
407                 // reset position of memorystream
408                 ms.Position = 0;
409
410                 // deserialze assembly name
411                 AssemblyName dsAssemblyName = (AssemblyName) bf.Deserialize (ms);
412
413                 // close the memorystream
414                 ms.Close ();
415
416                 // compare orginal and deserialized assembly name
417                 Assert.AreEqual (an.CodeBase, dsAssemblyName.CodeBase, "CodeBase");
418                 Assert.AreEqual (an.CultureInfo, dsAssemblyName.CultureInfo, "CultureInfo");
419                 Assert.AreEqual (an.Flags, dsAssemblyName.Flags, "Flags");
420                 Assert.AreEqual (an.HashAlgorithm, dsAssemblyName.HashAlgorithm, "HashAlgorithm");
421                 Assert.AreEqual (an.Name, dsAssemblyName.Name, "Name");
422                 Assert.AreEqual (an.Version, dsAssemblyName.Version, "Version");
423                 Assert.AreEqual (an.VersionCompatibility, dsAssemblyName.VersionCompatibility, "VersionCompatibility");
424                 Assert.AreEqual (an.EscapedCodeBase, dsAssemblyName.EscapedCodeBase, "EscapedCodeBase");
425                 Assert.AreEqual (an.FullName, dsAssemblyName.FullName, "FullName");
426                 Assert.AreEqual (an.ToString (), dsAssemblyName.ToString (), "ToString");
427                 AssertEqualsByteArrays ("PublicKey", an.GetPublicKey (), dsAssemblyName.GetPublicKey ());
428                 AssertEqualsByteArrays ("PublicToken", an.GetPublicKeyToken (), dsAssemblyName.GetPublicKeyToken ());
429         }
430
431         [Test]
432         public void Serialization_WithoutStrongName ()
433         {
434                 AssemblyName an = new AssemblyName ();
435                 an.CodeBase = "http://www.test.com/test.dll";
436                 an.CultureInfo = CultureInfo.InvariantCulture;
437                 an.Flags = AssemblyNameFlags.None;
438                 an.HashAlgorithm = AssemblyHashAlgorithm.SHA1;
439                 an.KeyPair = null;
440                 an.Name = "TestAssembly2";
441                 an.Version = new Version (1, 5, 0, 0);
442                 an.VersionCompatibility = AssemblyVersionCompatibility.SameMachine;
443
444                 MemoryStream ms = new MemoryStream ();
445                 BinaryFormatter bf = new BinaryFormatter ();
446                 bf.Serialize (ms, an);
447
448                 // reset position of memorystream
449                 ms.Position = 0;
450
451                 // deserialze assembly name
452                 AssemblyName dsAssemblyName = (AssemblyName) bf.Deserialize (ms);
453
454                 // close the memorystream
455                 ms.Close ();
456
457                 // compare orginal and deserialized assembly name
458                 Assert.AreEqual (an.CodeBase, dsAssemblyName.CodeBase, "CodeBase");
459                 Assert.AreEqual (an.CultureInfo, dsAssemblyName.CultureInfo, "CultureInfo");
460                 Assert.AreEqual (an.Flags, dsAssemblyName.Flags, "Flags");
461                 Assert.AreEqual (an.HashAlgorithm, dsAssemblyName.HashAlgorithm, "HashAlgorithm");
462                 Assert.AreEqual (an.Name, dsAssemblyName.Name, "Name");
463                 Assert.AreEqual (an.Version, dsAssemblyName.Version, "Version");
464                 Assert.AreEqual (an.VersionCompatibility, dsAssemblyName.VersionCompatibility, "VersionCompatibility");
465                 Assert.AreEqual (an.EscapedCodeBase, dsAssemblyName.EscapedCodeBase, "EscapedCodeBase");
466                 Assert.AreEqual (an.FullName, dsAssemblyName.FullName, "FullName");
467                 Assert.AreEqual (an.ToString (), dsAssemblyName.ToString (), "ToString");
468                 AssertEqualsByteArrays ("PublicKey", an.GetPublicKey (), dsAssemblyName.GetPublicKey ());
469                 AssertEqualsByteArrays ("PublicToken", an.GetPublicKeyToken (), dsAssemblyName.GetPublicKeyToken ());
470         }
471
472         [Test]
473         [ExpectedException (typeof (ArgumentNullException))]
474         public void GetObjectData_Null ()
475         {
476                 AssemblyName an = new AssemblyName ();
477                 an.GetObjectData (null, new StreamingContext (StreamingContextStates.All));
478         }
479
480         [Test]
481 #if NET_2_0
482         [Category ("NotWorking")]
483 #endif
484         public void Clone_Empty ()
485         {
486                 an = new AssemblyName ();
487                 AssemblyName clone = (AssemblyName) an.Clone ();
488
489                 Assert.IsNull (clone.CodeBase, "CodeBase");
490                 Assert.IsNull (clone.CultureInfo, "CultureInfo");
491                 Assert.IsNull (clone.EscapedCodeBase, "EscapedCodeBase");
492                 Assert.AreEqual (AssemblyNameFlags.None, clone.Flags, "Flags");
493 #if NET_2_0
494                 Assert.AreEqual (String.Empty, clone.FullName, "FullName");
495 #else
496                 Assert.IsNull (clone.FullName, "FullName");
497 #endif
498                 Assert.AreEqual (AssemblyHashAlgorithm.None, clone.HashAlgorithm, "HashAlgorithm");
499                 Assert.IsNull (clone.KeyPair, "KeyPair");
500                 Assert.IsNull (clone.Name, "Name");
501                 Assert.IsNull (clone.Version, "Version");
502                 Assert.AreEqual (AssemblyVersionCompatibility.SameMachine, 
503                         clone.VersionCompatibility, "VersionCompatibility");
504         }
505
506         [Test]
507         public void Clone_Self ()
508         {
509                 an = Assembly.GetExecutingAssembly ().GetName ();
510                 AssemblyName clone = (AssemblyName) an.Clone ();
511
512                 Assert.AreEqual (an.CodeBase, clone.CodeBase, "CodeBase");
513                 Assert.AreEqual (an.CultureInfo, clone.CultureInfo, "CultureInfo");
514                 Assert.AreEqual (an.EscapedCodeBase, clone.EscapedCodeBase, "EscapedCodeBase");
515                 Assert.AreEqual (an.Flags, clone.Flags, "Flags");
516                 Assert.AreEqual (an.FullName, clone.FullName, "FullName");
517                 Assert.AreEqual (an.HashAlgorithm, clone.HashAlgorithm, "HashAlgorithm");
518                 Assert.AreEqual (an.KeyPair, clone.KeyPair, "KeyPair");
519                 Assert.AreEqual (an.Name, clone.Name, "Name");
520                 Assert.AreEqual (an.Version, clone.Version, "Version");
521                 Assert.AreEqual (an.VersionCompatibility, clone.VersionCompatibility, "VersionCompatibility");
522         }
523
524         [Test]
525         [ExpectedException (typeof (FileNotFoundException))]
526         public void GetAssemblyName_AssemblyFile_DoesNotExist ()
527         {
528                 AssemblyName.GetAssemblyName (Path.Combine (tempDir, "doesnotexist.dll"));
529         }
530
531         [Test]
532         [Category ("NotWorking")]
533         public void GetAssemblyName_AssemblyFile_LoadFailure ()
534         {
535                 string file = Path.Combine (tempDir, "loadfailure.dll");
536                 using (FileStream fs = File.Open (file, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None)) {
537                         try {
538                                 AssemblyName.GetAssemblyName (file);
539                                 Assert.Fail ("#1");
540                         } catch (FileLoadException ex) {
541                         }
542                 }
543                 File.Delete (file);
544         }
545
546         [Test]
547         public void GetAssemblyName_AssemblyFile_BadImage ()
548         {
549                 string file = Path.Combine (tempDir, "badimage.dll");
550                 using (StreamWriter sw = File.CreateText (file)) {
551                         sw.WriteLine ("somegarbage");
552                 }
553                 try {
554                         AssemblyName.GetAssemblyName (file);
555                         Assert.Fail ("#1");
556                 } catch (BadImageFormatException ex) {
557                 }
558                 File.Delete (file);
559         }
560
561         [Test]
562         public void GetAssemblyName_CodeBase ()
563         {
564                 Assembly execAssembly = Assembly.GetExecutingAssembly ();
565
566                 AssemblyName aname = AssemblyName.GetAssemblyName (execAssembly.Location);
567                 Assert.IsNotNull (aname.CodeBase, "#1");
568                 Assert.AreEqual (execAssembly.CodeBase, aname.CodeBase, "#2");
569         }
570
571         // helpers
572
573         private string GetTokenString (byte[] value)
574         {
575                 string tokenString = "";
576                 for (int i = 0; i < value.Length; i++) {
577                         tokenString += value[i].ToString ("x2");
578                 }
579                 return tokenString;
580         }
581
582 #if NET_2_0
583         [Test]
584         [Category ("NotWorking")]
585         public void Ctor1 ()
586         {
587                 const string assemblyName = "TestAssembly";
588                 AssemblyName an = new AssemblyName (assemblyName);
589                 Assert.IsNotNull (an.Name, "Ctor1#1");
590                 Assert.AreEqual (an.Name, assemblyName, "Ctor1#2");
591                 Assert.IsNull (an.Version, "Ctor1#3");
592                 Assert.IsNull (an.CultureInfo, "Ctor1#4");
593                 Assert.IsNull (an.GetPublicKeyToken (), "Ctor1#5");
594         }
595
596         [Test]
597         public void Ctor2 ()
598         {
599                 const string assemblyName = "TestAssembly";
600                 const string assemblyVersion = "1.2.3.4";
601                 AssemblyName an = new AssemblyName (assemblyName + ", Version=" + assemblyVersion);
602                 Assert.IsNotNull (an.Name, "Ctor2#1");
603                 Assert.AreEqual (an.Name, assemblyName, "Ctor2#2");
604                 Assert.IsNotNull (an.Version, "Ctor2#3");
605                 Assert.AreEqual (an.Version, new Version (assemblyVersion), "Ctor2#4");
606                 Assert.IsNull (an.CultureInfo, "Ctor2#5");
607                 Assert.IsNull (an.GetPublicKeyToken (), "Ctor2#6");
608         }
609
610         [Test]
611         [Category ("NotWorking")]
612         public void Ctor3 ()
613         {
614                 const string assemblyName = "TestAssembly";
615                 const string assemblyCulture = "en-US";
616                 AssemblyName an = new AssemblyName (assemblyName + ", Culture=" + assemblyCulture);
617                 Assert.IsNotNull (an.Name, "Ctor3#1");
618                 Assert.AreEqual (an.Name, assemblyName, "Ctor3#2");
619                 Assert.IsNotNull (an.CultureInfo, "Ctor3#3");
620                 Assert.AreEqual (an.CultureInfo, new CultureInfo (assemblyCulture), "Ctor3#4");
621                 Assert.IsNull (an.Version, "Ctor3#5");
622                 Assert.IsNull (an.GetPublicKeyToken (), "Ctor3#6");
623         }
624
625         [Test]
626         [Category ("NotWorking")]
627         public void Ctor4 ()
628         {
629                 const string assemblyName = "TestAssembly";
630                 byte [] assemblyKeyToken;
631                 AssemblyName an = new AssemblyName (assemblyName + ", PublicKeyToken=" + GetTokenString (token));
632                 Assert.IsNotNull (an.Name, "Ctor4#1");
633                 Assert.AreEqual (an.Name, assemblyName, "Ctor4#2");
634                 Assert.IsNotNull (assemblyKeyToken = an.GetPublicKeyToken (), "Ctor4#3");
635                 Assert.AreEqual (assemblyKeyToken, token, "Ctor4#4");
636                 Assert.IsNull (an.Version, "Ctor4#5");
637                 Assert.IsNull (an.CultureInfo, "Ctor4#6");
638         }
639
640         [Test]
641         public void Ctor5 ()
642         {
643                 const string assemblyName = "TestAssembly";
644                 const string assemblyCulture = "neutral";
645                 const string assemblyVersion = "1.2.3.4";
646                 byte [] assemblyKeyToken;
647
648                 AssemblyName an = new AssemblyName (assemblyName + ", Version=" + assemblyVersion + 
649                                 ", Culture=" + assemblyCulture + ", PublicKeyToken=" + GetTokenString (token));
650                 Assert.IsNotNull (an.Name, "Ctor5#1");
651                 Assert.AreEqual (an.Name, assemblyName, "Ctor5#2");
652                 Assert.IsNotNull (an.CultureInfo, "Ctor5#3");
653                 Assert.AreEqual (an.CultureInfo, new CultureInfo (""), "Ctor5#4");
654                 Assert.IsNotNull (an.Version, "Ctor5#5");
655                 Assert.AreEqual (an.Version, new Version (assemblyVersion), "Ctor5#6");
656                 Assert.IsNotNull (assemblyKeyToken = an.GetPublicKeyToken (), "Ctor5#7");
657                 Assert.AreEqual (assemblyKeyToken, token, "Ctor5#8");
658         }
659
660         [Test]
661         [Category ("NotWorking")]
662         public void Ctor6 ()
663         {
664                 const string assemblyName = "TestAssembly";
665                 AssemblyName an = null;
666                 
667                 // null argument
668                 try {
669                         an = new AssemblyName (null);
670                 } catch (ArgumentNullException) {
671                 }
672                 Assert.IsNull (an, "Ctor6#1");
673
674                 // empty string
675                 an = null;
676                 try {
677                         an = new AssemblyName ("");
678                 } catch (ArgumentException) {
679                 }
680                 Assert.IsNull (an, "Ctor6#2");
681
682                 // incomplete entry
683                 an = null;
684                 try {
685                         an = new AssemblyName (assemblyName + ", Version=,Culture=neutral");
686                 } catch (FileLoadException) {
687                 }
688                 Assert.IsNull (an, "Ctor6#3");
689
690                 // bad format for version
691                 an = null;
692                 try {
693                         an = new AssemblyName (assemblyName + ", Version=a.b");
694                 } catch (FileLoadException) {
695                 }
696                 Assert.IsNull (an, "Ctor6#4");
697
698                 // bad culture info
699                 an = null;
700                 try {
701                         an = new AssemblyName (assemblyName + ", Culture=aa-AA");
702                 } catch (ArgumentException) {
703                 }
704                 Assert.IsNull (an, "Ctor6#5");
705
706                 // incorrect length for key token
707                 an = null;
708                 try {
709                         an = new AssemblyName (assemblyName + ", PublicKeyToken=27576a8182a188");
710                 } catch (FileLoadException) {
711                 }
712                 Assert.IsNull (an, "Ctor6#6");
713
714                 // Incorrect length for key
715                 an = null;
716                 try {
717                         an = new AssemblyName (assemblyName + ", PublicKey=0024000004800000940000000602000000240000525341310004000011000000e39d99616f48cf7d6d59f345e485e713e89b8b1265a31b1a393e9894ee3fbddaf382dcaf4083dc31ee7a40a2a25c69c6d019fba9f37ec17fd680e4f6fe3b5305f71ae9e494e3501d92508c2e98ca1e22991a217aa8ce259c9882ffdfff4fbc6fa5e6660a8ff951cd94ed011e5633651b64e8f4522519b6ec84921ee22e4840e");
718                 } catch (FileLoadException) {
719                 }
720                 Assert.IsNull (an, "Ctor6#7");
721
722                 // missing spec
723                 an = null;
724                 try {
725                         an = new AssemblyName (assemblyName + ", =1.2.4.5");
726                 } catch (FileLoadException) {
727                 }
728                 Assert.IsNull (an, "Ctor6#8");
729
730                 // No '=' found
731                 an = null;
732                 try {
733                         an = new AssemblyName (assemblyName + ", OtherAttribute");
734                 } catch (FileLoadException) {
735                 }
736                 Assert.IsNull (an, "Ctor6#9");
737         }
738
739 #endif
740 }
741
742 }