Skip to content

Commit 8e4985f

Browse files
committed
Bombardier Insecure flag support, use content type support, refactorings and bug fixes
1 parent 4f27520 commit 8e4985f

File tree

8 files changed

+108
-32
lines changed

8 files changed

+108
-32
lines changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<Project>
22
<PropertyGroup>
3-
<Version>0.1.0</Version>
3+
<Version>0.1.1</Version>
44
</PropertyGroup>
55
</Project>
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using Newtonsoft.Json;
2+
using QAToolKit.Core.Models;
3+
using System.Collections.Generic;
4+
using System.IO;
5+
using System.Linq;
6+
using System.Threading.Tasks;
7+
using Xunit;
8+
9+
namespace QAToolKit.Engine.Bombardier.Test
10+
{
11+
public class BombardierTestsGeneratorTests
12+
{
13+
/* [Fact]
14+
public async Task BombardierTestWithoutOptionsTest_Successfull()
15+
{
16+
17+
var bombardierTestsGenerator = new BombardierTestsGenerator(options =>
18+
{
19+
options.BombardierConcurrentUsers = 1;
20+
options.BombardierDuration = 1;
21+
options.BombardierTimeout = 30;
22+
options.BombardierUseHttp2 = true;
23+
});
24+
25+
var content = File.ReadAllText("d:\\getPetById.json");
26+
var httpRequest = JsonConvert.DeserializeObject<IList<HttpTestRequest>>(content);
27+
28+
var bombardierTests = await bombardierTestsGenerator.Generate(httpRequest);
29+
30+
//Run Bombardier Tests
31+
var bombardierTestsRunner = new BombardierTestsRunner(bombardierTests.ToList(), options =>
32+
{
33+
options.ObfuscateAuthenticationHeader = true;
34+
});
35+
var bombardierResults = await bombardierTestsRunner.Run();
36+
37+
Assert.NotNull(bombardierResults);
38+
}*/
39+
}
40+
}

src/QAToolKit.Engine.Bombardier.Test/QAToolKit.Engine.Bombardier.Test.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,8 @@
1919
</PackageReference>
2020
</ItemGroup>
2121

22+
<ItemGroup>
23+
<ProjectReference Include="..\QAToolKit.Engine.Bombardier\QAToolKit.Engine.Bombardier.csproj" />
24+
</ItemGroup>
25+
2226
</Project>

src/QAToolKit.Engine.Bombardier.Test/UnitTest1.cs

Lines changed: 0 additions & 13 deletions
This file was deleted.

src/QAToolKit.Engine.Bombardier/BombardierGeneratorOptions.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@ public class BombardierGeneratorOptions
4545
/// </summary>
4646
public bool BombardierUseHttp2 { get; set; }
4747
/// <summary>
48+
/// Use http or https protocols, default is false.
49+
/// </summary>
50+
public bool BombardierInsecure { get; set; } = false;
51+
/// <summary>
52+
/// Set request body content type for Bombardier tests, default is 'application/json'
53+
/// </summary>
54+
public string BombardierBodyContentType { get; set; } = "application/json";
55+
/// <summary>
4856
/// What is the type of the test
4957
/// </summary>
5058
internal TestType TestType { get; } = TestType.LoadTest;

src/QAToolKit.Engine.Bombardier/BombardierTestsGenerator.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,20 @@ public async Task<IEnumerable<BombardierTest>> Generate(IList<HttpTestRequest> r
4848
bombardierFullPath = Path.Combine("./bombardier", "linux", "bombardier");
4949
}
5050

