Merge branch 'master' into config-checks-ipv6
[mono.git] / mcs / class / System.Data / Test / ProviderTests / System.Data.SqlClient / SqlConnectionTest.cs
index 41105d4f22c084335f3ddd1e594bc1ea4bb97a41..0e060e9f857a012bdc65758d96fcfbdf95bfb45f 100644 (file)
@@ -36,7 +36,7 @@ using System.Threading;
 
 using NUnit.Framework;
 
-namespace MonoTests.System.Data
+namespace MonoTests.System.Data.Connected.SqlClient
 {
        [TestFixture]
        [Category ("sqlserver")]
@@ -45,12 +45,14 @@ namespace MonoTests.System.Data
                SqlConnection conn;
                String connectionString;
                ArrayList events;
+               EngineConfig engine;
 
                [SetUp]
                public void SetUp ()
                {
                        events = new ArrayList ();
-                       connectionString = ConnectionManager.Singleton.ConnectionString;
+                       connectionString = ConnectionManager.Instance.Sql.ConnectionString;
+                       engine = ConnectionManager.Instance.Sql.EngineConfig;
                }
 
                [TearDown]
@@ -58,9 +60,8 @@ namespace MonoTests.System.Data
                {
                        if (conn != null)
                                conn.Dispose ();
-#if NET_2_0
-                       SqlConnection.ClearAllPools ();
-#endif
+                       if (connectionString != null)
+                               SqlConnection.ClearAllPools ();
                }
 
                [Test]
@@ -130,92 +131,98 @@ namespace MonoTests.System.Data
                }
 
                [Test]
