in src/TestFramework/Core/Adapters/PowerShellAdapterProxy.cs [71:168]
protected override object ExecuteMethod(MethodInfo targetMethod, object[] args)
{
//get help message from attribute
string methodhelp = AdapterProxyHelpers.GetHelpMessage(targetMethod);
bool compactMode = ((targetMethod.Name == "Initialize" || targetMethod.Name == "Reset")
&& AdapterType.IsAdapterTypeFullName(targetMethod.DeclaringType.FullName)
);
if (compactMode)
return ExecuteMethodCompact(targetMethod, methodhelp);
object retVal = null;
object[] outArgs = args;
// Check if this is a method from IAdapter. Any IAdapter methods should be ignored.
if (!AdapterType.IsAdapterTypeFullName(targetMethod.DeclaringType.FullName)
&& (targetMethod.DeclaringType.FullName != typeof(IDisposable).FullName)
)
{
TestSite.Log.Add(LogEntryKind.EnterAdapter,
"PowerShell adapter: {0}, method: {1}",
ProxyType.Name,
targetMethod.Name);
try
{
string path = LookupScript(targetMethod.Name);
if (path == null)
{
TestSite.Assume.Fail(
"PowerShell script file ({0}.ps1) can not be found.",
targetMethod.Name);
}
else
{
int timeout = AdapterProxyHelpers.GetTimeout(targetMethod, int.Parse(TestSite.Properties["AdapterInvokeTimeout"]));
Task<PSParameterBuilder> invokeTask = Task.Run<PSParameterBuilder>(() =>
{
TestSite.Log.Add(LogEntryKind.Debug, $"Start to invoke Script {targetMethod.Name}.ps1, timeout: {timeout}");
var invokeResult = InvokeScript(path, targetMethod, args, methodhelp);
TestSite.Log.Add(LogEntryKind.Debug, $"Complete execute Script {targetMethod.Name}.ps1");
return invokeResult;
});
TimeSpan waiter = TimeSpan.FromMinutes(timeout);
if (invokeTask.Wait(waiter))
{
PSParameterBuilder resultBuilder = invokeTask.Result;
if (resultBuilder != null)
{
retVal = resultBuilder.RetValue;
if (resultBuilder.OutArguments != null)
{
int argsIndex = 0;
int outArgsIndex = 0;
foreach (ParameterInfo pi in targetMethod.GetParameters())
{
if (pi.ParameterType.IsByRef)
{
outArgs[argsIndex] = resultBuilder.OutArguments[outArgsIndex++];
}
argsIndex++;
}
}
//clear builder
resultBuilder = null;
}
}
else
{
throw new TimeoutException($"Invoke adapater method timeout after wait {timeout} minutes.");
}
}
}
catch (Exception ex)
{
if (ex.InnerException != null)
{
ex = ex.InnerException;
}
TestSite.Log.Add(LogEntryKind.Debug, ex.ToString());
throw ex;
}
finally
{
TestSite.Log.Add(LogEntryKind.ExitAdapter,
"PowerShell adapter: {0}, method: {1}",
ProxyType.Name,
targetMethod.Name);
}
}
return retVal;
}