public void BreakConnectorInPool(bool keepAlive)
{
var csb = new NpgsqlConnectionStringBuilder(ConnectionString) { MaxPoolSize = 1 };
if (keepAlive)
csb.KeepAlive = 1;
using (var conn = new NpgsqlConnection(csb))
{
conn.Open();
var connectorId = conn.ProcessID;
conn.Close();
// Use another connection to kill the connector currently in the pool
using (var conn2 = OpenConnection())
conn2.ExecuteNonQuery($"SELECT pg_terminate_backend({connectorId})");
// Allow some time for the terminate to occur
Thread.Sleep(2000);
conn.Open();
Assert.That(conn.FullState, Is.EqualTo(ConnectionState.Open));
if (keepAlive)
{
Assert.That(conn.ProcessID, Is.Not.EqualTo(connectorId));
Assert.That(conn.ExecuteScalar("SELECT 1"), Is.EqualTo(1));
}
else
{
Assert.That(conn.ProcessID, Is.EqualTo(connectorId));
Assert.That(() => conn.ExecuteScalar("SELECT 1"), Throws.Exception.TypeOf<NpgsqlException>());
}
}
}