2 // SqlConnectionTest.cs - NUnit Test Cases for testing the
5 // Senganal T (tsenganal@novell.com)
7 // Copyright (c) 2004 Novell Inc., and the individuals listed
8 // on the ChangeLog entries.
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System.Collections;
33 using System.Data.SqlClient;
35 using System.Threading;
37 using NUnit.Framework;
39 namespace MonoTests.System.Data.Connected.SqlClient
42 [Category ("sqlserver")]
43 public class SqlConnectionTest
46 String connectionString;
53 events = new ArrayList ();
54 connectionString = ConnectionManager.Instance.Sql.ConnectionString;
55 engine = ConnectionManager.Instance.Sql.EngineConfig;
59 public void TearDown ()
63 SqlConnection.ClearAllPools ();
67 public void OverloadedConstructorTest ()
70 //do i need to check for all the synonyms..
71 conn = new SqlConnection ("Timeout=10;Connect Timeout=20;Connection Timeout=30");
72 Assert.AreEqual (30, conn.ConnectionTimeout, "#A1");
73 conn = new SqlConnection ("Connect Timeout=100;Connection Timeout=200;Timeout=300");
74 Assert.AreEqual (300, conn.ConnectionTimeout, "#A2");
75 conn = new SqlConnection ("Connection Timeout=1000;Timeout=2000;Connect Timeout=3000");
76 Assert.AreEqual (3000, conn.ConnectionTimeout, "#A3");
78 //'==' doesent work correctly in both msdotnet and mono
80 conn = new SqlConnection ("server=local==host;database=tmp;");
81 Assert.AreEqual ("local==host", conn.DataSource,
82 "# Datasource name is set incorrectly");
84 string connStr = "Server='loca\"lhost';Database='''Db'; packet Size=\"512\";"
85 + "connect Timeout=20;Workstation Id=\"'\"\"desktop\";";
86 conn = new SqlConnection (connStr);
87 Assert.AreEqual (connStr , conn.ConnectionString , "#B1");
88 Assert.AreEqual ("loca\"lhost" , conn.DataSource , "#B2");
89 Assert.AreEqual ("'Db" , conn.Database , "#B3");
90 Assert.AreEqual (512 , conn.PacketSize , "#B4");
91 Assert.AreEqual (20 , conn.ConnectionTimeout , "#B5");
92 Assert.AreEqual ("'\"desktop" , conn.WorkstationId , "#B6");
98 conn = new SqlConnection (connectionString);
99 conn.StateChange += new StateChangeEventHandler (Connection_StateChange);
102 Assert.AreEqual (ConnectionState.Open, conn.State, "#1");
103 Assert.AreEqual (1, events.Count, "#2");
104 StateChangeEventArgs args = events [0] as StateChangeEventArgs;
105 Assert.IsNotNull (args, "#3");
106 Assert.AreEqual (ConnectionState.Closed, args.OriginalState, "#4");
107 Assert.AreEqual (ConnectionState.Open, args.CurrentState, "#5");
113 public void Open_Connection_Open ()
115 conn = new SqlConnection (connectionString);
121 } catch (InvalidOperationException ex) {
122 // The connection was not closed. The connection's
123 // current state is open
124 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
125 Assert.IsNull (ex.InnerException, "#3");
126 Assert.IsNotNull (ex.Message, "#4");
133 public void Open_ConnectionString_LoginInvalid ()
136 conn = new SqlConnection (connectionString + "user id=invalidLogin");
140 } catch (SqlException ex) {
141 // Login failed for user 'invalidLogin'
142 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
143 Assert.AreEqual ((byte) 14, ex.Class, "#3");
144 Assert.IsNull (ex.InnerException, "#4");
145 Assert.IsNotNull (ex.Message, "#5");
146 Assert.AreEqual (18456, ex.Number, "#7");
147 Assert.AreEqual ((byte) 1, ex.State, "#8");
154 public void Open_ConnectionString_DatabaseInvalid ()
156 conn = new SqlConnection (connectionString + "database=invalidDB");
160 } catch (SqlException ex) {
161 // Cannot open database "invalidDB" requested
162 // by the login. The login failed
163 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
164 Assert.AreEqual ((byte) 14, ex.Class, "#3");
165 Assert.IsNull (ex.InnerException, "#4");
166 Assert.IsNotNull (ex.Message, "#5");
167 Assert.AreEqual (18456, ex.Number, "#7");
168 Assert.AreEqual ((byte) 1, ex.State, "#8");
176 public void Open_ConnectionString_PasswordInvalid ()
179 conn = new SqlConnection (connectionString + ";password=invalidPassword");
183 } catch (SqlException ex) {
184 // Login failed for user '...'
185 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
186 Assert.AreEqual ((byte) 14, ex.Class, "#3");
187 Assert.IsNull (ex.InnerException, "#4");
188 Assert.IsNotNull (ex.Message, "#5");
189 Assert.AreEqual (18456, ex.Number, "#6");
190 Assert.AreEqual ((byte) 1, ex.State, "#7");
197 public void Open_ConnectionString_ServerInvalid ()
199 Assert.Ignore ("Long running");
202 conn = new SqlConnection (connectionString + ";server=invalidServerName");
206 } catch (SqlException ex) {
207 // An error has occurred while establishing a
208 // connection to the server...
209 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
210 Assert.AreEqual ((byte) 20, ex.Class, "#3");
211 Assert.IsNull (ex.InnerException, "#4");
212 Assert.IsNotNull (ex.Message, "#5");
213 Assert.AreEqual (53, ex.Number, "#6");
214 Assert.AreEqual ((byte) 0, ex.State, "#7");
220 [Test] // bug #383061
221 [Category("NotWorking")]
222 public void Open_MaxPoolSize_Reached ()
224 connectionString += ";Pooling=true;Connection Lifetime=6;Connect Timeout=3;Max Pool Size=2";
226 SqlConnection conn1 = new SqlConnection (connectionString);
229 SqlConnection conn2 = new SqlConnection (connectionString);
232 DateTime start = DateTime.Now;
235 using (SqlConnection sqlConnection = new SqlConnection (connectionString)) {
236 sqlConnection.Open ();
239 } catch (InvalidOperationException ex) {
240 // System.InvalidOperationException: Timeout expired.
241 // The timeout period elapsed prior to obtaining a
242 // connection from the pool. This may have occurred
243 // because all pooled connections were in use and max
244 // pool size was reached.
245 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
246 Assert.IsNull (ex.InnerException, "#A3");
247 Assert.IsNotNull (ex.Message, "#A4");
250 TimeSpan elapsed = DateTime.Now - start;
252 Assert.IsTrue (elapsed.TotalSeconds >= 3, "#B1:" + elapsed.TotalSeconds);
253 Assert.IsTrue (elapsed.TotalSeconds < 4, "#B2:" + elapsed.TotalSeconds);
257 // as the second connection is closed, we should now be
258 // able to open a new connection (which essentially
259 // uses the pooled connection from conn2)
260 SqlConnection conn3 = new SqlConnection (connectionString);
267 [Test] // bug #412574
270 conn = new SqlConnection (connectionString);
272 conn.StateChange += new StateChangeEventHandler (Connection_StateChange);
275 Assert.AreEqual (ConnectionState.Closed, conn.State, "#1");
276 Assert.AreEqual (1, events.Count, "#2");
277 StateChangeEventArgs args = events [0] as StateChangeEventArgs;
278 Assert.IsNotNull (args, "#3");
279 Assert.AreEqual (ConnectionState.Open, args.OriginalState, "#4");
280 Assert.AreEqual (ConnectionState.Closed, args.CurrentState, "5");
284 Assert.AreEqual (1, events.Count, "#6");
288 public void ChangeDatabase ()
290 conn = new SqlConnection(connectionString);
293 if (ConnectionManager.Instance.Sql.IsAzure)
295 var exc = Assert.Throws<SqlException>(() => conn.ChangeDatabase("master"));
296 Assert.Equals(40508, exc.Number); //USE statement is not supported to switch between databases (Azure).
300 conn.ChangeDatabase("master");
301 Assert.AreEqual("master", conn.Database);
306 public void ChangeDatabase_DatabaseName_DoesNotExist ()
308 if (ConnectionManager.Instance.Sql.IsAzure)
309 Assert.Ignore("SQL Azure doesn't support 'ChangeDatabase'");
311 conn = new SqlConnection (connectionString);
314 String database = conn.Database;
317 conn.ChangeDatabase ("doesnotexist");
319 } catch (SqlException ex) {
320 // Could not locate entry in sysdatabases for
321 // database 'doesnotexist'. No entry found with
322 // that name. Make sure that the name is entered
324 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
325 Assert.AreEqual ((byte) 16, ex.Class, "#3");
326 Assert.IsNull (ex.InnerException, "#4");
327 Assert.IsNotNull (ex.Message, "#5");
328 Assert.IsTrue (ex.Message.IndexOf ("'doesnotexist'") != -1, "#6");
329 Assert.AreEqual (911, ex.Number, "#7");
330 Assert.AreEqual ((byte) 1, ex.State, "#8");
332 Assert.AreEqual (database, conn.Database, "#9");
339 public void ChangeDatabase_DatabaseName_Empty ()
341 conn = new SqlConnection (connectionString);
344 conn.ChangeDatabase (string.Empty);
346 } catch (ArgumentException ex) {
347 // Database cannot be null, the empty string,
348 // or string of only whitespace
349 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
350 Assert.IsNull (ex.InnerException, "#3");
351 Assert.IsNotNull (ex.Message, "#4");
352 Assert.IsNull (ex.ParamName);
357 public void ChangeDatabase_DatabaseName_Null ()
359 conn = new SqlConnection (connectionString);
362 conn.ChangeDatabase ((string) null);
364 } catch (ArgumentException ex) {
365 // Database cannot be null, the empty string,
366 // or string of only whitespace
367 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
368 Assert.IsNull (ex.InnerException, "#3");
369 Assert.IsNotNull (ex.Message, "#4");
370 Assert.IsNull (ex.ParamName);
374 [Test] // bug #412581
375 public void ChangeDatabase_DatabaseName_Whitespace ()
377 Assert.Ignore ("bug #412581");
379 conn = new SqlConnection (connectionString);
382 conn.ChangeDatabase (" ");
384 } catch (SqlException ex) {
385 // Could not locate entry in sysdatabases for
386 // database ' '. No entry found with that name.
387 // Make sure that the name is entered correctly
388 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
389 Assert.AreEqual ((byte) 16, ex.Class, "#3");
390 Assert.IsNull (ex.InnerException, "#4");
391 Assert.IsNotNull (ex.Message, "#5");
392 Assert.IsTrue (ex.Message.IndexOf ("' '") != -1, "#6");
393 Assert.AreEqual (911, ex.Number, "#7");
394 Assert.AreEqual ((byte) 1, ex.State, "#8");
399 [Category("NotWorking")]
400 public void ClearAllPools ()
402 SqlConnection conn1 = new SqlConnection (connectionString + ";Pooling=false");
405 int initial_connection_count = GetConnectionCount (conn1);
407 SqlConnection conn2 = new SqlConnection (connectionString + ";App=A");
411 SqlConnection conn3 = new SqlConnection (connectionString + ";App=B");
415 Assert.AreEqual (initial_connection_count + 2, GetConnectionCount (conn1), "#1");
417 SqlConnection.ClearAllPools ();
419 Assert.AreEqual (initial_connection_count, GetConnectionCount (conn1), "#2");
423 [Test] // bug #443131
424 [Category("NotWorking")]
425 public void ClearPool ()
427 SqlConnection conn1 = new SqlConnection (connectionString);
430 int initial_connection_count = GetConnectionCount (conn1);
432 SqlConnection conn2 = new SqlConnection (connectionString);
435 SqlConnection conn3 = new SqlConnection (connectionString);
439 Assert.AreEqual (initial_connection_count + 2, GetConnectionCount (conn1), "#1");
441 SqlConnection.ClearPool (conn1);
443 // check if pooled connections that were not in use are
445 Assert.AreEqual (initial_connection_count + 1, GetConnectionCount (conn1), "#2");
449 // check if connections that were in use when the pool
450 // was cleared will not be returned to the pool when
451 // closed (and are closed instead)
452 Assert.AreEqual (initial_connection_count, GetConnectionCount (conn1), "#3");
454 SqlConnection conn4 = new SqlConnection (connectionString);
457 SqlConnection conn5 = new SqlConnection (connectionString);
460 SqlConnection conn6 = new SqlConnection (connectionString);
463 Assert.AreEqual (initial_connection_count + 3, GetConnectionCount (conn1), "#4");
468 // check if new connections are stored in the pool again
469 Assert.AreEqual (initial_connection_count + 3, GetConnectionCount (conn1), "#5");
473 Assert.AreEqual (initial_connection_count + 2, GetConnectionCount (conn4), "#6");
475 SqlConnection.ClearPool (conn3);
477 // the connection passed to ClearPool does not have to
479 Assert.AreEqual (initial_connection_count, GetConnectionCount (conn4), "#7");
481 SqlConnection conn7 = new SqlConnection (connectionString);
485 Assert.AreEqual (initial_connection_count + 1, GetConnectionCount (conn4), "#8");
487 conn3.ConnectionString += ";App=B";
488 SqlConnection.ClearPool (conn3);
490 // check if a pool is identified by its connection string
491 Assert.AreEqual (initial_connection_count + 1, GetConnectionCount (conn4), "#9");
493 SqlConnection conn8 = new SqlConnection (connectionString);
494 SqlConnection.ClearPool (conn8);
496 // connection should not have been opened before to
497 // clear the corresponding pool
498 Assert.AreEqual (initial_connection_count, GetConnectionCount (conn4), "#10");
500 SqlConnection conn9 = new SqlConnection (connectionString);
504 Assert.AreEqual (initial_connection_count + 1, GetConnectionCount (conn4), "#11");
506 conn3.ConnectionString = connectionString;
507 SqlConnection.ClearPool (conn3);
509 Assert.AreEqual (initial_connection_count, GetConnectionCount (conn4), "#12");
511 SqlConnection conn10 = new SqlConnection (connectionString);
514 SqlConnection conn11 = new SqlConnection (connectionString + ";App=B");
517 SqlConnection conn12 = new SqlConnection (connectionString + ";App=B");
520 SqlConnection conn13 = new SqlConnection (connectionString + ";App=B");
528 Assert.AreEqual (initial_connection_count + 4, GetConnectionCount (conn4), "#13");
530 // check that other connection pools are not affected
531 SqlConnection.ClearPool (conn13);
533 Assert.AreEqual (initial_connection_count + 1, GetConnectionCount (conn4), "#14");
535 SqlConnection conn14 = new SqlConnection (connectionString);
539 // a disposed connection cannot be used to clear a pool
540 SqlConnection.ClearPool (conn14);
542 Assert.AreEqual (initial_connection_count + 1, GetConnectionCount (conn4), "#15");
544 SqlConnection.ClearPool (conn4);
546 Assert.AreEqual (initial_connection_count, GetConnectionCount (conn4), "#16");
552 public void InterfaceTransactionTest ()
554 conn = new SqlConnection (connectionString);
556 IDbCommand idbCommand = new SqlCommand ("use [mono-test]", conn);
557 idbCommand.Connection = null;
558 Assert.AreEqual (null, idbCommand.Connection, "Connection should be null");
559 idbCommand.Transaction = null;
560 Assert.AreEqual (null, idbCommand.Transaction, "Transaction should be null");
566 public void BeginTransaction ()
568 conn = new SqlConnection (connectionString);
571 SqlTransaction trans = conn.BeginTransaction ();
572 Assert.AreSame (conn, trans.Connection, "#A1");
573 Assert.AreEqual (IsolationLevel.ReadCommitted, trans.IsolationLevel, "#A2");
576 trans = conn.BeginTransaction ();
579 conn.BeginTransaction ();
581 } catch (InvalidOperationException ex) {
582 // SqlConnection does not support parallel transactions
583 Assert.AreEqual (typeof(InvalidOperationException), ex.GetType(), "#B2");
584 Assert.IsNull (ex.InnerException, "#B3");
585 Assert.IsNotNull (ex.Message, "#B4");
591 trans = conn.BeginTransaction ();
593 trans = conn.BeginTransaction ();
595 trans = conn.BeginTransaction ();
602 public void ConnectionString ()
604 conn = new SqlConnection (connectionString);
605 // Test Repeated Keyoword should take the latest value
606 conn.ConnectionString = conn.ConnectionString + ";server=RepeatedServer;";
607 Assert.AreEqual ("RepeatedServer", ((SqlConnection)conn).DataSource, "#A1");
608 conn.ConnectionString += ";database=gen;Initial Catalog=gen1";
609 Assert.AreEqual ("gen1", conn.Database, "#A2");
611 // Test if properties are set correctly
612 string str = "server=localhost1;database=db;user id=user;";
613 str += "password=pwd;Workstation ID=workstation;Packet Size=512;";
614 str += "Connect Timeout=10";
615 conn.ConnectionString = str;
617 Assert.AreEqual ("localhost1", conn.DataSource, "#B1");
618 Assert.AreEqual ("db", conn.Database, "#B2");
619 Assert.AreEqual (ConnectionState.Closed, conn.State, "#B3");
620 Assert.AreEqual ("workstation", conn.WorkstationId, "#B4");
621 Assert.AreEqual (512, conn.PacketSize, "#B5");
622 Assert.AreEqual (10, conn.ConnectionTimeout, "#B6");
624 // Test if any leftover values exist from previous invocation
625 conn.ConnectionString = connectionString;
626 conn.ConnectionString = string.Empty;
627 Assert.AreEqual (string.Empty, conn.DataSource, "#C1");
628 Assert.AreEqual ("", conn.Database, "#C2");
629 Assert.AreEqual (8000, conn.PacketSize, "#C3");
630 Assert.AreEqual (15, conn.ConnectionTimeout, "#C4");
631 Assert.IsTrue (string.Compare (conn.WorkstationId, Environment.MachineName, true) == 0, "#C5");
635 public void ConnectionString_Connection_Open ()
637 conn = new SqlConnection (connectionString);
638 conn.ConnectionString = connectionString;
641 conn.ConnectionString = "server=localhost;database=tmp;";
643 } catch (InvalidOperationException ex) {
644 // Not allowed to change the 'ConnectionString'
645 // property. The connection's current state is open
646 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
647 Assert.IsNull (ex.InnerException, "#3");
648 Assert.IsNotNull (ex.Message, "#4");
655 public void ServerVersionTest ()
657 conn = new SqlConnection (connectionString);
659 // Test InvalidOperation Exception is thrown if Connection is CLOSED
661 string s = conn.ServerVersion;
662 Assert.Fail ("#A1:" + s);
663 } catch (InvalidOperationException ex) {
664 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
665 Assert.IsNull (ex.InnerException, "#A3");
666 Assert.IsNotNull (ex.Message, "#A4");
669 // Test if Release Version is as per specification.
671 String [] version = conn.ServerVersion.Split ('.');
672 Assert.AreEqual (2, version[0].Length,
673 "#B1 The Major release shud be exactly 2 characters");
674 Assert.AreEqual (2, version[1].Length,
675 "#B2 The Minor release shud be exactly 2 characters");
676 Assert.AreEqual (4, version[2].Length,
677 "#B3 The Release version should be exactly 4 digits");
681 public void Database ()
683 if (ConnectionManager.Instance.Sql.IsAzure)
684 Assert.Ignore("SQL Azure doesn't support 'use [db]'");
686 conn = new SqlConnection (connectionString);
687 string database = conn.Database;
691 // Test if database property is updated when a query changes database
693 cmd = new SqlCommand ("use [master]" , conn);
694 cmd.ExecuteNonQuery ();
695 Assert.AreEqual ("master", conn.Database, "#1");
697 // ensure we're really in the expected database
698 if (ClientVersion == 7)
699 cmd.CommandText = "SELECT name FROM sysdatabases WHERE name = 'master'";
701 cmd.CommandText = "SELECT name FROM sys.databases WHERE name = 'master'";
702 using (SqlDataReader dr = cmd.ExecuteReader ()) {
703 Assert.IsTrue (dr.Read (), "#2");
707 Assert.AreEqual (database, conn.Database, "#3");
709 // Test if the database property is reset on re-opening the connection
710 conn.ConnectionString = connectionString;
712 Assert.AreEqual (database, conn.Database, "#4");
714 // ensure we're really in the expected database
715 cmd.CommandText = "SELECT fname FROM employee WHERE id = 2";
716 using (SqlDataReader dr = cmd.ExecuteReader ()) {
717 Assert.IsTrue (dr.Read (), "#5");
718 Assert.AreEqual ("ramesh", dr.GetValue (0), "#6");
724 [Test] // bug #412571
725 public void Dispose ()
727 StateChangeEventArgs stateChangeArgs;
728 EventArgs disposedArgs;
730 conn = new SqlConnection (connectionString + ";Connection Timeout=30;Packet Size=512;Workstation Id=Desktop");
731 conn.Disposed += new EventHandler (Connection_Disposed);
733 conn.StateChange += new StateChangeEventHandler (Connection_StateChange);
734 Assert.AreEqual (0, events.Count, "#A1");
736 Assert.AreEqual (string.Empty, conn.ConnectionString, "#A2");
737 Assert.AreEqual (15, conn.ConnectionTimeout, "#A3");
738 Assert.AreEqual (string.Empty, conn.Database, "#A4");
739 Assert.AreEqual (string.Empty, conn.DataSource, "#A5");
740 Assert.AreEqual (8000, conn.PacketSize, "#A6");
741 Assert.AreEqual (ConnectionState.Closed, conn.State, "#A7");
742 Assert.IsTrue (string.Compare (conn.WorkstationId, Environment.MachineName, true) == 0, "#A8");
743 Assert.AreEqual (2, events.Count, "#A9");
745 stateChangeArgs = events [0] as StateChangeEventArgs;
746 Assert.IsNotNull (stateChangeArgs, "#B1");
747 Assert.AreEqual (typeof (StateChangeEventArgs), stateChangeArgs.GetType (), "#B2");
748 Assert.AreEqual (ConnectionState.Open, stateChangeArgs.OriginalState, "#B3");
749 Assert.AreEqual (ConnectionState.Closed, stateChangeArgs.CurrentState, "B4");
751 disposedArgs = events [1] as EventArgs;
752 Assert.IsNotNull (disposedArgs, "#C1");
753 Assert.AreEqual (typeof (EventArgs), disposedArgs.GetType (), "#C2");
757 Assert.AreEqual (ConnectionState.Closed, conn.State, "#D1");
758 Assert.AreEqual (3, events.Count, "#D2");
760 disposedArgs = events [2] as EventArgs;
761 Assert.IsNotNull (disposedArgs, "#E1");
762 Assert.AreEqual (typeof (EventArgs), disposedArgs.GetType (), "#E2");
765 void Connection_StateChange (object sender , StateChangeEventArgs e)
770 void Connection_Disposed (object sender , EventArgs e)
776 public void FireInfoMessageEventOnUserErrorsTest ()
778 conn = new SqlConnection ();
779 Assert.AreEqual(false, conn.FireInfoMessageEventOnUserErrors, "#1 The default value should be false");
780 conn.FireInfoMessageEventOnUserErrors = true;
781 Assert.AreEqual(true, conn.FireInfoMessageEventOnUserErrors, "#1 The value should be true after setting the property to true");
785 public void StatisticsEnabledTest ()
787 conn = new SqlConnection ();
788 Assert.AreEqual(false, conn.StatisticsEnabled, "#1 The default value should be false");
789 conn.StatisticsEnabled = true;
790 Assert.AreEqual(true, conn.StatisticsEnabled, "#1 The value should be true after setting the property to true");
794 [Category("NotWorking")]
795 public void ChangePasswordTest ()
797 string tmpPassword = "modifiedbymonosqlclient";
798 SqlConnection.ChangePassword (connectionString, tmpPassword);
799 SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder (connectionString);
800 string oldPassword = connBuilder.Password;
801 connBuilder.Password = tmpPassword;
802 SqlConnection.ChangePassword (connBuilder.ConnectionString, oldPassword); // Modify to the original password
805 static int GetConnectionCount (SqlConnection conn)
809 SqlCommand cmd = conn.CreateCommand ();
810 cmd.CommandText = "select count(*) from master..sysprocesses where db_name(dbid) = @dbname";
811 cmd.Parameters.Add (new SqlParameter ("@dbname", conn.Database));
812 int connection_count = (int) cmd.ExecuteScalar ();
815 return connection_count;
820 return (engine.ClientVersion);
826 [Category ("sqlserver")]
827 public class GetSchemaTest
829 SqlConnection conn = null;
830 String connectionString = ConnectionManager.Instance.Sql.ConnectionString;
835 conn = new SqlConnection(connectionString);
840 public void TearDown()
846 public void GetSchemaTest1()
848 if (ConnectionManager.Instance.Sql.IsAzure)
849 Assert.Ignore("SQL Azure - Not supported'");
852 DataTable tab1 = conn.GetSchema("databases");
853 foreach (DataRow row in tab1.Rows)
855 foreach (DataColumn col in tab1.Columns)
857 if (col.ColumnName.ToString() == "database_name" && row[col].ToString() == ConnectionManager.Instance.DatabaseName)
866 Assert.AreEqual(true, flag, "#GS1 failed");
870 [ExpectedException(typeof(ArgumentException))]
871 public void GetSchemaTest2()
873 conn.GetSchema(null);
877 public void GetSchemaTest3 ()
879 Assert.Ignore ("We currently have no foreign keys defined in the test database");
882 DataTable tab1 = conn.GetSchema("ForeignKeys");
883 foreach (DataRow row in tab1.Rows)
885 foreach (DataColumn col in tab1.Columns)
888 * We need to consider multiple values
890 if (col.ColumnName.ToString() == "TABLE_NAME" && row[col].ToString() == "tmptable1")
899 Assert.AreEqual(true, flag, "#GS3 failed");
903 public void GetSchemaTest4()
906 DataTable tab1 = conn.GetSchema("Indexes");
907 foreach (DataRow row in tab1.Rows)
909 foreach (DataColumn col in tab1.Columns)
912 * We need to consider multiple values
914 if (col.ColumnName.ToString() == "table_name" && row[col].ToString() == "binary_family")
923 Assert.AreEqual(true, flag, "#GS4 failed");
927 public void GetSchemaTest5()
930 DataTable tab1 = conn.GetSchema("IndexColumns");
931 foreach (DataRow row in tab1.Rows)
933 foreach (DataColumn col in tab1.Columns)
936 * We need to consider multiple values
938 if (col.ColumnName.ToString() == "table_name" && row[col].ToString() == "binary_family")
947 Assert.AreEqual(true, flag, "#GS5 failed");
951 public void GetSchemaTest6()
954 DataTable tab1 = conn.GetSchema("Procedures");
955 foreach (DataRow row in tab1.Rows)
957 foreach (DataColumn col in tab1.Columns)
960 * We need to consider multiple values
962 if (col.ColumnName.ToString() == "SPECIFIC_NAME" && row[col].ToString() == "sp_get_age")
971 Assert.AreEqual(true, flag, "#GS6 failed");
975 public void GetSchemaTest7()
978 DataTable tab1 = conn.GetSchema("ProcedureParameters");
979 foreach (DataRow row in tab1.Rows)
981 foreach (DataColumn col in tab1.Columns)
984 * We need to consider multiple values
986 if (col.ColumnName.ToString() == "SPECIFIC_NAME" && row[col].ToString() == "sp_get_age")
995 Assert.AreEqual(true, flag, "#GS7 failed");
999 public void GetSchemaTest8()
1002 DataTable tab1 = conn.GetSchema("Tables");
1003 foreach (DataRow row in tab1.Rows)
1005 foreach (DataColumn col in tab1.Columns)
1008 * We need to consider multiple values
1010 if (col.ColumnName.ToString() == "TABLE_NAME" && row[col].ToString() == "binary_family")
1019 Assert.AreEqual(true, flag, "#GS8 failed");
1023 public void GetSchemaTest9()
1025 if (ConnectionManager.Instance.Sql.IsAzure)
1026 Assert.Ignore("SQL Azure - Not supported'");
1029 DataTable tab1 = conn.GetSchema("Columns");
1030 foreach (DataRow row in tab1.Rows)
1032 foreach (DataColumn col in tab1.Columns)
1035 * We need to consider multiple values
1037 if (col.ColumnName.ToString() == "TABLE_NAME" && row[col].ToString() == "binary_family")
1046 Assert.AreEqual(true, flag, "#GS9 failed");
1050 public void GetSchemaTest10()
1053 DataTable tab1 = conn.GetSchema("Users");
1054 foreach (DataRow row in tab1.Rows)
1056 foreach (DataColumn col in tab1.Columns)
1059 * We need to consider multiple values
1061 if (col.ColumnName.ToString() == "user_name" && row[col].ToString() == "public")
1070 Assert.AreEqual(true, flag, "#GS10 failed");
1074 public void GetSchemaTest11 ()
1076 Assert.Ignore ("Incorrect syntax near 'TABLE_SCHEMA'");
1079 DataTable tab1 = conn.GetSchema("Views");
1080 flag = true; // FIXME: Currently MS-SQL 2005 returns empty table. Remove this flag ASAP.
1081 foreach (DataRow row in tab1.Rows)
1083 foreach (DataColumn col in tab1.Columns)
1086 * We need to consider multiple values.
1088 if (col.ColumnName.ToString() == "user_name" && row[col].ToString() == "public")
1097 Assert.AreEqual(true, flag, "#GS11 failed");
1101 public void GetSchemaTest12 ()
1103 Assert.Ignore ("Incorrect syntax near '('");
1106 DataTable tab1 = conn.GetSchema("ViewColumns");
1107 flag = true; // FIXME: Currently MS-SQL 2005 returns empty table. Remove this flag ASAP.
1108 foreach (DataRow row in tab1.Rows)
1110 foreach (DataColumn col in tab1.Columns)
1113 * We need to consider multiple values.
1115 if (col.ColumnName.ToString() == "user_name" && row[col].ToString() == "public")
1124 Assert.AreEqual(true, flag, "#GS12 failed");
1128 public void GetSchemaTest13 ()
1130 Assert.Ignore ("The multi-part identifier \"assportemblies.name\" could not be bound");
1133 DataTable tab1 = conn.GetSchema("UserDefinedTypes");
1134 flag = true; // FIXME: Currently MS-SQL 2005 returns empty table. Remove this flag ASAP.
1135 foreach (DataRow row in tab1.Rows)
1137 foreach (DataColumn col in tab1.Columns)
1140 * We need to consider multiple values.
1142 if (col.ColumnName.ToString() == "user_name" && row[col].ToString() == "public")
1151 Assert.AreEqual(true, flag, "#GS13 failed");
1155 [Ignore("TODO: fix restrictions")]
1156 public void GetSchemaTest14()
1159 string [] restrictions = new string[4];
1161 restrictions[0] = ConnectionManager.Instance.DatabaseName;
1162 restrictions[1] = "dbo";
1163 restrictions[2] = null;
1164 restrictions[3] = "BASE TABLE";
1165 DataTable tab1 = conn.GetSchema("Tables", restrictions);
1166 foreach (DataRow row in tab1.Rows)
1168 foreach (DataColumn col in tab1.Columns)
1171 * We need to consider multiple values
1173 if (col.ColumnName.ToString() == "TABLE_NAME" && row[col].ToString() == "binary_family")
1182 Assert.AreEqual(true, flag, "#GS14 failed");
1186 [Ignore("TODO: fix restrictions")]
1187 public void GetSchemaTest15()
1190 string [] restrictions = new string[4];
1192 restrictions[0] = ConnectionManager.Instance.DatabaseName;
1193 restrictions[1] = null;
1194 restrictions[2] = "binary_family";
1195 restrictions[3] = null;
1196 DataTable tab1 = conn.GetSchema("IndexColumns", restrictions);
1197 foreach (DataRow row in tab1.Rows)
1199 foreach (DataColumn col in tab1.Columns)
1202 * We need to consider multiple values
1204 if (col.ColumnName.ToString() == "table_name" && row[col].ToString() == "binary_family")
1213 Assert.AreEqual(true, flag, "#GS15 failed");
1217 [Ignore("TODO: fix restrictions")]
1218 public void GetSchemaTest16()
1221 string [] restrictions = new string[4];
1223 restrictions[0] = ConnectionManager.Instance.DatabaseName;
1224 restrictions[1] = null;
1225 restrictions[2] = "sp_get_age";
1226 restrictions[3] = null;
1227 DataTable tab1 = conn.GetSchema("Procedures", restrictions);
1228 foreach (DataRow row in tab1.Rows)
1230 foreach (DataColumn col in tab1.Columns)
1233 * We need to consider multiple values
1235 if (col.ColumnName.ToString() == "ROUTINE_NAME" && row[col].ToString() == "sp_get_age")
1244 Assert.AreEqual(true, flag, "#GS16 failed");
1248 public void GetSchemaTest17()
1251 DataTable tab1 = conn.GetSchema();
1252 foreach (DataRow row in tab1.Rows)
1254 foreach (DataColumn col in tab1.Columns)
1257 * We need to consider multiple values
1259 if (col.ColumnName.ToString() == "CollectionName" && row[col].ToString() == "UserDefinedTypes")
1268 Assert.AreEqual(true, flag, "#GS17 failed");
1272 public void GetSchemaTest18()
1275 DataTable tab1 = conn.GetSchema("RESTRICTIONS");
1276 foreach (DataRow row in tab1.Rows)
1278 foreach (DataColumn col in tab1.Columns)
1281 * We need to consider multiple values
1283 if (col.ColumnName.ToString() == "RestrictionDefault" && row[col].ToString() == "CONSTRAINT_NAME")
1292 Assert.AreEqual(true, flag, "#GS18 failed");
1296 [ExpectedException (typeof (ArgumentException))]
1297 public void GetSchemaTest19 ()
1299 String [] restrictions = new String[1];
1300 conn.GetSchema("RESTRICTIONS", restrictions);
1304 public void GetSchemaTest20 ()
1307 DataTable tab1 = conn.GetSchema("DataTypes");
1308 foreach (DataRow row in tab1.Rows)
1310 foreach (DataColumn col in tab1.Columns)
1313 * We need to consider multiple values
1315 if (col.ColumnName.ToString() == "TypeName" && row[col].ToString() == "uniqueidentifier")
1324 Assert.AreEqual(true, flag, "#GS20 failed");
1328 public void GetSchemaTest21()
1331 DataTable tab1 = conn.GetSchema();
1332 foreach (DataRow row in tab1.Rows)
1334 foreach (DataColumn col in tab1.Columns)
1337 * We need to consider multiple values
1339 if (col.ColumnName.ToString() == "CollectionName" && row[col].ToString() == "UserDefinedTypes")
1348 Assert.AreEqual(true, flag, "#GS21 failed");
1351 public void GetSchemaTest22()
1354 DataTable tab1 = conn.GetSchema("ReservedWords");
1355 foreach (DataRow row in tab1.Rows)
1357 foreach (DataColumn col in tab1.Columns)
1360 * We need to consider multiple values
1362 if (col.ColumnName.ToString() == "ReservedWord" && row[col].ToString() == "UPPER")
1371 Assert.AreEqual(true, flag, "#GS22 failed");
1375 public void GetSchemaTest23()
1378 DataTable tab1 = conn.GetSchema("ReservedWords");
1379 foreach (DataRow row in tab1.Rows)
1381 foreach (DataColumn col in tab1.Columns)
1384 * We need to consider multiple values
1386 if (col.ColumnName.ToString() == "ReservedWord" && row[col].ToString() == "upper")
1395 Assert.AreEqual(false, flag, "#GS23 failed");
1399 public void GetSchemaTest24()
1402 string [] restrictions = new string[4];
1404 restrictions[0] = ConnectionManager.Instance.DatabaseName;
1405 restrictions[1] = null;
1406 restrictions[2] = "sp_get_age";
1407 restrictions[3] = null;
1408 DataTable tab1 = conn.GetSchema("Procedures", restrictions);
1409 foreach (DataRow row in tab1.Rows)
1411 foreach (DataColumn col in tab1.Columns)
1414 * We need to consider multiple values
1416 if (col.ColumnName.ToString() == "ROUTINE_NAME" && row[col].ToString() == "mono")
1425 Assert.AreEqual(false, flag, "#GS24 failed");
1429 [ExpectedException (typeof (ArgumentException))]
1430 public void GetSchemaTest25 ()
1432 String [] restrictions = new String [1];
1433 conn.GetSchema ("Mono", restrictions);