Use test timeout logic from Microsoft.AspNetCore.Testing (#6433)
This commit is contained in:
parent
edfb2ab8ab
commit
489735d390
|
|
@ -1,4 +1,4 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Description>Tests for users to verify their own implementations of SignalR types</Description>
|
<Description>Tests for users to verify their own implementations of SignalR types</Description>
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Testing" Version="$(MicrosoftAspNetCoreTestingPackageVersion)" />
|
||||||
<PackageReference Include="xunit.extensibility.core" Version="$(XunitExtensibilityCorePackageVersion)" />
|
<PackageReference Include="xunit.extensibility.core" Version="$(XunitExtensibilityCorePackageVersion)" />
|
||||||
<PackageReference Include="xunit.assert" Version="$(XunitAssertPackageVersion)" />
|
<PackageReference Include="xunit.assert" Version="$(XunitAssertPackageVersion)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netcoreapp3.0</TargetFramework>
|
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||||
|
|
@ -22,6 +22,7 @@
|
||||||
<PackageReference Include="Microsoft.Extensions.ValueStopwatch.Sources" Version="$(MicrosoftExtensionsValueStopwatchSourcesPackageVersion)" PrivateAssets="All" />
|
<PackageReference Include="Microsoft.Extensions.ValueStopwatch.Sources" Version="$(MicrosoftExtensionsValueStopwatchSourcesPackageVersion)" PrivateAssets="All" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="$(MicrosoftAspNetCoreServerKestrelPackageVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="$(MicrosoftAspNetCoreServerKestrelPackageVersion)" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Testing" Version="$(MicrosoftAspNetCoreTestingPackageVersion)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO.Pipelines;
|
using System.IO.Pipelines;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
using Microsoft.AspNetCore.Testing;
|
||||||
|
|
||||||
namespace System.Threading.Tasks
|
namespace System.Threading.Tasks
|
||||||
{
|
{
|
||||||
|
|
@ -21,23 +22,9 @@ namespace System.Threading.Tasks
|
||||||
return OrTimeout(task, new TimeSpan(0, 0, 0, 0, milliseconds), memberName, filePath, lineNumber);
|
return OrTimeout(task, new TimeSpan(0, 0, 0, 0, milliseconds), memberName, filePath, lineNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task OrTimeout(this Task task, TimeSpan timeout, [CallerMemberName] string memberName = null, [CallerFilePath] string filePath = null, [CallerLineNumber] int? lineNumber = null)
|
public static Task OrTimeout(this Task task, TimeSpan timeout, [CallerMemberName] string memberName = null, [CallerFilePath] string filePath = null, [CallerLineNumber] int? lineNumber = null)
|
||||||
{
|
{
|
||||||
if (task.IsCompleted)
|
return task.TimeoutAfter(timeout, filePath, lineNumber ?? 0);
|
||||||
{
|
|
||||||
await task;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var cts = new CancellationTokenSource();
|
|
||||||
var completed = await Task.WhenAny(task, Task.Delay(Debugger.IsAttached ? Timeout.InfiniteTimeSpan : timeout, cts.Token));
|
|
||||||
if (completed != task)
|
|
||||||
{
|
|
||||||
throw new TimeoutException(GetMessage(memberName, filePath, lineNumber));
|
|
||||||
}
|
|
||||||
cts.Cancel();
|
|
||||||
|
|
||||||
await task;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Task<T> OrTimeout<T>(this ValueTask<T> task, int milliseconds = DefaultTimeout, [CallerMemberName] string memberName = null, [CallerFilePath] string filePath = null, [CallerLineNumber] int? lineNumber = null) =>
|
public static Task<T> OrTimeout<T>(this ValueTask<T> task, int milliseconds = DefaultTimeout, [CallerMemberName] string memberName = null, [CallerFilePath] string filePath = null, [CallerLineNumber] int? lineNumber = null) =>
|
||||||
|
|
@ -51,22 +38,9 @@ namespace System.Threading.Tasks
|
||||||
return OrTimeout(task, new TimeSpan(0, 0, 0, 0, milliseconds), memberName, filePath, lineNumber);
|
return OrTimeout(task, new TimeSpan(0, 0, 0, 0, milliseconds), memberName, filePath, lineNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<T> OrTimeout<T>(this Task<T> task, TimeSpan timeout, [CallerMemberName] string memberName = null, [CallerFilePath] string filePath = null, [CallerLineNumber] int? lineNumber = null)
|
public static Task<T> OrTimeout<T>(this Task<T> task, TimeSpan timeout, [CallerMemberName] string memberName = null, [CallerFilePath] string filePath = null, [CallerLineNumber] int? lineNumber = null)
|
||||||
{
|
{
|
||||||
if (task.IsCompleted)
|
return task.TimeoutAfter(timeout, filePath, lineNumber ?? 0);
|
||||||
{
|
|
||||||
return await task;
|
|
||||||
}
|
|
||||||
|
|
||||||
var cts = new CancellationTokenSource();
|
|
||||||
var completed = await Task.WhenAny(task, Task.Delay(Debugger.IsAttached ? Timeout.InfiniteTimeSpan : timeout, cts.Token));
|
|
||||||
if (completed != task)
|
|
||||||
{
|
|
||||||
throw new TimeoutException(GetMessage(memberName, filePath, lineNumber));
|
|
||||||
}
|
|
||||||
cts.Cancel();
|
|
||||||
|
|
||||||
return await task;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task OrThrowIfOtherFails(this Task task, Task otherTask)
|
public static async Task OrThrowIfOtherFails(this Task task, Task otherTask)
|
||||||
|
|
@ -92,17 +66,5 @@ namespace System.Threading.Tasks
|
||||||
// If we get here, 'task' is finished and succeeded.
|
// If we get here, 'task' is finished and succeeded.
|
||||||
return task.GetAwaiter().GetResult();
|
return task.GetAwaiter().GetResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string GetMessage(string memberName, string filePath, int? lineNumber)
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(memberName))
|
|
||||||
{
|
|
||||||
return $"Operation in {memberName} timed out at {filePath}:{lineNumber}";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return "Operation timed out";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue