/// <summary> /// Converts keyword result to RF XmlRpc Structure /// </summary> public static XmlRpcStruct ToXmlRpcResult(KeywordResult kwresult) { var result = new XmlRpcStruct(); //add status result.Add("status",kwresult.status.ToString()); //add error, traceback, output result.Add("error",kwresult.error); result.Add("traceback",kwresult.traceback); result.Add("output",kwresult.output); //add return if ([email protected]().Equals(typeof(System.Int64))) { //64bit int has to be returned as string result.Add("return",[email protected]()); } else { result.Add("return",kwresult.@return); } //check error type if (kwresult.status==KeywordStatus.FAIL) { if (kwresult.errortype==KeywordErrorTypes.Continuable) { //continuable error result.Add("continuable",true); } if (kwresult.errortype==KeywordErrorTypes.Fatal) { //fatal error result.Add("fatal",true); } } return result; }
/// <summary> /// Executes keyword with arguments, returns a keyword result /// </summary> public KeywordResult ExecuteKeyword(string name, object[] args) { //setup var keyword = _keywords.GetKeyword(name); var method = keyword.Method; var kwresult = new KeywordResult(); var numargs = keyword.ArgumentCount; //check number of arguments if (args.Length!=numargs) throw new InvalidKeywordArgumentsException("Incorrect number of keyword arguments supplied"); //setup trace listener Trace.Listeners.Add(_tracelistener); //invoke _timer.Start(); try { if (method.ReturnParameter.ParameterType.Equals(typeof(void))) { method.Invoke(_instance, args); kwresult.@return = ""; } else { kwresult.@return = method.Invoke(_instance, args); if (kwresult.@return==null) { kwresult.@return = ""; } } kwresult.status = KeywordStatus.PASS; } catch (TargetInvocationException ie) { kwresult.CaptureException(ie.InnerException); } catch (Exception e) { kwresult.CaptureException(e); } //stop timer _timer.Stop(); kwresult.duration = _timer.Elapsed.TotalSeconds; //stop trace listener _tracelistener.Flush(); Trace.Listeners.Remove(_tracelistener); kwresult.output = System.Text.Encoding.Default.GetString(_tracecontent.ToArray()); _tracecontent.SetLength(0); //finish return kwresult; }