e2etest/GuestProxyAgentTest/GuestProxyAgentScenarioTests.cs (113 lines of code) (raw):
// Copyright (c) Microsoft Corporation
// SPDX-License-Identifier: MIT
using GuestProxyAgentTest.Utilities;
using GuestProxyAgentTest.Extensions;
using GuestProxyAgentTest.Models;
using GuestProxyAgentTest.Settings;
using GuestProxyAgentTest.TestScenarios;
namespace GuestProxyAgentTest
{
/// <summary>
/// GuestProxyAgentScenarioTests class for running scenario tests
/// </summary>
public class GuestProxyAgentScenarioTests
{
/// <summary>
/// Main function to start each scenario test
/// </summary>
/// <param name="testScenarioList"></param>
/// <returns></returns>
public async Task StartAsync(List<TestScenarioSetting> testScenarioList)
{
var groupTestResultBuilderMap = new Dictionary<string, JunitTestResultBuilder>();
foreach(var testGroupName in testScenarioList.Select(x => x.testGroupName).ToHashSet())
{
groupTestResultBuilderMap[testGroupName] = new JunitTestResultBuilder(TestSetting.Instance.testResultFolder, testGroupName);
}
var taskList = new List<Task>();
var testScenarioStatusList = new List<TestScenarioStatusDetails>();
foreach (var testScenario in testScenarioList)
{
var testScenarioStatusDetails = new TestScenarioStatusDetails()
{
ScenarioName = testScenario.testScenarioName,
GroupName = testScenario.testGroupName,
Status = ScenarioTestStatus.NotStarted,
ErrorMessage = "",
Result = ScenarioTestResult.Succeed,
};
Task testScenarioTask = null!;
try
{
if (Activator.CreateInstance(Type.GetType(testScenario.testScenarioClassName)!) is TestScenarioBase @scenario)
{
testScenarioTask = @scenario
.TestScenarioSetting(testScenario)
.JUnitTestResultBuilder(groupTestResultBuilderMap[testScenario.testGroupName])
.StartAsync(testScenarioStatusDetails);
taskList.Add(testScenarioTask);
}
else
{
testScenarioStatusDetails.Result = ScenarioTestResult.Failed;
testScenarioStatusDetails.Status = ScenarioTestStatus.Completed;
testScenarioStatusDetails.ErrorMessage = "Failed to create the scenario class instance: " + testScenario.testScenarioClassName;
}
}
catch (Exception ex)
{
testScenarioStatusDetails.Result = ScenarioTestResult.Failed;
testScenarioStatusDetails.Status = ScenarioTestStatus.Completed;
testScenarioStatusDetails.ErrorMessage = ex.Message;
}
finally
{
testScenarioStatusList.Add(testScenarioStatusDetails);
if (testScenarioTask != null)
{
taskList.Add(testScenarioTask);
}
}
}
var stopMonitor = new ManualResetEvent(false);
var monitoringTask = Task.Run(() =>
{
while (!stopMonitor.WaitOne(5000))
{
ConsolePrintTestScenariosStatusSummary(testScenarioStatusList);
}
});
try
{
await Task.WhenAll(taskList).TimeoutAfter(TestSetting.Instance.testMapTimeoutMilliseconds);
}
catch (Exception ex)
{
Console.WriteLine($"Test execution exception: {ex.Message}");
}
stopMonitor.Set();
foreach (var groupName in groupTestResultBuilderMap.Keys)
{
Console.WriteLine("building test result report for test group: " + groupName);
groupTestResultBuilderMap[groupName].Build();
}
ConsolePrintTestScenariosStatusSummary(testScenarioStatusList);
ConsolePrintTestScenariosDetailsSummary(testScenarioStatusList);
}
private void ConsolePrintTestScenariosStatusSummary(IEnumerable<TestScenarioStatusDetails> testScenarioStatusDetailsList)
{
var message = $"Test Running Summary: total {testScenarioStatusDetailsList.Count()}" +
$", not started {testScenarioStatusDetailsList.Where(x => x.Status == ScenarioTestStatus.NotStarted).Count()}" +
$", running {testScenarioStatusDetailsList.Where(x => x.Status == ScenarioTestStatus.Running).Count()}" +
$", failed {testScenarioStatusDetailsList.Where(x => x.Status == ScenarioTestStatus.Completed && x.Result == ScenarioTestResult.Failed).Count()}" +
$", success {testScenarioStatusDetailsList.Where(x => x.Status == ScenarioTestStatus.Completed && x.Result == ScenarioTestResult.Succeed).Count()}. ";
Console.WriteLine(message);
}
private void ConsolePrintTestScenariosDetailsSummary(IEnumerable<TestScenarioStatusDetails> testScenariosStatusDetailsList)
{
var failedScenarios = testScenariosStatusDetailsList.Where(x => x.Status == ScenarioTestStatus.Completed && x.Result == ScenarioTestResult.Failed).ToList();
var message = $"Total Failed Scenarios: {failedScenarios.Count()}" + Environment.NewLine;
int i = 1;
foreach (var fc in failedScenarios)
{
message += $"Failed Scenario {i}/{failedScenarios.Count()}: " + Environment.NewLine
+ $"GroupName: {fc.GroupName}, ScenarioName: {fc.ScenarioName}" + Environment.NewLine
+ $"Scenario Level ErrorMessage: {fc.ErrorMessage}" + Environment.NewLine
+ $"Failed Test Cases Summary: {fc.TestCasesErrorMessage}" + Environment.NewLine;
i++;
}
Console.WriteLine(message);
}
}
}