/// <summary> /// Creates a new instance of InteractiveAdapterDialog class. /// </summary> /// <param name="methodCall">An IMessage that contains a IDictionary of information about the method call.</param> /// <param name="ptfProp">A NameValueCollection of settings from the test configuration file.</param> /// <param name="args">args.</param> public InteractiveAdapterConsole(MethodInfo methodCall, NameValueCollection ptfProp, object[] args) { if (methodCall == null) { throw new ArgumentNullException("methodCall"); } if (ptfProp == null) { throw new ArgumentNullException("ptfProp"); } // Stores all arguments for generating the 'OutArgs' property, // since ReturnMessage needs all arguments including in args. outArgs = methodCall.GetGenericArguments(); // Change caption this.Text = methodCall.Name; // Set the help message this.HelperMessage = AdapterProxyHelpers.GetHelpMessage(methodCall); // Set the properties this.properties = ptfProp; // Set data grid views builder = BuildInputParamsCommand(methodCall, args); paraCommands = new List <ParaCommandInfo>(); }
/// <summary> /// Creates a new instance of InteractiveAdapterDialog class. /// </summary> /// <param name="methodCall">An IMessage that contains a IDictionary of information about the method call.</param> /// <param name="ptfProp">A NameValueCollection of settings from the test configuration file.</param> public InteractiveAdapterDialog(IMethodCallMessage methodCall, NameValueCollection ptfProp) { InitializeComponent(); if (methodCall == null) { throw new ArgumentNullException("methodCall"); } if (ptfProp == null) { throw new ArgumentNullException("ptfProp"); } // Stores all arguments for generating the 'OutArgs' property, // since ReturnMessage needs all arguments including in args. outArgs = methodCall.Args; // Change caption this.Text = methodCall.MethodName; // Set the help message this.textHelpMessage.Text = AdapterProxyHelpers.GetHelpMessage(methodCall); // Set the properties this.properties = ptfProp; // Set data grid views builder = BindGridToDataTable( methodCall, dataGridViewActionPara); // Adjust the controls if (!builder.HasInArg) { labelActionParameters.Visible = false; dataGridViewActionPara.Visible = false; tableLayoutPanel1.RowStyles[2].Height = 5; tableLayoutPanel1.RowStyles[3].Height = 5; } if ((!builder.HasReturnVal) && (!builder.HasOutArg)) { labelActionResult.Visible = false; tableActionResult.Visible = false; tableLayoutPanel1.RowStyles[4].Height = 5; tableLayoutPanel1.RowStyles[5].Height = 5; } }
/// <summary> /// Proxy method for substitution of executing methods in adapter interface. /// </summary> /// <param name="targetMethod">The method the caller invoked.</param> /// <param name="args">The arguments the caller passed to the method.</param> /// <returns>The return value of the ExecuteMethod implementation.</returns> 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 { PSParameterBuilder builder = InvokeScript(path, targetMethod, args, methodhelp); if (builder != null) { retVal = builder.RetValue; if (builder.OutArguments != null) { int argsIndex = 0; int outArgsIndex = 0; foreach (ParameterInfo pi in targetMethod.GetParameters()) { if (pi.ParameterType.IsByRef) { outArgs[argsIndex] = builder.OutArguments[outArgsIndex++]; } argsIndex++; } } //clear builder builder = null; } } } catch (Exception ex) { TestSite.Log.Add(LogEntryKind.Debug, ex.ToString()); throw; } finally { TestSite.Log.Add(LogEntryKind.ExitAdapter, "PowerShell adapter: {0}, method: {1}", ProxyType.Name, targetMethod.Name); } } return(retVal); }
protected override IMessage Invoke(IMethodCallMessage methodCall) { //get help message from attribute string methodhelp = AdapterProxyHelpers.GetHelpMessage(methodCall); bool compactMode = ((methodCall.MethodName == "Initialize" || methodCall.MethodName == "Reset") && AdapterType.IsAdapterTypeFullName(methodCall.MethodBase.DeclaringType.FullName) ); if (compactMode) { return(InvokeCompact(methodCall, methodhelp)); } object retVal = null; object[] outArgs = methodCall.Args; // Check if this is a method from IAdapter. Any IAdapter methods should be ignored. if (!AdapterType.IsAdapterTypeFullName(methodCall.MethodBase.DeclaringType.FullName) && (methodCall.MethodBase.DeclaringType.FullName != typeof(IDisposable).FullName) ) { TestSite.Log.Add(LogEntryKind.EnterAdapter, "Power Shell adapter: {0}, method: {1}", ProxyType.Name, methodCall.MethodName); try { string path = LookupScript(methodCall.MethodName); if (path == null) { TestSite.Assume.Fail( "PowerShell script file ({0}.ps1) can not be found.", methodCall.MethodName); } else { PSParameterBuilder builder = InvokeScript(path, methodCall, methodhelp); if (builder != null) { retVal = builder.RetValue; if (builder.OutArguments != null) { int argsIndex = 0; int outArgsIndex = 0; foreach (ParameterInfo pi in methodCall.MethodBase.GetParameters()) { if (pi.ParameterType.IsByRef) { outArgs[argsIndex] = builder.OutArguments[outArgsIndex++]; } argsIndex++; } } //clear builder builder = null; } } } catch (Exception ex) { TestSite.Log.Add(LogEntryKind.Debug, ex.ToString()); throw; } finally { TestSite.Log.Add(LogEntryKind.ExitAdapter, "Power Shell adapter: {0}, method: {1}", ProxyType.Name, methodCall.MethodName); } } ReturnMessage mret = new ReturnMessage( retVal, (outArgs != null && outArgs.Length > 0) ? outArgs : null, (outArgs != null) ? outArgs.Length : 0, methodCall.LogicalCallContext, methodCall); return(mret); }
/// <summary> /// Proxy method for substitution of executing methods in adapter interface. /// </summary> /// <param name="mcall">The IMethodCallMessage containing method invoking data.</param> /// <returns>The IMessage containing method return data.</returns> protected override IMessage Invoke(IMethodCallMessage mcall) { // set to compat Mode to allow running of Initialize.cmd or Reset.cmd if call from IAdapter context compatMode = ((mcall.MethodName == "Initialize" || mcall.MethodName == "Reset") && AdapterType.IsAdapterTypeFullName(mcall.MethodBase.DeclaringType.FullName) ); if (compatMode) { return(InvokeCompat(mcall)); } // Build parameter on each invoke builder = new ParameterDataBuilder(mcall); builder.Build(); // Initial error message on each invoke ptfAdFailureMessage = null; object retVal = null; outArgs = mcall.Args; string methodhelp = AdapterProxyHelpers.GetHelpMessage(mcall); string arguments = BuildScriptArguments(methodhelp); // Check if this is a method from IAdapter. Any IAdapter methods should be ignored. if (!AdapterType.IsAdapterTypeFullName(mcall.MethodBase.DeclaringType.FullName) && (mcall.MethodBase.DeclaringType.FullName != typeof(IDisposable).FullName) ) { TestSite.Log.Add(LogEntryKind.EnterAdapter, "Script adapter: {0}, method: {1}", ProxyType.Name, mcall.MethodName); try { string path = LookupScript(mcall.MethodName); if (path == null) { TestSite.Assume.Fail( "The invoking script file ({0}.cmd) can not be found.", mcall.MethodName); } else { int scriptRet = InvokeScript(path, arguments); if (scriptRet != 0) { TestSite.Assume.Fail( "Script {0}.cmd exited with non-zero code. Error code: {1}. Failure message: {2}", mcall.MethodName, scriptRet, ptfAdFailureMessage); } retVal = GetReturnValue(); GetOutArgumentsValues(); } } catch (Exception ex) { TestSite.Log.Add(LogEntryKind.Debug, ex.ToString()); throw; } finally { TestSite.Log.Add(LogEntryKind.ExitAdapter, "Script adapter: {0}, method: {1}", ProxyType.Name, mcall.MethodName); } } ReturnMessage mret = new ReturnMessage( retVal, (outArgs != null && outArgs.Length > 0) ? outArgs : null, (outArgs != null) ? outArgs.Length : 0, mcall.LogicalCallContext, mcall); return(mret); }
/// <summary> /// Proxy method for substitution of executing methods in adapter interface. /// </summary> /// <param name="targetMethod">The method the caller invoked.</param> /// <param name="args">The arguments the caller passed to the method.</param> /// <returns>The return value of the ExecuteMethod implementation.</returns> 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) { TestSite.Log.Add(LogEntryKind.Debug, ex.ToString()); throw; } finally { TestSite.Log.Add(LogEntryKind.ExitAdapter, "PowerShell adapter: {0}, method: {1}", ProxyType.Name, targetMethod.Name); } } return(retVal); }
/// <summary> /// Proxy method for substitution of executing methods in adapter interface. /// </summary> /// <param name="targetMethod">The method the caller invoked.</param> /// <param name="args">The arguments the caller passed to the method.</param> /// <returns>The return value of the ExecuteMethod implementation.</returns> 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)); } // Build parameter on each invoke builder = new ParameterDataBuilder(targetMethod); builder.Build(args); lastOutput = null; errorMsg = new StringBuilder(); object retVal = null; string arguments = BuildScriptArguments(); // 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, "Shell adapter: {0}, method: {1}", ProxyType.Name, targetMethod.Name); try { string path = LookupScript(targetMethod.Name); if (path == null) { TestSite.Assume.Fail( "Shell script file ({0}.sh) can not be found.", targetMethod.Name); } else { int timeout = AdapterProxyHelpers.GetTimeout(targetMethod, int.Parse(TestSite.Properties["AdapterInvokeTimeout"])); Task <int> invokeTask = Task.Run <int>(() => { TestSite.Log.Add(LogEntryKind.Debug, $"Start to invoke shell {targetMethod.Name}.sh, timeout: {timeout}"); int invokeResult = InvokeScript(path, arguments); TestSite.Log.Add(LogEntryKind.Debug, $"Complete execute shell {targetMethod.Name}.sh"); return(invokeResult); }); TimeSpan waiter = TimeSpan.FromMinutes(timeout); if (invokeTask.Wait(waiter)) { if (invokeTask.Result != 0) { string exceptionMessage = string.Format("Exception thrown when executing {0}.sh.\nExit code: {1}\nError message: {2}\n", targetMethod.Name, invokeTask.Result, errorMsg); throw new InvalidOperationException(exceptionMessage); } if (builder.HasReturnVal) { retVal = AdapterProxyHelpers.ParseResult(builder.RetValType, lastOutput); } } else { throw new TimeoutException($"Invoke adapater method timeout after wait {timeout} minutes."); } } } catch (Exception ex) { TestSite.Log.Add(LogEntryKind.Debug, ex.ToString()); throw; } finally { TestSite.Log.Add(LogEntryKind.ExitAdapter, "Shell adapter: {0}, method: {1}", ProxyType.Name, targetMethod.Name); } } return(retVal); }