Skip to content

Commit

Permalink
- separated Response API for F# and C#
Browse files Browse the repository at this point in the history
- moved Response.API to NBomber project
  • Loading branch information
AntyaDev committed Nov 2, 2022
1 parent 6006cbb commit 824134b
Show file tree
Hide file tree
Showing 16 changed files with 176 additions and 28 deletions.
4 changes: 2 additions & 2 deletions examples/CSharpDev/Features/CustomSettings/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"ScenariosSettings": [
{
"ScenarioName": "my_scenario",
"WarmUpDuration": "00:00:00",
"WarmUpDuration": "00:00:05",

"LoadSimulationsSettings": [
{ "RampConstant": [10, "00:00:05"] },
Expand All @@ -25,7 +25,7 @@
],

"ReportFileName": "my_report_name",
"ReportFolder": "./my_reports",
"ReportFolder": "./reports",
"ReportFormats": [ "Html", "Md", "Txt", "Csv" ]
}
}
1 change: 0 additions & 1 deletion examples/CSharpDev/HelloWorld/EmptyScenario.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using System.Threading.Tasks;
using NBomber.Contracts;
using NBomber.CSharp;

namespace CSharpDev.HelloWorld;
Expand Down
3 changes: 1 addition & 2 deletions examples/CSharpDev/HelloWorld/HelloWorldExample.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using System.Threading.Tasks;
using NBomber.Contracts;
using NBomber.CSharp;

namespace CSharpDev.HelloWorld;
Expand All @@ -16,7 +15,7 @@ public void Run()
// NBomber will measure how much time it takes to execute your logic
await Task.Delay(1000);

return Response.Ok(statusCode: "200", sizeBytes: 1000);
return Response.Ok();
})
.WithoutWarmUp()
.WithLoadSimulations(
Expand Down
3 changes: 1 addition & 2 deletions examples/CSharpDev/HelloWorld/ParallelScenarios.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using System.Threading.Tasks;
using NBomber.Contracts;
using NBomber.CSharp;

namespace CSharpDev.HelloWorld;
Expand All @@ -12,7 +11,7 @@ public void Run()
var scenario1 = Scenario.Create("scenario_1", async context =>
{
await Task.Delay(1000);
return Response.Ok(statusCode: "300", sizeBytes: 1000);
return Response.Ok(statusCode: "200", sizeBytes: 1000);
})
.WithoutWarmUp()
.WithLoadSimulations(
Expand Down
3 changes: 2 additions & 1 deletion examples/CSharpDev/HelloWorld/ScenarioWithInit.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using System.Threading.Tasks;
using NBomber.Contracts;
using NBomber.CSharp;

namespace CSharpDev.HelloWorld;
Expand All @@ -18,11 +17,13 @@ public void Run()
.WithLoadSimulations(Simulation.KeepConstant(copies: 1, during: TimeSpan.FromSeconds(10)))
.WithInit(context =>
{
// You can do here any initialization logic: populate the database, etc.
context.Logger.Information("MY INIT");
return Task.CompletedTask;
})
.WithClean(context =>
{
// You can do here any cleaning logic: clearing the database, etc.
context.Logger.Information("MY CLEAN");
return Task.CompletedTask;
});
Expand Down
1 change: 0 additions & 1 deletion examples/CSharpDev/HelloWorld/ScenarioWithStepRetry.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using System.Threading.Tasks;
using NBomber.Contracts;
using NBomber.CSharp;

namespace CSharpDev.HelloWorld;
Expand Down
1 change: 0 additions & 1 deletion examples/CSharpDev/HelloWorld/ScenarioWithSteps.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using System.Threading.Tasks;
using NBomber.Contracts;
using NBomber.CSharp;

namespace CSharpDev.HelloWorld;
Expand Down
1 change: 0 additions & 1 deletion examples/CSharpDev/HelloWorld/ScenarioWithTimeout.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using NBomber.Contracts;
using NBomber.CSharp;

namespace CSharpDev.HelloWorld;
Expand Down
5 changes: 2 additions & 3 deletions examples/CSharpDev/Http/SimpleHttpTest.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using System.Net.Http;
using NBomber.Contracts;
using NBomber.CSharp;

namespace CSharpDev.Http;
Expand All @@ -15,8 +14,8 @@ public void Run()
{
var httpResponse = await httpClient.GetAsync("https://nbomber.com");
return httpResponse.IsSuccessStatusCode
? Response.Ok()
: Response.Fail();
? Response.Ok(statusCode: httpResponse.StatusCode.ToString())
: Response.Fail(statusCode: httpResponse.StatusCode.ToString());
})
.WithoutWarmUp()
.WithLoadSimulations(
Expand Down
5 changes: 3 additions & 2 deletions examples/CSharpDev/Mqtt/SimpleMqttTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
using MQTTnet.Client;
using MQTTnet.Client.Connecting;
using MQTTnet.Client.Options;
using NBomber.Contracts;
using NBomber.CSharp;

namespace CSharpDev.Mqtt;
Expand All @@ -31,7 +30,9 @@ public void Run()
return result.ResultCode == MqttClientConnectResultCode.Success
? Response.Ok()
: Response.Fail(
$"MQTT connection code is: {result.ResultCode}, reason: {result.ReasonString}");
statusCode: MqttClientConnectResultCode.Success.ToString(),
message: $"MQTT connection code is: {result.ResultCode}, reason: {result.ReasonString}"
);
});

