In tests/attributes:
[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
22 namespace MonoTests.System.Reflection {
23
24 [TestFixture]
25 public class AssemblyNameTest {
26         static public void AssertEqualsByteArrays (string msg, byte[] array1, byte[] array2) 
27         {
28                 if ((array1 == null) && (array2 == null))
29                         return;
30                 if (array1 == null)
31                         Assert.Fail (msg + " -> First array is NULL");
32                 if (array2 == null)
33                         Assert.Fail (msg + " -> Second array is NULL");
34
35                 bool a = (array1.Length == array2.Length);
36                 if (a) {
37                         for (int i = 0; i < array1.Length; i++) {
38                                 if (array1 [i] != array2 [i]) {
39                                         a = false;
40                                         break;
41                                 }
42                         }
43                 }
44                 msg += " -> Expected " + (array1.Length > 0 ? BitConverter.ToString (array1, 0) : "<empty>");
45                 msg += " is different than " + (array2.Length > 0 ? BitConverter.ToString (array2, 0) : "<empty>");
46                 Assert.IsTrue (a, msg);
47         }
48
49         private AssemblyName an;
50
51         private string tempDir = Path.Combine (Path.GetTempPath (), "MonoTests.System.Reflection.AssemblyNameTest");
52
53         private AppDomain domain;
54
55         // created with "sn -o test.snk test.txt"
56         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,
57                 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, 
58                 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,
59                 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 };
60
61         static byte[] token = { 0xFF, 0xEF, 0x94, 0x53, 0x67, 0x69, 0xDA, 0x06 };
62
63         [SetUp]
64         public void SetUp () 
65         {
66                 try {
67                         if (Directory.Exists (tempDir))
68                                 Directory.Delete (tempDir, true);
69                 }
70                 catch (Exception) {
71                 }
72
73                 Directory.CreateDirectory (tempDir);
74
75                 domain = Thread.GetDomain ();
76         }
77
78         [TearDown]
79         public void TearDown () 
80         {
81                 try {
82                         if (Directory.Exists (tempDir))
83                                 Directory.Delete (tempDir, true);
84                 }
85                 catch (Exception) {
86                         // This can happen on windows when the directory contains
87                         // files opened by the CLR
88                 }
89         }
90
91         [Test]
92         public void EmptyAssembly () 
93         {
94                 an = new AssemblyName ();
95                 Assert.IsNull (an.CodeBase, "CodeBase");
96                 Assert.IsNull (an.CultureInfo, "CultureInfo");
97                 Assert.IsNull (an.EscapedCodeBase, "EscapedCodeBase");
98                 Assert.AreEqual (AssemblyNameFlags.None, an.Flags, "Flags");
99                 Assert.IsNull (an.FullName, "FullName");
100                 Assert.AreEqual (AssemblyHashAlgorithm.None, an.HashAlgorithm, "HashAlgorithm");
101                 Assert.IsNull (an.KeyPair, "KeyPair");
102                 Assert.IsNull (an.Name, "Name");
103                 Assert.IsNull (an.Version, "Version");
104                 Assert.AreEqual (AssemblyVersionCompatibility.SameMachine, 
105                         an.VersionCompatibility, "VersionCompatibility");
106         }
107
108         [Test]
109         public void PublicKey () 
110         {
111                 an = new AssemblyName ();
112                 Assert.IsNull (an.GetPublicKey (), "PublicKey(empty)");
113                 an.SetPublicKey (publicKey);
114
115                 Assert.AreEqual (AssemblyNameFlags.PublicKey, an.Flags, "Flags");
116                 // strangly it doesn't affect the KeyPair ?
117                 Assert.IsNull (an.KeyPair, "KeyPair");
118                 AssertEqualsByteArrays ("PublicKey", publicKey, an.GetPublicKey ());
119                 AssertEqualsByteArrays ("PublicKeyToken", token, an.GetPublicKeyToken ());
120         }
121
122         [Test]
123         public void PublicKeyToken () 
124         {
125                 an = new AssemblyName ();
126                 an.SetPublicKeyToken (token);
127
128                 Assert.AreEqual (AssemblyNameFlags.None, an.Flags, "Flags");
129                 Assert.IsNull (an.KeyPair, "KeyPair");
130                 Assert.IsNull (an.GetPublicKey (), "PublicKey");
131                 AssertEqualsByteArrays ("PublicKeyToken", token, an.GetPublicKeyToken ());
132         }
133
134         [Test]
135         public void KeyPair () 
136         {
137                 an = new AssemblyName ();
138                 an.KeyPair = new StrongNameKeyPair (publicKey);
139
140                 Assert.AreEqual (AssemblyNameFlags.None, an.Flags, "Flags");
141                 Assert.IsNotNull (an.KeyPair, "KeyPair");
142                 Assert.IsNull (an.GetPublicKey (), "PublicKey");
143                 Assert.IsNull (an.GetPublicKeyToken (), "PublicKeyToken");
144         }
145
146         // !!! this assembly MUST NOT use a StrongName !!!
147         [Test]
148         public void Self () 
149         {
150                 Assembly a = Assembly.GetExecutingAssembly ();
151                 AssemblyName an = a.GetName ();
152
153                 Assert.IsNotNull (an.GetPublicKey (), "PublicKey(self)");
154                 Assert.AreEqual (0, an.GetPublicKey ().Length, "PublicKey.Length");
155         }
156
157         [Test]
158         public void FullName1 ()
159         {
160                 // !!! we assume the mscorlib has a strong name !!!
161                 AssemblyName an = typeof(int).Assembly.GetName ();
162                 Assert.IsNotNull (an.FullName, "FullName1#1");
163                 Assert.IsTrue (an.FullName.IndexOf ("Version=") != -1, "FullName1#2");
164                 Assert.IsTrue (an.FullName.IndexOf("Culture=") != -1, "FullName1#3");
165                 Assert.IsTrue (an.FullName.IndexOf ("PublicKeyToken=") != -1, "FullName1#4");
166         }
167
168         [Test]
169         public void FullName2 ()
170         {
171                 const string assemblyName = "TestAssembly";
172
173                 // tests for AssemblyName with only name
174                 AssemblyName an = new AssemblyName ();
175                 an.Name = assemblyName;
176                 Assert.IsNotNull (an.FullName, "FullName2#1");
177                 Assert.AreEqual (an.Name, an.FullName, "FullName2#2");
178                 Assert.AreEqual (-1, an.FullName.IndexOf ("Culture="), "FullName2#3");
179                 Assert.AreEqual (-1, an.FullName.IndexOf ("PublicKeyToken="), "FullName2#4");
180         }
181
182         [Test]
183         public void FullName3 ()
184         {
185                 const string assemblyName = "TestAssembly";
186                 const string assemblyVersion = "1.2";
187
188                 // tests for AssemblyName with name and version
189                 AssemblyName an = new AssemblyName ();
190                 an.Name = assemblyName;
191                 an.Version = new Version (assemblyVersion);
192                 Assert.AreEqual (assemblyName + ", Version=" + assemblyVersion, an.FullName, "FullName3#1");
193         }
194
195         [Test]
196         public void FullName4 ()
197         {
198                 const string assemblyName = "TestAssembly";
199
200                 // tests for AssemblyName with name and neutral culture
201                 AssemblyName an = new AssemblyName ();
202                 an.Name = assemblyName;
203                 an.CultureInfo = CultureInfo.InvariantCulture;
204                 Assert.AreEqual (assemblyName + ", Culture=neutral", an.FullName, "FullName4#1");
205         }
206
207         [Test]
208         public void FullName5 ()
209         {
210                 const string assemblyName = "TestAssembly";
211
212                 // tests for AssemblyName with name and public key
213                 AssemblyName an = new AssemblyName ();
214                 an.Name = assemblyName;
215                 an.SetPublicKey (publicKey);
216                 Assert.AreEqual (assemblyName + ", PublicKeyToken=" + GetTokenString(token), an.FullName, "FullName5#1");
217         }
218
219         [Test]
220         public void FullName6 ()
221         {
222                 const string assemblyName = "TestAssembly";
223                 const string assemblyVersion = "1.2";
224
225                 // tests for AssemblyName with name, version and neutral culture
226                 AssemblyName an = new AssemblyName ();
227                 an.Name = assemblyName;
228                 an.Version = new Version (assemblyVersion);
229                 an.CultureInfo = CultureInfo.InvariantCulture;
230                 Assert.AreEqual (assemblyName + ", Version=" + assemblyVersion 
231                         + ", Culture=neutral", an.FullName, "FullName6#1");
232         }
233
234         [Test]
235         public void FullName7 ()
236         {
237                 const string assemblyName = "TestAssembly";
238                 const string assemblyVersion = "1.2";
239
240                 // tests for AssemblyName with name, version and public key
241                 AssemblyName an = new AssemblyName ();
242                 an.Name = assemblyName;
243                 an.Version = new Version (assemblyVersion);
244                 an.SetPublicKey (publicKey);
245                 Assert.AreEqual (assemblyName + ", Version=" + assemblyVersion
246                         + ", PublicKeyToken=" + GetTokenString (token), 
247                         an.FullName, "FullName7#1");
248         }
249
250         [Test]
251         public void FullName8 ()
252         {
253                 const string assemblyName = "TestAssembly";
254
255                 // tests for AssemblyName with name, culture and public key
256                 AssemblyName an = new AssemblyName ();
257                 an.Name = assemblyName;
258                 an.CultureInfo = CultureInfo.InvariantCulture;
259                 an.SetPublicKey (publicKey);
260                 Assert.AreEqual (assemblyName + ", Culture=neutral"
261                         + ", PublicKeyToken=" + GetTokenString (token),
262                         an.FullName, "FullName8#1");
263         }
264
265         static int nameIndex = 0;
266
267         private AssemblyName GenAssemblyName () 
268         {
269                 AssemblyName assemblyName = new AssemblyName();
270                 assemblyName.Name = "MonoTests.System.Reflection.AssemblyNameTest" + (nameIndex ++);
271                 return assemblyName;
272         }
273
274         private Assembly GenerateAssembly (AssemblyName name) 
275         {
276                 AssemblyBuilder ab = domain.DefineDynamicAssembly (
277                         name,
278                         AssemblyBuilderAccess.RunAndSave,
279                         tempDir);
280                 ab.DefineDynamicModule ("def_module");
281                 ab.Save (name.Name + ".dll");
282
283                 return Assembly.LoadFrom (Path.Combine (tempDir, name.Name + ".dll"));
284         }
285
286         [Test]
287         public void TestCultureInfo ()
288         {
289                 AssemblyName name = GenAssemblyName ();
290                 name.CultureInfo = CultureInfo.CreateSpecificCulture ("ar-DZ");
291
292                 Assembly a = GenerateAssembly (name);
293                 Assert.AreEqual (a.GetName ().CultureInfo.Name, "ar-DZ");
294         }
295
296         [Test]
297         public void Version ()
298         {
299                 AssemblyName name = GenAssemblyName ();
300                 name.Version = new Version (1, 2, 3, 4);
301
302                 Assembly a = GenerateAssembly (name);
303                 Assert.AreEqual ("1.2.3.4", a.GetName ().Version.ToString ());
304
305                 name = GenAssemblyName ();
306                 name.Version = new Version (1, 2, 3);
307
308                 a = GenerateAssembly (name);
309                 Assert.AreEqual ("1.2.3.0", a.GetName ().Version.ToString ());
310
311                 name = GenAssemblyName ();
312                 name.Version = new Version (1, 2);
313
314                 a = GenerateAssembly (name);
315                 Assert.AreEqual ("1.2.0.0", a.GetName ().Version.ToString ());
316         }
317
318         [Test]
319         public void HashAlgorithm ()
320         {
321                 Assert.AreEqual (AssemblyHashAlgorithm.SHA1, 
322                         typeof (int).Assembly.GetName ().HashAlgorithm);
323         }
324
325         [Test]
326         public void Serialization ()
327         {
328                 AssemblyName an = new AssemblyName ();
329                 an.CodeBase = "http://www.test.com/test.dll";
330                 an.CultureInfo = CultureInfo.InvariantCulture;
331                 an.Flags = AssemblyNameFlags.PublicKey;
332                 an.HashAlgorithm = AssemblyHashAlgorithm.MD5;
333                 an.KeyPair = new StrongNameKeyPair (publicKey);
334                 an.Name = "TestAssembly";
335                 an.Version = new Version (1, 5);
336                 an.VersionCompatibility = AssemblyVersionCompatibility.SameProcess;
337
338                 MemoryStream ms = new MemoryStream ();
339                 BinaryFormatter bf = new BinaryFormatter ();
340                 bf.Serialize (ms, an);
341
342                 // reset position of memorystream
343                 ms.Position = 0;
344
345                 // deserialze assembly name
346                 AssemblyName dsAssemblyName = (AssemblyName) bf.Deserialize (ms);
347
348                 // close the memorystream
349                 ms.Close ();
350
351                 // compare orginal and deserialized assembly name
352                 Assert.AreEqual (an.CodeBase, dsAssemblyName.CodeBase, "CodeBase");
353                 Assert.AreEqual (an.CultureInfo, dsAssemblyName.CultureInfo, "CultureInfo");
354                 Assert.AreEqual (an.Flags, dsAssemblyName.Flags, "Flags");
355                 Assert.AreEqual (an.HashAlgorithm, dsAssemblyName.HashAlgorithm, "HashAlgorithm");
356                 Assert.AreEqual (an.Name, dsAssemblyName.Name, "Name");
357                 Assert.AreEqual (an.Version, dsAssemblyName.Version, "Version");
358                 Assert.AreEqual (an.VersionCompatibility, dsAssemblyName.VersionCompatibility, "VersionCompatibility");
359                 Assert.AreEqual (an.EscapedCodeBase, dsAssemblyName.EscapedCodeBase, "EscapedCodeBase");
360                 Assert.AreEqual (an.FullName, dsAssemblyName.FullName, "FullName");
361                 Assert.AreEqual (an.ToString (), dsAssemblyName.ToString (), "ToString");
362                 AssertEqualsByteArrays ("PublicKey", an.GetPublicKey (), dsAssemblyName.GetPublicKey ());
363                 AssertEqualsByteArrays ("PublicToken", an.GetPublicKeyToken (), dsAssemblyName.GetPublicKeyToken ());
364         }
365
366         [Test]
367         public void Serialization_WithoutStrongName ()
368         {
369                 AssemblyName an = new AssemblyName ();
370                 an.CodeBase = "http://www.test.com/test.dll";
371                 an.CultureInfo = CultureInfo.InvariantCulture;
372                 an.Flags = AssemblyNameFlags.None;
373                 an.HashAlgorithm = AssemblyHashAlgorithm.SHA1;
374                 an.KeyPair = null;
375                 an.Name = "TestAssembly2";
376                 an.Version = new Version (1, 5, 0, 0);
377                 an.VersionCompatibility = AssemblyVersionCompatibility.SameMachine;
378
379                 MemoryStream ms = new MemoryStream ();
380                 BinaryFormatter bf = new BinaryFormatter ();
381                 bf.Serialize (ms, an);
382
383                 // reset position of memorystream
384                 ms.Position = 0;
385
386                 // deserialze assembly name
387                 AssemblyName dsAssemblyName = (AssemblyName) bf.Deserialize (ms);
388
389                 // close the memorystream
390                 ms.Close ();
391
392                 // compare orginal and deserialized assembly name
393                 Assert.AreEqual (an.CodeBase, dsAssemblyName.CodeBase, "CodeBase");
394                 Assert.AreEqual (an.CultureInfo, dsAssemblyName.CultureInfo, "CultureInfo");
395                 Assert.AreEqual (an.Flags, dsAssemblyName.Flags, "Flags");
396                 Assert.AreEqual (an.HashAlgorithm, dsAssemblyName.HashAlgorithm, "HashAlgorithm");
397                 Assert.AreEqual (an.Name, dsAssemblyName.Name, "Name");
398                 Assert.AreEqual (an.Version, dsAssemblyName.Version, "Version");
399                 Assert.AreEqual (an.VersionCompatibility, dsAssemblyName.VersionCompatibility, "VersionCompatibility");
400                 Assert.AreEqual (an.EscapedCodeBase, dsAssemblyName.EscapedCodeBase, "EscapedCodeBase");
401                 Assert.AreEqual (an.FullName, dsAssemblyName.FullName, "FullName");
402                 Assert.AreEqual (an.ToString (), dsAssemblyName.ToString (), "ToString");
403                 AssertEqualsByteArrays ("PublicKey", an.GetPublicKey (), dsAssemblyName.GetPublicKey ());
404                 AssertEqualsByteArrays ("PublicToken", an.GetPublicKeyToken (), dsAssemblyName.GetPublicKeyToken ());
405         }
406
407         [Test]
408         [ExpectedException (typeof (ArgumentNullException))]
409         public void GetObjectData_Null ()
410         {
411                 AssemblyName an = new AssemblyName ();
412                 an.GetObjectData (null, new StreamingContext (StreamingContextStates.All));\r
413         }
414
415         [Test]
416         public void Clone_Empty ()
417         {
418                 an = new AssemblyName ();
419                 AssemblyName clone = (AssemblyName) an.Clone ();
420
421                 Assert.IsNull (clone.CodeBase, "CodeBase");
422                 Assert.IsNull (clone.CultureInfo, "CultureInfo");
423                 Assert.IsNull (clone.EscapedCodeBase, "EscapedCodeBase");
424                 Assert.AreEqual (AssemblyNameFlags.None, clone.Flags, "Flags");
425                 Assert.IsNull (clone.FullName, "FullName");
426                 Assert.AreEqual (AssemblyHashAlgorithm.None, clone.HashAlgorithm, "HashAlgorithm");
427                 Assert.IsNull (clone.KeyPair, "KeyPair");
428                 Assert.IsNull (clone.Name, "Name");
429                 Assert.IsNull (clone.Version, "Version");
430                 Assert.AreEqual (AssemblyVersionCompatibility.SameMachine, 
431                         clone.VersionCompatibility, "VersionCompatibility");
432         }\r
433
434         [Test]
435         public void Clone_Self ()
436         {
437                 an = Assembly.GetExecutingAssembly ().GetName ();
438                 AssemblyName clone = (AssemblyName) an.Clone ();
439
440                 Assert.AreEqual (an.CodeBase, clone.CodeBase, "CodeBase");
441                 Assert.AreEqual (an.CultureInfo, clone.CultureInfo, "CultureInfo");
442                 Assert.AreEqual (an.EscapedCodeBase, clone.EscapedCodeBase, "EscapedCodeBase");
443                 Assert.AreEqual (an.Flags, clone.Flags, "Flags");
444                 Assert.AreEqual (an.FullName, clone.FullName, "FullName");
445                 Assert.AreEqual (an.HashAlgorithm, clone.HashAlgorithm, "HashAlgorithm");
446                 Assert.AreEqual (an.KeyPair, clone.KeyPair, "KeyPair");
447                 Assert.AreEqual (an.Name, clone.Name, "Name");
448                 Assert.AreEqual (an.Version, clone.Version, "Version");
449                 Assert.AreEqual (an.VersionCompatibility, clone.VersionCompatibility, "VersionCompatibility");
450         }\r
451
452         // helpers
453
454         private string GetTokenString (byte[] value)
455         {
456                 string tokenString = "";
457                 for (int i = 0; i < value.Length; i++) {
458                         tokenString += value[i].ToString ("x2");
459                 }
460                 return tokenString;
461         }
462 }
463
464 }