1
0

Adding support for .NET 8.0 LTS, renaming private fields to start with underscore

This commit is contained in:
2023-12-29 01:58:40 +01:00
parent 8bd511a936
commit 99d3f7758a
59 changed files with 922 additions and 871 deletions

View File

@@ -78,6 +78,17 @@ dotnet_naming_rule.parameters_locals_must_be_camel_case.symbols = parameters_loc
dotnet_naming_rule.parameters_locals_must_be_camel_case.style = camel_case_style
dotnet_naming_rule.parameters_locals_must_be_camel_case.severity = warning
# Name all private fields starting with underscore
dotnet_naming_rule.private_members_with_underscore.symbols = private_fields
dotnet_naming_rule.private_members_with_underscore.style = prefix_underscore
dotnet_naming_rule.private_members_with_underscore.severity = suggestion
dotnet_naming_symbols.private_fields.applicable_kinds = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private
dotnet_naming_style.prefix_underscore.capitalization = camel_case
dotnet_naming_style.prefix_underscore.required_prefix = _
[*.cs]
csharp_preferred_modifier_order = public, private, protected, internal, static, extern, new, virtual, abstract, sealed, override, readonly, unsafe, volatile, async:suggestion

View File

@@ -1,5 +1,5 @@
# The image should use the same version as the UnitTests are
image: mcr.microsoft.com/dotnet/sdk:6.0
image: mcr.microsoft.com/dotnet/sdk:8.0
variables:
TZ: Europe/Berlin

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFrameworks>net6.0;net8.0</TargetFrameworks>
<LangVersion>10.0</LangVersion>
<NrtTagMatch>asp/v[0-9]*</NrtTagMatch>

View File