var subscribe = await Step.Run("subscribe", ctx, async () =>
Expand Down
88 changes: 88 additions & 0 deletions src/NBomber/Api/CSharp.fs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,94 @@ open NBomber
open NBomber.Contracts
open NBomber.Contracts.Stats

type Response() =

static let _okEmpty = { StatusCode = ""; IsError = false; SizeBytes = 0; Message = ""; LatencyMs = 0; Payload = None }
static let _failEmpty = { StatusCode = ""; IsError = true; SizeBytes = 0; Message = ""; LatencyMs = 0; Payload = None }

static member Ok() = _okEmpty
static member Fail() = _failEmpty

static member Ok(
[<Optional;DefaultParameterValue("")>] statusCode: string,
[<Optional;DefaultParameterValue(0)>] sizeBytes: int,
[<Optional;DefaultParameterValue("")>] message: string,
[<Optional;DefaultParameterValue(0.0)>] latencyMs: float) : Response<obj> =

{ StatusCode = statusCode
IsError = false
SizeBytes = sizeBytes
Message = if isNull message then String.Empty else message
LatencyMs = latencyMs
Payload = None }

static member Ok<'T>(
[<Optional;DefaultParameterValue("")>] statusCode: string,
[<Optional;DefaultParameterValue(0)>] sizeBytes: int,
[<Optional;DefaultParameterValue("")>] message: string,
[<Optional;DefaultParameterValue(0.0)>] latencyMs: float) : Response<'T> =

{ StatusCode = statusCode
IsError = false
SizeBytes = sizeBytes
Message = if isNull message then String.Empty else message
LatencyMs = latencyMs
Payload = None }

static member Ok<'T>(
payload: 'T,
[<Optional;DefaultParameterValue("")>] statusCode: string,
[<Optional;DefaultParameterValue(0)>] sizeBytes: int,
[<Optional;DefaultParameterValue("")>] message: string,
[<Optional;DefaultParameterValue(0.0)>] latencyMs: float) : Response<'T> =

{ StatusCode = statusCode
IsError = false
SizeBytes = sizeBytes
Message = if isNull message then String.Empty else message
LatencyMs = latencyMs
Payload = Some payload }

static member Fail(
[<Optional;DefaultParameterValue("")>] statusCode: string,
[<Optional;DefaultParameterValue("")>] message: string,
[<Optional;DefaultParameterValue(0)>] sizeBytes: int,
[<Optional;DefaultParameterValue(0.0)>] latencyMs: float) : Response<obj> =

{ StatusCode = statusCode
IsError = true
SizeBytes = sizeBytes
Message = if isNull message then String.Empty else message
LatencyMs = latencyMs
Payload = None }

