Skip to content

Commit 9f293c8

Browse files
authored
Capturing Test run data from Developer Local Machines (#26)
* Working e2e on local with Tests * publish alpha pkg * add license to nuget * Add simple local load test we can use * fix commit * Changes for addins file to include in output * fix lint warning * remove local debugging * add optional get gitlab user id from piepline trigger
1 parent 3e6375e commit 9f293c8

18 files changed

+412
-8
lines changed

.github/workflows/manual-publish-release.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ jobs:
5454
needs: build
5555
name: Deploy Packages
5656
runs-on: ubuntu-latest
57-
if: github.ref == 'refs/heads/master'
5857
steps:
5958
- name: Download Package artifact
6059
uses: actions/download-artifact@master
@@ -79,6 +78,7 @@ jobs:
7978
release:
8079
needs: deploy
8180
runs-on: ubuntu-latest
81+
if: github.ref == 'refs/heads/master'
8282
steps:
8383
- name: Create Draft Release
8484
id: create_release

src/Agoda.Builds.Metrics/Agoda.Builds.Metrics.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
54
<TargetFrameworks>netstandard2.0;net472</TargetFrameworks>
65
<!-- Suppresses the warnings about the package not having assemblies in lib/*/.dll.-->
76
<NoPackageAnalysis>true</NoPackageAnalysis>
87
<!-- Change the default location where NuGet will put the build output -->
98
<BuildOutputTargetFolder>tasks</BuildOutputTargetFolder>
109
<!-- Include all referenced assemblies in the package -->
1110
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
11+
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
1212
</PropertyGroup>
1313
<ItemGroup>
1414
<PackageReference Include="Microsoft.Build.Framework" Version="15.1.1012" />

src/Agoda.DevFeedback.AspNetStartup/Agoda.DevFeedback.AspNetStartup.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFrameworks>net6.0;net7.0</TargetFrameworks>
5+
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
56
</PropertyGroup>
67

78
<ItemGroup>

src/Agoda.DevFeedback.Common/Agoda.DevFeedback.Common.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFramework>netstandard2.0</TargetFramework>
5+
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
56
</PropertyGroup>
67

78
<ItemGroup>

src/Agoda.DevFeedback.Common/DevFeedbackPublisher.cs

+33-4
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,56 @@ namespace Agoda.DevFeedback.Common
77
{
88
public static class DevFeedbackPublisher
99
{
10-
public static void Publish(string apiEndpoint, DevFeedbackData data)
10+
public static void Publish<T>(string apiEndpoint, T data)
1111
{
12+
Publish(apiEndpoint,data, DevLocalDataType.Build);
13+
}
14+
15+
public static void Publish<T>(string apiEndpoint, T data, DevLocalDataType devLocalDataType)
16+
{
17+
var targetEndpoint = string.Empty;
18+
switch (devLocalDataType)
19+
{
20+
case DevLocalDataType.Build:
21+
targetEndpoint = GetApiEndpoint(apiEndpoint);
22+
break;
23+
case DevLocalDataType.NUint:
24+
targetEndpoint = GetNunitApiEndpoint(apiEndpoint);
25+
break;
26+
default:
27+
throw new ArgumentOutOfRangeException(nameof(devLocalDataType), devLocalDataType, null);
28+
}
1229
using (var httpClient = new HttpClient())
1330
{
14-
httpClient.Timeout = TimeSpan.FromSeconds(10);
31+
httpClient.Timeout = TimeSpan.FromSeconds(2);
1532

1633
var content = new StringContent(JsonSerializer.Serialize(data), Encoding.UTF8, "application/json");
17-
var response = httpClient.PostAsync(GetApiEndpoint(apiEndpoint), content).Result;
34+
var response = httpClient.PostAsync(targetEndpoint, content).Result;
1835

1936
response.EnsureSuccessStatusCode();
2037
}
2138
}
2239

40+
private const string BASE_URL = "http://compilation-metrics/";
41+
//private const string BASE_URL = "http://localhost:5000/";
2342
static string GetApiEndpoint(string apiEndpoint)
2443
{
2544
if (string.IsNullOrEmpty(apiEndpoint))
2645
{
2746
apiEndpoint = Environment.GetEnvironmentVariable("BUILD_METRICS_ES_ENDPOINT");
2847
}
2948

30-
return string.IsNullOrEmpty(apiEndpoint) ? "http://compilation-metrics/dotnet" : apiEndpoint;
49+
return string.IsNullOrEmpty(apiEndpoint) ? $"{BASE_URL}dotnet" : apiEndpoint;
50+
}
51+
52+
static string GetNunitApiEndpoint(string apiEndpoint)
53+
{
54+
if (string.IsNullOrEmpty(apiEndpoint))
55+
{
56+
apiEndpoint = Environment.GetEnvironmentVariable("NUNIT_METRICS_ES_ENDPOINT");
57+
}
58+
59+
return string.IsNullOrEmpty(apiEndpoint) ? $"{BASE_URL}dotnet/nunit" : apiEndpoint;
3160
}
3261
}
3362
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Agoda.DevFeedback.Common
2+
{
3+
public enum DevLocalDataType
4+
{
5+
Build,
6+
NUint
7+
}
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net6.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
<ProjectReference Include="..\Agoda.Tests.Metrics.NUnit\Agoda.Tests.Metrics.NUnit.csproj" />
12+
</ItemGroup>
13+
<ItemGroup>
14+
<PackageReference Include="Agoda.Analyzers" Version="1.0.523">
15+
<PrivateAssets>all</PrivateAssets>
16+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
17+
</PackageReference>
18+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0" />
19+
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
20+
<PackageReference Include="NSubstitute" Version="4.2.2" />
21+
<PackageReference Include="nunit" Version="3.13.2" />
22+
<PackageReference Include="NUnit3TestAdapter" Version="4.1.0" />
23+
<PackageReference Include="Shouldly" Version="4.2.1" />
24+
</ItemGroup>
25+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System.Collections;
2+
using NUnit.Framework;
3+
4+
namespace Agoda.Tests.Metrics.NUnit.Tests;
5+
6+
public class LargeAmountOftestData
7+
{
8+
public static IEnumerable TestCases
9+
{
10+
get
11+
{
12+
for (var i = 1; i <= 1000; i++)
13+
{
14+
yield return new TestCaseData(i);
15+
}
16+
17+
}
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using NUnit.Framework;
2+
using Shouldly;
3+
4+
namespace Agoda.Tests.Metrics.NUnit.Tests;
5+
6+
[TestFixture]
7+
public class LoadTesting
8+
{
9+
[Test]
10+
[Ignore("Used only for local testing to verify performance")]
11+
[TestCaseSource(typeof(LargeAmountOftestData), nameof(LargeAmountOftestData.TestCases))]
12+
public void WhenHaveLargeAmountsOfTest_ShouldSendInBatches(int n)
13+
{
14+
n.ShouldBeGreaterThan(0);
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using NUnit.Framework;
2+
using Shouldly;
3+
4+
namespace Agoda.Tests.Metrics.NUnit.Tests;
5+
6+
[TestFixture]
7+
public class NUnitTestCaseConverterTests
8+
{
9+
[Test]
10+
public void WhenInitTestCaseConverter_ShouldPopulateListOfTestCasesCorrectly()
11+
{
12+
var report =
13+
@"<test-run id=""0"" name=""Agoda.TestingLib.Tests.dll"" fullname=""C:\source\TestNunitEvent\src\Agoda.TestingLib.Tests\bin\Debug\net6.0\Agoda.TestingLib.Tests.dll"" runstate=""Runnable"" testcasecount=""1"" result=""Passed"" total=""1"" passed=""1"" failed=""0"" warnings=""0"" inconclusive=""0"" skipped=""0"" asserts=""0"" engine-version=""3.15.3.0"" clr-version=""6.0.15"" start-time=""2023-03-26 05:43:46Z"" end-time=""2023-03-26 05:43:46Z"" duration=""0.085810"">
14+
<command-line><![CDATA[C:\Users\myUser\AppData\Local\JetBrains\Installations\ReSharperPlatformVs17_cfc2aae1\TestRunner\netcoreapp3.0\ReSharperTestRunner.dll --parentProcessId 38540 -p 61838 -r e2d19589-94d1-4168-b342-3b18129cc640]]></command-line>
15+
<filter>
16+
<id>0-1000</id>
17+
</filter>
18+
<test-suite type=""Assembly"" id=""0-1002"" name=""Agoda.TestingLib.Tests.dll"" fullname=""C:/source/TestNunitEvent/src/Agoda.TestingLib.Tests/bin/Debug/net6.0/Agoda.TestingLib.Tests.dll"" runstate=""Runnable"" testcasecount=""1"" result=""Passed"" start-time=""2023-03-26T05:43:46.8009450Z"" end-time=""2023-03-26T05:43:46.8464532Z"" duration=""0.045445"" total=""1"" passed=""1"" failed=""0"" warnings=""0"" inconclusive=""0"" skipped=""0"" asserts=""0"">
19+
<environment framework-version=""3.13.3.0"" clr-version=""6.0.15"" os-version=""Microsoft Windows 10.0.19044"" platform=""Win32NT"" cwd=""C:\source\TestNunitEvent\src\Agoda.TestingLib.Tests\bin\Debug\net6.0"" machine-name=""6TW24J3"" user=""jdickson"" user-domain=""AGODA"" culture=""en-AU"" uiculture=""en-US"" os-architecture=""x64"" />
20+
<settings>
21+
<setting name=""ProcessModel"" value=""InProcess"" />
22+
<setting name=""DomainUsage"" value=""None"" />
23+
<setting name=""ShadowCopyFiles"" value=""False"" />
24+
<setting name=""TestParametersDictionary"" value="""" />
25+
<setting name=""NumberOfTestWorkers"" value=""0"" />
26+
<setting name=""SynchronousEvents"" value=""False"" />
27+
<setting name=""RandomSeed"" value=""361791836"" />
28+
<setting name=""LOAD"" value=""System.Collections.Generic.List`1[System.String]"" />
29+
<setting name=""WorkDirectory"" value=""C:\source\TestNunitEvent\src\Agoda.TestingLib.Tests\bin\Debug\net6.0"" />
30+
</settings>
31+
<properties>
32+
<property name=""_PID"" value=""51400"" />
33+
<property name=""_APPDOMAIN"" value=""ReSharperTestRunner"" />
34+
</properties>
35+
<test-suite type=""TestSuite"" id=""0-1003"" name=""Agoda"" fullname=""Agoda"" runstate=""Runnable"" testcasecount=""1"" result=""Passed"" start-time=""2023-03-26T05:43:46.8069136Z"" end-time=""2023-03-26T05:43:46.8464495Z"" duration=""0.039535"" total=""1"" passed=""1"" failed=""0"" warnings=""0"" inconclusive=""0"" skipped=""0"" asserts=""0"">
36+
<test-suite type=""TestSuite"" id=""0-1004"" name=""TestingLib"" fullname=""Agoda.TestingLib"" runstate=""Runnable"" testcasecount=""1"" result=""Passed"" start-time=""2023-03-26T05:43:46.8072958Z"" end-time=""2023-03-26T05:43:46.8464463Z"" duration=""0.039150"" total=""1"" passed=""1"" failed=""0"" warnings=""0"" inconclusive=""0"" skipped=""0"" asserts=""0"">
37+
<test-suite type=""TestSuite"" id=""0-1005"" name=""Tests"" fullname=""Agoda.TestingLib.Tests"" runstate=""Runnable"" testcasecount=""1"" result=""Passed"" start-time=""2023-03-26T05:43:46.8073083Z"" end-time=""2023-03-26T05:43:46.8464343Z"" duration=""0.039127"" total=""1"" passed=""1"" failed=""0"" warnings=""0"" inconclusive=""0"" skipped=""0"" asserts=""0"">
38+
<test-suite type=""TestFixture"" id=""0-1000"" name=""UnitTest1"" fullname=""Agoda.TestingLib.Tests.UnitTest1"" classname=""Agoda.TestingLib.Tests.UnitTest1"" runstate=""Runnable"" testcasecount=""1"" result=""Passed"" start-time=""2023-03-26T05:43:46.8073115Z"" end-time=""2023-03-26T05:43:46.8460458Z"" duration=""0.038735"" total=""1"" passed=""1"" failed=""0"" warnings=""0"" inconclusive=""0"" skipped=""0"" asserts=""0"">
39+
<test-case id=""0-1001"" name=""1WhenOneIsOne_ItSHouldBeOne"" fullname=""Agoda.TestingLib.Tests.UnitTest1.1WhenOneIsOne_ItSHouldBeOne"" methodname=""WhenOneIsOne_ItSHouldBeOne"" classname=""Agoda.TestingLib.Tests.UnitTest1"" runstate=""Runnable"" seed=""396657978"" result=""Passed"" start-time=""2023-03-26T05:43:46.8096530Z"" end-time=""2023-03-26T05:43:46.8428099Z"" duration=""0.033255"" asserts=""0"" />
40+
<test-case id=""0-1002"" name=""2WhenOneIsOne_ItSHouldBeOne"" fullname=""Agoda.TestingLib.Tests.UnitTest1.2WhenOneIsOne_ItSHouldBeOne"" methodname=""WhenOneIsOne_ItSHouldBeOne"" classname=""Agoda.TestingLib.Tests.UnitTest1"" runstate=""Runnable"" seed=""396657978"" result=""Passed"" start-time=""2023-03-26T05:43:46.8096530Z"" end-time=""2023-03-26T05:43:46.8428099Z"" duration=""0.033255"" asserts=""0"" />
41+
</test-suite>
42+
</test-suite>
43+
<test-suite type=""TestSuite"" id=""0-1005"" name=""Tests"" fullname=""Agoda.TestingLib.Tests2"" runstate=""Runnable"" testcasecount=""1"" result=""Passed"" start-time=""2023-03-26T05:43:46.8073083Z"" end-time=""2023-03-26T05:43:46.8464343Z"" duration=""0.039127"" total=""1"" passed=""1"" failed=""0"" warnings=""0"" inconclusive=""0"" skipped=""0"" asserts=""0"">
44+
<test-suite type=""TestFixture"" id=""0-1000"" name=""UnitTest1"" fullname=""Agoda.TestingLib.Tests.UnitTest2"" classname=""Agoda.TestingLib.Tests.UnitTest1"" runstate=""Runnable"" testcasecount=""1"" result=""Passed"" start-time=""2023-03-26T05:43:46.8073115Z"" end-time=""2023-03-26T05:43:46.8460458Z"" duration=""0.038735"" total=""1"" passed=""1"" failed=""0"" warnings=""0"" inconclusive=""0"" skipped=""0"" asserts=""0"">
45+
<test-case id=""0-1003"" name=""3WhenOneIsOne_ItSHouldBeOne"" fullname=""Agoda.TestingLib.Tests.UnitTest2.3WhenOneIsOne_ItSHouldBeOne"" methodname=""WhenOneIsOne_ItSHouldBeOne"" classname=""Agoda.TestingLib.Tests.UnitTest1"" runstate=""Runnable"" seed=""396657978"" result=""Passed"" start-time=""2023-03-26T05:43:46.8096530Z"" end-time=""2023-03-26T05:43:46.8428099Z"" duration=""0.033255"" asserts=""0"" />
46+
<test-case id=""0-1004"" name=""4WhenOneIsOne_ItSHouldBeOne"" fullname=""Agoda.TestingLib.Tests.UnitTest2.4WhenOneIsOne_ItSHouldBeOne"" methodname=""WhenOneIsOne_ItSHouldBeOne"" classname=""Agoda.TestingLib.Tests.UnitTest1"" runstate=""Runnable"" seed=""396657978"" result=""Passed"" start-time=""2023-03-26T05:43:46.8096530Z"" end-time=""2023-03-26T05:43:46.8428099Z"" duration=""0.033255"" asserts=""0"" />
47+
</test-suite>
48+
</test-suite>
49+
50+
</test-suite>
51+
</test-suite>
52+
</test-suite>
53+
</test-run>
54+
";
55+
var result = new NUnitXmlEventConverter(report);
56+
result.TestCases.Count.ShouldBe(4);
57+
for (int i = 1; i <= 4; i++)
58+
{
59+
result.TestCases[i - 1].Name.ShouldBe($"{i}WhenOneIsOne_ItSHouldBeOne",customMessage:$"Name on {i}");
60+
result.TestCases[i - 1].Id.ShouldBe($"0-100{i}", customMessage: $"Id on {i}");
61+
result.TestCases[i - 1].Fullname.ShouldBe($"Agoda.TestingLib.Tests.UnitTest{(i+1) / 2}.{i}WhenOneIsOne_ItSHouldBeOne", customMessage: $"Fullname on {i}");
62+
result.TestCases[i - 1].Duration.ShouldBe(0.033255, customMessage: $"Duration on {i}");
63+
}
64+
65+
}
66+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Agoda.DevFeedback.Common;
2+
using NSubstitute;
3+
using NUnit.Framework;
4+
using Shouldly;
5+
6+
namespace Agoda.Tests.Metrics.NUnit.Tests;
7+
8+
[TestFixture]
9+
public class NUnitTestCasePayloadTests
10+
{
11+
[Test]
12+
public void WhenInit_ShouldHaveDefaultVarsFromEnvironment()
13+
{
14+
var underTest = new NUnitTestCasePayload(null,Substitute.For<GitContext>(), new List<TestCase>());
15+
16+
underTest.Id.ShouldNotBeNull();
17+
underTest.UserName.ShouldBe(Environment.UserName);
18+
underTest.CpuCount.ShouldBe(Environment.ProcessorCount);
19+
#pragma warning disable AG0035
20+
underTest.Hostname.ShouldBe(Environment.MachineName);
21+
#pragma warning restore AG0035
22+
underTest.Platform.ShouldBe((int)Environment.OSVersion.Platform);
23+
underTest.Os.ShouldBe(Environment.OSVersion.VersionString);
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Agoda.Tests.Metrics.NUnit.dll
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netstandard2.0</TargetFramework>
5+
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
6+
</PropertyGroup>
7+
8+
<ItemGroup>
9+
<None Remove="Agoda.Testinglib.addins" />
10+
</ItemGroup>
11+
12+
<ItemGroup>
13+
<Content Include="Agoda.Testinglib.addins" >
14+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
15+
<PackageCopyToOutput>true</PackageCopyToOutput>
16+
</Content>
17+
</ItemGroup>
18+
19+
<ItemGroup>
20+
<PackageReference Include="Agoda.Analyzers" Version="1.0.523">
21+
<PrivateAssets>all</PrivateAssets>
22+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
23+
</PackageReference>
24+
<PackageReference Include="NUnit.Engine" Version="3.16.3" />
25+
</ItemGroup>
26+
27+
<ItemGroup>
28+
<ProjectReference Include="..\Agoda.DevFeedback.Common\Agoda.DevFeedback.Common.csproj" />
29+
</ItemGroup>
30+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using NUnit.Engine;
2+
using System;
3+
using NUnit.Engine.Extensibility;
4+
using System.Xml.Linq;
5+
using Agoda.DevFeedback.Common;
6+
7+
namespace Agoda.Tests.Metrics.NUnit
8+
{
9+
[Extension]
10+
public class AgodaNUnitEventListener : ITestEventListener
11+
{
12+
public AgodaNUnitEventListener()
13+
{
14+
15+
}
16+
public void OnTestEvent(string report)
17+
{
18+
try
19+
{
20+
var xmlConverter = new NUnitXmlEventConverter(report);
21+
22+
if (xmlConverter.TestCases.Count == 0) return;
23+
if (!report.StartsWith("<test-run")) return;
24+
25+
var gitContext = GitContextReader.GetGitContext();
26+
27+
var data = new NUnitTestCasePayload(
28+
typeof(AgodaNUnitEventListener).Assembly.GetName().Version.ToString(),
29+
gitContext,
30+
xmlConverter.TestCases
31+
);
32+
DevFeedbackPublisher.Publish(null, data, DevLocalDataType.NUint);
33+
}
34+
catch (Exception e)
35+
{
36+
Console.WriteLine(e.ToString());
37+
}
38+
}
39+
}
40+
}

0 commit comments

Comments
 (0)