@@ -45,13 +45,13 @@ namespace Microsoft.AspNetCore.Authorization
if (isAllowAnonymous)
return;
if (!context.HttpContext.Request.Headers.ContainsKey("Authorization"))
if (!context.HttpContext.Request.Headers.TryGetValue("Authorization", out var authHeaderValue))
{
SetAuthenticateRequest(context);
return;
}
var authHeader = AuthenticationHeaderValue.Parse(context.HttpContext.Request.Headers["Authorization"]);
var authHeader = AuthenticationHeaderValue.Parse(authHeaderValue);
byte[] decoded = Convert.FromBase64String(authHeader.Parameter);
string plain = Encoding.UTF8.GetString(decoded);
@@ -84,22 +84,22 @@ namespace Microsoft.AspNetCore.Authorization
: validator.Realm
: Realm;
context.HttpContext.Response.Headers["WWW-Authenticate"] = "Basic";
context.HttpContext.Response.Headers.WWWAuthenticate = "Basic";
if (!string.IsNullOrWhiteSpace(realm))
context.HttpContext.Response.Headers["WWW-Authenticate"] = $"Basic realm=\"{realm.Trim().Replace("\"", "")}\"";
context.HttpContext.Response.Headers.WWWAuthenticate = $"Basic realm=\"{realm.Trim().Replace("\"", "")}\"";
context.HttpContext.Response.StatusCode = StatusCodes.Status401Unauthorized;
context.Result = new StatusCodeResult(StatusCodes.Status401Unauthorized);
}
private async Task<ClaimsPrincipal> TrySetHttpUser(AuthorizationFilterContext context)
private static async Task<ClaimsPrincipal> TrySetHttpUser(AuthorizationFilterContext context)
{
var logger = context.HttpContext.RequestServices.GetService<ILogger<BasicAuthenticationAttribute>>();
try
{
if (context.HttpContext.Request.Headers.ContainsKey("Authorization"))
if (context.HttpContext.Request.Headers.TryGetValue("Authorization", out var authHeaderValue))
{
var authHeader = AuthenticationHeaderValue.Parse(context.HttpContext.Request.Headers["Authorization"]);
var authHeader = AuthenticationHeaderValue.Parse(authHeaderValue);
byte[] decoded = Convert.FromBase64String(authHeader.Parameter);
string plain = Encoding.UTF8.GetString(decoded);

View File

@@ -50,7 +50,7 @@ namespace Microsoft.AspNetCore.Mvc.Filters
private const string VerificationUrl = "https://www.google.com/recaptcha/api/siteverify";
private string privateKey;
private string _privateKey;
/// <summary>
/// Executes the validattion in background.
@@ -61,9 +61,9 @@ namespace Microsoft.AspNetCore.Mvc.Filters
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var configuration = context.HttpContext.RequestServices.GetService<IConfiguration>();
privateKey = configuration?.GetValue<string>("Google:ReCaptcha:PrivateKey");
_privateKey = configuration?.GetValue<string>("Google:ReCaptcha:PrivateKey");
if (string.IsNullOrWhiteSpace(privateKey))
if (string.IsNullOrWhiteSpace(_privateKey))
return;
await DoValidation(context).ConfigureAwait(false);
@@ -90,7 +90,7 @@ namespace Microsoft.AspNetCore.Mvc.Filters
using var httpClient = new HttpClient();
var param = new Dictionary<string, string>
{
{ "secret", privateKey },
{ "secret", _privateKey },
{ "response", token }
};
var response = await httpClient.PostAsync(VerificationUrl, new FormUrlEncodedContent(param)).ConfigureAwait(false);

View File

@@ -1,9 +1,9 @@
using System.Linq;
using System.Net;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using IPNetwork = Microsoft.AspNetCore.HttpOverrides.IPNetwork;
namespace Microsoft.AspNetCore.Mvc.Filters
{

View File

@@ -1,9 +1,9 @@
using System.Linq;
using System.Net;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using IPNetwork = Microsoft.AspNetCore.HttpOverrides.IPNetwork;
namespace Microsoft.AspNetCore.Mvc.Filters
{

View File

@@ -2,6 +2,7 @@
using System.Net;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpOverrides;
using IPNetwork = Microsoft.AspNetCore.HttpOverrides.IPNetwork;
namespace Microsoft.AspNetCore.Builder
{

View File

@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Http
public static class HttpContextExtensions
{
// Search these additional headers for a remote client ip address.
private static readonly string[] defaultIpHeaderNames = new[]
private static readonly string[] _defaultIpHeaderNames = new[]
{
"Cf-Connecting-Ip", // set by Cloudflare
"X-Real-IP", // wide-spread alternative to X-Forwarded-For
@@ -51,8 +51,8 @@ namespace Microsoft.AspNetCore.Http
string forwardedForAddress = null;
var headerNames = string.IsNullOrWhiteSpace(ipHeaderName)
? defaultIpHeaderNames
: new[] { ipHeaderName }.Concat(defaultIpHeaderNames);
? _defaultIpHeaderNames
: new[] { ipHeaderName }.Concat(_defaultIpHeaderNames);
foreach (string headerName in headerNames)
{
if (!httpContext.Request.Headers.ContainsKey(headerName))
@@ -67,9 +67,15 @@ namespace Microsoft.AspNetCore.Http
}
if (!string.IsNullOrWhiteSpace(forwardedForAddress) && IPAddress.TryParse(forwardedForAddress, out var remoteAddress))
return remoteAddress.IsIPv4MappedToIPv6 ? remoteAddress.MapToIPv4() : remoteAddress;
{
return remoteAddress.IsIPv4MappedToIPv6
? remoteAddress.MapToIPv4()
: remoteAddress;
}
return httpContext.Connection.RemoteIpAddress;
return httpContext.Connection.RemoteIpAddress.IsIPv4MappedToIPv6
? httpContext.Connection.RemoteIpAddress.MapToIPv4()
: httpContext.Connection.RemoteIpAddress;
}
/// <summary>

View File

@@ -15,11 +15,11 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
/// <typeparam name="TModel">The type of the model.</typeparam>
/// <typeparam name="TProperty">The type of the property.</typeparam>
/// <param name="modelState">The <see cref="ModelStateDictionary"/> instance.</param>
/// <param name="model">The model. Only used to infer the model type.</param>
/// <param name="_">The model. Only used to infer the model type.</param>
/// <param name="keyExpression">The <see cref="MemberExpression"/> that specifies the property.</param>
/// <param name="errorMessage">The error message to add.</param>
/// <exception cref="InvalidOperationException">No member expression provided.</exception>
public static void AddModelError<TModel, TProperty>(this ModelStateDictionary modelState, TModel model, Expression<Func<TModel, TProperty>> keyExpression, string errorMessage)
public static void AddModelError<TModel, TProperty>(this ModelStateDictionary modelState, TModel _, Expression<Func<TModel, TProperty>> keyExpression, string errorMessage)
{
if (modelState is null)
throw new ArgumentNullException(nameof(modelState));

View File

@@ -12,9 +12,9 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class InvariantFloatingPointModelBinder : IModelBinder
{
private readonly NumberStyles supportedNumberStyles;
private readonly ILogger logger;
private readonly CultureInfo cultureInfo;
private readonly NumberStyles _supportedNumberStyles;
private readonly ILogger _logger;
private readonly CultureInfo _cultureInfo;
/// <summary>
/// Initializes a new instance of <see cref="InvariantFloatingPointModelBinder"/>.
@@ -24,10 +24,10 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
/// <param name="loggerFactory">The <see cref="ILoggerFactory"/>.</param>
public InvariantFloatingPointModelBinder(NumberStyles supportedStyles, CultureInfo cultureInfo, ILoggerFactory loggerFactory)
{
this.cultureInfo = cultureInfo ?? throw new ArgumentNullException(nameof(cultureInfo));
_cultureInfo = cultureInfo ?? throw new ArgumentNullException(nameof(cultureInfo));
supportedNumberStyles = supportedStyles;
logger = loggerFactory?.CreateLogger<InvariantFloatingPointModelBinder>();
_supportedNumberStyles = supportedStyles;
_logger = loggerFactory?.CreateLogger<InvariantFloatingPointModelBinder>();
}
/// <inheritdoc />
@@ -36,15 +36,15 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
if (bindingContext == null)
throw new ArgumentNullException(nameof(bindingContext));
logger?.AttemptingToBindModel(bindingContext);
_logger?.AttemptingToBindModel(bindingContext);
string modelName = bindingContext.ModelName;
var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);
if (valueProviderResult == ValueProviderResult.None)
{
logger?.FoundNoValueInRequest(bindingContext);
_logger?.FoundNoValueInRequest(bindingContext);
// no entry
logger?.DoneAttemptingToBindModel(bindingContext);
_logger?.DoneAttemptingToBindModel(bindingContext);
return Task.CompletedTask;
}
@@ -56,7 +56,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
try
{
string value = valueProviderResult.FirstValue;
var culture = cultureInfo ?? valueProviderResult.Culture;
var culture = _cultureInfo ?? valueProviderResult.Culture;
object model;
if (string.IsNullOrWhiteSpace(value))
@@ -66,15 +66,15 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
}
else if (type == typeof(float))
{
model = float.Parse(value, supportedNumberStyles, culture);
model = float.Parse(value, _supportedNumberStyles, culture);
}
else if (type == typeof(double))
{
model = double.Parse(value, supportedNumberStyles, culture);
model = double.Parse(value, _supportedNumberStyles, culture);
}
else if (type == typeof(decimal))
{
model = decimal.Parse(value, supportedNumberStyles, culture);
model = decimal.Parse(value, _supportedNumberStyles, culture);
}
else
{
@@ -113,7 +113,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
// Conversion failed.
}
logger?.DoneAttemptingToBindModel(bindingContext);
_logger?.DoneAttemptingToBindModel(bindingContext);
return Task.CompletedTask;
}
}

View File

@@ -19,24 +19,44 @@ namespace AMWD.Common.AspNetCore.Security.BasicAuthentication
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class BasicAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
private readonly ILogger logger;
private readonly IBasicAuthenticationValidator validator;
private readonly ILogger _logger;
private readonly IBasicAuthenticationValidator _validator;
#if NET8_0_OR_GREATER
/// <summary>
/// Initializes a new instance of the <see cref="BasicAuthenticationHandler"/> class.
/// </summary>
/// <param name="options">The monitor for the options instance.</param>
/// <param name="logger">The <see cref="ILoggerFactory"/>.</param>
/// <param name="encoder">The <see cref="UrlEncoder"/>.</param>
/// <param name="validator">An basic autentication validator implementation.</param>
public BasicAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, IBasicAuthenticationValidator validator)
: base(options, logger, encoder)
{
_logger = logger.CreateLogger<BasicAuthenticationHandler>();
_validator = validator;
}
#endif
#if NET6_0
/// <summary>
/// Initializes a new instance of the <see cref="BasicAuthenticationHandler"/> class.
/// </summary>
/// <param name="options">The authentication scheme options.</param>
/// <param name="loggerFactory">The logger factory.</param>
/// <param name="encoder">The URL encoder.</param>
/// <param name="clock">The system clock.</param>
/// <param name="options" > The monitor for the options instance.</param>
/// <param name="logger">The <see cref="ILoggerFactory"/>.</param>
/// <param name="encoder">The <see cref="UrlEncoder"/>.</param>
/// <param name="clock">The <see cref="ISystemClock"/>.</param>
/// <param name="validator">An basic autentication validator implementation.</param>
public BasicAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory loggerFactory, UrlEncoder encoder, ISystemClock clock, IBasicAuthenticationValidator validator)
: base(options, loggerFactory, encoder, clock)
public BasicAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock, IBasicAuthenticationValidator validator)
: base(options, logger, encoder, clock)
{
logger = loggerFactory.CreateLogger<BasicAuthenticationHandler>();
this.validator = validator;
_logger = logger.CreateLogger<BasicAuthenticationHandler>();
_validator = validator;
}
#endif
/// <inheritdoc/>
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
@@ -44,13 +64,13 @@ namespace AMWD.Common.AspNetCore.Security.BasicAuthentication
if (endpoint?.Metadata?.GetMetadata<IAllowAnonymous>() != null)
return AuthenticateResult.NoResult();
if (!Request.Headers.ContainsKey("Authorization"))
if (!Request.Headers.TryGetValue("Authorization", out var authHeaderValue))
return AuthenticateResult.Fail("Authorization header missing");
ClaimsPrincipal principal;
try
{
var authHeader = AuthenticationHeaderValue.Parse(Request.Headers["Authorization"]);
var authHeader = AuthenticationHeaderValue.Parse(authHeaderValue);
string plain = Encoding.UTF8.GetString(Convert.FromBase64String(authHeader.Parameter));
// See: https://www.rfc-editor.org/rfc/rfc2617, page 6
@@ -58,11 +78,11 @@ namespace AMWD.Common.AspNetCore.Security.BasicAuthentication
string password = plain[(username.Length + 1)..];
var ipAddress = Context.GetRemoteIpAddress();
principal = await validator.ValidateAsync(username, password, ipAddress, Context.RequestAborted).ConfigureAwait(false);
principal = await _validator.ValidateAsync(username, password, ipAddress, Context.RequestAborted).ConfigureAwait(false);
}
catch (Exception ex)
{
logger.LogError(ex, $"Handling the Basic Authentication failed: {ex.Message}");
_logger.LogError(ex, $"Handling the Basic Authentication failed: {ex.Message}");
return AuthenticateResult.Fail("Authorization header invalid");
}

View File

@@ -13,8 +13,8 @@ namespace AMWD.Common.AspNetCore.Security.BasicAuthentication
/// </summary>
public class BasicAuthenticationMiddleware
{
private readonly RequestDelegate next;
private readonly IBasicAuthenticationValidator validator;
private readonly RequestDelegate _next;
private readonly IBasicAuthenticationValidator _validator;
/// <summary>
/// Initializes a new instance of the <see cref="BasicAuthenticationMiddleware"/> class.
@@ -23,8 +23,8 @@ namespace AMWD.Common.AspNetCore.Security.BasicAuthentication
/// <param name="validator">A basic authentication validator.</param>
public BasicAuthenticationMiddleware(RequestDelegate next, IBasicAuthenticationValidator validator)
{
this.next = next;
this.validator = validator;
_next = next;
_validator = validator;
}
/// <summary>
@@ -37,7 +37,7 @@ namespace AMWD.Common.AspNetCore.Security.BasicAuthentication
{
if (!httpContext.Request.Headers.ContainsKey("Authorization"))
{
SetAuthenticateRequest(httpContext, validator.Realm);
SetAuthenticateRequest(httpContext, _validator.Realm);
return;
}
@@ -51,14 +51,14 @@ namespace AMWD.Common.AspNetCore.Security.BasicAuthentication
string username = plain.Split(':').First();
string password = plain[(username.Length + 1)..];
var principal = await validator.ValidateAsync(username, password, httpContext.GetRemoteIpAddress(), httpContext.RequestAborted).ConfigureAwait(false);
var principal = await _validator.ValidateAsync(username, password, httpContext.GetRemoteIpAddress(), httpContext.RequestAborted).ConfigureAwait(false);
if (principal == null)
{
SetAuthenticateRequest(httpContext, validator.Realm);
SetAuthenticateRequest(httpContext, _validator.Realm);
return;
}
await next.Invoke(httpContext).ConfigureAwait(false);
await _next.Invoke(httpContext).ConfigureAwait(false);
}
catch (Exception ex)
{

View File

@@ -10,9 +10,9 @@ namespace AMWD.Common.AspNetCore.Security.PathProtection
/// </summary>
public class ProtectedPathMiddleware
{
private readonly RequestDelegate next;
private readonly PathString path;
private readonly string policyName;
private readonly RequestDelegate _next;
private readonly PathString _path;
private readonly string _policyName;
/// <summary>
/// Initializes a new instance of the <see cref="ProtectedPathExtensions"/> class.
@@ -21,9 +21,9 @@ namespace AMWD.Common.AspNetCore.Security.PathProtection
/// <param name="options">The options to configure the middleware.</param>
public ProtectedPathMiddleware(RequestDelegate next, ProtectedPathOptions options)
{
this.next = next;
path = options.Path;
policyName = options.PolicyName;
_next = next;
_path = options.Path;
_policyName = options.PolicyName;
}
/// <summary>
@@ -35,16 +35,16 @@ namespace AMWD.Common.AspNetCore.Security.PathProtection
/// <returns>An awaitable task.</returns>
public async Task InvokeAsync(HttpContext httpContext, IAuthorizationService authorizationService)
{
if (httpContext.Request.Path.StartsWithSegments(path))
if (httpContext.Request.Path.StartsWithSegments(_path))
{
var result = await authorizationService.AuthorizeAsync(httpContext.User, null, policyName).ConfigureAwait(false);
var result = await authorizationService.AuthorizeAsync(httpContext.User, null, _policyName).ConfigureAwait(false);
if (!result.Succeeded)
{
await httpContext.ChallengeAsync().ConfigureAwait(false);
return;
}
}
await next.Invoke(httpContext).ConfigureAwait(false);
await _next.Invoke(httpContext).ConfigureAwait(false);
}
}
}

View File

@@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers
[HtmlAttributeName("class")]
public string CssClass { get; set; }
private IDictionary<string, bool> classValues;
private IDictionary<string, bool> _classValues;
/// <summary>
/// Gets or sets a dictionary containing all conditional class names and a boolean condition
@@ -32,11 +32,11 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers
{
get
{
return classValues ??= new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
return _classValues ??= new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
}
set
{
classValues = value;
_classValues = value;
}
}
@@ -48,7 +48,7 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers
/// <param name="output">A stateful HTML element used to generate an HTML tag.</param>
public override void Process(TagHelperContext context, TagHelperOutput output)
{
var items = classValues.Where(e => e.Value).Select(e => e.Key).ToList();
var items = _classValues.Where(e => e.Value).Select(e => e.Key).ToList();
if (!string.IsNullOrEmpty(CssClass))
items.Insert(0, CssClass);

View File

@@ -18,8 +18,8 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers
[HtmlTargetElement("script")]
public class IntegrityHashTagHelper : TagHelper
{
private readonly IWebHostEnvironment env;
private readonly string hostUrl;
private readonly IWebHostEnvironment _env;
private readonly string _hostUrl;
/// <summary>
/// Initializes a new instance of the <see cref="IntegrityHashTagHelper"/> class.
@@ -28,8 +28,8 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers
/// <param name="configuration">The application configuration.</param>
public IntegrityHashTagHelper(IWebHostEnvironment env, IConfiguration configuration)
{
this.env = env;
hostUrl = configuration.GetValue("ASPNETCORE_APPL_URL", "http://localhost/");
_env = env;
_hostUrl = configuration.GetValue("ASPNETCORE_APPL_URL", "http://localhost/");
}
/// <summary>
@@ -84,8 +84,8 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers
{
using var client = new HttpClient();
if (!string.IsNullOrWhiteSpace(hostUrl))
client.DefaultRequestHeaders.Referrer = new Uri(hostUrl);
if (!string.IsNullOrWhiteSpace(_hostUrl))
client.DefaultRequestHeaders.Referrer = new Uri(_hostUrl);
var response = await client.GetAsync(source).ConfigureAwait(false);
fileBytes = await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false);
@@ -103,12 +103,12 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers
if (source.StartsWith("/"))
source = source[1..];
if (source.Contains("?"))
if (source.Contains('?'))
source = source[..source.IndexOf("?")];
try
{
string path = Path.Combine(env.WebRootPath, source);
string path = Path.Combine(_env.WebRootPath, source);
fileBytes = await File.ReadAllBytesAsync(path).ConfigureAwait(false);
}
catch
@@ -118,7 +118,7 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers
}
string type;
byte[] hashBytes = new byte[0];
byte[] hashBytes = Array.Empty<byte>();
switch (IntegrityStrength)
{
case 512:

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFrameworks>net6.0;net8.0</TargetFrameworks>
<LangVersion>10.0</LangVersion>
<NrtTagMatch>efc/v[0-9]*</NrtTagMatch>
@@ -21,11 +21,18 @@
<None Include="../README.md" Pack="true" PackagePath="/" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.23" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.23" />
<ItemGroup Condition="'$(TargetFramework)' == 'net6.0'">
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.25" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.25" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.0" />
</ItemGroup>
</Project>

View File

@@ -33,6 +33,8 @@ namespace System
: base(message, innerException)
{ }
#if NET6_0
/// <summary>
/// Initializes a new instance of the <see cref="DatabaseProviderException"/> class with serialized data.
/// </summary>
@@ -43,5 +45,7 @@ namespace System
protected DatabaseProviderException(SerializationInfo info, StreamingContext context)
: base(info, context)
{ }
#endif
}
}

View File

@@ -24,6 +24,7 @@ namespace Microsoft.EntityFrameworkCore
/// <param name="optionsAction">An action to set additional options.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>true on success, otherwise false or an exception is thrown.</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "CA2208")]
public static async Task<bool> ApplyMigrationsAsync(this DatabaseFacade database, Action<DatabaseMigrationOptions> optionsAction, CancellationToken cancellationToken = default)
{
if (database == null)

View File

@@ -10,14 +10,14 @@ namespace AMWD.Common.EntityFrameworkCore.Extensions
public static class ModelConfigurationBuilderExtensions
{
/// <summary>
/// Adds converters for the <see cref="DateOnly"/> and <see cref="TimeOnly"/> datatypes introduced with .NET 6.0.
/// Adds converters for the <see cref="DateOnly"/> datatype introduced with .NET 6.0.
/// </summary>
/// <remarks>
/// As of 2022-06-04 only required for Microsoft SQL server on .NET 6.0.
/// </remarks>
/// <param name="builder">The <see cref="ModelConfigurationBuilder"/> instance.</param>
/// <returns>The <see cref="ModelConfigurationBuilder"/> instance after applying the converters.</returns>
public static ModelConfigurationBuilder AddDateOnlyTimeOnlyConverters(this ModelConfigurationBuilder builder)
public static ModelConfigurationBuilder AddDateOnlyConverters(this ModelConfigurationBuilder builder)
{
builder.Properties<DateOnly>()
.HaveConversion<DateOnlyConverter>()
@@ -26,6 +26,19 @@ namespace AMWD.Common.EntityFrameworkCore.Extensions
.HaveConversion<NullableDateOnlyConverter>()
.HaveColumnType("date");
return builder;
}
/// <summary>
/// Adds converters for the <see cref="TimeOnly"/> datatype introduced with .NET 6.0.
/// </summary>
/// <remarks>
/// As of 2022-06-04 only required for Microsoft SQL server on .NET 6.0.
/// </remarks>
/// <param name="builder">The <see cref="ModelConfigurationBuilder"/> instance.</param>
/// <returns>The <see cref="ModelConfigurationBuilder"/> instance after applying the converters.</returns>
public static ModelConfigurationBuilder AddTimeOnlyConverters(this ModelConfigurationBuilder builder)
{
builder.Properties<TimeOnly>()
.HaveConversion<TimeOnlyConverter>()
.HaveColumnType("time");

View File

@@ -0,0 +1,3 @@
using System.Diagnostics.CodeAnalysis;
[assembly: SuppressMessage("Usage", "CA2254")]

View File

@@ -12,7 +12,7 @@ namespace AMWD.Common.Test
/// </summary>
public class TcpClientMoq
{
private readonly Mock<NetworkStream> streamMock;
private readonly Mock<NetworkStream> _streamMock;
/// <summary>
/// Initializes a new instance of the <see cref="TcpClientMoq"/> class.
@@ -22,8 +22,8 @@ namespace AMWD.Common.Test
Callbacks = new();
Response = new byte[0];
streamMock = new();
streamMock
_streamMock = new();
_streamMock
.Setup(s => s.WriteAsync(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<CancellationToken>()))
.Callback<byte[], int, int, CancellationToken>((buffer, offset, count, _) =>
{
@@ -39,7 +39,7 @@ namespace AMWD.Common.Test
Callbacks.Add(callback);
})
.Returns(Task.CompletedTask);
streamMock
_streamMock
.Setup(s => s.Write(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()))
.Callback<byte[], int, int>((buffer, offset, count) =>
{
@@ -55,7 +55,7 @@ namespace AMWD.Common.Test
Callbacks.Add(callback);
});
streamMock
_streamMock
.Setup(s => s.ReadAsync(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<CancellationToken>()))
.Callback<byte[], int, int, CancellationToken>((buffer, offset, count, _) =>
{
@@ -63,7 +63,7 @@ namespace AMWD.Common.Test
Array.Copy(bytes, 0, buffer, offset, Math.Min(bytes.Length, count));
})
.ReturnsAsync(Response?.Length ?? 0);
streamMock
_streamMock
.Setup(s => s.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()))
.Callback<byte[], int, int>((buffer, offset, count) =>
{
@@ -75,7 +75,7 @@ namespace AMWD.Common.Test
Mock = new();
Mock
.Setup(c => c.GetStream())
.Returns(streamMock.Object);
.Returns(_streamMock.Object);
}
/// <summary>
@@ -107,28 +107,28 @@ namespace AMWD.Common.Test
/// </summary>
/// <param name="times">Number of calls.</param>
public void VerifyWriteAsync(Times times)
=> streamMock.Verify(s => s.WriteAsync(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<CancellationToken>()), times);
=> _streamMock.Verify(s => s.WriteAsync(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<CancellationToken>()), times);
/// <summary>
/// Verifies the number of calls writing synchronous to the stream.
/// </summary>
/// <param name="times">Number of calls.</param>
public void VerifyWriteSync(Times times)
=> streamMock.Verify(s => s.Write(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()), times);
=> _streamMock.Verify(s => s.Write(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()), times);
/// <summary>
/// Verifies the number of calls reading asynchronous from the stream.
/// </summary>
/// <param name="times">Number of calls.</param>
public void VerifyReadAsync(Times times)
=> streamMock.Verify(s => s.ReadAsync(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<CancellationToken>()), times);
=> _streamMock.Verify(s => s.ReadAsync(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<CancellationToken>()), times);
/// <summary>
/// Verifies the number of calls reading synchronous from the stream.
/// </summary>
/// <param name="times">Number of calls.</param>
public void VerifyReadSync(Times times)
=> streamMock.Verify(s => s.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()), times);
=> _streamMock.Verify(s => s.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()), times);
/// <summary>
/// Represents the placed TCP request.

View File

@@ -12,9 +12,9 @@ namespace AMWD.Common.Cli
{
#region Private data
private string[] args;
private List<Argument> parsedArguments;
private readonly List<Option> options = new();
private string[] _args;
private List<Argument> _parsedArguments;
private readonly List<Option> _options = new();
#endregion Private data
@@ -138,7 +138,7 @@ namespace AMWD.Common.Cli
/// <param name="argsString">The string that contains the entire command line.</param>
public void ReadArgs(string argsString)
{
args = ParseArgsString(argsString);
_args = ParseArgsString(argsString);
}
#endregion Custom arguments line parsing
@@ -164,7 +164,7 @@ namespace AMWD.Common.Cli
public Option RegisterOption(string name, int parameterCount)
{
var option = new Option(name, parameterCount);
options.Add(option);
_options.Add(option);
return option;
}
@@ -178,7 +178,7 @@ namespace AMWD.Common.Cli
/// <param name="args">The command line arguments.</param>
public void Parse(string[] args)
{
this.args = args ?? throw new ArgumentNullException(nameof(args));
_args = args ?? throw new ArgumentNullException(nameof(args));
Parse();
}
@@ -188,19 +188,19 @@ namespace AMWD.Common.Cli
public void Parse()
{
// Use args of the current process if no other source was given
if (args == null)
if (_args == null)
{
args = Environment.GetCommandLineArgs();
if (args.Length > 0)
_args = Environment.GetCommandLineArgs();
if (_args.Length > 0)
{
// Skip myself (args[0])
args = args.Skip(1).ToArray();
_args = _args.Skip(1).ToArray();
}
}
// Clear/reset data
parsedArguments = new();
foreach (var option in options)
_parsedArguments = new();
foreach (var option in _options)
{
option.IsSet = false;
option.SetCount = 0;
@@ -210,7 +210,7 @@ namespace AMWD.Common.Cli
var comparison = IsCaseSensitive
? StringComparison.Ordinal
: StringComparison.OrdinalIgnoreCase;
var argumentWalker = new EnumerableWalker<string>(args);
var argumentWalker = new EnumerableWalker<string>(_args);
bool optMode = true;
foreach (string arg in argumentWalker.Cast<string>())
{
@@ -232,11 +232,11 @@ namespace AMWD.Common.Cli
}
// Find the option with complete name match
var option = options.FirstOrDefault(o => o.Names.Any(n => n.Equals(optName, comparison)));
var option = _options.FirstOrDefault(o => o.Names.Any(n => n.Equals(optName, comparison)));
if (option == null)
{
// Try to complete the name to a unique registered option
var matchingOptions = options.Where(o => o.Names.Any(n => n.StartsWith(optName, comparison))).ToList();
var matchingOptions = _options.Where(o => o.Names.Any(n => n.StartsWith(optName, comparison))).ToList();
if (AutoCompleteOptions && matchingOptions.Count > 1)
throw new Exception("Invalid option, completion is not unique: " + arg);
@@ -283,16 +283,16 @@ namespace AMWD.Common.Cli
}
else
{
parsedArguments.Add(argument);
_parsedArguments.Add(argument);
}
}
else
{
parsedArguments.Add(new Argument(null, new[] { arg }));
_parsedArguments.Add(new Argument(null, new[] { arg }));
}
}
var missingOption = options.FirstOrDefault(o => o.IsRequired && !o.IsSet);
var missingOption = _options.FirstOrDefault(o => o.IsRequired && !o.IsSet);
if (missingOption != null)
throw new Exception("Missing required option: /" + missingOption.Names[0]);
}
@@ -312,10 +312,10 @@ namespace AMWD.Common.Cli
{
get
{
if (parsedArguments == null)
if (_parsedArguments == null)
Parse();
return parsedArguments.ToArray();
return _parsedArguments.ToArray();
}
}
@@ -330,10 +330,10 @@ namespace AMWD.Common.Cli
{
get
{
if (parsedArguments == null)
if (_parsedArguments == null)
Parse();
return parsedArguments
return _parsedArguments
.Where(a => a.Option != null)
.Select(a => a.Option)
.ToArray();
@@ -351,10 +351,10 @@ namespace AMWD.Common.Cli
{
get
{
if (parsedArguments == null)
if (_parsedArguments == null)
Parse();
return parsedArguments
return _parsedArguments
.Where(a => a.Option == null)
.Select(a => a.Value)
.ToArray();

View File

@@ -11,8 +11,8 @@ namespace AMWD.Common.Cli
internal class EnumerableWalker<T> : IEnumerable<T>
where T : class
{
private readonly IEnumerable<T> array;
private IEnumerator<T> enumerator;
private readonly IEnumerable<T> _array;
private IEnumerator<T> _enumerator;
/// <summary>
/// Initialises a new instance of the <see cref="EnumerableWalker{T}"/> class.
@@ -20,13 +20,13 @@ namespace AMWD.Common.Cli
/// <param name="array">The array to walk though.</param>
public EnumerableWalker(IEnumerable<T> array)
{
this.array = array ?? throw new ArgumentNullException(nameof(array));
_array = array ?? throw new ArgumentNullException(nameof(array));
}
IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
enumerator = array.GetEnumerator();
return enumerator;
_enumerator = _array.GetEnumerator();
return _enumerator;
}
/// <summary>
@@ -35,8 +35,8 @@ namespace AMWD.Common.Cli
/// <returns>The enumerator.</returns>
public IEnumerator GetEnumerator()
{
enumerator = array.GetEnumerator();
return enumerator;
_enumerator = _array.GetEnumerator();
return _enumerator;
}
/// <summary>
@@ -45,9 +45,9 @@ namespace AMWD.Common.Cli
/// <returns>The next item.</returns>
public T GetNext()
{
if (enumerator.MoveNext())
if (_enumerator.MoveNext())
{
return enumerator.Current;
return _enumerator.Current;
}
else
{

View File

@@ -17,7 +17,7 @@ namespace Newtonsoft.Json
/// <summary>
/// Common JSON serializer settings.
/// </summary>
private static readonly JsonSerializerSettings jsonSerializerSettings = new()
private static readonly JsonSerializerSettings _jsonSerializerSettings = new()
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Culture = CultureInfo.InvariantCulture
@@ -32,7 +32,7 @@ namespace Newtonsoft.Json
public static void DeserializeJson<T>(this T target, string json)
{
if (!string.IsNullOrWhiteSpace(json))
JsonConvert.PopulateObject(json, target, jsonSerializerSettings);
JsonConvert.PopulateObject(json, target, _jsonSerializerSettings);
}
/// <summary>
@@ -42,7 +42,7 @@ namespace Newtonsoft.Json
/// <param name="json">The JSON string to read the values from.</param>
/// <returns>A new instance of <typeparamref name="T"/> with the deserialized values.</returns>
public static T DeserializeJson<T>(this string json)
=> JsonConvert.DeserializeObject<T>(json, jsonSerializerSettings);
=> JsonConvert.DeserializeObject<T>(json, _jsonSerializerSettings);
/// <summary>
/// Deserializes a JSON string into a new instance or using the fallback value.
@@ -55,7 +55,7 @@ namespace Newtonsoft.Json
{
try
{
return JsonConvert.DeserializeObject<T>(json, jsonSerializerSettings);
return JsonConvert.DeserializeObject<T>(json, _jsonSerializerSettings);
}
catch
{
@@ -83,7 +83,7 @@ namespace Newtonsoft.Json
jw.QuoteChar = '\'';
jw.Formatting = indented ? Formatting.Indented : Formatting.None;
var serializer = useCamelCase ? JsonSerializer.Create(jsonSerializerSettings) : JsonSerializer.CreateDefault();
var serializer = useCamelCase ? JsonSerializer.Create(_jsonSerializerSettings) : JsonSerializer.CreateDefault();
serializer.Error += (s, a) =>
{
@@ -107,7 +107,7 @@ namespace Newtonsoft.Json
if (obj == null)
return null;
var serializer = JsonSerializer.Create(jsonSerializerSettings);
var serializer = JsonSerializer.Create(_jsonSerializerSettings);
return JObject.FromObject(obj, serializer);
}
@@ -121,7 +121,7 @@ namespace Newtonsoft.Json
if (array == null)
return null;
var serializer = JsonSerializer.Create(jsonSerializerSettings);
var serializer = JsonSerializer.Create(_jsonSerializerSettings);
return JArray.FromObject(array, serializer);
}

View File

@@ -58,30 +58,30 @@
private struct DisposableReadWriteLock : IDisposable
{
private readonly ReaderWriterLockSlim rwLock;
private LockMode lockMode;
private readonly ReaderWriterLockSlim _rwLock;
private LockMode _lockMode;
public DisposableReadWriteLock(ReaderWriterLockSlim rwLock, LockMode lockMode)
{
this.rwLock = rwLock;
this.lockMode = lockMode;
_rwLock = rwLock;
_lockMode = lockMode;
}
public void Dispose()
{
if (lockMode == LockMode.Read)
rwLock.ExitReadLock();
if (_lockMode == LockMode.Read)
_rwLock.ExitReadLock();
if (lockMode == LockMode.Upgradable && rwLock.IsWriteLockHeld) // Upgraded with EnterWriteLock alone
rwLock.ExitWriteLock();
if (_lockMode == LockMode.Upgradable && _rwLock.IsWriteLockHeld) // Upgraded with EnterWriteLock alone
_rwLock.ExitWriteLock();
if (lockMode == LockMode.Upgradable)
rwLock.ExitUpgradeableReadLock();
if (_lockMode == LockMode.Upgradable)
_rwLock.ExitUpgradeableReadLock();
if (lockMode == LockMode.Write)
rwLock.ExitWriteLock();
if (_lockMode == LockMode.Write)
_rwLock.ExitWriteLock();
lockMode = LockMode.None;
_lockMode = LockMode.None;
}
}

View File

@@ -177,10 +177,7 @@ namespace System
if (isValid && nameservers?.Any() == true)
{
var dnsClientType = Type.GetType("DNS.Client.DnsClient, DNS");
if (dnsClientType == null)
throw new DllNotFoundException("The DNS NuGet package is required: https://www.nuget.org/packages/DNS/7.0.0");
var dnsClientType = Type.GetType("DNS.Client.DnsClient, DNS") ?? throw new DllNotFoundException("The DNS NuGet package is required: https://www.nuget.org/packages/DNS/7.0.0");
var recordTypeType = Type.GetType("DNS.Protocol.RecordType, DNS");
var resolveMethodInfo = dnsClientType.GetMethod("Resolve", new[] { typeof(string), recordTypeType, typeof(CancellationToken) });

View File

@@ -24,13 +24,13 @@ namespace AMWD.Common.Logging
{
#region Fields
private bool isDisposed = false;
private readonly CancellationTokenSource cancellationTokenSource = new();
private bool _isDisposed = false;
private readonly CancellationTokenSource _cancellationTokenSource = new();
private readonly StreamWriter fileWriter;
private readonly Task writeTask;
private readonly StreamWriter _fileWriter;
private readonly Task _writeTask;
private readonly AsyncQueue<QueueItem> queue = new();
private readonly AsyncQueue<QueueItem> _queue = new();
#endregion Fields
@@ -45,8 +45,8 @@ namespace AMWD.Common.Logging
public FileLogger(string file, bool append = false, Encoding encoding = null)
{
FileName = file;
fileWriter = new StreamWriter(FileName, append, encoding ?? Encoding.UTF8);
writeTask = Task.Run(() => WriteFileAsync(cancellationTokenSource.Token));
_fileWriter = new StreamWriter(FileName, append, encoding ?? Encoding.UTF8);
_writeTask = Task.Run(() => WriteFileAsync(_cancellationTokenSource.Token));
}
/// <summary>
@@ -148,7 +148,7 @@ namespace AMWD.Common.Logging
/// <inheritdoc cref="ILogger.BeginScope{TState}(TState)" />
public IDisposable BeginScope<TState>(TState state)
{
if (isDisposed)
if (_isDisposed)
throw new ObjectDisposedException(GetType().FullName);
return ScopeProvider?.Push(state) ?? NullScope.Instance;
@@ -157,7 +157,7 @@ namespace AMWD.Common.Logging
/// <inheritdoc cref="ILogger.IsEnabled(LogLevel)" />
public bool IsEnabled(LogLevel logLevel)
{
if (isDisposed)
if (_isDisposed)
throw new ObjectDisposedException(GetType().FullName);
return logLevel >= MinLevel;
@@ -166,7 +166,7 @@ namespace AMWD.Common.Logging
/// <inheritdoc cref="ILogger.Log{TState}(LogLevel, EventId, TState, Exception, Func{TState, Exception, string})" />
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
if (isDisposed)
if (_isDisposed)
throw new ObjectDisposedException(GetType().FullName);
if (!IsEnabled(logLevel))
@@ -197,13 +197,13 @@ namespace AMWD.Common.Logging
/// <inheritdoc cref="IDisposable.Dispose" />
public void Dispose()
{
if (!isDisposed)
if (!_isDisposed)
{
isDisposed = true;
_isDisposed = true;
cancellationTokenSource.Cancel();
writeTask.GetAwaiter().GetResult();
fileWriter.Dispose();
_cancellationTokenSource.Cancel();
_writeTask.GetAwaiter().GetResult();
_fileWriter.Dispose();
}
}
@@ -213,7 +213,7 @@ namespace AMWD.Common.Logging
private void WriteMessage(string name, LogLevel logLevel, int eventId, string message, Exception exception)
{
queue.Enqueue(new QueueItem
_queue.Enqueue(new QueueItem
{
Timestamp = UseUtcTimestamp ? DateTime.UtcNow : DateTime.Now,
Name = name,
@@ -236,7 +236,7 @@ namespace AMWD.Common.Logging
QueueItem[] items;
try
{
items = await queue.DequeueAvailableAsync(cancellationToken: token).ConfigureAwait(false);
items = await _queue.DequeueAvailableAsync(cancellationToken: token).ConfigureAwait(false);
}
catch (OperationCanceledException)
{
@@ -302,10 +302,10 @@ namespace AMWD.Common.Logging
sb.Append(message.Replace("\n", "\n" + timestampPadding + logLevelPadding));
await fileWriter.WriteLineAsync(sb.ToString()).ConfigureAwait(false);
await _fileWriter.WriteLineAsync(sb.ToString()).ConfigureAwait(false);
}
await fileWriter.FlushAsync().ConfigureAwait(false);
await _fileWriter.FlushAsync().ConfigureAwait(false);
}
}

View File

@@ -12,10 +12,10 @@ namespace System.Collections.Generic
{
#region Fields
private readonly Queue<T> queue;
private readonly Queue<T> _queue;
private TaskCompletionSource<bool> dequeueTcs = new();
private TaskCompletionSource<bool> availableTcs = new();
private TaskCompletionSource<bool> _dequeueTcs = new();
private TaskCompletionSource<bool> _availableTcs = new();
#endregion Fields
@@ -27,7 +27,7 @@ namespace System.Collections.Generic
[ExcludeFromCodeCoverage]
public AsyncQueue()
{
queue = new Queue<T>();
_queue = new Queue<T>();
}
/// <summary>
@@ -40,7 +40,7 @@ namespace System.Collections.Generic
[ExcludeFromCodeCoverage]
public AsyncQueue(IEnumerable<T> collection)
{
queue = new Queue<T>();
_queue = new Queue<T>();
Enqueue(collection);
}
@@ -52,7 +52,7 @@ namespace System.Collections.Generic
[ExcludeFromCodeCoverage]
public AsyncQueue(int capacity)
{
queue = new Queue<T>(capacity);
_queue = new Queue<T>(capacity);
}
#endregion Constructors
@@ -67,9 +67,9 @@ namespace System.Collections.Generic
{
get
{
lock (queue)
lock (_queue)
{
return queue.Count;
return _queue.Count;
}
}
}
@@ -84,9 +84,9 @@ namespace System.Collections.Generic
[ExcludeFromCodeCoverage]
public void Clear()
{
lock (queue)
lock (_queue)
{
queue.Clear();
_queue.Clear();
}
}
@@ -98,9 +98,9 @@ namespace System.Collections.Generic
[ExcludeFromCodeCoverage]
public bool Contains(T item)
{
lock (queue)
lock (_queue)
{
return queue.Contains(item);
return _queue.Contains(item);
}
}
@@ -115,9 +115,9 @@ namespace System.Collections.Generic
[ExcludeFromCodeCoverage]
public void CopyTo(T[] array, int arrayIndex)
{
lock (queue)
lock (_queue)
{
queue.CopyTo(array, arrayIndex);
_queue.CopyTo(array, arrayIndex);
}
}
@@ -129,9 +129,9 @@ namespace System.Collections.Generic
[ExcludeFromCodeCoverage]
public T Dequeue()
{
lock (queue)
lock (_queue)
{
return queue.Dequeue();
return _queue.Dequeue();
}
}
@@ -141,11 +141,11 @@ namespace System.Collections.Generic
/// <param name="item">The object to add to the <see cref="AsyncQueue{T}"/>. The value can be null for reference types.</param>
public void Enqueue(T item)
{
lock (queue)
lock (_queue)
{
queue.Enqueue(item);
SetToken(dequeueTcs);
SetToken(availableTcs);
_queue.Enqueue(item);
SetToken(_dequeueTcs);
SetToken(_availableTcs);
}
}
@@ -157,9 +157,9 @@ namespace System.Collections.Generic
[ExcludeFromCodeCoverage]
public T Peek()
{
lock (queue)
lock (_queue)
{
return queue.Peek();
return _queue.Peek();
}
}
@@ -170,9 +170,9 @@ namespace System.Collections.Generic
[ExcludeFromCodeCoverage]
public T[] ToArray()
{
lock (queue)
lock (_queue)
{
return queue.ToArray();
return _queue.ToArray();
}
}
@@ -182,9 +182,9 @@ namespace System.Collections.Generic
[ExcludeFromCodeCoverage]
public void TrimExcess()
{
lock (queue)
lock (_queue)
{
queue.TrimExcess();
_queue.TrimExcess();
}
}
@@ -203,21 +203,21 @@ namespace System.Collections.Generic
while (true)
{
TaskCompletionSource<bool> internalDequeueTcs;
lock (queue)
lock (_queue)
{
if (queue.Count > 0)
if (_queue.Count > 0)
{
int count = queue.Count;
int count = _queue.Count;
if (maxCount > 0 && count > maxCount)
count = maxCount;
var items = new T[count];
for (int i = 0; i < count; i++)
items[i] = queue.Dequeue();
items[i] = _queue.Dequeue();
return items;
}
internalDequeueTcs = ResetToken(ref dequeueTcs);
internalDequeueTcs = ResetToken(ref _dequeueTcs);
}
await WaitAsync(internalDequeueTcs, cancellationToken).ConfigureAwait(false);
@@ -238,17 +238,17 @@ namespace System.Collections.Generic
while (true)
{
TaskCompletionSource<bool> internalDequeueTcs;
lock (queue)
lock (_queue)
{
if (count <= queue.Count)
if (count <= _queue.Count)
{
var items = new T[count];
for (int i = 0; i < count; i++)
items[i] = queue.Dequeue();
items[i] = _queue.Dequeue();
return items;
}
internalDequeueTcs = ResetToken(ref dequeueTcs);
internalDequeueTcs = ResetToken(ref _dequeueTcs);
}
await WaitAsync(internalDequeueTcs, cancellationToken).ConfigureAwait(false);
@@ -265,12 +265,12 @@ namespace System.Collections.Generic
while (true)
{
TaskCompletionSource<bool> internalDequeueTcs;
lock (queue)
lock (_queue)
{
if (queue.Count > 0)
return queue.Dequeue();
if (_queue.Count > 0)
return _queue.Dequeue();
internalDequeueTcs = ResetToken(ref dequeueTcs);
internalDequeueTcs = ResetToken(ref _dequeueTcs);
}
await WaitAsync(internalDequeueTcs, cancellationToken).ConfigureAwait(false);
@@ -285,12 +285,12 @@ namespace System.Collections.Generic
public async Task WaitAsync(CancellationToken cancellationToken = default)
{
TaskCompletionSource<bool> internalAvailableTcs;
lock (queue)
lock (_queue)
{
if (queue.Count > 0)
if (_queue.Count > 0)
return;
internalAvailableTcs = ResetToken(ref availableTcs);
internalAvailableTcs = ResetToken(ref _availableTcs);
}
await WaitAsync(internalAvailableTcs, cancellationToken).ConfigureAwait(false);
@@ -347,10 +347,10 @@ namespace System.Collections.Generic
/// <returns>true if item is successfully removed; otherwise, false. This method also returns false if item was not found in the <see cref="AsyncQueue{T}"/>.</returns>
public bool Remove(T item)
{
lock (queue)
lock (_queue)
{
var copy = new Queue<T>(queue);
queue.Clear();
var copy = new Queue<T>(_queue);
_queue.Clear();
bool found = false;
int count = copy.Count;
@@ -359,7 +359,7 @@ namespace System.Collections.Generic
var element = copy.Dequeue();
if (found)
{
queue.Enqueue(element);
_queue.Enqueue(element);
continue;
}
@@ -369,7 +369,7 @@ namespace System.Collections.Generic
continue;
}
queue.Enqueue(element);
_queue.Enqueue(element);
}
return found;
@@ -382,19 +382,19 @@ namespace System.Collections.Generic
/// <param name="collection">The objects to add to the <see cref="AsyncQueue{T}"/>.</param>
public void Enqueue(IEnumerable<T> collection)
{
lock (queue)
lock (_queue)
{
bool hasElements = false;
foreach (var element in collection)
{
hasElements = true;
queue.Enqueue(element);
_queue.Enqueue(element);
}
if (hasElements)
{
SetToken(dequeueTcs);
SetToken(availableTcs);
SetToken(_dequeueTcs);
SetToken(_availableTcs);
}
}
}

View File

@@ -8,9 +8,12 @@ namespace System.Security.Cryptography
/// </summary>
public class CryptographyHelper
{
private static int saltLength = 8;
// "readonly" not added due to UnitTests
#pragma warning disable IDE0044 // Add "readonly" modifier
private static int _saltLength = 8;
#pragma warning restore IDE0044 // Add "readonly" modifier
private readonly string masterKeyFile;
private readonly string _masterKeyFile;
/// <summary>
/// Initializes a new instance of the <see cref="CryptographyHelper"/> class.
@@ -18,17 +21,17 @@ namespace System.Security.Cryptography
/// <param name="keyFile">The (absolute) path to the crypto key file. On <c>null</c> the file 'crypto.key' at the executing assembly location will be used.</param>
public CryptographyHelper(string keyFile = null)
{
masterKeyFile = keyFile;
_masterKeyFile = keyFile;
if (string.IsNullOrWhiteSpace(masterKeyFile))
masterKeyFile = "crypto.key";
if (string.IsNullOrWhiteSpace(_masterKeyFile))
_masterKeyFile = "crypto.key";
if (!Path.IsPathRooted(masterKeyFile))
masterKeyFile = Path.Combine(AppContext.BaseDirectory, masterKeyFile);
if (!Path.IsPathRooted(_masterKeyFile))
_masterKeyFile = Path.Combine(AppContext.BaseDirectory, _masterKeyFile);
string pw = File.Exists(masterKeyFile) ? File.ReadAllText(masterKeyFile) : null;
string pw = File.Exists(_masterKeyFile) ? File.ReadAllText(_masterKeyFile) : null;
if (string.IsNullOrWhiteSpace(pw))
File.WriteAllText(masterKeyFile, GetRandomString(64));
File.WriteAllText(_masterKeyFile, GetRandomString(64));
}
#region Instance methods
@@ -46,8 +49,7 @@ namespace System.Security.Cryptography
/// <returns>The decrypted data.</returns>
public byte[] DecryptAes(byte[] cipher, string password = null)
{
if (password == null)
password = File.ReadAllText(masterKeyFile);
password ??= File.ReadAllText(_masterKeyFile);
return AesDecrypt(cipher, password);
}
@@ -63,8 +65,7 @@ namespace System.Security.Cryptography
/// <returns>The encrypted data (cipher).</returns>
public byte[] EncryptAes(byte[] plain, string password = null)
{
if (password == null)
password = File.ReadAllText(masterKeyFile);
password ??= File.ReadAllText(_masterKeyFile);
return AesEncrypt(plain, password);
}
@@ -110,8 +111,7 @@ namespace System.Security.Cryptography
/// <returns>The decrypted data.</returns>
public byte[] DecryptTripleDes(byte[] cipher, string password = null)
{
if (password == null)
password = File.ReadAllText(masterKeyFile);
password ??= File.ReadAllText(_masterKeyFile);
return TripleDesDecrypt(cipher, password);
}
@@ -127,8 +127,7 @@ namespace System.Security.Cryptography
/// <returns>The encrypted data (cipher).</returns>
public byte[] EncryptTripleDes(byte[] plain, string password = null)
{
if (password == null)
password = File.ReadAllText(masterKeyFile);
password ??= File.ReadAllText(_masterKeyFile);
return TripleDesEncrypt(plain, password);
}
@@ -183,8 +182,8 @@ namespace System.Security.Cryptography
/// <returns>The decrypted data.</returns>
public static byte[] AesDecrypt(byte[] cipher, string password)
{
byte[] salt = new byte[saltLength];
Array.Copy(cipher, salt, saltLength);
byte[] salt = new byte[_saltLength];
Array.Copy(cipher, salt, _saltLength);
using var gen = new Rfc2898DeriveBytes(password, salt);
using var aes = Aes.Create();
@@ -197,7 +196,7 @@ namespace System.Security.Cryptography
using var ms = new MemoryStream();
using var cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(cipher, saltLength, cipher.Length - saltLength);
cs.Write(cipher, _saltLength, cipher.Length - _saltLength);
cs.FlushFinalBlock();
return ms.ToArray();
@@ -224,7 +223,7 @@ namespace System.Security.Cryptography
/// <returns>The encrypted data (cipher).</returns>
public static byte[] AesEncrypt(byte[] plain, string password)
{
byte[] salt = GetRandomBytes(saltLength);
byte[] salt = GetRandomBytes(_saltLength);
using var gen = new Rfc2898DeriveBytes(password, salt);
using var aes = Aes.Create();
@@ -269,8 +268,8 @@ namespace System.Security.Cryptography
/// <returns>The decrypted data.</returns>
public static byte[] TripleDesDecrypt(byte[] cipher, string password)
{
byte[] salt = new byte[saltLength];
Array.Copy(cipher, salt, saltLength);
byte[] salt = new byte[_saltLength];
Array.Copy(cipher, salt, _saltLength);
using var gen = new Rfc2898DeriveBytes(password, salt);
using var tdes = TripleDES.Create();
@@ -283,7 +282,7 @@ namespace System.Security.Cryptography
using var ms = new MemoryStream();
using var cs = new CryptoStream(ms, tdes.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(cipher, saltLength, cipher.Length - saltLength);
cs.Write(cipher, _saltLength, cipher.Length - _saltLength);
cs.FlushFinalBlock();
return ms.ToArray();
@@ -297,7 +296,7 @@ namespace System.Security.Cryptography
/// <returns>The encrypted data (cipher).</returns>
public static byte[] TripleDesEncrypt(byte[] plain, string password)
{
byte[] salt = GetRandomBytes(saltLength);
byte[] salt = GetRandomBytes(_saltLength);
using var gen = new Rfc2898DeriveBytes(password, salt);
using var tdes = TripleDES.Create();

View File

@@ -15,9 +15,9 @@ namespace AMWD.Common.Utilities
{
#region Data
private Timer timer;
private Timer _timer;
private bool nextRunPending;
private bool _nextRunPending;
/// <summary>
/// The synchronisation object.
@@ -130,13 +130,13 @@ namespace AMWD.Common.Utilities
tcs = CreateTcs();
}
IsWaitingToRun = true;
if (timer != null)
if (_timer != null)
{
timer.Change(Delay, Timeout.InfiniteTimeSpan);
_timer.Change(Delay, Timeout.InfiniteTimeSpan);
}
else
{
timer = new Timer(OnTimerCallback, null, Delay, Timeout.InfiniteTimeSpan);
_timer = new Timer(OnTimerCallback, null, Delay, Timeout.InfiniteTimeSpan);
}
}
}
@@ -152,9 +152,9 @@ namespace AMWD.Common.Utilities
lock (syncLock)
{
IsWaitingToRun = false;
nextRunPending = false;
timer?.Dispose();
timer = null;
_nextRunPending = false;
_timer?.Dispose();
_timer = null;
if (!IsRunning)
{
localTcs = tcs;
@@ -179,13 +179,13 @@ namespace AMWD.Common.Utilities
return false;
}
IsWaitingToRun = true;
if (timer != null)
if (_timer != null)
{
timer.Change(TimeSpan.Zero, Timeout.InfiniteTimeSpan);
_timer.Change(TimeSpan.Zero, Timeout.InfiniteTimeSpan);
}
else
{
timer = new Timer(OnTimerCallback, null, TimeSpan.Zero, Timeout.InfiniteTimeSpan);
_timer = new Timer(OnTimerCallback, null, TimeSpan.Zero, Timeout.InfiniteTimeSpan);
}
return true;
}
@@ -256,7 +256,7 @@ namespace AMWD.Common.Utilities
{
tcs = CreateTcs();
IsWaitingToRun = true;
timer = new Timer(OnTimerCallback, null, Delay, Timeout.InfiniteTimeSpan);
_timer = new Timer(OnTimerCallback, null, Delay, Timeout.InfiniteTimeSpan);
return this;
}
@@ -285,7 +285,7 @@ namespace AMWD.Common.Utilities
if (IsRunning)
{
// Currently running, remember and do nothing for now
nextRunPending = true;
_nextRunPending = true;
return;
}
IsRunning = true;
@@ -308,12 +308,12 @@ namespace AMWD.Common.Utilities
{
runAgain = false;
IsRunning = false;
nextRunPending = false;
_nextRunPending = false;
localTcs = tcs;
if (!IsWaitingToRun)
{
timer?.Dispose();
timer = null;
_timer?.Dispose();
_timer = null;
}
}
exceptionHandler?.Invoke(ex);
@@ -322,16 +322,16 @@ namespace AMWD.Common.Utilities
{
lock (syncLock)
{
runAgain = nextRunPending;
runAgain = _nextRunPending;
IsRunning = runAgain;
nextRunPending = false;
_nextRunPending = false;
if (!runAgain)
{
if (!IsWaitingToRun)
{
localTcs = tcs;
timer?.Dispose();
timer = null;
_timer?.Dispose();
_timer = null;
}
}
}
@@ -403,19 +403,19 @@ namespace AMWD.Common.Utilities
/// <typeparam name="TResult">The type of the result value.</typeparam>
protected class TaskCompletionSourceWrapper<TResult> : TaskCompletionSourceWrapper
{
private readonly TaskCompletionSource<TResult> tcs;
private readonly TaskCompletionSource<TResult> _tcs;
/// <summary>
/// Gets the <see cref="Task{TResult}"/> of the <see cref="TaskCompletionSource{TResult}"/>.
/// </summary>
public override Task Task => tcs.Task;
public override Task Task => _tcs.Task;
/// <summary>
/// Initializes a new instance of the <see cref="TaskCompletionSourceWrapper{TResult}"/> class.
/// </summary>
public TaskCompletionSourceWrapper()
{
tcs = new TaskCompletionSource<TResult>();
_tcs = new TaskCompletionSource<TResult>();
}
/// <summary>
@@ -424,13 +424,13 @@ namespace AMWD.Common.Utilities
/// </summary>
/// <param name="result">The result value to bind to this <see cref="Task{TResult}"/>.</param>
/// <seealso cref="TaskCompletionSource{TResult}.TrySetResult(TResult)"/>
public void TrySetResult(TResult result) => tcs.TrySetResult(result);
public void TrySetResult(TResult result) => _tcs.TrySetResult(result);
/// <inheritdoc/>
public override void TrySetException(Exception exception) => tcs.TrySetException(exception);
public override void TrySetException(Exception exception) => _tcs.TrySetException(exception);
/// <inheritdoc/>
public override void TrySetCanceled() => tcs.TrySetCanceled();
public override void TrySetCanceled() => _tcs.TrySetCanceled();
}
#endregion Internal TaskCompletionSourceWrapper classes

View File

@@ -150,7 +150,7 @@ namespace AMWD.Common.Utilities
if (addressFamily != AddressFamily.Unspecified && ipAddress.AddressFamily != addressFamily)
return null;
return ipAddress;
return ipAddress.IsIPv4MappedToIPv6 ? ipAddress.MapToIPv4() : ipAddress;
}
return null;

View File

@@ -4,6 +4,7 @@
<AppendTargetFrameworkToOutputPath>true</AppendTargetFrameworkToOutputPath>
<CopyRefAssembliesToPublishDirectory>false</CopyRefAssembliesToPublishDirectory>
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<IncludeSymbols>true</IncludeSymbols>
@@ -33,7 +34,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="AMWD.NetRevisionTask" Version="1.0.0">
<PackageReference Include="AMWD.NetRevisionTask" Version="1.1.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

View File

@@ -22,28 +22,28 @@ namespace UnitTests.AspNetCore.Attributes
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class BasicAuthenticationAttributeTests
{
private Mock<IHeaderDictionary> requestHeaderMock;
private Mock<IHeaderDictionary> responseHeaderMock;
private Mock<IHeaderDictionary> _requestHeaderMock;
private Mock<IHeaderDictionary> _responseHeaderMock;
private Mock<HttpRequest> requestMock;
private Mock<HttpResponse> responseMock;
private Mock<HttpRequest> _requestMock;
private Mock<HttpResponse> _responseMock;
private Mock<HttpContext> contextMock;
private Mock<HttpContext> _contextMock;
private Dictionary<string, string> requestHeaders;
private string validatorRealm;
private ClaimsPrincipal validatorResult;
private Dictionary<string, string> _requestHeaders;
private string _validatorRealm;
private ClaimsPrincipal _validatorResult;
private string responseHeaderAuthCallback;
private string _responseHeaderAuthCallback;
[TestInitialize]
public void InitializeTest()
{
requestHeaders = new Dictionary<string, string>();
validatorRealm = null;
validatorResult = null;
_requestHeaders = [];
_validatorRealm = null;
_validatorResult = null;
responseHeaderAuthCallback = null;
_responseHeaderAuthCallback = null;
}
[TestMethod]
@@ -55,7 +55,7 @@ namespace UnitTests.AspNetCore.Attributes
Username = "user",
Password = "password"
};
requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{attribute.Username}:{attribute.Password}"))}");
_requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{attribute.Username}:{attribute.Password}"))}");
var context = GetContext();
@@ -64,7 +64,7 @@ namespace UnitTests.AspNetCore.Attributes
// assert
Assert.IsNull(context.Result);
Assert.IsTrue(string.IsNullOrWhiteSpace(responseHeaderAuthCallback));
Assert.IsTrue(string.IsNullOrWhiteSpace(_responseHeaderAuthCallback));
}
[TestMethod]
@@ -72,8 +72,8 @@ namespace UnitTests.AspNetCore.Attributes
{
// arrange
var attribute = new BasicAuthenticationAttribute();
requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{attribute.Username}:{attribute.Password}"))}");
validatorResult = new ClaimsPrincipal();
_requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{attribute.Username}:{attribute.Password}"))}");
_validatorResult = new ClaimsPrincipal();
var context = GetContext(hasValidator: true);
@@ -82,7 +82,7 @@ namespace UnitTests.AspNetCore.Attributes
// assert
Assert.IsNull(context.Result);
Assert.IsTrue(string.IsNullOrWhiteSpace(responseHeaderAuthCallback));
Assert.IsTrue(string.IsNullOrWhiteSpace(_responseHeaderAuthCallback));
}
[TestMethod]
@@ -101,7 +101,7 @@ namespace UnitTests.AspNetCore.Attributes
// assert
Assert.IsNull(context.Result);
Assert.IsTrue(string.IsNullOrWhiteSpace(responseHeaderAuthCallback));
Assert.IsTrue(string.IsNullOrWhiteSpace(_responseHeaderAuthCallback));
}
[TestMethod]
@@ -123,8 +123,8 @@ namespace UnitTests.AspNetCore.Attributes
Assert.IsTrue(context.Result is StatusCodeResult);
Assert.AreEqual(401, ((StatusCodeResult)context.Result).StatusCode);
Assert.IsFalse(string.IsNullOrWhiteSpace(responseHeaderAuthCallback));
Assert.AreEqual("Basic", responseHeaderAuthCallback);
Assert.IsFalse(string.IsNullOrWhiteSpace(_responseHeaderAuthCallback));
Assert.AreEqual("Basic", _responseHeaderAuthCallback);
}
[TestMethod]
@@ -147,8 +147,8 @@ namespace UnitTests.AspNetCore.Attributes
Assert.IsTrue(context.Result is StatusCodeResult);
Assert.AreEqual(401, ((StatusCodeResult)context.Result).StatusCode);
Assert.IsFalse(string.IsNullOrWhiteSpace(responseHeaderAuthCallback));
Assert.AreEqual("Basic realm=\"re:alm\"", responseHeaderAuthCallback);
Assert.IsFalse(string.IsNullOrWhiteSpace(_responseHeaderAuthCallback));
Assert.AreEqual("Basic realm=\"re:alm\"", _responseHeaderAuthCallback);
}
[TestMethod]
@@ -160,7 +160,7 @@ namespace UnitTests.AspNetCore.Attributes
Username = "user",
Password = "password"
};
requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{attribute.Username}a:{attribute.Password}"))}");
_requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{attribute.Username}a:{attribute.Password}"))}");
var context = GetContext();
// act
@@ -171,8 +171,8 @@ namespace UnitTests.AspNetCore.Attributes
Assert.IsTrue(context.Result is StatusCodeResult);
Assert.AreEqual(401, ((StatusCodeResult)context.Result).StatusCode);
Assert.IsFalse(string.IsNullOrWhiteSpace(responseHeaderAuthCallback));
Assert.AreEqual("Basic", responseHeaderAuthCallback);
Assert.IsFalse(string.IsNullOrWhiteSpace(_responseHeaderAuthCallback));
Assert.AreEqual("Basic", _responseHeaderAuthCallback);
}
[TestMethod]
@@ -184,7 +184,7 @@ namespace UnitTests.AspNetCore.Attributes
Username = "user",
Password = "password"
};
requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{attribute.Username}:{attribute.Password}a"))}");
_requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{attribute.Username}:{attribute.Password}a"))}");
var context = GetContext();
// act
@@ -195,8 +195,8 @@ namespace UnitTests.AspNetCore.Attributes
Assert.IsTrue(context.Result is StatusCodeResult);
Assert.AreEqual(401, ((StatusCodeResult)context.Result).StatusCode);
Assert.IsFalse(string.IsNullOrWhiteSpace(responseHeaderAuthCallback));
Assert.AreEqual("Basic", responseHeaderAuthCallback);
Assert.IsFalse(string.IsNullOrWhiteSpace(_responseHeaderAuthCallback));
Assert.AreEqual("Basic", _responseHeaderAuthCallback);
}
[TestMethod]
@@ -207,7 +207,7 @@ namespace UnitTests.AspNetCore.Attributes
{
Realm = "attribute"
};
requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{attribute.Username}:{attribute.Password}"))}");
_requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{attribute.Username}:{attribute.Password}"))}");
var context = GetContext(hasValidator: true);
// act
@@ -218,17 +218,17 @@ namespace UnitTests.AspNetCore.Attributes
Assert.IsTrue(context.Result is StatusCodeResult);
Assert.AreEqual(401, ((StatusCodeResult)context.Result).StatusCode);
Assert.IsFalse(string.IsNullOrWhiteSpace(responseHeaderAuthCallback));
Assert.AreEqual("Basic realm=\"attribute\"", responseHeaderAuthCallback);
Assert.IsFalse(string.IsNullOrWhiteSpace(_responseHeaderAuthCallback));
Assert.AreEqual("Basic realm=\"attribute\"", _responseHeaderAuthCallback);
}
[TestMethod]
public async Task ShouldAskOnValidatorWithRealmOnValidator()
{
// arrange
validatorRealm = "validator";
_validatorRealm = "validator";
var attribute = new BasicAuthenticationAttribute();
requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{attribute.Username}:{attribute.Password}"))}");
_requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{attribute.Username}:{attribute.Password}"))}");
var context = GetContext(hasValidator: true);
// act
@@ -239,8 +239,8 @@ namespace UnitTests.AspNetCore.Attributes
Assert.IsTrue(context.Result is StatusCodeResult);
Assert.AreEqual(401, ((StatusCodeResult)context.Result).StatusCode);
Assert.IsFalse(string.IsNullOrWhiteSpace(responseHeaderAuthCallback));
Assert.AreEqual("Basic realm=\"validator\"", responseHeaderAuthCallback);
Assert.IsFalse(string.IsNullOrWhiteSpace(_responseHeaderAuthCallback));
Assert.AreEqual("Basic realm=\"validator\"", _responseHeaderAuthCallback);
}
[TestMethod]
@@ -248,7 +248,7 @@ namespace UnitTests.AspNetCore.Attributes
{
// arrange
var attribute = new BasicAuthenticationAttribute();
requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{attribute.Username}"))}");
_requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{attribute.Username}"))}");
var context = GetContext();
// act
@@ -262,34 +262,38 @@ namespace UnitTests.AspNetCore.Attributes
private AuthorizationFilterContext GetContext(bool isAnonymousAllowed = false, bool hasValidator = false)
{
requestHeaderMock = new Mock<IHeaderDictionary>();
foreach (var header in requestHeaders)
_requestHeaderMock = new Mock<IHeaderDictionary>();
foreach (var header in _requestHeaders)
{
requestHeaderMock
StringValues outVal = header.Value;
_requestHeaderMock
.Setup(h => h.ContainsKey(header.Key))
.Returns(true);
requestHeaderMock
_requestHeaderMock
.Setup(h => h[header.Key])
.Returns(header.Value);
_requestHeaderMock
.Setup(h => h.TryGetValue(header.Key, out outVal))
.Returns(true);
}
responseHeaderMock = new Mock<IHeaderDictionary>();
responseHeaderMock
.SetupSet(h => h["WWW-Authenticate"] = It.IsAny<StringValues>())
.Callback<string, StringValues>((key, value) =>
_responseHeaderMock = new Mock<IHeaderDictionary>();
_responseHeaderMock
.SetupSet(h => h.WWWAuthenticate = It.IsAny<StringValues>())
.Callback<StringValues>((value) =>
{
responseHeaderAuthCallback = value;
_responseHeaderAuthCallback = value;
});
requestMock = new Mock<HttpRequest>();
requestMock
_requestMock = new Mock<HttpRequest>();
_requestMock
.Setup(r => r.Headers)
.Returns(requestHeaderMock.Object);
.Returns(_requestHeaderMock.Object);
responseMock = new Mock<HttpResponse>();
responseMock
_responseMock = new Mock<HttpResponse>();
_responseMock
.Setup(r => r.Headers)
.Returns(responseHeaderMock.Object);
.Returns(_responseHeaderMock.Object);
var requestServicesMock = new Mock<IServiceProvider>();
@@ -298,10 +302,10 @@ namespace UnitTests.AspNetCore.Attributes
var validatorMock = new Mock<IBasicAuthenticationValidator>();
validatorMock
.Setup(v => v.Realm)
.Returns(validatorRealm);
.Returns(_validatorRealm);
validatorMock
.Setup(v => v.ValidateAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<IPAddress>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(validatorResult);
.ReturnsAsync(_validatorResult);
requestServicesMock
.Setup(rs => rs.GetService(typeof(IBasicAuthenticationValidator)))
@@ -313,20 +317,20 @@ namespace UnitTests.AspNetCore.Attributes
.Setup(ci => ci.RemoteIpAddress)
.Returns(IPAddress.Loopback);
contextMock = new Mock<HttpContext>();
contextMock
_contextMock = new Mock<HttpContext>();
_contextMock
.Setup(c => c.Request)
.Returns(requestMock.Object);
contextMock
.Returns(_requestMock.Object);
_contextMock
.Setup(c => c.Response)
.Returns(responseMock.Object);
contextMock
.Returns(_responseMock.Object);
_contextMock
.Setup(c => c.RequestServices)
.Returns(requestServicesMock.Object);
contextMock
_contextMock
.Setup(c => c.Connection)
.Returns(connectionInfoMock.Object);
contextMock
_contextMock
.Setup(c => c.RequestAborted)
.Returns(CancellationToken.None);
@@ -341,7 +345,7 @@ namespace UnitTests.AspNetCore.Attributes
return new AuthorizationFilterContext(new ActionContext
{
HttpContext = contextMock.Object,
HttpContext = _contextMock.Object,
RouteData = routeDataMock.Object,
ActionDescriptor = actionDescriptor,
}, new List<IFilterMetadata>());

View File

@@ -16,20 +16,20 @@ namespace UnitTests.AspNetCore.Attributes
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class IPAllowListAttributeTests
{
private Dictionary<string, string> requestHeaders;
private Dictionary<object, object> itemsCallback;
private string configKey;
private bool configExists;
private List<string> allowedIpsConfig;
private Dictionary<string, string> _requestHeaders;
private Dictionary<object, object> _itemsCallback;
private string _configKey;
private bool _configExists;
private List<string> _allowedIpsConfig;
[TestInitialize]
public void InitializeTest()
{
requestHeaders = new Dictionary<string, string>();
itemsCallback = new Dictionary<object, object>();
configKey = null;
configExists = false;
allowedIpsConfig = new List<string>();
_requestHeaders = [];
_itemsCallback = [];
_configKey = null;
_configExists = false;
_allowedIpsConfig = [];
}
[TestMethod]
@@ -48,8 +48,8 @@ namespace UnitTests.AspNetCore.Attributes
Assert.IsTrue(context.Result is StatusCodeResult);
Assert.AreEqual(403, ((StatusCodeResult)context.Result).StatusCode);
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(remote, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(remote, _itemsCallback["RemoteAddress"]);
}
[TestMethod]
@@ -71,8 +71,8 @@ namespace UnitTests.AspNetCore.Attributes
Assert.IsTrue(context.Result is StatusCodeResult);
Assert.AreEqual(403, ((StatusCodeResult)context.Result).StatusCode);
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(remote, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(remote, _itemsCallback["RemoteAddress"]);
}
[TestMethod]
@@ -87,8 +87,8 @@ namespace UnitTests.AspNetCore.Attributes
// assert
Assert.IsNull(context.Result);
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, _itemsCallback["RemoteAddress"]);
}
[TestMethod]
@@ -109,8 +109,8 @@ namespace UnitTests.AspNetCore.Attributes
Assert.IsTrue(context.Result is StatusCodeResult);
Assert.AreEqual(403, ((StatusCodeResult)context.Result).StatusCode);
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, _itemsCallback["RemoteAddress"]);
}
[DataTestMethod]
@@ -142,22 +142,22 @@ namespace UnitTests.AspNetCore.Attributes
Assert.AreEqual(403, ((StatusCodeResult)context.Result).StatusCode);
}
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(remote, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(remote, _itemsCallback["RemoteAddress"]);
}
[TestMethod]
public void ShouldAllowLocalAccessConfig()
{
// arrange
configKey = "White:List";
configExists = true;
allowedIpsConfig.Add("127.0.0.0/8");
allowedIpsConfig.Add("192.168.178.10");
_configKey = "White:List";
_configExists = true;
_allowedIpsConfig.Add("127.0.0.0/8");
_allowedIpsConfig.Add("192.168.178.10");
var attribute = new IPAllowListAttribute
{
AllowLocalAccess = true,
ConfigurationKey = configKey
ConfigurationKey = _configKey
};
var context = GetContext();
@@ -166,22 +166,22 @@ namespace UnitTests.AspNetCore.Attributes
// assert
Assert.IsNull(context.Result);
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, _itemsCallback["RemoteAddress"]);
}
[TestMethod]
public void ShouldDenyLocalAccessConfig()
{
// arrange
configKey = "White:List";
configExists = true;
allowedIpsConfig.Add("");
allowedIpsConfig.Add("192.168.178.10");
_configKey = "White:List";
_configExists = true;
_allowedIpsConfig.Add("");
_allowedIpsConfig.Add("192.168.178.10");
var attribute = new IPAllowListAttribute
{
AllowLocalAccess = false,
ConfigurationKey = configKey
ConfigurationKey = _configKey
};
var context = GetContext();
@@ -193,8 +193,8 @@ namespace UnitTests.AspNetCore.Attributes
Assert.IsTrue(context.Result is StatusCodeResult);
Assert.AreEqual(403, ((StatusCodeResult)context.Result).StatusCode);
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, _itemsCallback["RemoteAddress"]);
}
[DataTestMethod]
@@ -203,13 +203,13 @@ namespace UnitTests.AspNetCore.Attributes
public void ShouldAllowSpecificAddressConfig(string address)
{
// arrange
configKey = "White:List";
configExists = true;
allowedIpsConfig.Add("192.168.178.10");
_configKey = "White:List";
_configExists = true;
_allowedIpsConfig.Add("192.168.178.10");
var attribute = new IPAllowListAttribute
{
AllowLocalAccess = false,
ConfigurationKey = configKey
ConfigurationKey = _configKey
};
var remote = IPAddress.Parse(address);
var context = GetContext(remote);
@@ -229,20 +229,20 @@ namespace UnitTests.AspNetCore.Attributes
Assert.AreEqual(403, ((StatusCodeResult)context.Result).StatusCode);
}
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(remote, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(remote, _itemsCallback["RemoteAddress"]);
}
[TestMethod]
public void ShouldDenyOnMissingConfiguration()
{
// arrange
configKey = "White:List";
configExists = false;
_configKey = "White:List";
_configExists = false;
var attribute = new IPAllowListAttribute
{
AllowLocalAccess = false,
ConfigurationKey = configKey
ConfigurationKey = _configKey
};
var context = GetContext();
@@ -254,14 +254,14 @@ namespace UnitTests.AspNetCore.Attributes
Assert.IsTrue(context.Result is StatusCodeResult);
Assert.AreEqual(403, ((StatusCodeResult)context.Result).StatusCode);
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, _itemsCallback["RemoteAddress"]);
}
private ActionExecutingContext GetContext(IPAddress remote = null)
{
var requestHeaderMock = new Mock<IHeaderDictionary>();
foreach (var header in requestHeaders)
foreach (var header in _requestHeaders)
{
requestHeaderMock
.Setup(h => h.ContainsKey(header.Key))
@@ -287,11 +287,11 @@ namespace UnitTests.AspNetCore.Attributes
var itemsMock = new Mock<IDictionary<object, object>>();
itemsMock
.SetupSet(i => i[It.IsAny<object>()] = It.IsAny<object>())
.Callback<object, object>((key, val) => itemsCallback.Add(key, val));
.Callback<object, object>((key, val) => _itemsCallback.Add(key, val));
var configurationMock = new Mock<IConfiguration>();
var children = new List<IConfigurationSection>();
foreach (string ipAddress in allowedIpsConfig)
foreach (string ipAddress in _allowedIpsConfig)
{
var csm = new Mock<IConfigurationSection>();
csm.Setup(cs => cs.Value).Returns(ipAddress);
@@ -305,8 +305,8 @@ namespace UnitTests.AspNetCore.Attributes
.Returns(children);
configurationMock
.Setup(c => c.GetSection(configKey))
.Returns(configExists ? configSectionMock.Object : null);
.Setup(c => c.GetSection(_configKey))
.Returns(_configExists ? configSectionMock.Object : null);
var requestServicesMock = new Mock<IServiceProvider>();
requestServicesMock

View File

@@ -16,20 +16,20 @@ namespace UnitTests.AspNetCore.Attributes
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class IPBlockListAttributeTests
{
private Dictionary<string, string> requestHeaders;
private Dictionary<object, object> itemsCallback;
private string configKey;
private bool configExists;
private List<string> restrictedIpsConfig;
private Dictionary<string, string> _requestHeaders;
private Dictionary<object, object> _itemsCallback;
private string _configKey;
private bool _configExists;
private List<string> _restrictedIpsConfig;
[TestInitialize]
public void InitializeTest()
{
requestHeaders = new Dictionary<string, string>();
itemsCallback = new Dictionary<object, object>();
configKey = null;
configExists = false;
restrictedIpsConfig = new List<string>();
_requestHeaders = [];
_itemsCallback = [];
_configKey = null;
_configExists = false;
_restrictedIpsConfig = [];
}
[TestMethod]
@@ -45,8 +45,8 @@ namespace UnitTests.AspNetCore.Attributes
// assert
Assert.IsNull(context.Result);
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(remote, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(remote, _itemsCallback["RemoteAddress"]);
}
[TestMethod]
@@ -65,8 +65,8 @@ namespace UnitTests.AspNetCore.Attributes
// assert
Assert.IsNull(context.Result);
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(remote, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(remote, _itemsCallback["RemoteAddress"]);
}
[TestMethod]
@@ -85,8 +85,8 @@ namespace UnitTests.AspNetCore.Attributes
// assert
Assert.IsNull(context.Result);
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, _itemsCallback["RemoteAddress"]);
}
[TestMethod]
@@ -108,8 +108,8 @@ namespace UnitTests.AspNetCore.Attributes
Assert.IsTrue(context.Result is StatusCodeResult);
Assert.AreEqual(403, ((StatusCodeResult)context.Result).StatusCode);
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, _itemsCallback["RemoteAddress"]);
}
[DataTestMethod]
@@ -141,22 +141,22 @@ namespace UnitTests.AspNetCore.Attributes
Assert.IsNull(context.Result);
}
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(remote, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(remote, _itemsCallback["RemoteAddress"]);
}
[TestMethod]
public void ShouldAllowLocalAccessConfig()
{
// arrange
configKey = "Black:List";
configExists = true;
restrictedIpsConfig.Add("127.0.0.0/8");
restrictedIpsConfig.Add("192.168.178.10");
_configKey = "Black:List";
_configExists = true;
_restrictedIpsConfig.Add("127.0.0.0/8");
_restrictedIpsConfig.Add("192.168.178.10");
var attribute = new IPBlockListAttribute
{
BlockLocalAccess = false,
ConfigurationKey = configKey
ConfigurationKey = _configKey
};
var context = GetContext();
@@ -165,23 +165,23 @@ namespace UnitTests.AspNetCore.Attributes
// assert
Assert.IsNull(context.Result);
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, _itemsCallback["RemoteAddress"]);
}
[TestMethod]
public void ShouldBlockLocalAccessConfig()
{
// arrange
configKey = "Black:List";
configExists = true;
restrictedIpsConfig.Add("");
restrictedIpsConfig.Add("127.0.0.0/8");
restrictedIpsConfig.Add("192.168.178.10");
_configKey = "Black:List";
_configExists = true;
_restrictedIpsConfig.Add("");
_restrictedIpsConfig.Add("127.0.0.0/8");
_restrictedIpsConfig.Add("192.168.178.10");
var attribute = new IPBlockListAttribute
{
BlockLocalAccess = true,
ConfigurationKey = configKey
ConfigurationKey = _configKey
};
var context = GetContext();
@@ -193,8 +193,8 @@ namespace UnitTests.AspNetCore.Attributes
Assert.IsTrue(context.Result is StatusCodeResult);
Assert.AreEqual(403, ((StatusCodeResult)context.Result).StatusCode);
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, _itemsCallback["RemoteAddress"]);
}
[DataTestMethod]
@@ -203,14 +203,14 @@ namespace UnitTests.AspNetCore.Attributes
public void ShouldBlockSpecificAddressConfig(string address)
{
// arrange
configKey = "Black:List";
configExists = true;
restrictedIpsConfig.Add("127.0.0.0/8");
restrictedIpsConfig.Add("192.168.178.10");
_configKey = "Black:List";
_configExists = true;
_restrictedIpsConfig.Add("127.0.0.0/8");
_restrictedIpsConfig.Add("192.168.178.10");
var attribute = new IPBlockListAttribute
{
BlockLocalAccess = true,
ConfigurationKey = configKey
ConfigurationKey = _configKey
};
var remote = IPAddress.Parse(address);
var context = GetContext(remote);
@@ -230,20 +230,20 @@ namespace UnitTests.AspNetCore.Attributes
Assert.IsNull(context.Result);
}
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(remote, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(remote, _itemsCallback["RemoteAddress"]);
}
[TestMethod]
public void ShouldAllowOnMissingConfiguration()
{
// arrange
configKey = "Black:List";
configExists = false;
_configKey = "Black:List";
_configExists = false;
var attribute = new IPBlockListAttribute
{
BlockLocalAccess = true,
ConfigurationKey = configKey
ConfigurationKey = _configKey
};
var context = GetContext();
@@ -253,14 +253,14 @@ namespace UnitTests.AspNetCore.Attributes
// assert
Assert.IsNull(context.Result);
Assert.AreEqual(1, itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, itemsCallback["RemoteAddress"]);
Assert.AreEqual(1, _itemsCallback.Count);
Assert.AreEqual(IPAddress.Loopback, _itemsCallback["RemoteAddress"]);
}
private ActionExecutingContext GetContext(IPAddress remote = null)
{
var requestHeaderMock = new Mock<IHeaderDictionary>();
foreach (var header in requestHeaders)
foreach (var header in _requestHeaders)
{
requestHeaderMock
.Setup(h => h.ContainsKey(header.Key))
@@ -286,11 +286,11 @@ namespace UnitTests.AspNetCore.Attributes
var itemsMock = new Mock<IDictionary<object, object>>();
itemsMock
.SetupSet(i => i[It.IsAny<object>()] = It.IsAny<object>())
.Callback<object, object>((key, val) => itemsCallback.Add(key, val));
.Callback<object, object>((key, val) => _itemsCallback.Add(key, val));
var configurationMock = new Mock<IConfiguration>();
var children = new List<IConfigurationSection>();
foreach (string ipAddress in restrictedIpsConfig)
foreach (string ipAddress in _restrictedIpsConfig)
{
var csm = new Mock<IConfigurationSection>();
csm.Setup(cs => cs.Value).Returns(ipAddress);
@@ -304,8 +304,8 @@ namespace UnitTests.AspNetCore.Attributes
.Returns(children);
configurationMock
.Setup(c => c.GetSection(configKey))
.Returns(configExists ? configSectionMock.Object : null);
.Setup(c => c.GetSection(_configKey))
.Returns(_configExists ? configSectionMock.Object : null);
var requestServicesMock = new Mock<IServiceProvider>();
requestServicesMock

View File

@@ -12,30 +12,30 @@ namespace UnitTests.AspNetCore.Extensions
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class HttpContextExtensionsTests
{
private Mock<ISession> sessionMock;
private Mock<ISession> _sessionMock;
private string tokenFormName;
private string tokenHeaderName;
private string tokenValue;
private string _tokenFormName;
private string _tokenHeaderName;
private string _tokenValue;
private Dictionary<string, string> requestHeaders;
private Dictionary<string, string> requestQueries;
private Dictionary<object, object> items;
private Dictionary<string, string> _requestHeaders;
private Dictionary<string, string> _requestQueries;
private Dictionary<object, object> _items;
private IPAddress remote;
private IPAddress _remote;
[TestInitialize]
public void InitializeTests()
{
tokenFormName = null;
tokenHeaderName = null;
tokenValue = null;
_tokenFormName = null;
_tokenHeaderName = null;
_tokenValue = null;
requestHeaders = new Dictionary<string, string>();
requestQueries = new Dictionary<string, string>();
items = new Dictionary<object, object>();
_requestHeaders = [];
_requestQueries = [];
_items = [];
remote = IPAddress.Loopback;
_remote = IPAddress.Loopback;
}
#region Antiforgery
@@ -44,9 +44,9 @@ namespace UnitTests.AspNetCore.Extensions
public void ShouldReturnAntiforgery()
{
// arrange
tokenFormName = "af-token";
tokenHeaderName = "af-header";
tokenValue = "security_first";
_tokenFormName = "af-token";
_tokenHeaderName = "af-header";
_tokenValue = "security_first";
var context = GetContext();
@@ -54,18 +54,18 @@ namespace UnitTests.AspNetCore.Extensions
var (formName, headerName, value) = context.GetAntiforgeryToken();
// assert
Assert.AreEqual(tokenFormName, formName);
Assert.AreEqual(tokenHeaderName, headerName);
Assert.AreEqual(tokenValue, value);
Assert.AreEqual(_tokenFormName, formName);
Assert.AreEqual(_tokenHeaderName, headerName);
Assert.AreEqual(_tokenValue, value);
}
[TestMethod]
public void ShouldReturnAntiforgeryNullService()
{
// arrange
tokenFormName = "af-token";
tokenHeaderName = "af-header";
tokenValue = "security_first";
_tokenFormName = "af-token";
_tokenHeaderName = "af-header";
_tokenValue = "security_first";
var context = GetContext(hasAntiforgery: false);
@@ -101,7 +101,7 @@ namespace UnitTests.AspNetCore.Extensions
public void ShouldReturnRemoteAddress()
{
// arrange
remote = IPAddress.Parse("1.2.3.4");
_remote = IPAddress.Parse("1.2.3.4");
var context = GetContext();
@@ -109,7 +109,7 @@ namespace UnitTests.AspNetCore.Extensions
var result = context.GetRemoteIpAddress();
// assert
Assert.AreEqual(remote, result);
Assert.AreEqual(_remote, result);
}
[DataTestMethod]
@@ -119,9 +119,9 @@ namespace UnitTests.AspNetCore.Extensions
public void ShouldReturnDefaultHeader(string headerName)
{
// arrange
remote = IPAddress.Parse("1.2.3.4");
_remote = IPAddress.Parse("1.2.3.4");
var header = IPAddress.Parse("5.6.7.8");
requestHeaders.Add(headerName, header.ToString());
_requestHeaders.Add(headerName, header.ToString());
var context = GetContext();
@@ -129,7 +129,7 @@ namespace UnitTests.AspNetCore.Extensions
var result = context.GetRemoteIpAddress();
// assert
Assert.AreNotEqual(remote, result);
Assert.AreNotEqual(_remote, result);
Assert.AreEqual(header, result);
}
@@ -137,12 +137,12 @@ namespace UnitTests.AspNetCore.Extensions
public void ShouldReturnCustomHeader()
{
// arrange
remote = IPAddress.Parse("1.2.3.4");
_remote = IPAddress.Parse("1.2.3.4");
string headerName = "FooBar";
var headerIp = IPAddress.Parse("5.6.7.8");
requestHeaders.Add(headerName, headerIp.ToString());
requestHeaders.Add("X-Forwarded-For", remote.ToString());
_requestHeaders.Add(headerName, headerIp.ToString());
_requestHeaders.Add("X-Forwarded-For", _remote.ToString());
var context = GetContext();
@@ -150,7 +150,7 @@ namespace UnitTests.AspNetCore.Extensions
var result = context.GetRemoteIpAddress(ipHeaderName: headerName);
// assert
Assert.AreNotEqual(remote, result);
Assert.AreNotEqual(_remote, result);
Assert.AreEqual(headerIp, result);
}
@@ -158,8 +158,8 @@ namespace UnitTests.AspNetCore.Extensions
public void ShouldReturnAddressInvalidHeader()
{
// arrange
remote = IPAddress.Parse("1.2.3.4");
requestHeaders.Add("X-Forwarded-For", "1.2.3:4");
_remote = IPAddress.Parse("1.2.3.4");
_requestHeaders.Add("X-Forwarded-For", "1.2.3:4");
var context = GetContext();
@@ -167,16 +167,16 @@ namespace UnitTests.AspNetCore.Extensions
var result = context.GetRemoteIpAddress();
// assert
Assert.AreEqual(remote, result);
Assert.AreEqual(_remote, result);
}
[TestMethod]
public void ShouldReturnFirstAddressOnMultipleProxies()
{
// arrange
remote = IPAddress.Parse("1.2.3.4");
_remote = IPAddress.Parse("1.2.3.4");
var header = IPAddress.Parse("5.6.7.8");
requestHeaders.Add("X-Forwarded-For", $"{header}, 111.222.111.222");
_requestHeaders.Add("X-Forwarded-For", $"{header}, 111.222.111.222");
var context = GetContext();
@@ -184,7 +184,7 @@ namespace UnitTests.AspNetCore.Extensions
var result = context.GetRemoteIpAddress();
// assert
Assert.AreNotEqual(remote, result);
Assert.AreNotEqual(_remote, result);
Assert.AreEqual(header, result);
}
@@ -192,9 +192,9 @@ namespace UnitTests.AspNetCore.Extensions
public void ShouldReturnV4AddressOnMapped()
{
// arrange
remote = IPAddress.Parse("1.2.3.4");
_remote = IPAddress.Parse("1.2.3.4");
var header = IPAddress.Parse("::ffff:127.0.0.1");
requestHeaders.Add("X-Forwarded-For", "::ffff:127.0.0.1");
_requestHeaders.Add("X-Forwarded-For", "::ffff:127.0.0.1");
var context = GetContext();
@@ -202,7 +202,7 @@ namespace UnitTests.AspNetCore.Extensions
var result = context.GetRemoteIpAddress();
// assert
Assert.AreNotEqual(remote, result);
Assert.AreNotEqual(_remote, result);
Assert.AreNotEqual(header, result);
Assert.AreEqual(header.MapToIPv4(), result);
}
@@ -215,7 +215,7 @@ namespace UnitTests.AspNetCore.Extensions
public void ShouldReturnTrueOnLocal()
{
// arrange
remote = IPAddress.Loopback;
_remote = IPAddress.Loopback;
var context = GetContext();
@@ -230,7 +230,7 @@ namespace UnitTests.AspNetCore.Extensions
public void ShouldReturnFalseOnRemote()
{
// arrange
remote = IPAddress.Parse("1.2.3.4");
_remote = IPAddress.Parse("1.2.3.4");
var context = GetContext();
@@ -245,9 +245,9 @@ namespace UnitTests.AspNetCore.Extensions
public void ShouldReturnTrueOnDefaultHeader()
{
// arrange
remote = IPAddress.Parse("1.2.3.4");
_remote = IPAddress.Parse("1.2.3.4");
var headerIp = IPAddress.Loopback;
requestHeaders.Add("X-Forwarded-For", headerIp.ToString());
_requestHeaders.Add("X-Forwarded-For", headerIp.ToString());
var context = GetContext();
@@ -262,10 +262,10 @@ namespace UnitTests.AspNetCore.Extensions
public void ShouldReturnTrueOnCustomHeader()
{
// arrange
remote = IPAddress.Parse("1.2.3.4");
_remote = IPAddress.Parse("1.2.3.4");
string headerName = "FooBar";
var headerIp = IPAddress.Loopback;
requestHeaders.Add(headerName, headerIp.ToString());
_requestHeaders.Add(headerName, headerIp.ToString());
var context = GetContext();
@@ -281,7 +281,7 @@ namespace UnitTests.AspNetCore.Extensions
{
// arrange
var headerIp = IPAddress.Parse("1.2.3.4");
requestHeaders.Add("X-Forwarded-For", headerIp.ToString());
_requestHeaders.Add("X-Forwarded-For", headerIp.ToString());
var context = GetContext();
@@ -298,7 +298,7 @@ namespace UnitTests.AspNetCore.Extensions
// arrange
string headerName = "FooBar";
var headerIp = IPAddress.Parse("1.2.3.4");
requestHeaders.Add(headerName, headerIp.ToString());
_requestHeaders.Add(headerName, headerIp.ToString());
var context = GetContext();
@@ -333,8 +333,8 @@ namespace UnitTests.AspNetCore.Extensions
string request = "abc";
string query = "def";
items.Add("OriginalRequest", request);
requestQueries.Add("ReturnUrl", query);
_items.Add("OriginalRequest", request);
_requestQueries.Add("ReturnUrl", query);
var context = GetContext();
@@ -351,7 +351,7 @@ namespace UnitTests.AspNetCore.Extensions
{
// arrange
string query = "def";
requestQueries.Add("ReturnUrl", query);
_requestQueries.Add("ReturnUrl", query);
var context = GetContext();
@@ -376,7 +376,7 @@ namespace UnitTests.AspNetCore.Extensions
context.ClearSession();
// assert
sessionMock.Verify(s => s.Clear(), Times.Once);
_sessionMock.Verify(s => s.Clear(), Times.Once);
}
[TestMethod]
@@ -389,7 +389,7 @@ namespace UnitTests.AspNetCore.Extensions
context.ClearSession();
// assert
sessionMock.Verify(s => s.Clear(), Times.Never);
_sessionMock.Verify(s => s.Clear(), Times.Never);
}
#endregion Session
@@ -398,7 +398,7 @@ namespace UnitTests.AspNetCore.Extensions
{
// Request
var requestHeaderMock = new Mock<IHeaderDictionary>();
foreach (var header in requestHeaders)
foreach (var header in _requestHeaders)
{
requestHeaderMock
.Setup(h => h.ContainsKey(header.Key))
@@ -409,7 +409,7 @@ namespace UnitTests.AspNetCore.Extensions
}
var requestQueryMock = new Mock<IQueryCollection>();
foreach (var query in requestQueries)
foreach (var query in _requestQueries)
{
requestQueryMock
.Setup(h => h.ContainsKey(query.Key))
@@ -434,7 +434,7 @@ namespace UnitTests.AspNetCore.Extensions
var antiforgeryMock = new Mock<IAntiforgery>();
antiforgeryMock
.Setup(af => af.GetAndStoreTokens(It.IsAny<HttpContext>()))
.Returns(() => string.IsNullOrWhiteSpace(tokenValue) ? null : new AntiforgeryTokenSet(tokenValue, tokenValue, tokenFormName, tokenHeaderName));
.Returns(() => string.IsNullOrWhiteSpace(_tokenValue) ? null : new AntiforgeryTokenSet(_tokenValue, _tokenValue, _tokenFormName, _tokenHeaderName));
requestServicesMock
.Setup(rs => rs.GetService(typeof(IAntiforgery)))
@@ -448,10 +448,10 @@ namespace UnitTests.AspNetCore.Extensions
.Returns(IPAddress.Loopback);
connectionInfoMock
.Setup(ci => ci.RemoteIpAddress)
.Returns(remote);
.Returns(_remote);
// Session
sessionMock = new Mock<ISession>();
_sessionMock = new Mock<ISession>();
var contextMock = new Mock<HttpContext>();
contextMock
@@ -465,12 +465,12 @@ namespace UnitTests.AspNetCore.Extensions
.Returns(connectionInfoMock.Object);
contextMock
.Setup(c => c.Items)
.Returns(items);
.Returns(_items);
if (hasSession)
{
contextMock
.Setup(c => c.Session)
.Returns(sessionMock.Object);
.Returns(_sessionMock.Object);
}
return contextMock.Object;

View File

@@ -9,12 +9,12 @@ namespace UnitTests.AspNetCore.Extensions
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class ModelStateDictionaryExtensionsTests
{
private TestModel testModel;
private TestModel _testModel;
[TestInitialize]
public void InitializeTests()
{
testModel = new TestModel
_testModel = new TestModel
{
ValueA = "A",
ValueB = "B",
@@ -33,7 +33,7 @@ namespace UnitTests.AspNetCore.Extensions
var modelState = new ModelStateDictionary();
// act
modelState.AddModelError(testModel, m => m.ValueA, "ShitHappens");
modelState.AddModelError(_testModel, m => m.ValueA, "ShitHappens");
// assert
Assert.AreEqual(1, modelState.Count);
@@ -48,7 +48,7 @@ namespace UnitTests.AspNetCore.Extensions
var modelState = new ModelStateDictionary();
// act
modelState.AddModelError(testModel, m => m.SubModel.SubValueB, "ShitHappens");
modelState.AddModelError(_testModel, m => m.SubModel.SubValueB, "ShitHappens");
// assert
Assert.AreEqual(1, modelState.Count);
@@ -64,7 +64,7 @@ namespace UnitTests.AspNetCore.Extensions
ModelStateDictionary modelState = null;
// act
modelState.AddModelError(testModel, m => m.SubModel.SubValueB, "ShitHappens");
modelState.AddModelError(_testModel, m => m.SubModel.SubValueB, "ShitHappens");
}
[TestMethod]
@@ -75,7 +75,7 @@ namespace UnitTests.AspNetCore.Extensions
var modelState = new ModelStateDictionary();
// act
modelState.AddModelError(testModel, m => m, "ShitHappens");
modelState.AddModelError(_testModel, m => m, "ShitHappens");
}
internal class TestModel

View File

@@ -10,12 +10,12 @@ namespace UnitTests.AspNetCore.Extensions
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class SessionExtensionsTests
{
private Mock<ISession> sessionMock;
private Mock<ISession> _sessionMock;
private string sessionKey;
private byte[] sessionValue;
private string _sessionKey;
private byte[] _sessionValue;
private TestModel model;
private TestModel _model;
internal class TestModel
{
@@ -27,10 +27,10 @@ namespace UnitTests.AspNetCore.Extensions
[TestInitialize]
public void InitializeTests()
{
sessionKey = null;
sessionValue = null;
_sessionKey = null;
_sessionValue = null;
model = new TestModel
_model = new TestModel
{
ValueA = "A",
ValueB = "B"
@@ -41,7 +41,7 @@ namespace UnitTests.AspNetCore.Extensions
public void ShouldCheckKeyExists()
{
// arrange
sessionKey = "exists";
_sessionKey = "exists";
var session = GetSession();
// act
@@ -57,25 +57,25 @@ namespace UnitTests.AspNetCore.Extensions
public void ShouldGetValue()
{
// arrange
sessionKey = "test";
sessionValue = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(model));
_sessionKey = "test";
_sessionValue = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(_model));
var session = GetSession();
// act
var result = session.GetValue<TestModel>(sessionKey);
var result = session.GetValue<TestModel>(_sessionKey);
// assert
Assert.IsNotNull(result);
Assert.AreEqual(model.ValueA, result.ValueA);
Assert.AreEqual(model.ValueB, result.ValueB);
Assert.AreEqual(_model.ValueA, result.ValueA);
Assert.AreEqual(_model.ValueB, result.ValueB);
}
[TestMethod]
public void ShouldGetNull()
{
// arrange
sessionKey = "foo";
sessionValue = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(model));
_sessionKey = "foo";
_sessionValue = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(_model));
var session = GetSession();
// act
@@ -89,25 +89,25 @@ namespace UnitTests.AspNetCore.Extensions
public void ShouldGetValueWithFallback()
{
// arrange
sessionKey = "test";
sessionValue = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(model));
_sessionKey = "test";
_sessionValue = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(_model));
var session = GetSession();
// act
var result = session.GetValue(sessionKey, new TestModel());
var result = session.GetValue(_sessionKey, new TestModel());
// assert
Assert.IsNotNull(result);
Assert.AreEqual(model.ValueA, result.ValueA);
Assert.AreEqual(model.ValueB, result.ValueB);
Assert.AreEqual(_model.ValueA, result.ValueA);
Assert.AreEqual(_model.ValueB, result.ValueB);
}
[TestMethod]
public void ShouldGetFallback()
{
// arrange
sessionKey = "foo";
sessionValue = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(model));
_sessionKey = "foo";
_sessionValue = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(_model));
var session = GetSession();
// act
@@ -127,33 +127,33 @@ namespace UnitTests.AspNetCore.Extensions
var session = GetSession();
// act
session.SetValue(key, model);
session.SetValue(key, _model);
// arrange
Assert.AreEqual(key, sessionKey);
Assert.AreEqual(JsonConvert.SerializeObject(model), Encoding.UTF8.GetString(sessionValue));
Assert.AreEqual(key, _sessionKey);
Assert.AreEqual(JsonConvert.SerializeObject(_model), Encoding.UTF8.GetString(_sessionValue));
}
private ISession GetSession()
{
string[] keys = new[] { sessionKey };
string[] keys = [_sessionKey];
sessionMock = new Mock<ISession>();
sessionMock
.Setup(s => s.TryGetValue(It.IsAny<string>(), out sessionValue))
.Returns<string, byte[]>((key, value) => sessionKey == key);
sessionMock
_sessionMock = new Mock<ISession>();
_sessionMock
.Setup(s => s.TryGetValue(It.IsAny<string>(), out _sessionValue))
.Returns<string, byte[]>((key, value) => _sessionKey == key);
_sessionMock
.Setup(s => s.Set(It.IsAny<string>(), It.IsAny<byte[]>()))
.Callback<string, byte[]>((key, value) =>
{
sessionKey = key;
sessionValue = value;
_sessionKey = key;
_sessionValue = value;
});
sessionMock
_sessionMock
.Setup(s => s.Keys)
.Returns(keys);
return sessionMock.Object;
return _sessionMock.Object;
}
}
}

View File

@@ -18,26 +18,26 @@ namespace UnitTests.AspNetCore.Security.BasicAuthentication
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class BasicAuthenticationMiddlewareTests
{
private Dictionary<string, string> requestHeaders;
private Dictionary<string, string> _requestHeaders;
private Dictionary<string, string> responseHeadersCallback;
private int responseStatusCodeCallback;
private Dictionary<string, string> _responseHeadersCallback;
private int _responseStatusCodeCallback;
private string validatorRealm;
private ClaimsPrincipal validatorResponse;
private List<(string username, string password, IPAddress ipAddr)> validatorCallback;
private string _validatorRealm;
private ClaimsPrincipal _validatorResponse;
private List<(string username, string password, IPAddress ipAddr)> _validatorCallback;
[TestInitialize]
public void InitializeTests()
{
requestHeaders = new Dictionary<string, string>();
_requestHeaders = [];
responseHeadersCallback = new Dictionary<string, string>();
responseStatusCodeCallback = 0;
_responseHeadersCallback = [];
_responseStatusCodeCallback = 0;
validatorRealm = null;
validatorResponse = null;
validatorCallback = new List<(string username, string password, IPAddress ipAddr)>();
_validatorRealm = null;
_validatorResponse = null;
_validatorCallback = [];
}
[TestMethod]
@@ -47,8 +47,8 @@ namespace UnitTests.AspNetCore.Security.BasicAuthentication
string username = "user";
string password = "pass:word";
requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}"))}");
validatorResponse = new ClaimsPrincipal();
_requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}"))}");
_validatorResponse = new ClaimsPrincipal();
var middleware = GetMiddleware();
var context = GetContext();
@@ -57,13 +57,13 @@ namespace UnitTests.AspNetCore.Security.BasicAuthentication
await middleware.InvokeAsync(context);
// assert
Assert.AreEqual(0, responseStatusCodeCallback); // not triggered
Assert.AreEqual(0, responseHeadersCallback.Count);
Assert.AreEqual(1, validatorCallback.Count);
Assert.AreEqual(0, _responseStatusCodeCallback); // not triggered
Assert.AreEqual(0, _responseHeadersCallback.Count);
Assert.AreEqual(1, _validatorCallback.Count);
Assert.AreEqual(username, validatorCallback.First().username);
Assert.AreEqual(password, validatorCallback.First().password);
Assert.AreEqual(IPAddress.Loopback, validatorCallback.First().ipAddr);
Assert.AreEqual(username, _validatorCallback.First().username);
Assert.AreEqual(password, _validatorCallback.First().password);
Assert.AreEqual(IPAddress.Loopback, _validatorCallback.First().ipAddr);
}
[TestMethod]
@@ -77,13 +77,13 @@ namespace UnitTests.AspNetCore.Security.BasicAuthentication
await middleware.InvokeAsync(context);
// assert
Assert.AreEqual(401, responseStatusCodeCallback);
Assert.AreEqual(401, _responseStatusCodeCallback);
Assert.AreEqual(0, validatorCallback.Count);
Assert.AreEqual(0, _validatorCallback.Count);
Assert.AreEqual(1, responseHeadersCallback.Count);
Assert.AreEqual("WWW-Authenticate", responseHeadersCallback.Keys.First());
Assert.AreEqual("Basic", responseHeadersCallback.Values.First());
Assert.AreEqual(1, _responseHeadersCallback.Count);
Assert.AreEqual("WWW-Authenticate", _responseHeadersCallback.Keys.First());
Assert.AreEqual("Basic", _responseHeadersCallback.Values.First());
}
[TestMethod]
@@ -93,10 +93,10 @@ namespace UnitTests.AspNetCore.Security.BasicAuthentication
string username = "user";
string password = "pw";
validatorRealm = "TEST";
_validatorRealm = "TEST";
var remote = IPAddress.Parse("1.2.3.4");
requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}"))}");
_requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}"))}");
var middleware = GetMiddleware();
var context = GetContext(remote);
@@ -105,16 +105,16 @@ namespace UnitTests.AspNetCore.Security.BasicAuthentication
await middleware.InvokeAsync(context);
// assert
Assert.AreEqual(401, responseStatusCodeCallback);
Assert.AreEqual(401, _responseStatusCodeCallback);
Assert.AreEqual(1, responseHeadersCallback.Count);
Assert.AreEqual("WWW-Authenticate", responseHeadersCallback.Keys.First());
Assert.AreEqual($"Basic realm=\"{validatorRealm}\"", responseHeadersCallback.Values.First());
Assert.AreEqual(1, _responseHeadersCallback.Count);
Assert.AreEqual("WWW-Authenticate", _responseHeadersCallback.Keys.First());
Assert.AreEqual($"Basic realm=\"{_validatorRealm}\"", _responseHeadersCallback.Values.First());
Assert.AreEqual(1, validatorCallback.Count);
Assert.AreEqual(username, validatorCallback.First().username);
Assert.AreEqual(password, validatorCallback.First().password);
Assert.AreEqual(remote, validatorCallback.First().ipAddr);
Assert.AreEqual(1, _validatorCallback.Count);
Assert.AreEqual(username, _validatorCallback.First().username);
Assert.AreEqual(password, _validatorCallback.First().password);
Assert.AreEqual(remote, _validatorCallback.First().ipAddr);
}
[TestMethod]
@@ -123,7 +123,7 @@ namespace UnitTests.AspNetCore.Security.BasicAuthentication
// arrange
string username = "user";
requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}"))}");
_requestHeaders.Add("Authorization", $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}"))}");
var middleware = GetMiddleware();
var context = GetContext();
@@ -132,7 +132,7 @@ namespace UnitTests.AspNetCore.Security.BasicAuthentication
await middleware.InvokeAsync(context);
// assert
Assert.AreEqual(500, responseStatusCodeCallback);
Assert.AreEqual(500, _responseStatusCodeCallback);
}
private BasicAuthenticationMiddleware GetMiddleware()
@@ -141,11 +141,11 @@ namespace UnitTests.AspNetCore.Security.BasicAuthentication
var validatorMock = new Mock<IBasicAuthenticationValidator>();
validatorMock
.Setup(v => v.Realm)
.Returns(validatorRealm);
.Returns(_validatorRealm);
validatorMock
.Setup(v => v.ValidateAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<IPAddress>(), It.IsAny<CancellationToken>()))
.Callback<string, string, IPAddress, CancellationToken>((username, password, ipAddress, _) => validatorCallback.Add((username, password, ipAddress)))
.ReturnsAsync(validatorResponse);
.Callback<string, string, IPAddress, CancellationToken>((username, password, ipAddress, _) => _validatorCallback.Add((username, password, ipAddress)))
.ReturnsAsync(_validatorResponse);
return new BasicAuthenticationMiddleware(nextMock.Object, validatorMock.Object);
}
@@ -154,7 +154,7 @@ namespace UnitTests.AspNetCore.Security.BasicAuthentication
{
// Request
var requestHeaderMock = new Mock<IHeaderDictionary>();
foreach (var header in requestHeaders)
foreach (var header in _requestHeaders)
{
requestHeaderMock
.Setup(h => h.ContainsKey(header.Key))
@@ -173,7 +173,7 @@ namespace UnitTests.AspNetCore.Security.BasicAuthentication
var responseHeaderMock = new Mock<IHeaderDictionary>();
responseHeaderMock
.SetupSet(h => h[It.IsAny<string>()] = It.IsAny<StringValues>())
.Callback<string, StringValues>((key, value) => responseHeadersCallback[key] = value);
.Callback<string, StringValues>((key, value) => _responseHeadersCallback[key] = value);
var responseMock = new Mock<HttpResponse>();
responseMock
@@ -181,7 +181,7 @@ namespace UnitTests.AspNetCore.Security.BasicAuthentication
.Returns(responseHeaderMock.Object);
responseMock
.SetupSet(r => r.StatusCode = It.IsAny<int>())
.Callback<int>((code) => responseStatusCodeCallback = code);
.Callback<int>((code) => _responseStatusCodeCallback = code);
// Connection
var connectionInfoMock = new Mock<ConnectionInfo>();

View File

@@ -14,17 +14,17 @@ namespace UnitTests.AspNetCore.Security.PathProtection
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class ProtectedPathMiddlewareTests
{
private Mock<RequestDelegate> nextMock;
private Mock<HttpContext> httpContextMock;
private Mock<IAuthorizationService> authorizationServiceMock;
private Mock<IAuthenticationService> authenticationServiceMock;
private Mock<RequestDelegate> _nextMock;
private Mock<HttpContext> _httpContextMock;
private Mock<IAuthorizationService> _authorizationServiceMock;
private Mock<IAuthenticationService> _authenticationServiceMock;
private ProtectedPathOptions options;
private ProtectedPathOptions _options;
[TestInitialize]
public void InitializeTest()
{
options = new ProtectedPathOptions
_options = new ProtectedPathOptions
{
Path = "/secure/protected",
PolicyName = "Protection"
@@ -36,21 +36,21 @@ namespace UnitTests.AspNetCore.Security.PathProtection
{
// arrange
var middleware = GetMiddleware();
var context = GetHttpContext(options.Path);
var context = GetHttpContext(_options.Path);
var auth = GetAuthService(true);
// act
await middleware.InvokeAsync(context, auth);
// assert
authorizationServiceMock.Verify(s => s.AuthorizeAsync(It.IsAny<ClaimsPrincipal>(), It.IsAny<object>(), options.PolicyName), Times.Once);
authorizationServiceMock.VerifyNoOtherCalls();
_authorizationServiceMock.Verify(s => s.AuthorizeAsync(It.IsAny<ClaimsPrincipal>(), It.IsAny<object>(), _options.PolicyName), Times.Once);
_authorizationServiceMock.VerifyNoOtherCalls();
authenticationServiceMock.Verify(s => s.ChallengeAsync(It.IsAny<HttpContext>(), It.IsAny<string>(), It.IsAny<AuthenticationProperties>()), Times.Never);
authenticationServiceMock.VerifyNoOtherCalls();
_authenticationServiceMock.Verify(s => s.ChallengeAsync(It.IsAny<HttpContext>(), It.IsAny<string>(), It.IsAny<AuthenticationProperties>()), Times.Never);
_authenticationServiceMock.VerifyNoOtherCalls();
nextMock.Verify(n => n.Invoke(It.IsAny<HttpContext>()), Times.Once);
nextMock.VerifyNoOtherCalls();
_nextMock.Verify(n => n.Invoke(It.IsAny<HttpContext>()), Times.Once);
_nextMock.VerifyNoOtherCalls();
}
[TestMethod]
@@ -65,14 +65,14 @@ namespace UnitTests.AspNetCore.Security.PathProtection
await middleware.InvokeAsync(context, auth);
// assert
authorizationServiceMock.Verify(s => s.AuthorizeAsync(It.IsAny<ClaimsPrincipal>(), It.IsAny<object>(), options.PolicyName), Times.Never);
authorizationServiceMock.VerifyNoOtherCalls();
_authorizationServiceMock.Verify(s => s.AuthorizeAsync(It.IsAny<ClaimsPrincipal>(), It.IsAny<object>(), _options.PolicyName), Times.Never);
_authorizationServiceMock.VerifyNoOtherCalls();
authenticationServiceMock.Verify(s => s.ChallengeAsync(It.IsAny<HttpContext>(), It.IsAny<string>(), It.IsAny<AuthenticationProperties>()), Times.Never);
authenticationServiceMock.VerifyNoOtherCalls();
_authenticationServiceMock.Verify(s => s.ChallengeAsync(It.IsAny<HttpContext>(), It.IsAny<string>(), It.IsAny<AuthenticationProperties>()), Times.Never);
_authenticationServiceMock.VerifyNoOtherCalls();
nextMock.Verify(n => n.Invoke(It.IsAny<HttpContext>()), Times.Once);
nextMock.VerifyNoOtherCalls();
_nextMock.Verify(n => n.Invoke(It.IsAny<HttpContext>()), Times.Once);
_nextMock.VerifyNoOtherCalls();
}
[TestMethod]
@@ -80,27 +80,27 @@ namespace UnitTests.AspNetCore.Security.PathProtection
{
// arrange
var middleware = GetMiddleware();
var context = GetHttpContext(options.Path);
var context = GetHttpContext(_options.Path);
var auth = GetAuthService(false);
// act
await middleware.InvokeAsync(context, auth);
// assert
authorizationServiceMock.Verify(s => s.AuthorizeAsync(It.IsAny<ClaimsPrincipal>(), It.IsAny<object>(), options.PolicyName), Times.Once);
authorizationServiceMock.VerifyNoOtherCalls();
_authorizationServiceMock.Verify(s => s.AuthorizeAsync(It.IsAny<ClaimsPrincipal>(), It.IsAny<object>(), _options.PolicyName), Times.Once);
_authorizationServiceMock.VerifyNoOtherCalls();
authenticationServiceMock.Verify(s => s.ChallengeAsync(It.IsAny<HttpContext>(), It.IsAny<string>(), It.IsAny<AuthenticationProperties>()), Times.Once);
authenticationServiceMock.VerifyNoOtherCalls();
_authenticationServiceMock.Verify(s => s.ChallengeAsync(It.IsAny<HttpContext>(), It.IsAny<string>(), It.IsAny<AuthenticationProperties>()), Times.Once);
_authenticationServiceMock.VerifyNoOtherCalls();
nextMock.Verify(n => n.Invoke(It.IsAny<HttpContext>()), Times.Never);
nextMock.VerifyNoOtherCalls();
_nextMock.Verify(n => n.Invoke(It.IsAny<HttpContext>()), Times.Never);
_nextMock.VerifyNoOtherCalls();
}
private ProtectedPathMiddleware GetMiddleware()
{
nextMock = new Mock<RequestDelegate>();
return new ProtectedPathMiddleware(nextMock.Object, options);
_nextMock = new Mock<RequestDelegate>();
return new ProtectedPathMiddleware(_nextMock.Object, _options);
}
private HttpContext GetHttpContext(string requestPath)
@@ -110,32 +110,32 @@ namespace UnitTests.AspNetCore.Security.PathProtection
.Setup(r => r.Path)
.Returns(new PathString(requestPath));
authenticationServiceMock = new Mock<IAuthenticationService>();
_authenticationServiceMock = new Mock<IAuthenticationService>();
var requestServicesMock = new Mock<IServiceProvider>();
requestServicesMock
.Setup(s => s.GetService(typeof(IAuthenticationService)))
.Returns(authenticationServiceMock.Object);
.Returns(_authenticationServiceMock.Object);
httpContextMock = new Mock<HttpContext>();
httpContextMock
_httpContextMock = new Mock<HttpContext>();
_httpContextMock
.Setup(c => c.Request)
.Returns(requestMock.Object);
httpContextMock
_httpContextMock
.Setup(c => c.RequestServices)
.Returns(requestServicesMock.Object);
return httpContextMock.Object;
return _httpContextMock.Object;
}
private IAuthorizationService GetAuthService(bool success)
{
authorizationServiceMock = new Mock<IAuthorizationService>();
authorizationServiceMock
_authorizationServiceMock = new Mock<IAuthorizationService>();
_authorizationServiceMock
.Setup(service => service.AuthorizeAsync(It.IsAny<ClaimsPrincipal>(), It.IsAny<object>(), It.IsAny<string>()))
.ReturnsAsync(() => success ? AuthorizationResult.Success() : AuthorizationResult.Failed());
return authorizationServiceMock.Object;
return _authorizationServiceMock.Object;
}
}
}

View File

@@ -1,9 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using Microsoft.AspNetCore.Identity;
using Microsoft.VisualStudio.TestTools.UnitTesting;

View File

@@ -41,7 +41,7 @@ namespace UnitTests.Common.Cli
// act
parser.ReadArgs("Option1 \"Option 2\"");
string[] args = parser.GetType().GetField("args", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(parser) as string[];
string[] args = parser.GetType().GetField("_args", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(parser) as string[];
// assert
Assert.IsNotNull(args);
@@ -63,7 +63,7 @@ namespace UnitTests.Common.Cli
parser.RegisterOption("opt3", 2).Required().Single();
parser.RegisterOption("opt4").Alias("option4");
var options = parser.GetType().GetField("options", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(parser) as List<Option>;
var options = parser.GetType().GetField("_options", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(parser) as List<Option>;
// assert
Assert.IsNotNull(options);
@@ -163,7 +163,7 @@ namespace UnitTests.Common.Cli
// arrange
Argument actionArgument = null;
string[] args = new[] { "/run", "--opt" };
string[] args = ["/run", "--opt"];
var parser = new CommandLineParser();
parser.RegisterOption("opt").Required();
parser.RegisterOption("run").Do(arg => actionArgument = arg);
@@ -219,7 +219,7 @@ namespace UnitTests.Common.Cli
public void ShouldThrowExceptionOnMultipleAutocomplete()
{
// arrange
string[] args = new[] { "/Opt:on" };
string[] args = ["/Opt:on"];
var parser = new CommandLineParser
{
IsCaseSensitive = true
@@ -239,7 +239,7 @@ namespace UnitTests.Common.Cli
public void ShouldThrowExceptionOnMissingOption()
{
// arrange
string[] args = new[] { "/Option:on" };
string[] args = ["/Option:on"];
var parser = new CommandLineParser
{
AutoCompleteOptions = false
@@ -259,7 +259,7 @@ namespace UnitTests.Common.Cli
public void ShouldTrhowExceptionOnDuplicateOption()
{
// arrange
string[] args = new[] { "/Opt:on", "--opt=off" };
string[] args = ["/Opt:on", "--opt=off"];
var parser = new CommandLineParser();
parser.RegisterOption("opt", 1).Single();
@@ -275,7 +275,7 @@ namespace UnitTests.Common.Cli
public void ShouldThrowExceptionOnMissingArgument()
{
// arrange
string[] args = new[] { "/Option" };
string[] args = ["/Option"];
var parser = new CommandLineParser();
parser.RegisterOption("option", 1);
@@ -291,7 +291,7 @@ namespace UnitTests.Common.Cli
public void ShouldThrowExceptionForMissingRequiredOption()
{
// arrange
string[] args = new[] { "/opt" };
string[] args = ["/opt"];
var parser = new CommandLineParser();
parser.RegisterOption("opt").Required();
parser.RegisterOption("foo").Required();

View File

@@ -8,18 +8,12 @@ namespace UnitTests.Common.Cli
[TestClass]
public class EnumerableWalkerTests
{
private List<string> list;
private List<string> _list;
[TestInitialize]
public void Initialize()
{
list = new List<string>
{
"one",
"two",
"three",
"four",
};
_list = ["one", "two", "three", "four"];
}
[TestMethod]
@@ -39,7 +33,7 @@ namespace UnitTests.Common.Cli
public void ShouldReturnEnumerator()
{
// arrange
var walker = new EnumerableWalker<string>(list);
var walker = new EnumerableWalker<string>(_list);
// act
var enumerator = walker.GetEnumerator();
@@ -52,7 +46,7 @@ namespace UnitTests.Common.Cli
public void ShouldReturnGenericEnumerator()
{
// arrange
var walker = new EnumerableWalker<string>(list);
var walker = new EnumerableWalker<string>(_list);
// act
var enumerator = ((IEnumerable<string>)walker).GetEnumerator();
@@ -65,18 +59,18 @@ namespace UnitTests.Common.Cli
public void ShouldReturnItems()
{
// arrange
var walker = new EnumerableWalker<string>(list);
var walker = new EnumerableWalker<string>(_list);
_ = walker.GetEnumerator();
string[] items = new string[list.Count];
string[] items = new string[_list.Count];
// act
for (int i = 0; i < list.Count; i++)
for (int i = 0; i < _list.Count; i++)
items[i] = walker.GetNext();
// assert
for (int i = 0; i < list.Count; i++)
Assert.AreEqual(list[i], items[i], $"Position {i} failed");
for (int i = 0; i < _list.Count; i++)
Assert.AreEqual(_list[i], items[i], $"Position {i} failed");
}
[TestMethod]
@@ -90,7 +84,7 @@ namespace UnitTests.Common.Cli
string item = walker.GetNext();
// assert
Assert.AreEqual(default(string), item);
Assert.AreEqual(default, item);
}
}
}

View File

@@ -12,7 +12,7 @@ namespace UnitTests.Common.Extensions
{
// arrange
string str = "Hello World!";
byte[] bytes = new byte[] { 0xaf, 0xfe };
byte[] bytes = [0xaf, 0xfe];
// act
string strHash = str.Md5();
@@ -28,7 +28,7 @@ namespace UnitTests.Common.Extensions
{
// arrange
string str = "Hello World!";
byte[] bytes = new byte[] { 0xaf, 0xfe };
byte[] bytes = [0xaf, 0xfe];
// act
string strHash = str.Sha1();
@@ -44,7 +44,7 @@ namespace UnitTests.Common.Extensions
{
// arrange
string str = "Hello World!";
byte[] bytes = new byte[] { 0xaf, 0xfe };
byte[] bytes = [0xaf, 0xfe];
// act
string strHash = str.Sha256();
@@ -60,7 +60,7 @@ namespace UnitTests.Common.Extensions
{
// arrange
string str = "Hello World!";
byte[] bytes = new byte[] { 0xaf, 0xfe };
byte[] bytes = [0xaf, 0xfe];
// act
string strHash = str.Sha512();

View File

@@ -56,11 +56,11 @@ namespace UnitTests.Common.Extensions
// arrange
var innerExceptions = new List<Exception>
{
new Exception("Inner Exception 1."),
new Exception("Inner Exception 2. See the inner exception for details.", new Exception("Inner Exception of Exception 2.")),
new Exception("Inner Exception 3."),
new Exception("Inner Exception 4."),
new Exception("Inner Exception 5.")
new("Inner Exception 1."),
new("Inner Exception 2. See the inner exception for details.", new Exception("Inner Exception of Exception 2.")),
new("Inner Exception 3."),
new("Inner Exception 4."),
new("Inner Exception 5.")
};
var aggregateException = new AggregateException("Lots of exceptions.", innerExceptions);
string expectedMessage = "Inner Exception 1. Inner Exception 2. Inner Exception of Exception 2. Inner Exception 3.";

View File

@@ -224,7 +224,7 @@ namespace UnitTests.Common.Extensions
public void ShouldConvertToJArray()
{
// arrange
string[] stringArray = new[] { "one", "two", "three" };
string[] stringArray = ["one", "two", "three"];
var objectArray = new[]
{
new JsonTestClass { StringValue = "One" },

View File

@@ -154,7 +154,7 @@ namespace UnitTests.Common.Extensions
catch (Exception)
{ /* keep it quiet */ }
});
Task.WaitAll(awaitableTask);
awaitableTask.Wait();
// assert
Assert.IsTrue(isTimeout);
@@ -183,7 +183,7 @@ namespace UnitTests.Common.Extensions
catch (Exception)
{ /* keep it quiet */ }
});
Task.WaitAll(awaitableTask);
awaitableTask.Wait();
// assert
Assert.IsTrue(isTimeout);
@@ -212,7 +212,7 @@ namespace UnitTests.Common.Extensions
catch (Exception)
{ /* keep it quiet */ }
});
Task.WaitAll(awaitableTask);
awaitableTask.Wait();
// assert
Assert.IsTrue(isTimeout);

View File

@@ -87,7 +87,7 @@ namespace UnitTests.Common.Extensions
{
// arrange
byte[] bytes1 = null;
byte[] bytes2 = Array.Empty<byte>();
byte[] bytes2 = [];
// act
string hex1 = bytes1.BytesToHex();
@@ -102,7 +102,7 @@ namespace UnitTests.Common.Extensions
public void ShouldReturnHexString()
{
// arrange
byte[] bytes = new byte[] { 0xaf, 0xfe };
byte[] bytes = [0xaf, 0xfe];
// act
string hex = bytes.BytesToHex();
@@ -116,7 +116,7 @@ namespace UnitTests.Common.Extensions
public void ShouldReturnHexStringWithDelimiter()
{
// arrange
byte[] bytes = new byte[] { 0xde, 0xad, 0xbe, 0xef };
byte[] bytes = [0xde, 0xad, 0xbe, 0xef];
// act
string hex = bytes.BytesToHex("_");

View File

@@ -15,14 +15,14 @@ namespace UnitTests.Common.Logging
[TestClass]
public class FileLoggerTests
{
private Mock<StreamWriter> streamWriterMock;
private Mock<StreamWriter> _streamWriterMock;
private List<string> lines;
private List<string> _lines;
[TestInitialize]
public void Initialize()
{
lines = new List<string>();
_lines = [];
}
[TestMethod]
@@ -157,14 +157,14 @@ namespace UnitTests.Common.Logging
// act
logger.Log(LogLevel.Information, "Test Message");
SpinWait.SpinUntil(() => lines.Count == 1);
SpinWait.SpinUntil(() => _lines.Count == 1);
// assert
Assert.AreEqual("INFO | Test Message", lines.First());
Assert.AreEqual("INFO | Test Message", _lines.First());
streamWriterMock.Verify(sw => sw.WriteLineAsync(It.IsAny<string>()), Times.Once);
streamWriterMock.Verify(sw => sw.FlushAsync(), Times.Once);
streamWriterMock.VerifyNoOtherCalls();
_streamWriterMock.Verify(sw => sw.WriteLineAsync(It.IsAny<string>()), Times.Once);
_streamWriterMock.Verify(sw => sw.FlushAsync(), Times.Once);
_streamWriterMock.VerifyNoOtherCalls();
}
[TestMethod]
@@ -177,18 +177,18 @@ namespace UnitTests.Common.Logging
foreach (LogLevel level in Enum.GetValues<LogLevel>())
logger.Log(level, "Test Message");
SpinWait.SpinUntil(() => lines.Count == 7);
SpinWait.SpinUntil(() => _lines.Count == 7);
// assert
streamWriterMock.Verify(sw => sw.WriteLineAsync("TRCE | Test Message"), Times.Once);
streamWriterMock.Verify(sw => sw.WriteLineAsync("DBUG | Test Message"), Times.Once);
streamWriterMock.Verify(sw => sw.WriteLineAsync("INFO | Test Message"), Times.Once);
streamWriterMock.Verify(sw => sw.WriteLineAsync("WARN | Test Message"), Times.Once);
streamWriterMock.Verify(sw => sw.WriteLineAsync("FAIL | Test Message"), Times.Once);
streamWriterMock.Verify(sw => sw.WriteLineAsync("CRIT | Test Message"), Times.Once);
streamWriterMock.Verify(sw => sw.WriteLineAsync(" | Test Message"), Times.Once);
streamWriterMock.Verify(sw => sw.FlushAsync(), Times.AtLeastOnce);
streamWriterMock.VerifyNoOtherCalls();
_streamWriterMock.Verify(sw => sw.WriteLineAsync("TRCE | Test Message"), Times.Once);
_streamWriterMock.Verify(sw => sw.WriteLineAsync("DBUG | Test Message"), Times.Once);
_streamWriterMock.Verify(sw => sw.WriteLineAsync("INFO | Test Message"), Times.Once);
_streamWriterMock.Verify(sw => sw.WriteLineAsync("WARN | Test Message"), Times.Once);
_streamWriterMock.Verify(sw => sw.WriteLineAsync("FAIL | Test Message"), Times.Once);
_streamWriterMock.Verify(sw => sw.WriteLineAsync("CRIT | Test Message"), Times.Once);
_streamWriterMock.Verify(sw => sw.WriteLineAsync(" | Test Message"), Times.Once);
_streamWriterMock.Verify(sw => sw.FlushAsync(), Times.AtLeastOnce);
_streamWriterMock.VerifyNoOtherCalls();
}
[TestMethod]
@@ -202,14 +202,14 @@ namespace UnitTests.Common.Logging
foreach (LogLevel level in Enum.GetValues<LogLevel>())
logger.Log(level, "Test Message");
SpinWait.SpinUntil(() => lines.Count == 3);
SpinWait.SpinUntil(() => _lines.Count == 3);
// assert
streamWriterMock.Verify(sw => sw.WriteLineAsync("FAIL | Test Message"), Times.Once);
streamWriterMock.Verify(sw => sw.WriteLineAsync("CRIT | Test Message"), Times.Once);
streamWriterMock.Verify(sw => sw.WriteLineAsync(" | Test Message"), Times.Once);
streamWriterMock.Verify(sw => sw.FlushAsync(), Times.AtLeastOnce);
streamWriterMock.VerifyNoOtherCalls();
_streamWriterMock.Verify(sw => sw.WriteLineAsync("FAIL | Test Message"), Times.Once);
_streamWriterMock.Verify(sw => sw.WriteLineAsync("CRIT | Test Message"), Times.Once);
_streamWriterMock.Verify(sw => sw.WriteLineAsync(" | Test Message"), Times.Once);
_streamWriterMock.Verify(sw => sw.FlushAsync(), Times.AtLeastOnce);
_streamWriterMock.VerifyNoOtherCalls();
}
[TestMethod]
@@ -222,13 +222,13 @@ namespace UnitTests.Common.Logging
// act
logger.LogWarning("Some Warning");
SpinWait.SpinUntil(() => lines.Count == 1);
SpinWait.SpinUntil(() => _lines.Count == 1);
// assert
streamWriterMock.Verify(sw => sw.WriteLineAsync($"{DateTime.Now:yyyy-MM-dd HH:mm} | WARN | Some Warning"), Times.Once);
streamWriterMock.Verify(sw => sw.FlushAsync(), Times.Once);
streamWriterMock.VerifyNoOtherCalls();
_streamWriterMock.Verify(sw => sw.WriteLineAsync($"{DateTime.Now:yyyy-MM-dd HH:mm} | WARN | Some Warning"), Times.Once);
_streamWriterMock.Verify(sw => sw.FlushAsync(), Times.Once);
_streamWriterMock.VerifyNoOtherCalls();
}
[TestMethod]
@@ -241,12 +241,12 @@ namespace UnitTests.Common.Logging
// act
logger.LogWarning("Some Warning");
SpinWait.SpinUntil(() => lines.Count == 1);
SpinWait.SpinUntil(() => _lines.Count == 1);
// assert
streamWriterMock.Verify(sw => sw.WriteLineAsync($"{DateTime.UtcNow:yyyy-MM-dd HH:mm} | WARN | Some Warning"), Times.Once);
streamWriterMock.Verify(sw => sw.FlushAsync(), Times.Once);
streamWriterMock.VerifyNoOtherCalls();
_streamWriterMock.Verify(sw => sw.WriteLineAsync($"{DateTime.UtcNow:yyyy-MM-dd HH:mm} | WARN | Some Warning"), Times.Once);
_streamWriterMock.Verify(sw => sw.FlushAsync(), Times.Once);
_streamWriterMock.VerifyNoOtherCalls();
}
[TestMethod]
@@ -264,12 +264,12 @@ namespace UnitTests.Common.Logging
// act
logger.LogWarning("Some Warning");
SpinWait.SpinUntil(() => lines.Count == 1);
SpinWait.SpinUntil(() => _lines.Count == 1);
// assert
streamWriterMock.Verify(sw => sw.WriteLineAsync($"{DateTime.Now:yyyy-MM-dd HH:mm} | WARN | [NamedInstance] Some Warning"), Times.Once);
streamWriterMock.Verify(sw => sw.FlushAsync(), Times.Once);
streamWriterMock.VerifyNoOtherCalls();
_streamWriterMock.Verify(sw => sw.WriteLineAsync($"{DateTime.Now:yyyy-MM-dd HH:mm} | WARN | [NamedInstance] Some Warning"), Times.Once);
_streamWriterMock.Verify(sw => sw.FlushAsync(), Times.Once);
_streamWriterMock.VerifyNoOtherCalls();
Assert.AreEqual(0, new FileInfo(file).Length);
}
@@ -290,13 +290,13 @@ namespace UnitTests.Common.Logging
using (var scope = logger.BeginScope("scope"))
{
logger.LogError("Test");
SpinWait.SpinUntil(() => lines.Count == 1);
SpinWait.SpinUntil(() => _lines.Count == 1);
}
// assert
streamWriterMock.Verify(sw => sw.WriteLineAsync("FAIL | [NamedInstance] Test"), Times.Once);
streamWriterMock.Verify(sw => sw.FlushAsync(), Times.Once);
streamWriterMock.VerifyNoOtherCalls();
_streamWriterMock.Verify(sw => sw.WriteLineAsync("FAIL | [NamedInstance] Test"), Times.Once);
_streamWriterMock.Verify(sw => sw.FlushAsync(), Times.Once);
_streamWriterMock.VerifyNoOtherCalls();
scopeProvider.Verify(sp => sp.Push("scope"), Times.Once);
scopeProvider.Verify(sp => sp.ForEachScope(It.IsAny<Action<object, It.IsAnyType>>(), It.IsAny<It.IsAnyType>()), Times.Once);
@@ -311,12 +311,12 @@ namespace UnitTests.Common.Logging
// act
logger.LogCritical(new Exception("TestException"), "");
SpinWait.SpinUntil(() => lines.Count == 1);
SpinWait.SpinUntil(() => _lines.Count == 1);
// assert
streamWriterMock.Verify(sw => sw.WriteLineAsync("CRIT | System.Exception: TestException"), Times.Once);
streamWriterMock.Verify(sw => sw.FlushAsync(), Times.Once);
streamWriterMock.VerifyNoOtherCalls();
_streamWriterMock.Verify(sw => sw.WriteLineAsync("CRIT | System.Exception: TestException"), Times.Once);
_streamWriterMock.Verify(sw => sw.FlushAsync(), Times.Once);
_streamWriterMock.VerifyNoOtherCalls();
}
[TestMethod]
@@ -327,12 +327,12 @@ namespace UnitTests.Common.Logging
// act
logger.LogCritical(new Exception("TestException"), "Bad things happen...");
SpinWait.SpinUntil(() => lines.Count == 1);
SpinWait.SpinUntil(() => _lines.Count == 1);
// assert
streamWriterMock.Verify(sw => sw.WriteLineAsync($"CRIT | Bad things happen...{Environment.NewLine} System.Exception: TestException"), Times.Once);
streamWriterMock.Verify(sw => sw.FlushAsync(), Times.Once);
streamWriterMock.VerifyNoOtherCalls();
_streamWriterMock.Verify(sw => sw.WriteLineAsync($"CRIT | Bad things happen...{Environment.NewLine} System.Exception: TestException"), Times.Once);
_streamWriterMock.Verify(sw => sw.FlushAsync(), Times.Once);
_streamWriterMock.VerifyNoOtherCalls();
}
private FileLogger GetFileLogger(string name = null, IExternalScopeProvider scopeProvider = null)
@@ -340,10 +340,10 @@ namespace UnitTests.Common.Logging
string tmpFilePath = Path.GetTempFileName();
try
{
streamWriterMock = new Mock<StreamWriter>(Stream.Null);
streamWriterMock
_streamWriterMock = new Mock<StreamWriter>(Stream.Null);
_streamWriterMock
.Setup(sw => sw.WriteLineAsync(It.IsAny<string>()))
.Callback<string>(line => lines.Add(line))
.Callback<string>(line => _lines.Add(line))
.Returns(Task.CompletedTask);
FileLogger fileLogger;
@@ -356,9 +356,9 @@ namespace UnitTests.Common.Logging
fileLogger = new FileLogger(tmpFilePath, name, scopeProvider);
}
var fieldInfo = fileLogger.GetType().GetField("fileWriter", BindingFlags.NonPublic | BindingFlags.Instance);
var fieldInfo = fileLogger.GetType().GetField("_fileWriter", BindingFlags.NonPublic | BindingFlags.Instance);
(fieldInfo.GetValue(fileLogger) as StreamWriter).Dispose();
fieldInfo.SetValue(fileLogger, streamWriterMock.Object);
fieldInfo.SetValue(fileLogger, _streamWriterMock.Object);
return fileLogger;
}

View File

@@ -10,35 +10,35 @@ namespace UnitTests.Common.Utilities
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class AsyncQueueTests
{
private Queue<TestElement> internalQueue;
private Queue<TestElement> _internalQueue;
private TestElement queueElement1;
private TestElement queueElement2;
private TestElement queueElement3;
private TestElement _queueElement1;
private TestElement _queueElement2;
private TestElement _queueElement3;
[TestInitialize]
public void InitializeTest()
{
queueElement1 = new TestElement
_queueElement1 = new TestElement
{
Number = 111,
Text = "one"
};
queueElement2 = new TestElement
_queueElement2 = new TestElement
{
Number = 222,
Text = "two"
};
queueElement3 = new TestElement
_queueElement3 = new TestElement
{
Number = 333,
Text = "three"
};
internalQueue = new Queue<TestElement>();
internalQueue.Enqueue(queueElement1);
internalQueue.Enqueue(queueElement2);
internalQueue.Enqueue(queueElement3);
_internalQueue = new Queue<TestElement>();
_internalQueue.Enqueue(_queueElement1);
_internalQueue.Enqueue(_queueElement2);
_internalQueue.Enqueue(_queueElement3);
}
[TestMethod]
@@ -47,15 +47,15 @@ namespace UnitTests.Common.Utilities
// arrange
var element = new TestElement { Number = 1, Text = "Hello" };
internalQueue.Clear();
_internalQueue.Clear();
var queue = GetQueue();
// act
queue.Enqueue(element);
// assert
Assert.AreEqual(1, internalQueue.Count);
Assert.AreEqual(internalQueue.Count, queue.Count);
Assert.AreEqual(1, _internalQueue.Count);
Assert.AreEqual(_internalQueue.Count, queue.Count);
}
[TestMethod]
@@ -65,7 +65,7 @@ namespace UnitTests.Common.Utilities
var element = new TestElement { Number = 1, Text = "Hello" };
bool available = false;
internalQueue.Clear();
_internalQueue.Clear();
var queue = GetQueue();
// act
@@ -88,7 +88,7 @@ namespace UnitTests.Common.Utilities
var element = new TestElement { Number = 1, Text = "Hello" };
TestElement callback = null;
internalQueue.Clear();
_internalQueue.Clear();
var queue = GetQueue();
// act
@@ -110,18 +110,18 @@ namespace UnitTests.Common.Utilities
// arrange
var elements = new TestElement[]
{
new TestElement { Number = 1, Text = "Hello" },
new TestElement { Number = 2, Text = "World" },
new() { Number = 1, Text = "Hello" },
new() { Number = 2, Text = "World" },
};
internalQueue.Clear();
_internalQueue.Clear();
var queue = GetQueue();
// act
queue.Enqueue(elements);
// assert
Assert.AreEqual(2, internalQueue.Count);
Assert.AreEqual(queue.Count, internalQueue.Count);
Assert.AreEqual(2, _internalQueue.Count);
Assert.AreEqual(queue.Count, _internalQueue.Count);
}
[TestMethod]
@@ -136,7 +136,7 @@ namespace UnitTests.Common.Utilities
// assert
Assert.IsTrue(isSuccess);
Assert.IsNotNull(item);
Assert.AreEqual(queueElement1, item);
Assert.AreEqual(_queueElement1, item);
Assert.AreEqual(3, queue.Count);
}
@@ -144,7 +144,7 @@ namespace UnitTests.Common.Utilities
public void ShouldNotPeekAValue()
{
// arrange
internalQueue.Clear();
_internalQueue.Clear();
var queue = GetQueue();
// act
@@ -167,7 +167,7 @@ namespace UnitTests.Common.Utilities
// assert
Assert.IsTrue(isSuccess);
Assert.IsNotNull(item);
Assert.AreEqual(queueElement1, item);
Assert.AreEqual(_queueElement1, item);
Assert.AreEqual(2, queue.Count);
}
@@ -175,7 +175,7 @@ namespace UnitTests.Common.Utilities
public void ShouldNotDequeueAValue()
{
// arrange
internalQueue.Clear();
_internalQueue.Clear();
var queue = GetQueue();
// act
@@ -193,14 +193,14 @@ namespace UnitTests.Common.Utilities
var queue = GetQueue();
// act
queue.Remove(queueElement2);
queue.Remove(_queueElement2);
var item1 = queue.Dequeue();
var item2 = queue.Dequeue();
// assert
Assert.AreEqual(0, queue.Count);
Assert.AreEqual(queueElement1, item1);
Assert.AreEqual(queueElement3, item2);
Assert.AreEqual(_queueElement1, item1);
Assert.AreEqual(_queueElement3, item2);
}
[TestMethod]
@@ -217,22 +217,22 @@ namespace UnitTests.Common.Utilities
// assert
Assert.AreEqual(0, queue.Count);
Assert.AreEqual(queueElement1, item1);
Assert.AreEqual(queueElement2, item2);
Assert.AreEqual(queueElement3, item3);
Assert.AreEqual(_queueElement1, item1);
Assert.AreEqual(_queueElement2, item2);
Assert.AreEqual(_queueElement3, item3);
}
[TestMethod]
public async Task ShouldAwaitOneDequeue()
{
// arrange
internalQueue.Clear();
_internalQueue.Clear();
var queue = GetQueue();
var task = Task.Run(async () =>
{
await Task.Delay(1000);
queue.Enqueue(new[] { queueElement1, queueElement2, queueElement3 });
queue.Enqueue(new[] { _queueElement1, _queueElement2, _queueElement3 });
});
// act
@@ -241,20 +241,20 @@ namespace UnitTests.Common.Utilities
// assert
Assert.AreEqual(2, queue.Count);
Assert.IsNotNull(item);
Assert.AreEqual(queueElement1, item);
Assert.AreEqual(_queueElement1, item);
}
[TestMethod]
public async Task ShouldAwaitManyDequeue()
{
// arrange
internalQueue.Clear();
_internalQueue.Clear();
var queue = GetQueue();
var task = Task.Run(async () =>
{
await Task.Delay(1000);
queue.Enqueue(new[] { queueElement1, queueElement2, queueElement3 });
queue.Enqueue(new[] { _queueElement1, _queueElement2, _queueElement3 });
});
// act
@@ -264,21 +264,21 @@ namespace UnitTests.Common.Utilities
Assert.AreEqual(1, queue.Count);
Assert.IsNotNull(items);
Assert.AreEqual(2, items.Length);
Assert.AreEqual(queueElement1, items[0]);
Assert.AreEqual(queueElement2, items[1]);
Assert.AreEqual(_queueElement1, items[0]);
Assert.AreEqual(_queueElement2, items[1]);
}
[TestMethod]
public async Task ShouldAwaitAllDequeue()
{
// arrange
internalQueue.Clear();
_internalQueue.Clear();
var queue = GetQueue();
var task = Task.Run(async () =>
{
await Task.Delay(1000);
queue.Enqueue(new[] { queueElement1, queueElement2, queueElement3 });
queue.Enqueue(new[] { _queueElement1, _queueElement2, _queueElement3 });
});
// act
@@ -288,22 +288,22 @@ namespace UnitTests.Common.Utilities
Assert.AreEqual(0, queue.Count);
Assert.IsNotNull(items);
Assert.AreEqual(3, items.Length);
Assert.AreEqual(queueElement1, items[0]);
Assert.AreEqual(queueElement2, items[1]);
Assert.AreEqual(queueElement3, items[2]);
Assert.AreEqual(_queueElement1, items[0]);
Assert.AreEqual(_queueElement2, items[1]);
Assert.AreEqual(_queueElement3, items[2]);
}
[TestMethod]
public async Task ShouldAwaitAvailableDequeue()
{
// arrange
internalQueue.Clear();
_internalQueue.Clear();
var queue = GetQueue();
var task = Task.Run(async () =>
{
await Task.Delay(1000);
queue.Enqueue(new[] { queueElement1, queueElement2, queueElement3 });
queue.Enqueue(new[] { _queueElement1, _queueElement2, _queueElement3 });
});
// act
@@ -313,8 +313,8 @@ namespace UnitTests.Common.Utilities
Assert.AreEqual(1, queue.Count);
Assert.IsNotNull(items);
Assert.AreEqual(2, items.Length);
Assert.AreEqual(queueElement1, items[0]);
Assert.AreEqual(queueElement2, items[1]);
Assert.AreEqual(_queueElement1, items[0]);
Assert.AreEqual(_queueElement2, items[1]);
}
[TestMethod]
@@ -322,7 +322,7 @@ namespace UnitTests.Common.Utilities
public async Task ShouldThrowArumentOutOfRangeException()
{
// arrange
internalQueue.Clear();
_internalQueue.Clear();
var queue = GetQueue();
// act
@@ -336,8 +336,8 @@ namespace UnitTests.Common.Utilities
{
var asyncQueue = new AsyncQueue<TestElement>();
var field = asyncQueue.GetType().GetField("queue", BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(asyncQueue, internalQueue);
var field = asyncQueue.GetType().GetField("_queue", BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(asyncQueue, _internalQueue);
return asyncQueue;
}

View File

@@ -10,22 +10,22 @@ namespace UnitTests.Common.Utilities
{
[TestClass]
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class CryptographyHelperTests
public partial class CryptographyHelperTests
{
private string keyFile;
private CryptographyHelper cryptoHelper;
private string _keyFile;
private CryptographyHelper _cryptoHelper;
[TestInitialize]
public void Initialize()
{
keyFile = Path.GetTempFileName();
cryptoHelper = new CryptographyHelper(keyFile);
_keyFile = Path.GetTempFileName();
_cryptoHelper = new CryptographyHelper(_keyFile);
}
[TestCleanup]
public void Cleanup()
{
File.Delete(keyFile);
File.Delete(_keyFile);
}
#region Static
@@ -40,12 +40,12 @@ namespace UnitTests.Common.Utilities
// arrange
using var _ = CryptographyHelperSaltMock.Create(0);
byte[] bytes = new byte[] { 0xaf, 0xfe };
byte[] bytes = [0xaf, 0xfe];
string str = "ABC";
string password1 = "P@ssw0rd!";
string password2 = "P@ssw0rd";
byte[] expectedBytes = new byte[] { 0x7c, 0x7b, 0x77, 0x56, 0x91, 0x1a, 0xd9, 0xc0, 0x72, 0x70, 0x36, 0x88, 0x9f, 0xb4, 0xb5, 0xbc };
byte[] expectedBytes = [0x7c, 0x7b, 0x77, 0x56, 0x91, 0x1a, 0xd9, 0xc0, 0x72, 0x70, 0x36, 0x88, 0x9f, 0xb4, 0xb5, 0xbc];
// act
byte[] cipherBytes1 = CryptographyHelper.AesEncrypt(bytes, password1);
@@ -68,12 +68,12 @@ namespace UnitTests.Common.Utilities
using var _ = CryptographyHelperSaltMock.Create(0);
string cipherStr = "ueLuhFNpCuYmx8v3hczHtg==";
byte[] cipherBytes = new byte[] { 0x7c, 0x7b, 0x77, 0x56, 0x91, 0x1a, 0xd9, 0xc0, 0x72, 0x70, 0x36, 0x88, 0x9f, 0xb4, 0xb5, 0xbc };
byte[] cipherBytes = [0x7c, 0x7b, 0x77, 0x56, 0x91, 0x1a, 0xd9, 0xc0, 0x72, 0x70, 0x36, 0x88, 0x9f, 0xb4, 0xb5, 0xbc];
string password1 = "P@ssw0rd!";
string password2 = "P@ssw0rd";
byte[] expectedBytes = new byte[] { 0xaf, 0xfe };
byte[] expectedBytes = [0xaf, 0xfe];
// act
byte[] plainBytes1 = CryptographyHelper.AesDecrypt(cipherBytes, password1);
@@ -104,7 +104,7 @@ namespace UnitTests.Common.Utilities
public void ShouldEncryptDecryptAesBytes()
{
// arrange
byte[] plain = new byte[] { 0xaf, 0xfe };
byte[] plain = [0xaf, 0xfe];
string password = "P@ssw0rd!";
// act
@@ -154,12 +154,12 @@ namespace UnitTests.Common.Utilities
// arrange
using var _ = CryptographyHelperSaltMock.Create(0);
byte[] bytes = new byte[] { 0xaf, 0xfe };
byte[] bytes = [0xaf, 0xfe];
string str = "ABC";
string password1 = "P@ssw0rd!";
string password2 = "P@ssw0rd";
byte[] expectedBytes = new byte[] { 0xbf, 0x59, 0x1f, 0x48, 0x69, 0xab, 0x18, 0xc7 };
byte[] expectedBytes = [0xbf, 0x59, 0x1f, 0x48, 0x69, 0xab, 0x18, 0xc7];
// act
byte[] cipherBytes1 = CryptographyHelper.TripleDesEncrypt(bytes, password1);
@@ -182,12 +182,12 @@ namespace UnitTests.Common.Utilities
using var _ = CryptographyHelperSaltMock.Create(0);
string cipherStr = "1l74soBuuEI=";
byte[] cipherBytes = new byte[] { 0xbf, 0x59, 0x1f, 0x48, 0x69, 0xab, 0x18, 0xc7 };
byte[] cipherBytes = [0xbf, 0x59, 0x1f, 0x48, 0x69, 0xab, 0x18, 0xc7];
string password1 = "P@ssw0rd!";
string password2 = "P@ssw0rd";
byte[] expectedBytes = new byte[] { 0xaf, 0xfe };
byte[] expectedBytes = [0xaf, 0xfe];
// act
byte[] plainBytes1 = CryptographyHelper.TripleDesDecrypt(cipherBytes, password1);
@@ -218,7 +218,7 @@ namespace UnitTests.Common.Utilities
public void ShouldEncryptDecryptTdesBytes()
{
// arrange
byte[] plain = new byte[] { 0xaf, 0xfe };
byte[] plain = [0xaf, 0xfe];
string password = "P@ssw0rd!";
// act
@@ -269,7 +269,7 @@ namespace UnitTests.Common.Utilities
{
// arrange
string text = "Hello World!";
byte[] bytes = new byte[] { 0xde, 0xad, 0xbe, 0xef };
byte[] bytes = [0xde, 0xad, 0xbe, 0xef];
string fileName = Path.GetTempFileName();
// act
@@ -291,7 +291,7 @@ namespace UnitTests.Common.Utilities
{
// arrange
string text = "Hello World!";
byte[] bytes = new byte[] { 0xde, 0xad, 0xbe, 0xef };
byte[] bytes = [0xde, 0xad, 0xbe, 0xef];
string fileName = Path.GetTempFileName();
// act
@@ -313,7 +313,7 @@ namespace UnitTests.Common.Utilities
{
// arrange
string text = "Hello World!";
byte[] bytes = new byte[] { 0xde, 0xad, 0xbe, 0xef };
byte[] bytes = [0xde, 0xad, 0xbe, 0xef];
string fileName = Path.GetTempFileName();
// act
@@ -335,7 +335,7 @@ namespace UnitTests.Common.Utilities
{
// arrange
string text = "Hello World!";
byte[] bytes = new byte[] { 0xde, 0xad, 0xbe, 0xef };
byte[] bytes = [0xde, 0xad, 0xbe, 0xef];
string fileName = Path.GetTempFileName();
// act
@@ -415,8 +415,8 @@ namespace UnitTests.Common.Utilities
Assert.AreEqual(length, str1.Length);
Assert.AreEqual(length, str2.Length);
Assert.IsFalse(str1 == str2);
Assert.IsFalse(Regex.IsMatch(str1, "[^0-9a-f]"));
Assert.IsFalse(Regex.IsMatch(str2, "[^0-9a-f]"));
Assert.IsFalse(RandomStringWithPoolRegex().IsMatch(str1));
Assert.IsFalse(RandomStringWithPoolRegex().IsMatch(str2));
}
#endregion Random
@@ -537,7 +537,6 @@ namespace UnitTests.Common.Utilities
Assert.IsTrue(!string.IsNullOrWhiteSpace(content));
}
[TestMethod]
public void ShouldEncryptAesUsingKeyFile()
{
@@ -545,11 +544,11 @@ namespace UnitTests.Common.Utilities
string str = "Hello World!";
byte[] bytes = CryptographyHelper.GetRandomBytes(32);
string password = File.ReadAllText(keyFile);
string password = File.ReadAllText(_keyFile);
// act
string cipherStr = cryptoHelper.EncryptAes(str);
byte[] cipherBytes = cryptoHelper.EncryptAes(bytes);
string cipherStr = _cryptoHelper.EncryptAes(str);
byte[] cipherBytes = _cryptoHelper.EncryptAes(bytes);
string plainStr = CryptographyHelper.AesDecrypt(cipherStr, password);
byte[] plainBytes = CryptographyHelper.AesDecrypt(cipherBytes, password);
@@ -568,14 +567,14 @@ namespace UnitTests.Common.Utilities
string str = "Hello World!";
byte[] bytes = CryptographyHelper.GetRandomBytes(32);
string password = File.ReadAllText(keyFile);
string password = File.ReadAllText(_keyFile);
// act
string cipherStr = CryptographyHelper.AesEncrypt(str, password);
byte[] cipherBytes = CryptographyHelper.AesEncrypt(bytes, password);
string plainStr = cryptoHelper.DecryptAes(cipherStr);
byte[] plainBytes = cryptoHelper.DecryptAes(cipherBytes);
string plainStr = _cryptoHelper.DecryptAes(cipherStr);
byte[] plainBytes = _cryptoHelper.DecryptAes(cipherBytes);
// assert
Assert.AreNotEqual(str, cipherStr);
@@ -591,11 +590,11 @@ namespace UnitTests.Common.Utilities
string str = "Hello World!";
byte[] bytes = CryptographyHelper.GetRandomBytes(32);
string password = File.ReadAllText(keyFile);
string password = File.ReadAllText(_keyFile);
// act
string cipherStr = cryptoHelper.EncryptTripleDes(str);
byte[] cipherBytes = cryptoHelper.EncryptTripleDes(bytes);
string cipherStr = _cryptoHelper.EncryptTripleDes(str);
byte[] cipherBytes = _cryptoHelper.EncryptTripleDes(bytes);
string plainStr = CryptographyHelper.TripleDesDecrypt(cipherStr, password);
byte[] plainBytes = CryptographyHelper.TripleDesDecrypt(cipherBytes, password);
@@ -614,14 +613,14 @@ namespace UnitTests.Common.Utilities
string str = "Hello World!";
byte[] bytes = CryptographyHelper.GetRandomBytes(32);
string password = File.ReadAllText(keyFile);
string password = File.ReadAllText(_keyFile);
// act
string cipherStr = CryptographyHelper.TripleDesEncrypt(str, password);
byte[] cipherBytes = CryptographyHelper.TripleDesEncrypt(bytes, password);
string plainStr = cryptoHelper.DecryptTripleDes(cipherStr);
byte[] plainBytes = cryptoHelper.DecryptTripleDes(cipherBytes);
string plainStr = _cryptoHelper.DecryptTripleDes(cipherStr);
byte[] plainBytes = _cryptoHelper.DecryptTripleDes(cipherBytes);
// assert
Assert.AreNotEqual(str, cipherStr);
@@ -630,6 +629,9 @@ namespace UnitTests.Common.Utilities
CollectionAssert.AreEqual(bytes, plainBytes);
}
[GeneratedRegex("[^0-9a-f]")]
private static partial Regex RandomStringWithPoolRegex();
#endregion Instance
}
}

View File

@@ -17,11 +17,11 @@ namespace UnitTests.Common.Utilities
// arrange
int executionCount = 0;
var delay = TimeSpan.FromMilliseconds(100);
var action = () => { executionCount++; };
void Action() { executionCount++; }
// act
var cts = new CancellationTokenSource(delay.Add(TimeSpan.FromSeconds(1)));
var delayedTask = DelayedTask.Create(action, delay);
var delayedTask = DelayedTask.Create(Action, delay);
SpinWait.SpinUntil(() => executionCount > 0 || cts.IsCancellationRequested);
// assert
@@ -39,11 +39,11 @@ namespace UnitTests.Common.Utilities
// arrange
int executionCount = 0;
var delay = TimeSpan.FromMilliseconds(100);
var action = () => { executionCount++; };
void Action() { executionCount++; }
// act
var cts = new CancellationTokenSource(delay.Add(TimeSpan.FromSeconds(1)));
var delayedTask = DelayedTask.Run(action, delay);
var delayedTask = DelayedTask.Run(Action, delay);
SpinWait.SpinUntil(() => executionCount > 0 || cts.IsCancellationRequested);
// assert
@@ -61,11 +61,11 @@ namespace UnitTests.Common.Utilities
// arrange
int executionCount = 0;
var delay = TimeSpan.FromMilliseconds(100);
var action = () => { executionCount++; };
void Action() { executionCount++; }
// act
var cts = new CancellationTokenSource(delay.Add(TimeSpan.FromSeconds(1)));
var delayedTask = DelayedTask.Create(action, delay);
var delayedTask = DelayedTask.Create(Action, delay);
delayedTask.Reset();
SpinWait.SpinUntil(() => executionCount > 0 || cts.IsCancellationRequested);
@@ -84,11 +84,11 @@ namespace UnitTests.Common.Utilities
// arrange
int executionCount = 0;
var delay = TimeSpan.FromMilliseconds(100);
var action = () => { executionCount++; };
void Action() { executionCount++; }
// act
var cts = new CancellationTokenSource(delay.Add(TimeSpan.FromSeconds(1)));
var delayedTask = DelayedTask.Run(action, delay);
var delayedTask = DelayedTask.Run(Action, delay);
delayedTask.Cancel();
SpinWait.SpinUntil(() => executionCount > 0 || cts.IsCancellationRequested);
@@ -109,12 +109,12 @@ namespace UnitTests.Common.Utilities
var sw = new Stopwatch();
var delay = TimeSpan.FromMilliseconds(200);
var action = () => { sw.Stop(); executionCount++; };
void Action() { sw.Stop(); executionCount++; }
// act
var cts = new CancellationTokenSource(delay.Add(TimeSpan.FromSeconds(1)));
sw.Start();
var delayedTask = DelayedTask.Run(action, delay);
var delayedTask = DelayedTask.Run(Action, delay);
await Task.Delay(50);
delayedTask.Reset();
SpinWait.SpinUntil(() => executionCount > 0 || cts.IsCancellationRequested);
@@ -138,12 +138,12 @@ namespace UnitTests.Common.Utilities
var sw = new Stopwatch();
var delay = TimeSpan.FromMilliseconds(200);
var action = () => { sw.Stop(); executionCount++; };
void Action() { sw.Stop(); executionCount++; }
// act
var cts = new CancellationTokenSource(delay.Add(TimeSpan.FromSeconds(1)));
sw.Start();
var delayedTask = DelayedTask.Create(action, delay);
var delayedTask = DelayedTask.Create(Action, delay);
await Task.Delay(50);
bool isSuccess = delayedTask.ExecutePending();
SpinWait.SpinUntil(() => executionCount > 0 || cts.IsCancellationRequested);
@@ -169,12 +169,12 @@ namespace UnitTests.Common.Utilities
var sw = new Stopwatch();
var delay = TimeSpan.FromMilliseconds(200);
var action = () => { sw.Stop(); executionCount++; };
void Action() { sw.Stop(); executionCount++; }
// act
var cts = new CancellationTokenSource(delay.Add(TimeSpan.FromSeconds(1)));
sw.Start();
var delayedTask = DelayedTask.Run(action, delay);
var delayedTask = DelayedTask.Run(Action, delay);
await Task.Delay(50);
bool isSuccess = delayedTask.ExecutePending();
SpinWait.SpinUntil(() => executionCount > 0 || cts.IsCancellationRequested);
@@ -197,8 +197,8 @@ namespace UnitTests.Common.Utilities
// arrange
int executionCount = 0;
var delay = TimeSpan.FromMilliseconds(100);
var action = () => { executionCount++; };
var delayedTask = DelayedTask.Create(action, delay);
void Action() { executionCount++; }
var delayedTask = DelayedTask.Create(Action, delay);
// act
delayedTask.Reset();
@@ -219,10 +219,10 @@ namespace UnitTests.Common.Utilities
{
// arrange
var delay = TimeSpan.FromMilliseconds(100);
var action = () => { throw new Exception("TEST :D"); };
static void Action() { throw new Exception("TEST :D"); }
// act
var delayedTask = DelayedTask.Run(action, delay);
var delayedTask = DelayedTask.Run(Action, delay);
var awaiter = delayedTask.GetAwaiter();
SpinWait.SpinUntil(() => awaiter.IsCompleted);
@@ -240,15 +240,12 @@ namespace UnitTests.Common.Utilities
// arrange
string exceptionText = null;
var delay = TimeSpan.FromMilliseconds(100);
var action = () => { throw new Exception("TEST :D"); };
var exceptionHandler = (Exception ex) =>
{
exceptionText = ex.Message;
};
void Action() { throw new Exception("TEST :D"); }
void ExceptionHandler(Exception ex) { exceptionText = ex.Message; }
// act
var delayedTask = DelayedTask.Run(action, delay)
.WithExceptionHandler(exceptionHandler);
var delayedTask = DelayedTask.Run(Action, delay)
.WithExceptionHandler(ExceptionHandler);
var awaiter = delayedTask.GetAwaiter();
SpinWait.SpinUntil(() => awaiter.IsCompleted);
@@ -267,8 +264,8 @@ namespace UnitTests.Common.Utilities
// arrange
int executionCount = 0;
var delay = TimeSpan.FromMilliseconds(100);
var action = () => { executionCount++; };
var delayedTask = DelayedTask.Create(action, delay);
void Action() { executionCount++; }
var delayedTask = DelayedTask.Create(Action, delay);
// act
delayedTask.Reset();

View File

@@ -1,5 +1,4 @@
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using AMWD.Common.Utilities;
@@ -17,11 +16,11 @@ namespace UnitTests.Common.Utilities
// arrange
int executionCount = 0;
var delay = TimeSpan.FromMilliseconds(100);
var function = () => { executionCount++; return new[] { 42, 21 }; };
int[] Function() { executionCount++; return [42, 21]; }
// act
var cts = new CancellationTokenSource(delay.Add(TimeSpan.FromSeconds(1)));
var delayedTaskWithResult = DelayedTask.Create(function, delay);
var delayedTaskWithResult = DelayedTask.Create(Function, delay);
SpinWait.SpinUntil(() => executionCount > 0 || cts.IsCancellationRequested);
// assert
@@ -34,15 +33,16 @@ namespace UnitTests.Common.Utilities
}
[TestMethod]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1861")]
public async Task ShouldCreateNewDelayedTaskStarting()
{
// arrange
int executionCount = 0;
var delay = TimeSpan.FromMilliseconds(100);
var function = () => { executionCount++; return new[] { 42, 21 }; };
int[] Function() { executionCount++; return [42, 21]; }
// act
var delayedTaskWithResult = DelayedTask.Run(function, delay);
var delayedTaskWithResult = DelayedTask.Run(Function, delay);
int[] result = await delayedTaskWithResult;
// assert
@@ -61,11 +61,11 @@ namespace UnitTests.Common.Utilities
// arrange
var delay = TimeSpan.FromMilliseconds(100);
#pragma warning disable CS0162 // Unreachable Code detected.
var function = () => { throw new Exception("TEST :D"); return new[] { 42, 21 }; };
static int[] Function() { throw new Exception("TEST :D"); return [42, 21]; }
#pragma warning restore CS0162 // Unreachable Code detected
// act
var delayedTaskWithResult = DelayedTask.Run(function, delay);
var delayedTaskWithResult = DelayedTask.Run(Function, delay);
var awaiter = delayedTaskWithResult.GetAwaiter();
SpinWait.SpinUntil(() => awaiter.IsCompleted);
@@ -84,16 +84,13 @@ namespace UnitTests.Common.Utilities
string exceptionText = null;
var delay = TimeSpan.FromMilliseconds(100);
#pragma warning disable CS0162 // Unreachable Code detected.
var function = () => { throw new Exception("TEST :D"); return new[] { 42, 21 }; };
static int[] Function() { throw new Exception("TEST :D"); return [42, 21]; }
#pragma warning restore CS0162 // Unreachable Code detected
var exceptionHandler = (Exception ex) =>
{
exceptionText = ex.Message;
};
void ExceptionHandler(Exception ex) { exceptionText = ex.Message; }
// act
var delayedTaskWithResult = DelayedTask.Run(function, delay)
.WithExceptionHandler(exceptionHandler);
var delayedTaskWithResult = DelayedTask.Run(Function, delay)
.WithExceptionHandler(ExceptionHandler);
var awaiter = delayedTaskWithResult.GetAwaiter();
SpinWait.SpinUntil(() => awaiter.IsCompleted);
@@ -107,13 +104,14 @@ namespace UnitTests.Common.Utilities
}
[TestMethod]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1861")]
public async Task ShouldReturnNormalTask()
{
// arrange
int executionCount = 0;
var delay = TimeSpan.FromMilliseconds(100);
var function = () => { executionCount++; return new[] { 42, 21 }; };
var delayedTaskWithResult = DelayedTask.Create(function, delay);
int[] Function() { executionCount++; return [42, 21]; }
var delayedTaskWithResult = DelayedTask.Create(Function, delay);
// act
delayedTaskWithResult.Reset();

View File

@@ -7,11 +7,11 @@ namespace UnitTests.Common.Utils
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
internal class CryptographyHelperSaltMock : IDisposable
{
private readonly int saltLength;
private readonly int _saltLength;
private CryptographyHelperSaltMock(int saltLength)
{
this.saltLength = typeof(CryptographyHelper).AsDynamicType().saltLength;
_saltLength = typeof(CryptographyHelper).AsDynamicType()._saltLength;
SetSaltLength(saltLength);
}
@@ -19,9 +19,9 @@ namespace UnitTests.Common.Utils
=> new CryptographyHelperSaltMock(saltLength);
public void Dispose()
=> SetSaltLength(saltLength);
=> SetSaltLength(_saltLength);
private static void SetSaltLength(int length)
=> typeof(CryptographyHelper).AsDynamicType().saltLength = length;
=> typeof(CryptographyHelper).AsDynamicType()._saltLength = length;
}
}

View File

@@ -4,13 +4,8 @@ namespace UnitTests.Common.Utils
{
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
internal class CustomMultipleAttribute : Attribute
internal class CustomMultipleAttribute(string name) : Attribute
{
public CustomMultipleAttribute(string name)
{
Name = name;
}
public string Name { get; set; }
public string Name { get; set; } = name;
}
}

View File

@@ -33,18 +33,21 @@ namespace UnitTests.Common.Utils
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
internal class JsonErrorClass
{
private int? number;
private int? _number;
public int Number
{
get
{
if (number.HasValue)
return number.Value;
if (_number.HasValue)
return _number.Value;
throw new Exception("Null value");
}
set { number = value; }
set
{
_number = value;
}
}
}
}

View File

@@ -6,11 +6,11 @@ namespace UnitTests.Common.Utils
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
internal class TimeZoneInfoLocalMock : IDisposable
{
private readonly TimeZoneInfo localTimeZoneInfo;
private readonly TimeZoneInfo _localTimeZoneInfo;
private TimeZoneInfoLocalMock(TimeZoneInfo timeZoneInfo)
{
localTimeZoneInfo = TimeZoneInfo.Local;
_localTimeZoneInfo = TimeZoneInfo.Local;
SetLocalTimeZone(timeZoneInfo);
}
@@ -18,7 +18,7 @@ namespace UnitTests.Common.Utils
=> new TimeZoneInfoLocalMock(mockTimeZoneInfo);
public void Dispose()
=> SetLocalTimeZone(localTimeZoneInfo);
=> SetLocalTimeZone(_localTimeZoneInfo);
private static void SetLocalTimeZone(TimeZoneInfo timeZoneInfo)
=> typeof(TimeZoneInfo).AsDynamicType().s_cachedData._localTimeZone = timeZoneInfo;

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<IsPackable>false</IsPackable>
<CollectCoverage>true</CollectCoverage>
<GenerateDocumentationFile>false</GenerateDocumentationFile>