From ddf5bd3b34175111fe76b718fdea1b0dc69b8453 Mon Sep 17 00:00:00 2001 From: Anton Moldovan Date: Tue, 28 Feb 2023 11:22:50 +0200 Subject: [PATCH] #546 Extend LoggerExt to support Info, Warn, Error, Fatal log level (#547) --- src/NBomber/Extensions/Internal.fs | 59 +--------- src/NBomber/Infra/Dependency.fs | 83 +++++++++++--- .../ExtensionsTests.fs | 101 ------------------ .../NBomber.IntegrationTests.fsproj | 1 - 4 files changed, 72 insertions(+), 172 deletions(-) delete mode 100644 tests/NBomber.IntegrationTests/ExtensionsTests.fs diff --git a/src/NBomber/Extensions/Internal.fs b/src/NBomber/Extensions/Internal.fs index e262ad78..fd5f2c2a 100644 --- a/src/NBomber/Extensions/Internal.fs +++ b/src/NBomber/Extensions/Internal.fs @@ -2,9 +2,7 @@ namespace NBomber.Extensions open System open System.Collections.Generic -open System.Diagnostics open System.Text -open System.Threading.Tasks open FSharp.Json open FsToolkit.ErrorHandling @@ -24,62 +22,7 @@ module internal Internal = let inline round (digits: int) (value: float) = Math.Round(value, digits) let inline roundDuration (duration: TimeSpan) = - TimeSpan(duration.Days, duration.Hours, duration.Minutes, duration.Seconds) - - type Operation = - - static member retry (retryCount: int, getResult: unit -> Task>) = backgroundTask { - let mutable counter = 1 - let mutable result = Unchecked.defaultof<_> - let! r = getResult() - result <- r - - while Result.isError result && counter < retryCount do - counter <- counter + 1 - let! r = getResult() - result <- r - - return result - } - - static member retryDuring (duration: TimeSpan, getResult: unit -> Task>) = - Operation.retryDuring(duration, None, getResult) - - static member retryDuring (duration: TimeSpan, - retryDelay: TimeSpan, - getResult: unit -> Task>, - ?shouldRetry: Result<'T,'E> -> bool) = - - Operation.retryDuring(duration, Some retryDelay, getResult, ?shouldRetry = shouldRetry) - - static member private retryDuring (duration: TimeSpan, - retryDelay: TimeSpan option, - getResult: unit -> Task>, - ?shouldRetry: Result<'T,'E> -> bool) = backgroundTask { - let shouldContinue = - shouldRetry - |> Option.defaultValue(fun _ -> true) - - let stopwatch = Stopwatch() - stopwatch.Start() - - let mutable result = Unchecked.defaultof<_> - let! r = getResult() - result <- r - - while Result.isError result - && shouldContinue result - && stopwatch.Elapsed < duration do - - if retryDelay.IsSome then - do! Task.Delay retryDelay.Value - - let! r = getResult() - result <- r - - stopwatch.Stop() - return result - } + TimeSpan(duration.Days, duration.Hours, duration.Minutes, duration.Seconds) module JsonExt = diff --git a/src/NBomber/Infra/Dependency.fs b/src/NBomber/Infra/Dependency.fs index 69783dbd..ab6fc863 100644 --- a/src/NBomber/Infra/Dependency.fs +++ b/src/NBomber/Infra/Dependency.fs @@ -28,41 +28,100 @@ type internal IGlobalDependency = [] type internal LogExt = - + [] static member LogInfo(dep: IGlobalDependency, msg) = dep.ConsoleLogger.Information msg - dep.Logger.Information msg - + dep.Logger.Information msg + [] static member LogInfo(dep: IGlobalDependency, msg, []propertyValues: obj[]) = dep.ConsoleLogger.Information(msg, propertyValues) dep.Logger.Information(msg, propertyValues) - + + [] + static member LogWarn(dep: IGlobalDependency, msg) = + dep.ConsoleLogger.Warning msg + dep.Logger.Warning msg + [] static member LogWarn(dep: IGlobalDependency, msg, []propertyValues: obj[]) = dep.ConsoleLogger.Warning(msg, propertyValues) - dep.Logger.Warning(msg, propertyValues) - + dep.Logger.Warning(msg, propertyValues) + + [] + static member LogWarn(dep: IGlobalDependency, ex: exn, msg) = + if dep.Logger.IsEnabled LogEventLevel.Verbose then + dep.ConsoleLogger.Warning(ex, msg) + else + dep.ConsoleLogger.Warning(msg) + + dep.Logger.Warning(ex, msg) + [] static member LogWarn(dep: IGlobalDependency, ex: exn, msg, []propertyValues: obj[]) = - dep.ConsoleLogger.Warning(ex, msg, propertyValues) + if dep.Logger.IsEnabled LogEventLevel.Verbose then + dep.ConsoleLogger.Warning(ex, msg, propertyValues) + else + dep.ConsoleLogger.Warning(msg, propertyValues) + dep.Logger.Warning(ex, msg, propertyValues) - + [] static member LogError(dep: IGlobalDependency, msg) = dep.ConsoleLogger.Error msg dep.Logger.Error msg - + + [] + static member LogError(dep: IGlobalDependency, msg, []propertyValues: obj[]) = + dep.ConsoleLogger.Error(msg, propertyValues) + dep.Logger.Error(msg, propertyValues) + [] static member LogError(dep: IGlobalDependency, ex: exn, msg) = - dep.ConsoleLogger.Error(ex, msg) + if dep.Logger.IsEnabled LogEventLevel.Verbose then + dep.ConsoleLogger.Error(ex, msg) + else + dep.ConsoleLogger.Error msg + dep.Logger.Error(ex, msg) - + [] static member LogError(dep: IGlobalDependency, ex: exn, msg, []propertyValues: obj[]) = - dep.ConsoleLogger.Error(ex, msg, propertyValues) + if dep.Logger.IsEnabled LogEventLevel.Verbose then + dep.ConsoleLogger.Error(ex, msg, propertyValues) + else + dep.ConsoleLogger.Error(msg, propertyValues) + dep.Logger.Error(ex, msg, propertyValues) + + [] + static member LogFatal(dep: IGlobalDependency, msg) = + dep.ConsoleLogger.Fatal msg + dep.Logger.Fatal msg + + [] + static member LogFatal(dep: IGlobalDependency, msg, []propertyValues: obj[]) = + dep.ConsoleLogger.Fatal(msg, propertyValues) + dep.Logger.Fatal(msg, propertyValues) + + [] + static member LogFatal(dep: IGlobalDependency, ex: exn, msg) = + if dep.Logger.IsEnabled LogEventLevel.Verbose then + dep.ConsoleLogger.Fatal(ex, msg) + else + dep.ConsoleLogger.Fatal msg + + dep.Logger.Fatal(ex, msg) + + [] + static member LogFatal(dep: IGlobalDependency, ex: exn, msg, []propertyValues: obj[]) = + if dep.Logger.IsEnabled LogEventLevel.Verbose then + dep.ConsoleLogger.Fatal(ex, msg, propertyValues) + else + dep.ConsoleLogger.Fatal(msg, propertyValues) + + dep.Logger.Fatal(ex, msg, propertyValues) module internal Logger = diff --git a/tests/NBomber.IntegrationTests/ExtensionsTests.fs b/tests/NBomber.IntegrationTests/ExtensionsTests.fs deleted file mode 100644 index fb4a2160..00000000 --- a/tests/NBomber.IntegrationTests/ExtensionsTests.fs +++ /dev/null @@ -1,101 +0,0 @@ -module Tests.Extensions - -open System -open System.Diagnostics -open System.Threading - -open Xunit -open Swensen.Unquote -open FsCheck -open FsCheck.Xunit -open FsToolkit.ErrorHandling - -open NBomber -open NBomber.Extensions.Internal - -[] -let ``String concatWithComma should concat strings with comma`` () = - Assert.Equal("foo, bar, baz", ["foo"; "bar"; "baz"] |> String.concatWithComma) - Assert.Equal("foo", ["foo"] |> String.concatWithComma) - Assert.Equal("", [] |> String.concatWithComma) - -[] -let ``Operation retry should work correctly`` () = - - let retryCount = 5 - let mutable counter1 = 0 - let mutable counter2 = 0 - - // simulate Ok case - let result1 = Operation.retry(retryCount, fun () -> backgroundTask { - if counter1 < 3 then - counter1 <- counter1 + 1 - return Error "" - else - return Ok() - }) - result1.Wait() - - // simulate Error case - let result2 = Operation.retry(retryCount, fun () -> backgroundTask { - counter2 <- counter2 + 1 - return Error "" - }) - result2.Wait() - - test <@ Result.isOk result1.Result @> - test <@ Result.isError result2.Result @> - test <@ counter1 = 3 @> - test <@ counter2 = 5 @> - -[] -let ``Operation retryDuring should work correctly`` () = - - let duration = seconds 5 - let retryDelay = milliseconds 100 - let mutable counter1 = 0 - let mutable counter2 = 0 - let stopwatch = Stopwatch() - - // simulate Ok case - stopwatch.Start() - let result1 = Operation.retryDuring(duration, retryDelay, fun () -> backgroundTask { - if counter1 < 3 then - counter1 <- counter1 + 1 - return Error "" - else - return Ok() - }) - result1.Wait() - stopwatch.Stop() - let stw1Time = stopwatch.Elapsed // should be < 2sec - - // simulate Error case - stopwatch.Restart() - let result2 = Operation.retryDuring(duration, retryDelay, fun () -> backgroundTask { - return Error "" - }) - result2.Wait() - stopwatch.Stop() - let stw2Time = stopwatch.Elapsed // should be ~= 5sec - - // simulate EarlyReturn case - let result3 = Operation.retryDuring(duration, retryDelay, - getResult = fun () -> backgroundTask { - counter2 <- counter2 + 1 - return Error 5 - }, - shouldRetry = function - | Ok _ -> false - | Error value when value = 5 -> false // should return early - | Error _ -> true - ) - result3.Wait() - - let stw2Time = stopwatch.Elapsed // should be ~= 5sec - - test <@ Result.isOk result1.Result @> - test <@ Result.isError result2.Result @> - test <@ stw1Time < seconds 2 @> - test <@ stw2Time >= seconds 5 @> - test <@ counter2 = 1 @> diff --git a/tests/NBomber.IntegrationTests/NBomber.IntegrationTests.fsproj b/tests/NBomber.IntegrationTests/NBomber.IntegrationTests.fsproj index ef53b8c4..b973842b 100644 --- a/tests/NBomber.IntegrationTests/NBomber.IntegrationTests.fsproj +++ b/tests/NBomber.IntegrationTests/NBomber.IntegrationTests.fsproj @@ -7,7 +7,6 @@ - PreserveNewest