static member Fail<'T>(
[<Optional;DefaultParameterValue("")>] statusCode: string,
[<Optional;DefaultParameterValue("")>] message: string,
[<Optional;DefaultParameterValue(0)>] sizeBytes: int,
[<Optional;DefaultParameterValue(0.0)>] latencyMs: float) : Response<'T> =

{ StatusCode = statusCode
IsError = true
SizeBytes = sizeBytes
Message = if isNull message then String.Empty else message
LatencyMs = latencyMs
Payload = None }

static member Fail<'T>(
payload: 'T,
[<Optional;DefaultParameterValue("")>] statusCode: string,
[<Optional;DefaultParameterValue("")>] message: string,
[<Optional;DefaultParameterValue(0)>] sizeBytes: int,
[<Optional;DefaultParameterValue(0.0)>] latencyMs: float) : Response<'T> =

{ StatusCode = statusCode
IsError = true
SizeBytes = sizeBytes
Message = if isNull message then String.Empty else message
LatencyMs = latencyMs
Payload = Some payload }

/// Step represents a single user action like login, logout, etc.
type Step =

Expand Down
36 changes: 36 additions & 0 deletions src/NBomber/Api/FSharp.fs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,42 @@ open NBomber.Errors
open NBomber.Domain.ScenarioContext
open NBomber.DomainServices

type Response() =

static let _okEmpty = { StatusCode = ""; IsError = false; SizeBytes = 0; Message = ""; LatencyMs = 0; Payload = None }
static let _failEmpty = { StatusCode = ""; IsError = true; SizeBytes = 0; Message = ""; LatencyMs = 0; Payload = None }

static member ok () = _okEmpty
static member fail () = _failEmpty

static member ok<'T>(
?payload: 'T,
?statusCode: string,
?sizeBytes: int,
?message: string,
?latencyMs: float) =

{ StatusCode = statusCode |> Option.defaultValue ""
IsError = false
SizeBytes = sizeBytes |> Option.defaultValue 0
Message = message |> Option.defaultValue ""
LatencyMs = latencyMs |> Option.defaultValue 0
Payload = payload }

static member fail<'T>(
?statusCode: string,
?message: string,
?payload: 'T,
?sizeBytes: int,
?latencyMs: float) =

{ StatusCode = statusCode |> Option.defaultValue ""
IsError = true
SizeBytes = sizeBytes |> Option.defaultValue 0
Message = message |> Option.defaultValue ""
LatencyMs = latencyMs |> Option.defaultValue 0
Payload = payload }

