From 1567935cebff6306155c6433fb756f3d90eff048 Mon Sep 17 00:00:00 2001 From: Bradley Grainger Date: Thu, 15 Sep 2016 20:54:16 -0700 Subject: [PATCH] Add tests for baseline ConnectionTimeout. --- tests/SideBySide.New/ConnectSync.cs | 29 +++++++++- tests/SideBySide.New/ConnectionPool.cs | 74 ++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 1 deletion(-) diff --git a/tests/SideBySide.New/ConnectSync.cs b/tests/SideBySide.New/ConnectSync.cs index 26d91f26d..34552599e 100644 --- a/tests/SideBySide.New/ConnectSync.cs +++ b/tests/SideBySide.New/ConnectSync.cs @@ -1,4 +1,12 @@ -using System.Data; +using System; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; using MySql.Data.MySqlClient; using Xunit; @@ -125,6 +133,25 @@ public void ConnectNoPassword() } } + [Fact(Skip = "Not yet implemented")] + public void ConnectTimeout() + { + var csb = new MySqlConnectionStringBuilder + { + Server = "www.mysql.com", + Pooling = false, + ConnectionTimeout = 3, + }; + + using (var connection = new MySqlConnection(csb.ConnectionString)) + { + var stopwatch = Stopwatch.StartNew(); + Assert.Throws(() => connection.Open()); + stopwatch.Stop(); + Assert.InRange(stopwatch.ElapsedMilliseconds, 2800, 3500); + } + } + readonly DatabaseFixture m_database; } } diff --git a/tests/SideBySide.New/ConnectionPool.cs b/tests/SideBySide.New/ConnectionPool.cs index a2bcfae1e..f765725a3 100644 --- a/tests/SideBySide.New/ConnectionPool.cs +++ b/tests/SideBySide.New/ConnectionPool.cs @@ -1,4 +1,9 @@ using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; using MySql.Data.MySqlClient; using Xunit; @@ -74,6 +79,75 @@ public void ResetConnection(object connectionReset, int poolSize, long expected) } } + [Fact(Skip = "Not yet implemented")] + public async Task ExhaustConnectionPoolWithTimeout() + { + var csb = Constants.CreateConnectionStringBuilder(); + csb.Pooling = true; + csb.MinimumPoolSize = 0; + csb.MaximumPoolSize = 3; + csb.ConnectionTimeout = 5; + + var connections = new List(); + + for (int i = 0; i < csb.MaximumPoolSize; i++) + { + var connection = new MySqlConnection(csb.ConnectionString); + await connection.OpenAsync().ConfigureAwait(false); + connections.Add(connection); + } + + using (var extraConnection = new MySqlConnection(csb.ConnectionString)) + { + var stopwatch = Stopwatch.StartNew(); + Assert.Throws(() => extraConnection.Open()); + stopwatch.Stop(); + Assert.InRange(stopwatch.ElapsedMilliseconds, 4500, 5500); + } + + foreach (var connection in connections) + connection.Dispose(); + } + + [Fact(Skip = "Not yet implemented")] + public async Task ExhaustConnectionPoolBeforeTimeout() + { + var csb = Constants.CreateConnectionStringBuilder(); + csb.Pooling = true; + csb.MinimumPoolSize = 0; + csb.MaximumPoolSize = 3; + csb.ConnectionTimeout = 60; + + var connections = new List(); + + for (int i = 0; i < csb.MaximumPoolSize; i++) + { + var connection = new MySqlConnection(csb.ConnectionString); + await connection.OpenAsync().ConfigureAwait(false); + connections.Add(connection); + } + + var closeTask = Task.Run(() => + { + Thread.Sleep(5000); + connections[0].Dispose(); + connections.RemoveAt(0); + }); + + using (var extraConnection = new MySqlConnection(csb.ConnectionString)) + { + var stopwatch = Stopwatch.StartNew(); + await extraConnection.OpenAsync().ConfigureAwait(false); + stopwatch.Stop(); + Assert.InRange(stopwatch.ElapsedMilliseconds, 4500, 7500); + } + + closeTask.Wait(); + + foreach (var connection in connections) + connection.Dispose(); + } + public void Dispose() { MySqlConnection.ClearAllPools();