-               public void Open_ConnectionString_Incorrect ()
+               public void Open_ConnectionString_LoginInvalid ()
                {
-                       Assert.Ignore ("NotWorking");
-
                        // login invalid
                        conn = new SqlConnection (connectionString + "user id=invalidLogin");
                        try {
                                conn.Open ();
-                               Assert.Fail ("#A1");
+                               Assert.Fail ("#1");
                        } catch (SqlException ex) {
                                // Login failed for user 'invalidLogin'
-                               Assert.AreEqual (typeof (SqlException), ex.GetType (), "#A2");
-                               Assert.AreEqual ((byte) 14, ex.Class, "#A3");
-                               Assert.IsNull (ex.InnerException, "#A4");
-                               Assert.IsNotNull (ex.Message, "#A5");
-                               Assert.IsTrue (ex.Message.IndexOf ("'invalidLogin'") != -1, "#A6");
-                               Assert.AreEqual (18456, ex.Number, "#A7");
-                               Assert.AreEqual ((byte) 1, ex.State, "#A8");
+                               Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
+                               Assert.AreEqual ((byte) 14, ex.Class, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (18456, ex.Number, "#7");
+                               Assert.AreEqual ((byte) 1, ex.State, "#8");
                        } finally {
                                conn.Close ();
                        }
+               }
 
-                       // database invalid
+               [Test]
+               public void Open_ConnectionString_DatabaseInvalid ()
+               {
                        conn = new SqlConnection (connectionString + "database=invalidDB");
                        try {
                                conn.Open ();
-                               Assert.Fail ("#B1");
+                               Assert.Fail ("#1");
                        } catch (SqlException ex) {
                                // Cannot open database "invalidDB" requested
                                // by the login. The login failed
-                               Assert.AreEqual (typeof (SqlException), ex.GetType (), "#B2");
-                               Assert.AreEqual ((byte) 11, ex.Class, "#B3");
-                               Assert.IsNull (ex.InnerException, "#B4");
-                               Assert.IsNotNull (ex.Message, "#B5");
-                               Assert.IsTrue (ex.Message.IndexOf ("\"invalidDB\"") != -1, "#B6");
-                               Assert.AreEqual (4060, ex.Number, "#B7");
-                               Assert.AreEqual ((byte) 1, ex.State, "#B8");
+                               Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
+                               Assert.AreEqual ((byte) 14, ex.Class, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (18456, ex.Number, "#7");
+                               Assert.AreEqual ((byte) 1, ex.State, "#8");
                        } finally {
                                conn.Close ();
                        }
 
+               }
+
+               [Test]
+               public void Open_ConnectionString_PasswordInvalid ()
+               {
                        // password invalid
                        conn = new SqlConnection (connectionString + ";password=invalidPassword");
                        try {
                                conn.Open ();
-                               Assert.Fail ("#C1");
+                               Assert.Fail ("#1");
                        } catch (SqlException ex) {
                                // Login failed for user '...'
-                               Assert.AreEqual (typeof (SqlException), ex.GetType (), "#C2");
-                               Assert.AreEqual ((byte) 14, ex.Class, "#C3");
-                               Assert.IsNull (ex.InnerException, "#C4");
-                               Assert.IsNotNull (ex.Message, "#C5");
-                               Assert.AreEqual (18456, ex.Number, "#C6");
-                               Assert.AreEqual ((byte) 1, ex.State, "#C7");
+                               Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
+                               Assert.AreEqual ((byte) 14, ex.Class, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (18456, ex.Number, "#6");
+                               Assert.AreEqual ((byte) 1, ex.State, "#7");
                        } finally {
                                conn.Close ();
                        }
+               }
+
+               [Test]
+               public void Open_ConnectionString_ServerInvalid ()
+               {
+                       Assert.Ignore ("Long running");
 
                        // server invalid
                        conn = new SqlConnection (connectionString + ";server=invalidServerName");
                        try {
                                conn.Open ();
-                               Assert.Fail ("#D1");
+                               Assert.Fail ("#1");
                        } catch (SqlException ex) {
                                // An error has occurred while establishing a
                                // connection to the server...
-                               Assert.AreEqual (typeof (SqlException), ex.GetType (), "#D2");
-                               Assert.AreEqual ((byte) 20, ex.Class, "#D3");
-                               Assert.IsNull (ex.InnerException, "#D4");
-                               Assert.IsNotNull (ex.Message, "#D5");
-#if NET_2_0
-                               Assert.AreEqual (53, ex.Number, "#D6");
-#else
-                               Assert.AreEqual (17, ex.Number, "#D6");
-#endif
-                               Assert.AreEqual ((byte) 0, ex.State, "#D7");
+                               Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
+                               Assert.AreEqual ((byte) 20, ex.Class, "#3");
+                               Assert.IsNull (ex.InnerException, "#4");
+                               Assert.IsNotNull (ex.Message, "#5");
+                               Assert.AreEqual (53, ex.Number, "#6");
+                               Assert.AreEqual ((byte) 0, ex.State, "#7");
                        } finally {
                                conn.Close ();
                        }
-               }
+                       }
 
                [Test] // bug #383061
+               [Category("NotWorking")]
                public void Open_MaxPoolSize_Reached ()
                {
-                       connectionString += "Pooling=true;Connection Lifetime=6;"
-                               + "Connect Timeout=3;Max Pool Size=2";
+                       connectionString += ";Pooling=true;Connection Lifetime=6;Connect Timeout=3;Max Pool Size=2";
 
                        SqlConnection conn1 = new SqlConnection (connectionString);
                        conn1.Open ();
@@ -281,15 +288,27 @@ namespace MonoTests.System.Data
                [Test]
                public void ChangeDatabase ()
                {
-                       conn = new SqlConnection (connectionString);
-                       conn.Open ();
-                       conn.ChangeDatabase ("master");
-                       Assert.AreEqual ("master", conn.Database);
+                       conn = new SqlConnection(connectionString);
+                       conn.Open();
+
+                       if (ConnectionManager.Instance.Sql.IsAzure)
+                       {
+                               var exc = Assert.Throws<SqlException>(() => conn.ChangeDatabase("master"));
+                               Assert.Equals(40508, exc.Number); //USE statement is not supported to switch between databases (Azure).
+                       }
+                       else
+                       {
+                               conn.ChangeDatabase("master");
+                               Assert.AreEqual("master", conn.Database);
+                       }
                }
 
                [Test]
                public void ChangeDatabase_DatabaseName_DoesNotExist ()
                {
+                       if (ConnectionManager.Instance.Sql.IsAzure)
+                               Assert.Ignore("SQL Azure doesn't support 'ChangeDatabase'");
+
                        conn = new SqlConnection (connectionString);
                        conn.Open ();
 
@@ -356,16 +375,13 @@ namespace MonoTests.System.Data
                [Test] // bug #412581
                public void ChangeDatabase_DatabaseName_Whitespace ()
                {
-#if NET_2_0
                        Assert.Ignore ("bug #412581");
-#endif
 
                        conn = new SqlConnection (connectionString);
                        conn.Open ();
                        try {
                                conn.ChangeDatabase ("   ");
                                Assert.Fail ("#1");
-#if NET_2_0
                        } catch (SqlException ex) {
                                // Could not locate entry in sysdatabases for
                                // database '   '. No entry found with that name.
@@ -378,20 +394,10 @@ namespace MonoTests.System.Data
                                Assert.AreEqual (911, ex.Number, "#7");
                                Assert.AreEqual ((byte) 1, ex.State, "#8");
                        }
-#else
-                       } catch (ArgumentException ex) {
-                               // Database cannot be null, the empty string,
-                               // or string of only whitespace
-                               Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
-                               Assert.IsNull (ex.InnerException, "#3");
-                               Assert.IsNotNull (ex.Message, "#4");
-                               Assert.IsNull (ex.ParamName);
-                       }
-#endif
                }
 
-#if NET_2_0
                [Test]
+               [Category("NotWorking")]
                public void ClearAllPools ()
                {
                        SqlConnection conn1 = new SqlConnection (connectionString + ";Pooling=false");
@@ -416,6 +422,7 @@ namespace MonoTests.System.Data
                }
 
                [Test] // bug #443131
+               [Category("NotWorking")]
                public void ClearPool ()
                {
                        SqlConnection conn1 = new SqlConnection (connectionString);
@@ -541,7 +548,6 @@ namespace MonoTests.System.Data
 
                        conn4.Close ();
                }
-#endif
 
                [Test]
                public void InterfaceTransactionTest ()
@@ -621,11 +627,7 @@ namespace MonoTests.System.Data
                        conn.ConnectionString = string.Empty;
                        Assert.AreEqual (string.Empty, conn.DataSource, "#C1");
                        Assert.AreEqual ("", conn.Database, "#C2");
-#if NET_2_0
                        Assert.AreEqual (8000, conn.PacketSize, "#C3");
-#else
-                       Assert.AreEqual (8192, conn.PacketSize, "#C3");
-#endif
                        Assert.AreEqual (15, conn.ConnectionTimeout, "#C4");
                        Assert.IsTrue (string.Compare (conn.WorkstationId, Environment.MachineName, true) == 0, "#C5");
                }
@@ -679,21 +681,44 @@ namespace MonoTests.System.Data
                [Test]
                public void Database ()
                {
+                       if (ConnectionManager.Instance.Sql.IsAzure)
+                               Assert.Ignore("SQL Azure doesn't support 'use [db]'");
+
                        conn = new SqlConnection (connectionString);
                        string database = conn.Database;
 
+                       SqlCommand cmd;
+
                        // Test if database property is updated when a query changes database
                        conn.Open ();
-                       SqlCommand cmd = new SqlCommand ("use [master]" , conn);
+                       cmd = new SqlCommand ("use [master]" , conn);
                        cmd.ExecuteNonQuery ();
                        Assert.AreEqual ("master", conn.Database, "#1");
+
+                       // ensure we're really in the expected database
+                       if (ClientVersion == 7)
+                               cmd.CommandText = "SELECT name FROM sysdatabases WHERE name = 'master'";
+                       else
+                               cmd.CommandText = "SELECT name FROM sys.databases WHERE name = 'master'";
+                       using (SqlDataReader dr = cmd.ExecuteReader ()) {
+                               Assert.IsTrue (dr.Read (), "#2");
+                       }
+
                        conn.Close ();
-                       Assert.AreEqual (database, conn.Database, "#2");
+                       Assert.AreEqual (database, conn.Database, "#3");
 
                        // Test if the database property is reset on re-opening the connection
                        conn.ConnectionString = connectionString;
                        conn.Open ();
-                       Assert.AreEqual (database, conn.Database, "#3");
+                       Assert.AreEqual (database, conn.Database, "#4");
+
+                       // ensure we're really in the expected database
+                       cmd.CommandText = "SELECT fname FROM employee WHERE id = 2";
+                       using (SqlDataReader dr = cmd.ExecuteReader ()) {
+                               Assert.IsTrue (dr.Read (), "#5");
+                               Assert.AreEqual ("ramesh", dr.GetValue (0), "#6");
+                       }
+
                        conn.Close ();
                }
 
@@ -713,11 +738,7 @@ namespace MonoTests.System.Data
                        Assert.AreEqual (15, conn.ConnectionTimeout, "#A3");
                        Assert.AreEqual (string.Empty, conn.Database, "#A4");
                        Assert.AreEqual (string.Empty, conn.DataSource, "#A5");
-#if NET_2_0
                        Assert.AreEqual (8000, conn.PacketSize, "#A6");
-#else
-                       Assert.AreEqual (8192, conn.PacketSize, "#A6");
-#endif
                        Assert.AreEqual (ConnectionState.Closed, conn.State, "#A7");
                        Assert.IsTrue (string.Compare (conn.WorkstationId, Environment.MachineName, true) == 0, "#A8");
                        Assert.AreEqual (2, events.Count, "#A9");
@@ -752,7 +773,6 @@ namespace MonoTests.System.Data
                        events.Add (e);
                }
 
-#if NET_2_0
                [Test]
                public void FireInfoMessageEventOnUserErrorsTest ()
                {
@@ -772,6 +792,7 @@ namespace MonoTests.System.Data
                }
 
                [Test]
+               [Category("NotWorking")]
                public void ChangePasswordTest ()
                {
                        string tmpPassword = "modifiedbymonosqlclient";
@@ -794,19 +815,23 @@ namespace MonoTests.System.Data
 
                        return connection_count;
                }
-#endif
+
+               int ClientVersion {
+                       get {
+                               return (engine.ClientVersion);
+                       }
+               }
        }
 
