private static void TestReaderNonMarsCase(string caseName, string connectionString, ReaderTestType testType, ReaderVerificationType verificationType) { WeakReference weak = null; using (SqlConnection con = new SqlConnection(connectionString)) { con.Open(); using (SqlCommand cmd = con.CreateCommand()) { cmd.CommandText = COMMAND_TEXT_1; SqlDataReader gch = null; if ((testType != ReaderTestType.ReaderGC) && (testType != ReaderTestType.ReaderGCConnectionClose)) { gch = cmd.ExecuteReader(); } switch (testType) { case ReaderTestType.ReaderClose: gch.Dispose(); break; case ReaderTestType.ReaderDispose: gch.Dispose(); break; case ReaderTestType.ReaderGC: weak = OpenNullifyReader(cmd); GC.Collect(); GC.WaitForPendingFinalizers(); Assert.False(weak.IsAlive, "Reader is still alive!"); break; case ReaderTestType.ConnectionClose: GC.SuppressFinalize(gch); con.Close(); con.Open(); break; case ReaderTestType.ReaderGCConnectionClose: weak = OpenNullifyReader(cmd); GC.Collect(); GC.WaitForPendingFinalizers(); Assert.False(weak.IsAlive, "Reader is still alive!"); con.Close(); con.Open(); break; } switch (verificationType) { case ReaderVerificationType.ExecuteReader: cmd.CommandText = COMMAND_TEXT_2; using (SqlDataReader rdr = cmd.ExecuteReader()) { rdr.Read(); Assert.Equal(rdr.FieldCount, 1); Assert.Equal(rdr.GetName(0), COLUMN_NAME_2); } break; case ReaderVerificationType.ChangeDatabase: con.ChangeDatabase(CHANGE_DATABASE_NAME); Assert.Equal(con.Database, CHANGE_DATABASE_NAME); break; case ReaderVerificationType.BeginTransaction: cmd.Transaction = con.BeginTransaction(); cmd.CommandText = "select @@trancount"; int tranCount = (int)cmd.ExecuteScalar(); Assert.Equal(tranCount, 1); break; } } } }
private static void TestReaderNonMarsCase(string caseName, string connectionString, ReaderTestType testType, ReaderVerificationType verificationType) { WeakReference weak = null; using (SqlConnection con = new SqlConnection(connectionString)) { con.Open(); using (SqlCommand cmd = con.CreateCommand()) { cmd.CommandText = COMMAND_TEXT_1; SqlDataReader gch = null; if ((testType != ReaderTestType.ReaderGC) && (testType != ReaderTestType.ReaderGCConnectionClose)) gch = cmd.ExecuteReader(); switch (testType) { case ReaderTestType.ReaderClose: gch.Dispose(); break; case ReaderTestType.ReaderDispose: gch.Dispose(); break; case ReaderTestType.ReaderGC: weak = OpenNullifyReader(cmd); GC.Collect(); GC.WaitForPendingFinalizers(); Assert.False(weak.IsAlive, "Reader is still alive!"); break; case ReaderTestType.ConnectionClose: GC.SuppressFinalize(gch); con.Close(); con.Open(); break; case ReaderTestType.ReaderGCConnectionClose: weak = OpenNullifyReader(cmd); GC.Collect(); GC.WaitForPendingFinalizers(); Assert.False(weak.IsAlive, "Reader is still alive!"); con.Close(); con.Open(); break; } switch (verificationType) { case ReaderVerificationType.ExecuteReader: cmd.CommandText = COMMAND_TEXT_2; using (SqlDataReader rdr = cmd.ExecuteReader()) { rdr.Read(); Assert.Equal(rdr.FieldCount, 1); Assert.Equal(rdr.GetName(0), COLUMN_NAME_2); } break; case ReaderVerificationType.ChangeDatabase: con.ChangeDatabase(DATABASE_NAME); Assert.Equal(con.Database, DATABASE_NAME); break; case ReaderVerificationType.BeginTransaction: cmd.Transaction = con.BeginTransaction(); cmd.CommandText = "select @@trancount"; int tranCount = (int)cmd.ExecuteScalar(); Assert.Equal(tranCount, 1); break; } } } }
private static void TestReaderMarsCase(string caseName, string connectionString, ReaderTestType testType, ReaderVerificationType verificationType) { WeakReference weak = null; SqlCommand[] cmd = new SqlCommand[CONCURRENT_COMMANDS]; SqlDataReader[] gch = new SqlDataReader[CONCURRENT_COMMANDS]; using (SqlConnection con = new SqlConnection(connectionString)) { con.Open(); for (int i = 0; i < CONCURRENT_COMMANDS; i++) { cmd[i] = con.CreateCommand(); cmd[i].CommandText = COMMAND_TEXT_1; if ((testType != ReaderTestType.ReaderGC) && (testType != ReaderTestType.ReaderGCConnectionClose)) { gch[i] = cmd[i].ExecuteReader(); } else { gch[i] = null; } } for (int i = 0; i < CONCURRENT_COMMANDS; i++) { switch (testType) { case ReaderTestType.ReaderClose: gch[i].Dispose(); break; case ReaderTestType.ReaderDispose: gch[i].Dispose(); break; case ReaderTestType.ReaderGC: weak = OpenNullifyReader(cmd[i]); GC.Collect(); GC.WaitForPendingFinalizers(); Assert.False(weak.IsAlive, "Transaction is still alive on TestReaderMars: ReaderGC"); break; case ReaderTestType.ConnectionClose: GC.SuppressFinalize(gch[i]); con.Close(); con.Open(); break; case ReaderTestType.ReaderGCConnectionClose: weak = OpenNullifyReader(cmd[i]); GC.Collect(); GC.WaitForPendingFinalizers(); Assert.False(weak.IsAlive, "Transaction is still alive on TestReaderMars: ReaderGCConnectionClose"); con.Close(); con.Open(); break; } cmd[i].Dispose(); } SqlCommand verificationCmd = con.CreateCommand(); switch (verificationType) { case ReaderVerificationType.ExecuteReader: verificationCmd.CommandText = COMMAND_TEXT_2; using (SqlDataReader rdr = verificationCmd.ExecuteReader()) { rdr.Read(); DataTestClass.AssertEqualsWithDescription(1, rdr.FieldCount, "Execute Reader should return expected Field count"); DataTestClass.AssertEqualsWithDescription(COLUMN_NAME_2, rdr.GetName(0), "Execute Reader should return expected Field name"); } break; case ReaderVerificationType.ChangeDatabase: con.ChangeDatabase(DATABASE_NAME); DataTestClass.AssertEqualsWithDescription(DATABASE_NAME, con.Database, "Change Database should return expected Database Name"); break; case ReaderVerificationType.BeginTransaction: verificationCmd.Transaction = con.BeginTransaction(); verificationCmd.CommandText = "select @@trancount"; int tranCount = (int)verificationCmd.ExecuteScalar(); DataTestClass.AssertEqualsWithDescription(1, tranCount, "Begin Transaction should return expected Transaction count"); break; } verificationCmd.Dispose(); } }
private static void TestReaderMarsCase(string caseName, string connectionString, ReaderTestType testType, ReaderVerificationType verificationType) { WeakReference weak = null; SqlCommand[] cmd = new SqlCommand[CONCURRENT_COMMANDS]; SqlDataReader[] gch = new SqlDataReader[CONCURRENT_COMMANDS]; using (SqlConnection con = new SqlConnection(connectionString)) { con.Open(); for (int i = 0; i < CONCURRENT_COMMANDS; i++) { cmd[i] = con.CreateCommand(); cmd[i].CommandText = COMMAND_TEXT_1; if ((testType != ReaderTestType.ReaderGC) && (testType != ReaderTestType.ReaderGCConnectionClose)) gch[i] = cmd[i].ExecuteReader(); else gch[i] = null; } for (int i = 0; i < CONCURRENT_COMMANDS; i++) { switch (testType) { case ReaderTestType.ReaderClose: gch[i].Dispose(); break; case ReaderTestType.ReaderDispose: gch[i].Dispose(); break; case ReaderTestType.ReaderGC: weak = OpenNullifyReader(cmd[i]); GC.Collect(); GC.WaitForPendingFinalizers(); Assert.False(weak.IsAlive, "Transaction is still alive on TestReaderMars: ReaderGC"); break; case ReaderTestType.ConnectionClose: GC.SuppressFinalize(gch[i]); con.Close(); con.Open(); break; case ReaderTestType.ReaderGCConnectionClose: weak = OpenNullifyReader(cmd[i]); GC.Collect(); GC.WaitForPendingFinalizers(); Assert.False(weak.IsAlive, "Transaction is still alive on TestReaderMars: ReaderGCConnectionClose"); con.Close(); con.Open(); break; } cmd[i].Dispose(); } SqlCommand verificationCmd = con.CreateCommand(); switch (verificationType) { case ReaderVerificationType.ExecuteReader: verificationCmd.CommandText = COMMAND_TEXT_2; using (SqlDataReader rdr = verificationCmd.ExecuteReader()) { rdr.Read(); DataTestClass.AssertEqualsWithDescription(1, rdr.FieldCount, "Execute Reader should return expected Field count"); DataTestClass.AssertEqualsWithDescription(COLUMN_NAME_2, rdr.GetName(0), "Execute Reader should return expected Field name"); } break; case ReaderVerificationType.ChangeDatabase: con.ChangeDatabase(DATABASE_NAME); DataTestClass.AssertEqualsWithDescription(DATABASE_NAME, con.Database, "Change Database should return expected Database Name"); break; case ReaderVerificationType.BeginTransaction: verificationCmd.Transaction = con.BeginTransaction(); verificationCmd.CommandText = "select @@trancount"; int tranCount = (int)verificationCmd.ExecuteScalar(); DataTestClass.AssertEqualsWithDescription(1, tranCount, "Begin Transaction should return expected Transaction count"); break; } verificationCmd.Dispose(); } }