51-
foreach (var request in restRequests.Where(request => request.TestTypes.Contains(_bombardierGeneratorOptions.TestType)))
51+
foreach (var request in restRequests)
5252
{
5353
string authHeader = GeneratorHelper.GenerateAuthHeader(request, _bombardierGeneratorOptions);
5454

5555
scriptBuilder.AppendLine($"{bombardierFullPath} " +
5656
$"-m {request.Method.ToString().ToUpper()} {GeneratorHelper.GenerateUrlParameters(request)} " +
5757
$"-c {_bombardierGeneratorOptions.BombardierConcurrentUsers} " +
5858
$"{authHeader}" +
59-
$"{GeneratorHelper.GenerateContentTypeHeader(request)}" +
60-
$"{GeneratorHelper.GenerateJsonBody(request)}" +
59+
$"{GeneratorHelper.GenerateContentTypeHeader(request, _bombardierGeneratorOptions.BombardierBodyContentType)}" +
60+
$"{GeneratorHelper.GenerateJsonBody(request, _bombardierGeneratorOptions.BombardierBodyContentType)}" +
6161
$"--{(Convert.ToBoolean(_bombardierGeneratorOptions.BombardierUseHttp2) ? "http2" : "http1")} " +
6262
$"--timeout={_bombardierGeneratorOptions.BombardierTimeout}s " +
6363
$"--duration={_bombardierGeneratorOptions.BombardierDuration}s " +
64+
$"{GeneratorHelper.GenerateInsecureSwitch(_bombardierGeneratorOptions)}" +
6465
$"{GeneratorHelper.GenerateRateLimit(_bombardierGeneratorOptions.BombardierRateLimit)}");
6566

6667
bombardierTests.Add(new BombardierTest()

src/QAToolKit.Engine.Bombardier/Helpers/GeneratorHelper.cs

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Microsoft.AspNetCore.WebUtilities;
2+
using QAToolKit.Core.Helpers;
23
using QAToolKit.Core.Models;
34
using System;
45
using System.Collections.Generic;
@@ -22,26 +23,34 @@ internal static string GenerateRateLimit(int rateLimit)
2223
{
2324
return $"--rate={rateLimit}";
2425
}
25-
else
26-
{
27-
return "";
28-
}
26+
27+
return String.Empty;
2928
}
3029

3130
/// <summary>
3231
/// Generate content type header
3332
/// </summary>
3433
/// <param name="request"></param>
34+
/// <param name="useContentType"></param>
3535
/// <returns></returns>
36-
internal static string GenerateContentTypeHeader(HttpTestRequest request)
36+
internal static string GenerateContentTypeHeader(HttpTestRequest request, string useContentType)
3737
{
3838
if (request.Method == HttpMethod.Get)
3939
{
40-
return "";
40+
return String.Empty;
4141
}
4242
else
4343
{
44-
return "-H \"Content-Type: application/json\" ";
44+
var contentType = request.RequestBodies.FirstOrDefault(content => content.ContentType == useContentType);
45+
46+
if (contentType != null)
47+
{
48+
return $"-H \"Content-Type: {contentType.ContentType}\" ";
49+
}
50+
else
51+
{
52+
throw new Exception($"Content type header '{useContentType}' not found in the HttpTestRequest.");
53+
}
4554
}
4655
}
4756

@@ -52,8 +61,6 @@ internal static string GenerateContentTypeHeader(HttpTestRequest request)
5261
/// <returns></returns>
5362
internal static string GenerateUrlParameters(HttpTestRequest request)
5463
{
55-
var path = request.Path;
56-
5764
var queryParameters = new Dictionary<string, string>();
5865

5966
//add query parameters
@@ -62,27 +69,40 @@ internal static string GenerateUrlParameters(HttpTestRequest request)
6269
queryParameters.Add(parameter.Name, parameter.Value);
6370
}
6471

65-
return new Uri(new Uri(request.BasePath), QueryHelpers.AddQueryString(path, queryParameters)).ToString();
72+
var baseUrl = new Uri($"{request.BasePath}{request.Path}").ToString();
73+
var url = QueryHelpers.AddQueryString(baseUrl, queryParameters).ToString();
74+
75+
return url;
6676
}
6777

6878
/// <summary>
6979
/// Generate JSON body
7080
/// </summary>
7181
/// <param name="request"></param>
82+
/// <param name="useContentType"></param>
7283
/// <returns></returns>
73-
internal static string GenerateJsonBody(HttpTestRequest request)
84+
internal static string GenerateJsonBody(HttpTestRequest request, string useContentType)
7485
{
7586
if (request.Method == HttpMethod.Get)
7687
{
7788
return String.Empty;
7889
}
7990
else
8091
{
81-
if (request.RequestBody.Properties.Count > 0)
92+
var useRequest = request.RequestBodies.FirstOrDefault(content => content.ContentType == useContentType);
93+
94+
if (useRequest == null)
8295
{
83-
File.WriteAllText($"{request.RequestBody.Name}.json", JsonSerializer.Serialize(request.RequestBody.Properties));
96+
throw new Exception($"Request body content type '{useContentType}' not found in the HttpTestRequest.");
97+
}
8498

85-
return $"-f \"{request.RequestBody.Name}.json\" ";
99+
var fileName = $"{Guid.NewGuid()}.json";
100+
101+
if (useRequest.Properties.Count > 0)
102+
{
103+
File.WriteAllText(fileName, JsonSerializer.Serialize(useRequest.Properties));
104+
105+
return $"-f \"{fileName}\" ";
86106
}
87107
else
88108
{
@@ -91,6 +111,22 @@ internal static string GenerateJsonBody(HttpTestRequest request)
91111
}
92112
}
93113

114+
115+
/// <summary>
116+
/// Generate Insecure Bombardier switch
117+
/// </summary>
118+
/// <param name="bombardierOptions"></param>
119+
/// <returns></returns>
120+
public static string GenerateInsecureSwitch(BombardierGeneratorOptions bombardierOptions)
121+
{
122+
if (bombardierOptions.BombardierInsecure)
123+
{
124+
return "--insecure";
125+
}
126+
127+
return String.Empty;
128+
}
129+
94130
/// <summary>
95131
/// Generate Authentication header for HTTP request
96132
/// </summary>

src/QAToolKit.Engine.Bombardier/QAToolKit.Engine.Bombardier.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
<ItemGroup>
3434
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" />
35-
<PackageReference Include="QAToolKit.Core" Version="0.1.0" />
35+
<PackageReference Include="QAToolKit.Core" Version="0.1.1" />
3636
<PackageReference Include="System.Text.Json" Version="4.7.2" />
3737
</ItemGroup>
3838

0 commit comments

Comments
 (0)