/// Step represents a single user action like login, logout, etc.
[<RequireQualifiedAccess>]
type Step =
Expand Down
28 changes: 28 additions & 0 deletions src/NBomber/Contracts.fs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,9 @@ type NBomberContext = {

namespace NBomber.Contracts.Internal

open System
open CommandLine
open NBomber
open NBomber.Configuration
open NBomber.Contracts
open NBomber.Contracts.Stats
Expand Down Expand Up @@ -88,3 +90,29 @@ type SessionArgs = {

member this.GetScenariosSettings() = this.NBomberConfig.GlobalSettings.Value.ScenariosSettings.Value
member this.GetUseHintsAnalyzer() = this.NBomberConfig.GlobalSettings.Value.EnableHintsAnalyzer.Value

module internal ResponseInternal =

let emptyFail<'T> : Response<'T> =
{ StatusCode = ""
IsError = true
SizeBytes = 0
Message = String.Empty
LatencyMs = 0
Payload = None }

let failUnhandled<'T> (ex: Exception) : Response<'T> =
{ StatusCode = Constants.UnhandledExceptionCode
IsError = true
SizeBytes = 0
LatencyMs = 0
Message = ex.Message
Payload = None }

let failTimeout<'T> : Response<'T> =
{ StatusCode = Constants.TimeoutStatusCode
IsError = true
SizeBytes = 0
LatencyMs = 0
Message = "operation timeout"
Payload = None }
8 changes: 4 additions & 4 deletions src/NBomber/Domain/Scenario.fs
Original file line number Diff line number Diff line change
Expand Up @@ -188,8 +188,8 @@ let measure (name: string) (ctx: ScenarioContext) (run: IScenarioContext -> Task
let context = ctx :> IScenarioContext
context.Logger.Fatal(ex, $"Operation timeout for Scenario : {0}", context.ScenarioInfo.ScenarioName)

let error = Response.fail(message = "operation timeout", statusCode = Constants.TimeoutStatusCode)
let result = { Name = name; ClientResponse = error; EndTimeMs = endTime; LatencyMs = latency }
let response = ResponseInternal.failTimeout
let result = { Name = name; ClientResponse = response; EndTimeMs = endTime; LatencyMs = latency }
ctx.StatsActor.Publish(AddMeasurement result)

| ex ->
Expand All @@ -199,7 +199,7 @@ let measure (name: string) (ctx: ScenarioContext) (run: IScenarioContext -> Task
let context = ctx :> IScenarioContext
context.Logger.Fatal(ex, $"Unhandled exception for Scenario: {0}", context.ScenarioInfo.ScenarioName)

let error = Response.fail(ex, statusCode = Constants.UnhandledExceptionCode)
let result = { Name = name; ClientResponse = error; EndTimeMs = endTime; LatencyMs = latency }
let response = ResponseInternal.failUnhandled ex
let result = { Name = name; ClientResponse = response; EndTimeMs = endTime; LatencyMs = latency }
ctx.StatsActor.Publish(AddMeasurement result)
}
15 changes: 8 additions & 7 deletions src/NBomber/Domain/Step.fs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ module internal NBomber.Domain.Step

open System
open System.Threading.Tasks
open NBomber
open NBomber.Contracts
open NBomber.Contracts.Internal
open NBomber.Domain.ScenarioContext
Expand All @@ -27,10 +26,11 @@ let measure (name: string) (ctx: ScenarioContext) (run: unit -> Task<Response<'T
let context = ctx :> IScenarioContext
context.Logger.Fatal(ex, $"Operation timeout for Scenario: {0}, Step: {1}", context.ScenarioInfo.ScenarioName, name)

let error = Response.fail<'T>(message = "operation timeout", statusCode = Constants.TimeoutStatusCode)
let result = { Name = name; ClientResponse = error; EndTimeMs = endTime; LatencyMs = latency }
let response = ResponseInternal.failTimeout
let result = { Name = name; ClientResponse = response; EndTimeMs = endTime; LatencyMs = latency }

ctx.StatsActor.Publish(AddMeasurement result)
return error
return response

| ex ->
let endTime = ctx.Timer.Elapsed.TotalMilliseconds
Expand All @@ -39,8 +39,9 @@ let measure (name: string) (ctx: ScenarioContext) (run: unit -> Task<Response<'T
let context = ctx :> IScenarioContext
context.Logger.Fatal(ex, $"Unhandled exception for Scenario: {0}, Step: {1}", context.ScenarioInfo.ScenarioName, name)

let error = Response.fail<'T>(ex, statusCode = Constants.UnhandledExceptionCode)
let result = { Name = name; ClientResponse = error; EndTimeMs = endTime; LatencyMs = latency }
let response = ResponseInternal.failUnhandled ex
let result = { Name = name; ClientResponse = response; EndTimeMs = endTime; LatencyMs = latency }

ctx.StatsActor.Publish(AddMeasurement result)
return error
return response
}
2 changes: 1 addition & 1 deletion src/NBomber/NBomber.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="NBomber.Contracts" Version="[4.0.0-beta5]" />
<PackageReference Include="NBomber.Contracts" Version="[4.0.0-beta6]" />
<PackageReference Include="CommandLineParser" Version="2.8.0" />
<PackageReference Include="CsvHelper" Version="27.2.1" />
<PackageReference Include="FSharp.UMX" Version="1.1.0" />
Expand Down

0 comments on commit 824134b

Please sign in to comment.