Fix compilation of System.Configuration test suite.
[mono.git] / mcs / class / System / Test / System.Security.Cryptography.X509Certificates / X509StoreTest.cs
index 103b1ebeff07c60ad00c8e2486b626722f9e813b..3fba5e5564d0eddb2cf30cba9acff082409a0e6d 100644 (file)
@@ -15,31 +15,88 @@ using System;
 using System.Collections;
 using System.Security.Cryptography;
 using System.Security.Cryptography.X509Certificates;
+using System.Text;
 
 namespace MonoTests.System.Security.Cryptography.X509Certificates {
 
        [TestFixture]
-       public class X509StoreTest : Assertion {
+       public class X509StoreTest {
+
+               private X509Certificate2 cert_empty;
+               private X509Certificate2 cert1;
+               private X509Certificate2 cert2;
+               private X509Certificate2Collection coll_empty;
+               private X509Certificate2Collection coll;
+
+               [TestFixtureSetUp]
+               public void FixtureSetUp ()
+               {
+                       cert_empty = new X509Certificate2 ();
+                       cert1 = new X509Certificate2 (X509Certificate2Test.farscape_pfx, "farscape", X509KeyStorageFlags.Exportable);
+                       cert2 = new X509Certificate2 (Encoding.ASCII.GetBytes (X509Certificate2Test.base64_cert));
+                       coll_empty = new X509Certificate2Collection ();
+                       coll = new X509Certificate2Collection ();
+                       coll.Add (cert1);
+                       coll.Add (cert2);
+
+                       CleanUpStore ("ReadOnlyStore");
+               }
+
+               [SetUp]
+               public void SetUp ()
+               {
+                       CleanUpStore ("ReadWriteStore");
+               }
+
+               private void CleanUpStore (string s)
+               {
+                       X509Store xs = new X509Store (s);
+                       xs.Open (OpenFlags.ReadWrite);
+                       int n = xs.Certificates.Count;
+                       if (n > 0) {
+                               X509Certificate2[] array = new X509Certificate2[n];
+                               xs.Certificates.CopyTo (array, 0);
+                               foreach (X509Certificate2 x in array)
+                                       xs.Remove (x);
+                       }
+                       xs.Close ();
+               }
+
+               private void CheckDefaults (X509Store xs)
+               {
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("MY", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
+                       // always IntPtr.Zero for Mono, IntPtr.Zero before being opened on Windows
+                       Assert.AreEqual (IntPtr.Zero, xs.StoreHandle, "StoreHandle");
+               }
 
                [Test]
                public void ConstructorEmpty () 
                {
                        X509Store xs = new X509Store ();
-                       // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "MY", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       CheckDefaults (xs);
                }
 
+               [Test]
+               [ExpectedException (typeof (ArgumentNullException))]
+               public void ConstructorIntPtr ()
+               {
+                       new X509Store (IntPtr.Zero);
+               }
 
+               [Test]
+               [ExpectedException (typeof (ArgumentException))]
+               public void ConstructorStoreLocation_Invalid ()
+               {
+                       new X509Store ((StoreLocation) Int32.MinValue);
+               }
+               
                [Test]
                public void ConstructorStoreLocationCurrentUser () 
                {
                        X509Store xs = new X509Store (StoreLocation.CurrentUser);
-                       // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "MY", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       CheckDefaults (xs);
                }
 
                [Test]
@@ -47,20 +104,37 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                {
                        X509Store xs = new X509Store (StoreLocation.LocalMachine);
                        // default properties
-                       AssertEquals ("Location", StoreLocation.LocalMachine, xs.Location);
-                       AssertEquals ("Name", "MY", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.LocalMachine, xs.Location, "Location");
+                       Assert.AreEqual ("MY", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
+               [Test]
+               public void ConstructorStoreString_Null ()
+               {
+                       X509Store xs = new X509Store (null);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.IsNull (xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
+               }
+
+               [Test]
+               public void ConstructorStoreString_Empty ()
+               {
+                       X509Store xs = new X509Store (String.Empty);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual (String.Empty, xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
+               }
 
                [Test]
                public void ConstructorStoreStringAddressBook () 
                {
                        X509Store xs = new X509Store ("AddressBook");
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "AddressBook", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("AddressBook", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
                [Test]
@@ -68,9 +142,9 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                {
                        X509Store xs = new X509Store ("AuthRoot");
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "AuthRoot", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("AuthRoot", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
                [Test]
@@ -78,9 +152,9 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                {
                        X509Store xs = new X509Store ("CA");
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "CA", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("CA", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
                [Test]
@@ -88,9 +162,9 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                {
                        X509Store xs = new X509Store ("Disallowed");
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "Disallowed", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("Disallowed", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
                [Test]
@@ -98,9 +172,9 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                {
                        X509Store xs = new X509Store ("My");
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "My", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("My", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
                [Test]
@@ -108,9 +182,9 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                {
                        X509Store xs = new X509Store ("Root");
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "Root", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("Root", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
                [Test]
@@ -118,9 +192,9 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                {
                        X509Store xs = new X509Store ("TrustedPeople");
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "TrustedPeople", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("TrustedPeople", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
                [Test]
@@ -128,9 +202,9 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                {
                        X509Store xs = new X509Store ("TrustedPublisher");
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "TrustedPublisher", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("TrustedPublisher", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
                [Test]
@@ -139,9 +213,16 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                        // mono isn't defined the StoreName
                        X509Store xs = new X509Store ("Mono");
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "Mono", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("Mono", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
+               }
+
+               [Test]
+               [ExpectedException (typeof (ArgumentException))]
+               public void ConstructorStoreName_Invalid ()
+               {
+                       new X509Store ((StoreName) Int32.MinValue);
                }
 
                [Test]
@@ -149,9 +230,9 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                {
                        X509Store xs = new X509Store (StoreName.AddressBook);
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "AddressBook", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("AddressBook", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
                [Test]
@@ -159,9 +240,9 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                {
                        X509Store xs = new X509Store (StoreName.AuthRoot);
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "AuthRoot", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("AuthRoot", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
                [Test]
@@ -169,9 +250,9 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                {
                        X509Store xs = new X509Store (StoreName.CertificateAuthority);
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "CA", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("CA", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
                [Test]
@@ -179,18 +260,19 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                {
                        X509Store xs = new X509Store (StoreName.Disallowed);
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "Disallowed", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("Disallowed", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
                [Test]
-               public void ConstructorStoreNameMy () {
+               public void ConstructorStoreNameMy () 
+               {
                        X509Store xs = new X509Store (StoreName.My);
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "My", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("My", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
                [Test]
@@ -198,9 +280,9 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                {
                        X509Store xs = new X509Store (StoreName.Root);
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "Root", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("Root", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
                [Test]
@@ -208,9 +290,9 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                {
                        X509Store xs = new X509Store (StoreName.TrustedPeople);
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "TrustedPeople", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("TrustedPeople", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
                }
 
                [Test]
@@ -218,40 +300,293 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates {
                {
                        X509Store xs = new X509Store (StoreName.TrustedPublisher);
                        // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "TrustedPublisher", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       Assert.AreEqual (StoreLocation.CurrentUser, xs.Location, "Location");
+                       Assert.AreEqual ("TrustedPublisher", xs.Name, "Name");
+                       Assert.IsNotNull (xs.Certificates, "Certificates");
+               }
+
+               [Test]
+               [ExpectedException (typeof (ArgumentNullException))]
+               public void Add_Null ()
+               {
+                       new X509Store ().Add (null);
                }
 
+               [Test]
+               [ExpectedException (typeof (CryptographicException))]
+               public void Add_NotOpened ()
+               {
+                       // Open wasn't called
+                       new X509Store ().Add (cert1);
+               }
 
                [Test]
                [ExpectedException (typeof (CryptographicException))]
-               public void AddEmptyCertificateToReadOnlyNonExistingStore () 
+               public void Add_OpenReadOnly ()
                {
-                       // mono isn't defined the StoreName
-                       X509Store xs = new X509Store ("NonExistingStore");
-                       // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "NonExistingStore", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       X509Store xs = new X509Store ("ReadOnlyStore");
                        xs.Open (OpenFlags.ReadOnly);
-                       xs.Add (new X509Certificate2 ());
+                       xs.Add (cert1);
+               }
+
+               [Test]
+               public void Add_SameCertificate ()
+               {
+                       X509Store xs = new X509Store ("ReadWriteStore");
+                       xs.Open (OpenFlags.ReadWrite);
+                       int n = xs.Certificates.Count;
+                       xs.Add (cert1);
+                       xs.Add (cert1);
+                       Assert.AreEqual (n + 1, xs.Certificates.Count, "Count");
                        xs.Close ();
                }
 
                [Test]
                [ExpectedException (typeof (CryptographicException))]
-               public void AddEmptyCertificateToReadWriteNonExistingStore () 
+               public void Add_Empty_Certificate ()
                {
-                       // mono isn't defined the StoreName
-                       X509Store xs = new X509Store ("NonExistingStore");
-                       // default properties
-                       AssertEquals ("Location", StoreLocation.CurrentUser, xs.Location);
-                       AssertEquals ("Name", "NonExistingStore", xs.Name);
-                       AssertNotNull ("Certificates", xs.Certificates);
+                       X509Store xs = new X509Store ("ReadWriteStore");
+                       xs.Open (OpenFlags.ReadWrite);
+                       xs.Add (cert_empty);
+               }
+
+               [Test]
+               [ExpectedException (typeof (CryptographicException))]
+               public void Add_ExistingCertificateReadOnly ()
+               {
+                       X509Store xs = new X509Store ("ReadWriteStore");
+                       xs.Open (OpenFlags.ReadWrite);
+                       xs.Add (cert1);
+                       xs.Close ();
+                       xs.Open (OpenFlags.ReadOnly);
+                       xs.Add (cert1);
+                       xs.Close ();
+               }
+
+               [Test]
+               [ExpectedException (typeof (ArgumentNullException))]
+               public void AddRange_Null ()
+               {
+                       new X509Store ().AddRange (null);
+               }
+
+               [Test]
+               public void AddRange_Empty_Closed ()
+               {
+                       X509Store xs = new X509Store ("ReadWriteStore");
+                       xs.AddRange (coll_empty);
+                       Assert.AreEqual (coll_empty.Count, xs.Certificates.Count, "Count");
+               }
+
+               [Test]
+               public void AddRange_Empty_ReadOnly ()
+               {
+                       X509Store xs = new X509Store ("ReadWriteStore");
+                       xs.Open (OpenFlags.ReadOnly);
+                       xs.AddRange (coll_empty);
+                       Assert.AreEqual (coll_empty.Count, xs.Certificates.Count, "Count");
+               }
+
+               [Test]
+               public void AddRange_Empty_ReadWrite ()
+               {
+                       X509Store xs = new X509Store ("ReadWriteStore");
+                       xs.Open (OpenFlags.ReadWrite);
+                       xs.AddRange (coll_empty);
+                       Assert.AreEqual (coll_empty.Count, xs.Certificates.Count, "Count");
+               }
+
+               [Test]
+               [ExpectedException (typeof (CryptographicException))]
+               public void AddRange_Empty_Certificate ()
+               {
+                       X509Store xs = new X509Store ("ReadWriteStore");
+                       xs.Open (OpenFlags.ReadWrite);
+                       xs.AddRange (new X509Certificate2Collection (cert_empty));
+               }
+
+               [Test]
+               public void AddRange ()
+               {
+                       X509Store xs = new X509Store ("ReadWriteStore");
+                       xs.Open (OpenFlags.ReadWrite);
+                       xs.AddRange (coll);
+                       Assert.AreEqual (coll.Count, xs.Certificates.Count, "Count");
+               }
+
+               [Test]
+               [ExpectedException (typeof (CryptographicException))]
+               public void AddRange_NotOpened ()
+               {
+                       // Open wasn't called
+                       new X509Store ().AddRange (coll);
+               }
+
+               [Test]
+               [ExpectedException (typeof (CryptographicException))]
+               public void AddRange_OpenReadOnly ()
+               {
+                       X509Store xs = new X509Store ("ReadOnlyStore");
+                       xs.Open (OpenFlags.ReadOnly);
+                       xs.AddRange (coll);
+               }
+
+               [Test]
+               public void Close_NotOpen ()
+               {
+                       new X509Store ().Close ();
+               }
+
+               [Test]
+               public void Close_Collection ()
+               {
+                       X509Store xs = new X509Store ("ReadWriteStore");
                        xs.Open (OpenFlags.ReadWrite);
-                       xs.Add (new X509Certificate2 ());
+                       xs.Add (cert1);
+                       Assert.AreEqual (1, xs.Certificates.Count, "Open");
+                       xs.Close ();
+                       Assert.AreEqual (0, xs.Certificates.Count, "Close");
+               }
+
+               [Test]
+               public void Open_Invalid ()
+               {
+                       X509Store xs = new X509Store ("ReadWriteStore");
+                       xs.Open ((OpenFlags) Int32.MinValue);
+               }
+
+               [Test]
+               [ExpectedException (typeof (CryptographicException))]
+               public void Open_OpenExistingOnly ()
+               {
+                       new X509Store ("doesn't-exists").Open (OpenFlags.OpenExistingOnly);
+               }
+
+               [Test]
+               [ExpectedException (typeof (CryptographicException))]
+               public void Open_Store_Null ()
+               {
+                       // ctor is valid (see test) but can't be opened
+                       new X509Store (null).Open (OpenFlags.ReadOnly);
+               }
+
+               [Test]
+               [ExpectedException (typeof (CryptographicException))]
+               public void Open_Store_Empty ()
+               {
+                       // ctor is valid (see test) but can't be opened
+                       new X509Store (String.Empty).Open (OpenFlags.ReadOnly);
+               }
+
+               [Test]
+               [ExpectedException (typeof (ArgumentNullException))]
+               public void Remove_Null ()
+               {
+                       new X509Store ().Remove (null);
+               }
+
+               [Test]
+               [ExpectedException (typeof (CryptographicException))]
+               public void Remove_NotOpened ()
+               {
+                       // Open wasn't called
+                       new X509Store ().Remove (cert1);
+               }
+
+               [Test]
+               public void Remove_OpenReadOnly_Unexisting ()
+               {
+                       X509Store xs = new X509Store ("ReadOnlyStore");
+                       xs.Open (OpenFlags.ReadOnly);
+                       // note: cert1 wasn't present, remove "succeed"
+                       xs.Remove (cert1);
+               }
+
+               [Test]
+               [ExpectedException (typeof (CryptographicException))]
+               public void Remove_OpenReadOnly_Existing ()
+               {
+                       X509Store xs = new X509Store ("ReadWriteStore");
+                       xs.Open (OpenFlags.ReadWrite);
+                       xs.Add (cert1);
+                       xs.Close ();
+                       xs.Open (OpenFlags.ReadOnly);
+                       xs.Remove (cert1);
+               }
+
+               [Test]
+               public void Remove_Empty_Certificate ()
+               {
+                       X509Store xs = new X509Store ("ReadWriteStore");
+                       xs.Open (OpenFlags.ReadWrite);
+                       // note: impossible to add cert_empty, so we add something else
+                       // to be sure we'll follow the complete code path (loop) of removal
+                       xs.Add (cert1);
+                       xs.Remove (cert_empty);
+               }
+
+               [Test]
+               [ExpectedException (typeof (ArgumentNullException))]
+               public void RemoveRange_Null ()
+               {
+                       new X509Store ().RemoveRange (null);
+               }
+
+               [Test]
+               public void RemoveRange_Empty ()
+               {
+                       X509Store xs = new X509Store ();
+                       xs.RemoveRange (coll_empty);
+               }
+
+               [Test]
+               [ExpectedException (typeof (CryptographicException))]
+               public void RemoveRange_NotOpened ()
+               {
+                       // Open wasn't called
+                       new X509Store ().RemoveRange (coll);
+               }
+
+               [Test]
+               public void RemoveRange_OpenReadOnly_Unexisting ()
+               {
+                       X509Store xs = new X509Store ("ReadOnlyStore");
+                       xs.Open (OpenFlags.ReadOnly);
+                       // note: cert1 wasn't present, RemoveRange "succeed"
+                       xs.RemoveRange (coll);
+               }
+
+               [Test]
+               [ExpectedException (typeof (CryptographicException))]
+               public void RemoveRange_OpenReadOnly_Existing ()
+               {
+                       X509Store xs = new X509Store ("ReadWriteStore");
+                       xs.Open (OpenFlags.ReadWrite);
+                       xs.AddRange (coll);
+                       xs.Close ();
+                       xs.Open (OpenFlags.ReadOnly);
+                       xs.RemoveRange (coll);
+               }
+
+               [Test]
+               public void RemoveRange_Empty_Certificate ()
+               {
+                       X509Store xs = new X509Store ("ReadWriteStore");
+                       xs.Open (OpenFlags.ReadWrite);
+                       // note: impossible to add cert_empty, so we add something else
+                       // to be sure we'll follow the complete code path (loop) of removal
+                       xs.AddRange (coll);
+                       xs.RemoveRange (new X509Certificate2Collection (cert_empty));
+               }
+
+               [Test]
+               public void Collection_Add ()
+               {
+                       X509Store xs = new X509Store ("ReadWriteStore");
+                       xs.Certificates.Add (cert1);
+                       Assert.AreEqual (0, xs.Certificates.Count, "Not Open");
                        xs.Close ();
+                       Assert.AreEqual (0, xs.Certificates.Count, "Close");
                }
        }
 }