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
42 [Category ("sqlserver")]
43 public class SqlConnectionTest
46 String connectionString;
52 events = new ArrayList ();
53 connectionString = ConnectionManager.Singleton.ConnectionString;
57 public void TearDown ()
62 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.IsTrue (ex.Message.IndexOf ("'invalidLogin'") != -1, "#6");
147 Assert.AreEqual (18456, ex.Number, "#7");
148 Assert.AreEqual ((byte) 1, ex.State, "#8");
155 public void Open_ConnectionString_DatabaseInvalid ()
157 conn = new SqlConnection (connectionString + "database=invalidDB");
161 } catch (SqlException ex) {
162 // Cannot open database "invalidDB" requested
163 // by the login. The login failed
164 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
165 Assert.AreEqual ((byte) 11, ex.Class, "#3");
166 Assert.IsNull (ex.InnerException, "#4");
167 Assert.IsNotNull (ex.Message, "#5");
168 Assert.IsTrue (ex.Message.IndexOf ("\"invalidDB\"") != -1, "#6");
169 Assert.AreEqual (4060, ex.Number, "#7");
170 Assert.AreEqual ((byte) 1, ex.State, "#8");
178 public void Open_ConnectionString_PasswordInvalid ()
181 conn = new SqlConnection (connectionString + ";password=invalidPassword");
185 } catch (SqlException ex) {
186 // Login failed for user '...'
187 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
188 Assert.AreEqual ((byte) 14, ex.Class, "#3");
189 Assert.IsNull (ex.InnerException, "#4");
190 Assert.IsNotNull (ex.Message, "#5");
191 Assert.AreEqual (18456, ex.Number, "#6");
192 Assert.AreEqual ((byte) 1, ex.State, "#7");
199 public void Open_ConnectionString_ServerInvalid ()
201 Assert.Ignore ("Long running");
204 conn = new SqlConnection (connectionString + ";server=invalidServerName");
208 } catch (SqlException ex) {
209 // An error has occurred while establishing a
210 // connection to the server...
211 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
212 Assert.AreEqual ((byte) 20, ex.Class, "#3");
213 Assert.IsNull (ex.InnerException, "#4");
214 Assert.IsNotNull (ex.Message, "#5");
216 Assert.AreEqual (53, ex.Number, "#6");
218 Assert.AreEqual (17, ex.Number, "#6");
220 Assert.AreEqual ((byte) 0, ex.State, "#7");
226 [Test] // bug #383061
227 public void Open_MaxPoolSize_Reached ()
229 connectionString += "Pooling=true;Connection Lifetime=6;"
230 + "Connect Timeout=3;Max Pool Size=2";
232 SqlConnection conn1 = new SqlConnection (connectionString);
235 SqlConnection conn2 = new SqlConnection (connectionString);
238 DateTime start = DateTime.Now;
241 using (SqlConnection sqlConnection = new SqlConnection (connectionString)) {
242 sqlConnection.Open ();
245 } catch (InvalidOperationException ex) {
246 // System.InvalidOperationException: Timeout expired.
247 // The timeout period elapsed prior to obtaining a
248 // connection from the pool. This may have occurred
249 // because all pooled connections were in use and max
250 // pool size was reached.
251 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
252 Assert.IsNull (ex.InnerException, "#A3");
253 Assert.IsNotNull (ex.Message, "#A4");
256 TimeSpan elapsed = DateTime.Now - start;
258 Assert.IsTrue (elapsed.TotalSeconds >= 3, "#B1:" + elapsed.TotalSeconds);
259 Assert.IsTrue (elapsed.TotalSeconds < 4, "#B2:" + elapsed.TotalSeconds);
263 // as the second connection is closed, we should now be
264 // able to open a new connection (which essentially
265 // uses the pooled connection from conn2)
266 SqlConnection conn3 = new SqlConnection (connectionString);
273 [Test] // bug #412574
276 conn = new SqlConnection (connectionString);
278 conn.StateChange += new StateChangeEventHandler (Connection_StateChange);
281 Assert.AreEqual (ConnectionState.Closed, conn.State, "#1");
282 Assert.AreEqual (1, events.Count, "#2");
283 StateChangeEventArgs args = events [0] as StateChangeEventArgs;
284 Assert.IsNotNull (args, "#3");
285 Assert.AreEqual (ConnectionState.Open, args.OriginalState, "#4");
286 Assert.AreEqual (ConnectionState.Closed, args.CurrentState, "5");
290 Assert.AreEqual (1, events.Count, "#6");
294 public void ChangeDatabase ()
296 conn = new SqlConnection (connectionString);
298 conn.ChangeDatabase ("master");
299 Assert.AreEqual ("master", conn.Database);
303 public void ChangeDatabase_DatabaseName_DoesNotExist ()
305 conn = new SqlConnection (connectionString);
308 String database = conn.Database;
311 conn.ChangeDatabase ("doesnotexist");
313 } catch (SqlException ex) {
314 // Could not locate entry in sysdatabases for
315 // database 'doesnotexist'. No entry found with
316 // that name. Make sure that the name is entered
318 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
319 Assert.AreEqual ((byte) 16, ex.Class, "#3");
320 Assert.IsNull (ex.InnerException, "#4");
321 Assert.IsNotNull (ex.Message, "#5");
322 Assert.IsTrue (ex.Message.IndexOf ("'doesnotexist'") != -1, "#6");
323 Assert.AreEqual (911, ex.Number, "#7");
324 Assert.AreEqual ((byte) 1, ex.State, "#8");
326 Assert.AreEqual (database, conn.Database, "#9");
333 public void ChangeDatabase_DatabaseName_Empty ()
335 conn = new SqlConnection (connectionString);
338 conn.ChangeDatabase (string.Empty);
340 } catch (ArgumentException ex) {
341 // Database cannot be null, the empty string,
342 // or string of only whitespace
343 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
344 Assert.IsNull (ex.InnerException, "#3");
345 Assert.IsNotNull (ex.Message, "#4");
346 Assert.IsNull (ex.ParamName);
351 public void ChangeDatabase_DatabaseName_Null ()
353 conn = new SqlConnection (connectionString);
356 conn.ChangeDatabase ((string) null);
358 } catch (ArgumentException ex) {
359 // Database cannot be null, the empty string,
360 // or string of only whitespace
361 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
362 Assert.IsNull (ex.InnerException, "#3");
363 Assert.IsNotNull (ex.Message, "#4");
364 Assert.IsNull (ex.ParamName);
368 [Test] // bug #412581
369 public void ChangeDatabase_DatabaseName_Whitespace ()
372 Assert.Ignore ("bug #412581");
375 conn = new SqlConnection (connectionString);
378 conn.ChangeDatabase (" ");
381 } catch (SqlException ex) {
382 // Could not locate entry in sysdatabases for
383 // database ' '. No entry found with that name.
384 // Make sure that the name is entered correctly
385 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
386 Assert.AreEqual ((byte) 16, ex.Class, "#3");
387 Assert.IsNull (ex.InnerException, "#4");
388 Assert.IsNotNull (ex.Message, "#5");
389 Assert.IsTrue (ex.Message.IndexOf ("' '") != -1, "#6");
390 Assert.AreEqual (911, ex.Number, "#7");
391 Assert.AreEqual ((byte) 1, ex.State, "#8");
394 } catch (ArgumentException ex) {
395 // Database cannot be null, the empty string,
396 // or string of only whitespace
397 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
398 Assert.IsNull (ex.InnerException, "#3");
399 Assert.IsNotNull (ex.Message, "#4");
400 Assert.IsNull (ex.ParamName);
407 public void ClearAllPools ()
409 SqlConnection conn1 = new SqlConnection (connectionString + ";Pooling=false");
412 int initial_connection_count = GetConnectionCount (conn1);
414 SqlConnection conn2 = new SqlConnection (connectionString + ";App=A");
418 SqlConnection conn3 = new SqlConnection (connectionString + ";App=B");
422 Assert.AreEqual (initial_connection_count + 2, GetConnectionCount (conn1), "#1");
424 SqlConnection.ClearAllPools ();
426 Assert.AreEqual (initial_connection_count, GetConnectionCount (conn1), "#2");
430 [Test] // bug #443131
431 public void ClearPool ()
433 SqlConnection conn1 = new SqlConnection (connectionString);
436 int initial_connection_count = GetConnectionCount (conn1);
438 SqlConnection conn2 = new SqlConnection (connectionString);
441 SqlConnection conn3 = new SqlConnection (connectionString);
445 Assert.AreEqual (initial_connection_count + 2, GetConnectionCount (conn1), "#1");
447 SqlConnection.ClearPool (conn1);
449 // check if pooled connections that were not in use are
451 Assert.AreEqual (initial_connection_count + 1, GetConnectionCount (conn1), "#2");
455 // check if connections that were in use when the pool
456 // was cleared will not be returned to the pool when
457 // closed (and are closed instead)
458 Assert.AreEqual (initial_connection_count, GetConnectionCount (conn1), "#3");
460 SqlConnection conn4 = new SqlConnection (connectionString);
463 SqlConnection conn5 = new SqlConnection (connectionString);
466 SqlConnection conn6 = new SqlConnection (connectionString);
469 Assert.AreEqual (initial_connection_count + 3, GetConnectionCount (conn1), "#4");
474 // check if new connections are stored in the pool again
475 Assert.AreEqual (initial_connection_count + 3, GetConnectionCount (conn1), "#5");
479 Assert.AreEqual (initial_connection_count + 2, GetConnectionCount (conn4), "#6");
481 SqlConnection.ClearPool (conn3);
483 // the connection passed to ClearPool does not have to
485 Assert.AreEqual (initial_connection_count, GetConnectionCount (conn4), "#7");
487 SqlConnection conn7 = new SqlConnection (connectionString);
491 Assert.AreEqual (initial_connection_count + 1, GetConnectionCount (conn4), "#8");
493 conn3.ConnectionString += ";App=B";
494 SqlConnection.ClearPool (conn3);
496 // check if a pool is identified by its connection string
497 Assert.AreEqual (initial_connection_count + 1, GetConnectionCount (conn4), "#9");
499 SqlConnection conn8 = new SqlConnection (connectionString);
500 SqlConnection.ClearPool (conn8);
502 // connection should not have been opened before to
503 // clear the corresponding pool
504 Assert.AreEqual (initial_connection_count, GetConnectionCount (conn4), "#10");
506 SqlConnection conn9 = new SqlConnection (connectionString);
510 Assert.AreEqual (initial_connection_count + 1, GetConnectionCount (conn4), "#11");
512 conn3.ConnectionString = connectionString;
513 SqlConnection.ClearPool (conn3);
515 Assert.AreEqual (initial_connection_count, GetConnectionCount (conn4), "#12");
517 SqlConnection conn10 = new SqlConnection (connectionString);
520 SqlConnection conn11 = new SqlConnection (connectionString + ";App=B");
523 SqlConnection conn12 = new SqlConnection (connectionString + ";App=B");
526 SqlConnection conn13 = new SqlConnection (connectionString + ";App=B");
534 Assert.AreEqual (initial_connection_count + 4, GetConnectionCount (conn4), "#13");
536 // check that other connection pools are not affected
537 SqlConnection.ClearPool (conn13);
539 Assert.AreEqual (initial_connection_count + 1, GetConnectionCount (conn4), "#14");
541 SqlConnection conn14 = new SqlConnection (connectionString);
545 // a disposed connection cannot be used to clear a pool
546 SqlConnection.ClearPool (conn14);
548 Assert.AreEqual (initial_connection_count + 1, GetConnectionCount (conn4), "#15");
550 SqlConnection.ClearPool (conn4);
552 Assert.AreEqual (initial_connection_count, GetConnectionCount (conn4), "#16");
559 public void InterfaceTransactionTest ()
561 conn = new SqlConnection (connectionString);
563 IDbCommand idbCommand = new SqlCommand ("use [mono-test]", conn);
564 idbCommand.Connection = null;
565 Assert.AreEqual (null, idbCommand.Connection, "Connection should be null");
566 idbCommand.Transaction = null;
567 Assert.AreEqual (null, idbCommand.Transaction, "Transaction should be null");
573 public void BeginTransaction ()
575 conn = new SqlConnection (connectionString);
578 SqlTransaction trans = conn.BeginTransaction ();
579 Assert.AreSame (conn, trans.Connection, "#A1");
580 Assert.AreEqual (IsolationLevel.ReadCommitted, trans.IsolationLevel, "#A2");
583 trans = conn.BeginTransaction ();
586 conn.BeginTransaction ();
588 } catch (InvalidOperationException ex) {
589 // SqlConnection does not support parallel transactions
590 Assert.AreEqual (typeof(InvalidOperationException), ex.GetType(), "#B2");
591 Assert.IsNull (ex.InnerException, "#B3");
592 Assert.IsNotNull (ex.Message, "#B4");
598 trans = conn.BeginTransaction ();
600 trans = conn.BeginTransaction ();
602 trans = conn.BeginTransaction ();
609 public void ConnectionString ()
611 conn = new SqlConnection (connectionString);
612 // Test Repeated Keyoword should take the latest value
613 conn.ConnectionString = conn.ConnectionString + ";server=RepeatedServer;";
614 Assert.AreEqual ("RepeatedServer", ((SqlConnection)conn).DataSource, "#A1");
615 conn.ConnectionString += ";database=gen;Initial Catalog=gen1";
616 Assert.AreEqual ("gen1", conn.Database, "#A2");
618 // Test if properties are set correctly
619 string str = "server=localhost1;database=db;user id=user;";
620 str += "password=pwd;Workstation ID=workstation;Packet Size=512;";
621 str += "Connect Timeout=10";
622 conn.ConnectionString = str;
624 Assert.AreEqual ("localhost1", conn.DataSource, "#B1");
625 Assert.AreEqual ("db", conn.Database, "#B2");
626 Assert.AreEqual (ConnectionState.Closed, conn.State, "#B3");
627 Assert.AreEqual ("workstation", conn.WorkstationId, "#B4");
628 Assert.AreEqual (512, conn.PacketSize, "#B5");
629 Assert.AreEqual (10, conn.ConnectionTimeout, "#B6");
631 // Test if any leftover values exist from previous invocation
632 conn.ConnectionString = connectionString;
633 conn.ConnectionString = string.Empty;
634 Assert.AreEqual (string.Empty, conn.DataSource, "#C1");
635 Assert.AreEqual ("", conn.Database, "#C2");
637 Assert.AreEqual (8000, conn.PacketSize, "#C3");
639 Assert.AreEqual (8192, conn.PacketSize, "#C3");
641 Assert.AreEqual (15, conn.ConnectionTimeout, "#C4");
642 Assert.IsTrue (string.Compare (conn.WorkstationId, Environment.MachineName, true) == 0, "#C5");
646 public void ConnectionString_Connection_Open ()
648 conn = new SqlConnection (connectionString);
649 conn.ConnectionString = connectionString;
652 conn.ConnectionString = "server=localhost;database=tmp;";
654 } catch (InvalidOperationException ex) {
655 // Not allowed to change the 'ConnectionString'
656 // property. The connection's current state is open
657 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
658 Assert.IsNull (ex.InnerException, "#3");
659 Assert.IsNotNull (ex.Message, "#4");
666 public void ServerVersionTest ()
668 conn = new SqlConnection (connectionString);
670 // Test InvalidOperation Exception is thrown if Connection is CLOSED
672 string s = conn.ServerVersion;
673 Assert.Fail ("#A1:" + s);
674 } catch (InvalidOperationException ex) {
675 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
676 Assert.IsNull (ex.InnerException, "#A3");
677 Assert.IsNotNull (ex.Message, "#A4");
680 // Test if Release Version is as per specification.
682 String [] version = conn.ServerVersion.Split ('.');
683 Assert.AreEqual (2, version[0].Length,
684 "#B1 The Major release shud be exactly 2 characters");
685 Assert.AreEqual (2, version[1].Length,
686 "#B2 The Minor release shud be exactly 2 characters");
687 Assert.AreEqual (4, version[2].Length,
688 "#B3 The Release version should be exactly 4 digits");
692 public void Database ()
694 conn = new SqlConnection (connectionString);
695 string database = conn.Database;
699 // Test if database property is updated when a query changes database
701 cmd = new SqlCommand ("use [master]" , conn);
702 cmd.ExecuteNonQuery ();
703 Assert.AreEqual ("master", conn.Database, "#1");
705 // ensure we're really in the expected database
706 cmd.CommandText = "SELECT name FROM sys.databases WHERE name = 'master'";
707 using (SqlDataReader dr = cmd.ExecuteReader ()) {
708 Assert.IsTrue (dr.Read (), "#2");
712 Assert.AreEqual (database, conn.Database, "#3");
714 // Test if the database property is reset on re-opening the connection
715 conn.ConnectionString = connectionString;
717 Assert.AreEqual (database, conn.Database, "#4");
719 // ensure we're really in the expected database
720 cmd.CommandText = "SELECT fname FROM employee WHERE id = 2";
721 using (SqlDataReader dr = cmd.ExecuteReader ()) {
722 Assert.IsTrue (dr.Read (), "#5");
723 Assert.AreEqual ("ramesh", dr.GetValue (0), "#6");
729 [Test] // bug #412571
730 public void Dispose ()
732 StateChangeEventArgs stateChangeArgs;
733 EventArgs disposedArgs;
735 conn = new SqlConnection (connectionString + ";Connection Timeout=30;Packet Size=512;Workstation Id=Desktop");
736 conn.Disposed += new EventHandler (Connection_Disposed);
738 conn.StateChange += new StateChangeEventHandler (Connection_StateChange);
739 Assert.AreEqual (0, events.Count, "#A1");
741 Assert.AreEqual (string.Empty, conn.ConnectionString, "#A2");
742 Assert.AreEqual (15, conn.ConnectionTimeout, "#A3");
743 Assert.AreEqual (string.Empty, conn.Database, "#A4");
744 Assert.AreEqual (string.Empty, conn.DataSource, "#A5");
746 Assert.AreEqual (8000, conn.PacketSize, "#A6");
748 Assert.AreEqual (8192, conn.PacketSize, "#A6");
750 Assert.AreEqual (ConnectionState.Closed, conn.State, "#A7");
751 Assert.IsTrue (string.Compare (conn.WorkstationId, Environment.MachineName, true) == 0, "#A8");
752 Assert.AreEqual (2, events.Count, "#A9");
754 stateChangeArgs = events [0] as StateChangeEventArgs;
755 Assert.IsNotNull (stateChangeArgs, "#B1");
756 Assert.AreEqual (typeof (StateChangeEventArgs), stateChangeArgs.GetType (), "#B2");
757 Assert.AreEqual (ConnectionState.Open, stateChangeArgs.OriginalState, "#B3");
758 Assert.AreEqual (ConnectionState.Closed, stateChangeArgs.CurrentState, "B4");
760 disposedArgs = events [1] as EventArgs;
761 Assert.IsNotNull (disposedArgs, "#C1");
762 Assert.AreEqual (typeof (EventArgs), disposedArgs.GetType (), "#C2");
766 Assert.AreEqual (ConnectionState.Closed, conn.State, "#D1");
767 Assert.AreEqual (3, events.Count, "#D2");
769 disposedArgs = events [2] as EventArgs;
770 Assert.IsNotNull (disposedArgs, "#E1");
771 Assert.AreEqual (typeof (EventArgs), disposedArgs.GetType (), "#E2");
774 void Connection_StateChange (object sender , StateChangeEventArgs e)
779 void Connection_Disposed (object sender , EventArgs e)
786 public void FireInfoMessageEventOnUserErrorsTest ()
788 conn = new SqlConnection ();
789 Assert.AreEqual(false, conn.FireInfoMessageEventOnUserErrors, "#1 The default value should be false");
790 conn.FireInfoMessageEventOnUserErrors = true;
791 Assert.AreEqual(true, conn.FireInfoMessageEventOnUserErrors, "#1 The value should be true after setting the property to true");
795 public void StatisticsEnabledTest ()
797 conn = new SqlConnection ();
798 Assert.AreEqual(false, conn.StatisticsEnabled, "#1 The default value should be false");
799 conn.StatisticsEnabled = true;
800 Assert.AreEqual(true, conn.StatisticsEnabled, "#1 The value should be true after setting the property to true");
804 public void ChangePasswordTest ()
806 string tmpPassword = "modifiedbymonosqlclient";
807 SqlConnection.ChangePassword (connectionString, tmpPassword);
808 SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder (connectionString);
809 string oldPassword = connBuilder.Password;
810 connBuilder.Password = tmpPassword;
811 SqlConnection.ChangePassword (connBuilder.ConnectionString, oldPassword); // Modify to the original password
814 static int GetConnectionCount (SqlConnection conn)
818 SqlCommand cmd = conn.CreateCommand ();
819 cmd.CommandText = "select count(*) from master..sysprocesses where db_name(dbid) = @dbname";
820 cmd.Parameters.Add (new SqlParameter ("@dbname", conn.Database));
821 int connection_count = (int) cmd.ExecuteScalar ();
824 return connection_count;
831 [Category ("sqlserver")]
832 public class GetSchemaTest
834 SqlConnection conn = null;
835 String connectionString = ConnectionManager.Singleton.ConnectionString;
840 conn = new SqlConnection(connectionString);
845 public void TearDown()
851 public void GetSchemaTest1()
854 DataTable tab1 = conn.GetSchema("databases");
855 foreach (DataRow row in tab1.Rows)
857 foreach (DataColumn col in tab1.Columns)
859 if (col.ColumnName.ToString() == "database_name" && row[col].ToString() == "monotest")
868 Assert.AreEqual(true, flag, "#GS1 failed");
872 [ExpectedException(typeof(ArgumentException))]
873 public void GetSchemaTest2()
875 conn.GetSchema(null);
879 public void GetSchemaTest3 ()
881 Assert.Ignore ("We currently have no foreign keys defined in the test database");
884 DataTable tab1 = conn.GetSchema("ForeignKeys");
885 foreach (DataRow row in tab1.Rows)
887 foreach (DataColumn col in tab1.Columns)
890 * We need to consider multiple values
892 if (col.ColumnName.ToString() == "TABLE_NAME" && row[col].ToString() == "tmptable1")
901 Assert.AreEqual(true, flag, "#GS3 failed");
905 public void GetSchemaTest4()
908 DataTable tab1 = conn.GetSchema("Indexes");
909 foreach (DataRow row in tab1.Rows)
911 foreach (DataColumn col in tab1.Columns)
914 * We need to consider multiple values
916 if (col.ColumnName.ToString() == "table_name" && row[col].ToString() == "binary_family")
925 Assert.AreEqual(true, flag, "#GS4 failed");
929 public void GetSchemaTest5()
932 DataTable tab1 = conn.GetSchema("IndexColumns");
933 foreach (DataRow row in tab1.Rows)
935 foreach (DataColumn col in tab1.Columns)
938 * We need to consider multiple values
940 if (col.ColumnName.ToString() == "table_name" && row[col].ToString() == "binary_family")
949 Assert.AreEqual(true, flag, "#GS5 failed");
953 public void GetSchemaTest6()
956 DataTable tab1 = conn.GetSchema("Procedures");
957 foreach (DataRow row in tab1.Rows)
959 foreach (DataColumn col in tab1.Columns)
962 * We need to consider multiple values
964 if (col.ColumnName.ToString() == "SPECIFIC_NAME" && row[col].ToString() == "sp_get_age")
973 Assert.AreEqual(true, flag, "#GS6 failed");
977 public void GetSchemaTest7()
980 DataTable tab1 = conn.GetSchema("ProcedureParameters");
981 foreach (DataRow row in tab1.Rows)
983 foreach (DataColumn col in tab1.Columns)
986 * We need to consider multiple values
988 if (col.ColumnName.ToString() == "SPECIFIC_NAME" && row[col].ToString() == "sp_get_age")
997 Assert.AreEqual(true, flag, "#GS7 failed");
1001 public void GetSchemaTest8()
1004 DataTable tab1 = conn.GetSchema("Tables");
1005 foreach (DataRow row in tab1.Rows)
1007 foreach (DataColumn col in tab1.Columns)
1010 * We need to consider multiple values
1012 if (col.ColumnName.ToString() == "TABLE_NAME" && row[col].ToString() == "binary_family")
1021 Assert.AreEqual(true, flag, "#GS8 failed");
1025 public void GetSchemaTest9()
1028 DataTable tab1 = conn.GetSchema("Columns");
1029 foreach (DataRow row in tab1.Rows)
1031 foreach (DataColumn col in tab1.Columns)
1034 * We need to consider multiple values
1036 if (col.ColumnName.ToString() == "TABLE_NAME" && row[col].ToString() == "binary_family")
1045 Assert.AreEqual(true, flag, "#GS9 failed");
1049 public void GetSchemaTest10()
1052 DataTable tab1 = conn.GetSchema("Users");
1053 foreach (DataRow row in tab1.Rows)
1055 foreach (DataColumn col in tab1.Columns)
1058 * We need to consider multiple values
1060 if (col.ColumnName.ToString() == "user_name" && row[col].ToString() == "public")
1069 Assert.AreEqual(true, flag, "#GS10 failed");
1073 public void GetSchemaTest11 ()
1075 Assert.Ignore ("Incorrect syntax near 'TABLE_SCHEMA'");
1078 DataTable tab1 = conn.GetSchema("Views");
1079 flag = true; // FIXME: Currently MS-SQL 2005 returns empty table. Remove this flag ASAP.
1080 foreach (DataRow row in tab1.Rows)
1082 foreach (DataColumn col in tab1.Columns)
1085 * We need to consider multiple values.
1087 if (col.ColumnName.ToString() == "user_name" && row[col].ToString() == "public")
1096 Assert.AreEqual(true, flag, "#GS11 failed");
1100 public void GetSchemaTest12 ()
1102 Assert.Ignore ("Incorrect syntax near '('");
1105 DataTable tab1 = conn.GetSchema("ViewColumns");
1106 flag = true; // FIXME: Currently MS-SQL 2005 returns empty table. Remove this flag ASAP.
1107 foreach (DataRow row in tab1.Rows)
1109 foreach (DataColumn col in tab1.Columns)
1112 * We need to consider multiple values.
1114 if (col.ColumnName.ToString() == "user_name" && row[col].ToString() == "public")
1123 Assert.AreEqual(true, flag, "#GS12 failed");
1127 public void GetSchemaTest13 ()
1129 Assert.Ignore ("The multi-part identifier \"assportemblies.name\" could not be bound");
1132 DataTable tab1 = conn.GetSchema("UserDefinedTypes");
1133 flag = true; // FIXME: Currently MS-SQL 2005 returns empty table. Remove this flag ASAP.
1134 foreach (DataRow row in tab1.Rows)
1136 foreach (DataColumn col in tab1.Columns)
1139 * We need to consider multiple values.
1141 if (col.ColumnName.ToString() == "user_name" && row[col].ToString() == "public")
1150 Assert.AreEqual(true, flag, "#GS13 failed");
1154 public void GetSchemaTest14()
1157 string [] restrictions = new string[4];
1159 restrictions[0] = "monotest";
1160 restrictions[1] = "dbo";
1161 restrictions[2] = null;
1162 restrictions[3] = "BASE TABLE";
1163 DataTable tab1 = conn.GetSchema("Tables", restrictions);
1164 foreach (DataRow row in tab1.Rows)
1166 foreach (DataColumn col in tab1.Columns)
1169 * We need to consider multiple values
1171 if (col.ColumnName.ToString() == "TABLE_NAME" && row[col].ToString() == "binary_family")
1180 Assert.AreEqual(true, flag, "#GS14 failed");
1184 public void GetSchemaTest15()
1187 string [] restrictions = new string[4];
1189 restrictions[0] = "monotest";
1190 restrictions[1] = null;
1191 restrictions[2] = "binary_family";
1192 restrictions[3] = null;
1193 DataTable tab1 = conn.GetSchema("IndexColumns", restrictions);
1194 foreach (DataRow row in tab1.Rows)
1196 foreach (DataColumn col in tab1.Columns)
1199 * We need to consider multiple values
1201 if (col.ColumnName.ToString() == "table_name" && row[col].ToString() == "binary_family")
1210 Assert.AreEqual(true, flag, "#GS15 failed");
1214 public void GetSchemaTest16()
1217 string [] restrictions = new string[4];
1219 restrictions[0] = "monotest";
1220 restrictions[1] = null;
1221 restrictions[2] = "sp_get_age";
1222 restrictions[3] = null;
1223 DataTable tab1 = conn.GetSchema("Procedures", restrictions);
1224 foreach (DataRow row in tab1.Rows)
1226 foreach (DataColumn col in tab1.Columns)
1229 * We need to consider multiple values
1231 if (col.ColumnName.ToString() == "ROUTINE_NAME" && row[col].ToString() == "sp_get_age")
1240 Assert.AreEqual(true, flag, "#GS16 failed");
1244 public void GetSchemaTest17()
1247 DataTable tab1 = conn.GetSchema();
1248 foreach (DataRow row in tab1.Rows)
1250 foreach (DataColumn col in tab1.Columns)
1253 * We need to consider multiple values
1255 if (col.ColumnName.ToString() == "CollectionName" && row[col].ToString() == "UserDefinedTypes")
1264 Assert.AreEqual(true, flag, "#GS17 failed");
1268 public void GetSchemaTest18()
1271 DataTable tab1 = conn.GetSchema("RESTRICTIONS");
1272 foreach (DataRow row in tab1.Rows)
1274 foreach (DataColumn col in tab1.Columns)
1277 * We need to consider multiple values
1279 if (col.ColumnName.ToString() == "RestrictionDefault" && row[col].ToString() == "CONSTRAINT_NAME")
1288 Assert.AreEqual(true, flag, "#GS18 failed");
1292 [ExpectedException (typeof (ArgumentException))]
1293 public void GetSchemaTest19 ()
1295 String [] restrictions = new String[1];
1296 conn.GetSchema("RESTRICTIONS", restrictions);
1300 public void GetSchemaTest20 ()
1303 DataTable tab1 = conn.GetSchema("DataTypes");
1304 foreach (DataRow row in tab1.Rows)
1306 foreach (DataColumn col in tab1.Columns)
1309 * We need to consider multiple values
1311 if (col.ColumnName.ToString() == "TypeName" && row[col].ToString() == "uniqueidentifier")
1320 Assert.AreEqual(true, flag, "#GS20 failed");
1324 public void GetSchemaTest21()
1327 DataTable tab1 = conn.GetSchema();
1328 foreach (DataRow row in tab1.Rows)
1330 foreach (DataColumn col in tab1.Columns)
1333 * We need to consider multiple values
1335 if (col.ColumnName.ToString() == "CollectionName" && row[col].ToString() == "UserDefinedTypes")
1344 Assert.AreEqual(true, flag, "#GS21 failed");
1347 public void GetSchemaTest22()
1350 DataTable tab1 = conn.GetSchema("ReservedWords");
1351 foreach (DataRow row in tab1.Rows)
1353 foreach (DataColumn col in tab1.Columns)
1356 * We need to consider multiple values
1358 if (col.ColumnName.ToString() == "ReservedWord" && row[col].ToString() == "UPPER")
1367 Assert.AreEqual(true, flag, "#GS22 failed");
1371 public void GetSchemaTest23()
1374 DataTable tab1 = conn.GetSchema("ReservedWords");
1375 foreach (DataRow row in tab1.Rows)
1377 foreach (DataColumn col in tab1.Columns)
1380 * We need to consider multiple values
1382 if (col.ColumnName.ToString() == "ReservedWord" && row[col].ToString() == "upper")
1391 Assert.AreEqual(false, flag, "#GS23 failed");
1395 public void GetSchemaTest24()
1398 string [] restrictions = new string[4];
1400 restrictions[0] = "monotest";
1401 restrictions[1] = null;
1402 restrictions[2] = "sp_get_age";
1403 restrictions[3] = null;
1404 DataTable tab1 = conn.GetSchema("Procedures", restrictions);
1405 foreach (DataRow row in tab1.Rows)
1407 foreach (DataColumn col in tab1.Columns)
1410 * We need to consider multiple values
1412 if (col.ColumnName.ToString() == "ROUTINE_NAME" && row[col].ToString() == "mono")
1421 Assert.AreEqual(false, flag, "#GS24 failed");
1425 [ExpectedException (typeof (ArgumentException))]
1426 public void GetSchemaTest25 ()
1428 String [] restrictions = new String [1];
1429 conn.GetSchema ("Mono", restrictions);