public void TestAsyncDefaultLoginTimeout() { using (var conn = new MockSnowflakeDbConnection()) { conn.ConnectionString = ConnectionString; Assert.AreEqual(conn.State, ConnectionState.Closed); CancellationTokenSource connectionCancelToken = new CancellationTokenSource(); Stopwatch stopwatch = Stopwatch.StartNew(); try { Task connectTask = conn.OpenAsync(connectionCancelToken.Token); connectTask.Wait(); } catch (AggregateException e) { Assert.AreEqual(SFError.INTERNAL_ERROR.GetAttribute <SFErrorAttr>().errorCode, ((SnowflakeDbException)e.InnerException).ErrorCode); } stopwatch.Stop(); // Should timeout after the default timeout (120 sec) Assert.GreaterOrEqual(stopwatch.ElapsedMilliseconds, 120 * 1000); // But never more than 16 sec (max backoff) after the default timeout Assert.LessOrEqual(stopwatch.ElapsedMilliseconds, (120 + 16) * 1000); Assert.AreEqual(ConnectionState.Closed, conn.State); Assert.AreEqual(120, conn.ConnectionTimeout); } }
public void TestCancelLoginBeforeTimeout() { using (var conn = new MockSnowflakeDbConnection()) { // No timeout int timeoutSec = 0; string infiniteLoginTimeOut = String.Format(ConnectionString + ";connection_timeout={0}", timeoutSec); conn.ConnectionString = infiniteLoginTimeOut; Assert.AreEqual(conn.State, ConnectionState.Closed); // At this point the connection string has not been parsed, it will return the // default value //Assert.AreEqual(15, conn.ConnectionTimeout); CancellationTokenSource connectionCancelToken = new CancellationTokenSource(); logger.Debug("TestNoLoginTimeout token " + connectionCancelToken.Token.GetHashCode()); Task connectTask = conn.OpenAsync(connectionCancelToken.Token); // Sleep for 16min (more than the default connection timeout and the httpclient // timeout to make sure there are no false positive ) Thread.Sleep(16 * 60 * 1000); Assert.AreEqual(ConnectionState.Connecting, conn.State); // Cancel the connection because it will never succeed since there is no // connection_timeout defined logger.Debug("connectionCancelToken.Cancel "); connectionCancelToken.Cancel(); try { connectTask.Wait(); } catch (AggregateException e) { Assert.AreEqual( "System.Threading.Tasks.TaskCanceledException", e.InnerException.GetType().ToString()); } Assert.AreEqual(ConnectionState.Closed, conn.State); Assert.AreEqual(0, conn.ConnectionTimeout); } }