public void SynchronousFunc()
    {
        Skip.IfNot(OperatingSystem.IsWindows(), "Windows Only");
        if (!OperatingSystem.IsWindows())
        {
            return;
        }
        Skip.If(string.IsNullOrWhiteSpace(_settings.User), "No credentials in User Secrets");
        Skip.If(string.IsNullOrWhiteSpace(_settings.Password), "No credentials in User Secrets");
        Skip.If(string.IsNullOrWhiteSpace(_settings.Domain), "No credentials in User Secrets");

        // arrange
        var loggerMock = new Mock <ILogger <WindowsImpersonator> >();
        var loggerObj  = loggerMock.Object;
        var imp        = new WindowsImpersonator(loggerObj);

        var original = WindowsIdentity.GetCurrent().Name;

        // act
        var result = imp.Execute(_settings, () => !OperatingSystem.IsWindows() ? null : WindowsIdentity.GetCurrent().Name);

        // assert
        result.ShouldBe($"{_settings.Domain}\\{_settings.User}");

        loggerMock.Verify(m => m.Log(LogLevel.Debug, 0,
                                     It.Is <It.IsAnyType>((obj, t) => obj.ToString() == $"Before impersonation: {original}"),
                                     null, (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()));
        loggerMock.Verify(m => m.Log(LogLevel.Trace, 0,
                                     It.Is <It.IsAnyType>((obj, t) => obj.ToString() == "Setting up for impersonation"),
                                     null, (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()));
        loggerMock.VerifyNoOtherCalls();
    }
    public async Task AsynchronousAction()
    {
        Skip.IfNot(OperatingSystem.IsWindows(), "Windows Only");
        if (!OperatingSystem.IsWindows())
        {
            return;
        }
        Skip.If(string.IsNullOrWhiteSpace(_settings.User), "No credentials in User Secrets");
        Skip.If(string.IsNullOrWhiteSpace(_settings.Password), "No credentials in User Secrets");
        Skip.If(string.IsNullOrWhiteSpace(_settings.Domain), "No credentials in User Secrets");

        // arrange
        var loggerMock = new Mock <ILogger <WindowsImpersonator> >();
        var loggerObj  = loggerMock.Object;
        var imp        = new WindowsImpersonator(loggerObj);

        var original = WindowsIdentity.GetCurrent().Name;

        // act
        await imp.ExecuteAsync(_settings, () =>
        {
            if (!OperatingSystem.IsWindows())
            {
                return(Task.CompletedTask);
            }

            loggerObj.LogInformation("Testing as: {Identity}", WindowsIdentity.GetCurrent().Name);
            return(Task.CompletedTask);
        });

        // assert
        loggerMock.Verify(m => m.Log(LogLevel.Information, 0,
                                     It.Is <It.IsAnyType>((obj, t) => obj.ToString() == $"Testing as: {_settings.Domain}\\{_settings.User}"),
                                     null, (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()));
        loggerMock.Verify(m => m.Log(LogLevel.Debug, 0,
                                     It.Is <It.IsAnyType>((obj, t) => obj.ToString() == $"Before impersonation: {original}"),
                                     null, (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()));
        loggerMock.Verify(m => m.Log(LogLevel.Debug, 0,
                                     It.Is <It.IsAnyType>((obj, t) => obj.ToString() == $"After impersonation: {original}"),
                                     null, (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()));
        loggerMock.Verify(m => m.Log(LogLevel.Trace, 0,
                                     It.Is <It.IsAnyType>((obj, t) => obj.ToString() == "Setting up for impersonation"),
                                     null, (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()));
        loggerMock.VerifyNoOtherCalls();
    }