e2etest/GuestProxyAgentTest/TestCases/TestCaseBase.cs (80 lines of code) (raw):
// Copyright (c) Microsoft Corporation
// SPDX-License-Identifier: MIT
using Azure.ResourceManager.Compute;
using Azure.ResourceManager.Compute.Models;
using GuestProxyAgentTest.Models;
using GuestProxyAgentTest.Settings;
using GuestProxyAgentTest.TestScenarios;
using GuestProxyAgentTest.Utilities;
using System.Text;
namespace GuestProxyAgentTest.TestCases
{
public enum TestCaseResult
{
NotStarted,
Running,
Succeed,
Failed,
Aborted,
}
/// <summary>
/// Base case for each TestCase
/// </summary>
public abstract class TestCaseBase
{
/// <summary>
/// Test Case Name
/// </summary>
public string TestCaseName
{
get; private set;
} = null!;
public TestCaseResult Result { get; set; } = TestCaseResult.NotStarted;
public TestCaseBase(string testCaseName)
{
TestCaseName = testCaseName;
}
/// <summary>
/// Abstract function to start the test case
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public abstract Task StartAsync(TestCaseExecutionContext context);
/// <summary>
/// Function to run a script through RunCommandV2 on the VM, that can be used in the inherit class
/// </summary>
/// <param name="context"></param>
/// <param name="scriptFileName"></param>
/// <param name="parameterList"></param>
/// <param name="includeCustomJsonOutputSasParam">
/// if set to true, it will automatically add a parameter named <see cref="Utilities.Constants.RUNCOMMAND_CUSTOM_OUTPUT_SAS_PARAMETER_NAME"/>
/// the parameter value is base64 encoded blob SAS url, the test script can use it to write customized output info.
/// if set to false, it will not add the parameter.
/// </param>
/// <returns></returns>
protected async Task<RunCommandOutputDetails> RunScriptViaRunCommandV2Async(TestCaseExecutionContext context, string scriptFileName, List<(string, string)> parameterList, bool includeCustomJsonOutputSasParam = true)
{
var testScenarioSetting = context.ScenarioSetting;
string custJsonSas = null!;
if (includeCustomJsonOutputSasParam)
{
var custJsonPath = Path.Combine(Path.GetTempPath(), $"{testScenarioSetting.testGroupName}_{testScenarioSetting.testScenarioName}_{TestCaseName}.json");
using (File.CreateText(custJsonPath)) ConsoleLog("Created empty test file for customized json output file.");
custJsonSas = StorageHelper.Instance.Upload2SharedBlob(Constants.SHARED_E2E_TEST_OUTPUT_CONTAINER_NAME, custJsonPath, "customOutputJson.json", testScenarioSetting.TestScenarioStorageFolderPrefix);
}
return await RunCommandRunner.ExecuteRunCommandOnVM(context.VirtualMachineResource, new RunCommandSettingBuilder()
.TestScenarioSetting(testScenarioSetting)
.RunCommandName(TestCaseName)
.ScriptFullPath(Path.Combine(TestSetting.Instance.scriptsFolder, scriptFileName))
, context.CancellationToken
, (builder) => builder
.CustomOutputSas(custJsonSas)
.AddParameters(parameterList));
}
protected void ConsoleLog(string message) { Console.WriteLine($"[{TestCaseName}]: " + message); }
protected string FormatVMExtensionData(VirtualMachineExtensionData data)
{
if (data == null)
{
return "null";
}
return string.Format("ProvisioningState: {0}, Publisher: {1}, ExtensionType: {2}, TypeHandlerVersion: {3}, AutoUpgradeMinorVersion: {4}, EnableAutomaticUpgrade: {5}, InstanceView: {6}",
data.ProvisioningState, data.Publisher, data.ExtensionType, data.TypeHandlerVersion, data.AutoUpgradeMinorVersion, data.EnableAutomaticUpgrade, FormatVMExtensionInstanceView(data.InstanceView));
}
protected string FormatVMExtensionInstanceView(VirtualMachineExtensionInstanceView instanceView)
{
if (instanceView == null)
{
return "null";
}
return string.Format("Name: {0}, ExtensionType:{1}, ExtensionVersion:{2} Statuses: {3}, Substatuses: {4}", instanceView.Name,
instanceView.VirtualMachineExtensionInstanceViewType, instanceView.TypeHandlerVersion
, FormatVMInstanceViewStatus(instanceView.Statuses), FormatVMInstanceViewStatus(instanceView.Substatuses));
}
protected string FormatVMInstanceViewStatus(IList<InstanceViewStatus> instanceView)
{
StringBuilder stringBuilder = new StringBuilder();
foreach (var status in instanceView)
{
stringBuilder.AppendFormat("Code: {0}, Level: {1}, DisplayStatus: {2}, Message: {3}", status.Code, status.Level, status.DisplayStatus, status.Message);
}
return stringBuilder.ToString();
}
}
}