Skip to content
Merged
Prev Previous commit
Final test fixes
  • Loading branch information
vonzshik committed Oct 28, 2020
commit 2424d20df3c74485ae7e3d688fcace247631b6d1
2 changes: 1 addition & 1 deletion src/Npgsql/NpgsqlConnector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ internal void FlagAsWritableForMultiplexing()
volatile bool _cancellationRequested;
volatile bool _userCancellationRequested;

internal bool UserCancellationRequesed => _userCancellationRequested;
internal bool UserCancellationRequested => _userCancellationRequested;

internal CancellationToken UserCancellationToken { get; set; }

Expand Down
2 changes: 1 addition & 1 deletion src/Npgsql/NpgsqlReadBuffer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ async Task EnsureLong()

// There is a case, when we might call a cancellable method (NpgsqlDataReader.NextResult)
// but it times out on a sequential read (NpgsqlDataReader.ConsumeRow)
if (Connector.UserCancellationRequesed)
if (Connector.UserCancellationRequested)
{
// User requested the cancellation and it timed out (or we didn't send it)
throw Connector.Break(new OperationCanceledException("Query was cancelled", TimeoutException(),
Expand Down
29 changes: 23 additions & 6 deletions test/Npgsql.Tests/ReaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1729,6 +1729,9 @@ public async Task NextResultAsync_sequential_cancel()
if (IsMultiplexing)
return; // Multiplexing, cancellation

if (!IsSequential)
return;

await using var postmasterMock = PgPostmasterMock.Start(ConnectionString);
using var _ = CreateTempPool(postmasterMock.ConnectionString, out var connectionString);
await using var conn = await OpenConnectionAsync(connectionString);
Expand All @@ -1742,7 +1745,7 @@ await pgMock
.WriteDataRowWithFlush(new byte[10000]);

using var cmd = new NpgsqlCommand("SELECT some_bytea FROM some_table", conn);
await using var reader = await cmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess);
await using var reader = await cmd.ExecuteReaderAsync(Behavior);

// Successfully read the first resultset
Assert.True(await reader.ReadAsync());
Expand All @@ -1757,7 +1760,7 @@ await pgMock

// Send no response from server, wait for the cancellation attempt to time out
var exception = Assert.ThrowsAsync<OperationCanceledException>(async () => await task);
Assert.That(exception.InnerException, Is.Null);
Assert.That(exception.InnerException, Is.TypeOf<TimeoutException>());
Assert.That(exception.CancellationToken, Is.EqualTo(cancellationSource.Token));

Assert.That(conn.FullState, Is.EqualTo(ConnectionState.Broken));
Expand All @@ -1769,6 +1772,9 @@ public async Task GetFieldValueAsync_sequential_cancel()
if (IsMultiplexing)
return; // Multiplexing, cancellation

if (!IsSequential)
return;

await using var postmasterMock = PgPostmasterMock.Start(ConnectionString);
using var _ = CreateTempPool(postmasterMock.ConnectionString, out var connectionString);
await using var conn = await OpenConnectionAsync(connectionString);
Expand All @@ -1782,7 +1788,7 @@ await pgMock
.WriteDataRowWithFlush(new byte[10000]);

using var cmd = new NpgsqlCommand("SELECT some_bytea FROM some_table", conn);
await using var reader = await cmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess);
await using var reader = await cmd.ExecuteReaderAsync(Behavior);

await reader.ReadAsync();

Expand All @@ -1791,6 +1797,7 @@ await pgMock
cts.Cancel();

var exception = Assert.ThrowsAsync<OperationCanceledException>(async () => await task);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For completeness we can assert that no PG cancellation request reached the server (also in the other relevant tests).

Assert.That(exception.InnerException, Is.Null);

Assert.That(conn.FullState, Is.EqualTo(ConnectionState.Broken));
}
Expand All @@ -1801,6 +1808,9 @@ public async Task IsDBNullAsync_sequential_cancel()
if (IsMultiplexing)
return; // Multiplexing, cancellation

if (!IsSequential)
return;

await using var postmasterMock = PgPostmasterMock.Start(ConnectionString);
using var _ = CreateTempPool(postmasterMock.ConnectionString, out var connectionString);
await using var conn = await OpenConnectionAsync(connectionString);
Expand All @@ -1814,7 +1824,7 @@ await pgMock
.WriteDataRowWithFlush(new byte[10000], new byte[4]);

using var cmd = new NpgsqlCommand("SELECT some_bytea, some_int FROM some_table", conn);
await using var reader = await cmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess);
await using var reader = await cmd.ExecuteReaderAsync(Behavior);

await reader.ReadAsync();

Expand All @@ -1823,6 +1833,7 @@ await pgMock
cts.Cancel();

var exception = Assert.ThrowsAsync<OperationCanceledException>(async () => await task);
Assert.That(exception.InnerException, Is.Null);

Assert.That(conn.FullState, Is.EqualTo(ConnectionState.Broken));
}
Expand All @@ -1838,6 +1849,9 @@ public async Task GetFieldValueAsync_sequential_timeout()
if (IsMultiplexing)
return; // Multiplexing, cancellation

if (!IsSequential)
return;

var csb = new NpgsqlConnectionStringBuilder(ConnectionString);
csb.CommandTimeout = 3;
csb.CancellationTimeout = 15000;
Expand All @@ -1855,7 +1869,7 @@ await pgMock
.WriteDataRowWithFlush(new byte[10000]);

using var cmd = new NpgsqlCommand("SELECT some_bytea FROM some_table", conn);
await using var reader = await cmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess);
await using var reader = await cmd.ExecuteReaderAsync(Behavior);

await reader.ReadAsync();

Expand All @@ -1874,6 +1888,9 @@ public async Task IsDBNullAsync_sequential_timeout()
if (IsMultiplexing)
return; // Multiplexing, cancellation

if (!IsSequential)
return;

var csb = new NpgsqlConnectionStringBuilder(ConnectionString);
csb.CommandTimeout = 3;
csb.CancellationTimeout = 15000;
Expand All @@ -1891,7 +1908,7 @@ await pgMock
.WriteDataRowWithFlush(new byte[10000], new byte[4]);

using var cmd = new NpgsqlCommand("SELECT some_bytea, some_int FROM some_table", conn);
await using var reader = await cmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess);
await using var reader = await cmd.ExecuteReaderAsync(Behavior);

await reader.ReadAsync();

Expand Down