-#if NET_2_0
        [TestFixture]
        [Category ("sqlserver")]
        public class GetSchemaTest
        {
                SqlConnection conn = null;
-               String connectionString = ConnectionManager.Singleton.ConnectionString;
+               String connectionString = ConnectionManager.Instance.Sql.ConnectionString;
 
                [SetUp]
-               public void Setup()
+               public void SetUp()
                {
                        conn = new SqlConnection(connectionString);
                        conn.Open();
@@ -815,19 +840,22 @@ namespace MonoTests.System.Data
                [TearDown]
                public void TearDown()
                {
-                       conn.Close();
+                       conn?.Close();
                }
 
                [Test]
                public void GetSchemaTest1()
                {
+                       if (ConnectionManager.Instance.Sql.IsAzure)
+                               Assert.Ignore("SQL Azure - Not supported'");
+
                        bool flag = false;
                        DataTable tab1 = conn.GetSchema("databases");
                        foreach (DataRow row in tab1.Rows)
                        {
                                foreach (DataColumn col in tab1.Columns)
                                {
-                                       if (col.ColumnName.ToString() == "database_name" && row[col].ToString() == "monotest")
+                                       if (col.ColumnName.ToString() == "database_name" && row[col].ToString() == ConnectionManager.Instance.DatabaseName)
                                        {
                                                flag = true;
                                                break;
@@ -995,6 +1023,9 @@ namespace MonoTests.System.Data
                [Test]
                public void GetSchemaTest9()
                {
+                       if (ConnectionManager.Instance.Sql.IsAzure)
+                               Assert.Ignore("SQL Azure - Not supported'");
+
                        bool flag = false;
                        DataTable tab1 = conn.GetSchema("Columns");
                        foreach (DataRow row in tab1.Rows)
@@ -1122,12 +1153,13 @@ namespace MonoTests.System.Data
                }
 
                [Test]
+               [Ignore("TODO: fix restrictions")]
                public void GetSchemaTest14()
                {
                        bool flag = false;
                        string [] restrictions = new string[4];
 
-                       restrictions[0] = "monotest";
+                       restrictions[0] = ConnectionManager.Instance.DatabaseName;
                        restrictions[1] = "dbo";
                        restrictions[2] = null;
                        restrictions[3] = "BASE TABLE";
@@ -1152,12 +1184,13 @@ namespace MonoTests.System.Data
                }
 
                [Test]
+               [Ignore("TODO: fix restrictions")]
                public void GetSchemaTest15()
                {
                        bool flag = false;
                        string [] restrictions = new string[4];
 
-                       restrictions[0] = "monotest";
+                       restrictions[0] = ConnectionManager.Instance.DatabaseName;
                        restrictions[1] = null;
                        restrictions[2] = "binary_family";
                        restrictions[3] = null;
@@ -1182,12 +1215,13 @@ namespace MonoTests.System.Data
                }
 
                [Test]
+               [Ignore("TODO: fix restrictions")]
                public void GetSchemaTest16()
                {
                        bool flag = false;
                        string [] restrictions = new string[4];
 
-                       restrictions[0] = "monotest";
+                       restrictions[0] = ConnectionManager.Instance.DatabaseName;
                        restrictions[1] = null;
                        restrictions[2] = "sp_get_age";
                        restrictions[3] = null;
@@ -1368,7 +1402,7 @@ namespace MonoTests.System.Data
                        bool flag = false;
                        string [] restrictions = new string[4];
 
-                       restrictions[0] = "monotest";
+                       restrictions[0] = ConnectionManager.Instance.DatabaseName;
                        restrictions[1] = null;
                        restrictions[2] = "sp_get_age";
                        restrictions[3] = null;
@@ -1400,5 +1434,4 @@ namespace MonoTests.System.Data
                        conn.GetSchema ("Mono", restrictions);
                }
        }
-#endif
 }