/// <summary> /// Méthode exécutée lors de la reception d'un résultat d'un step provenant d'un testeur /// </summary> private void OnReceiveStepResults(String _testerName, string _datas) { try { XmlSerializer s = new XmlSerializer(typeof(GenericTesterResult)); byte[] buf = System.Text.Encoding.Unicode.GetBytes(_datas); MemoryStream ms = new MemoryStream(buf); if (_testerName == testerDestinationName) { testerDestinationResults = new GenericTesterResult(); testerDestinationResults = (GenericTesterResult)s.Deserialize((Stream)ms); } else { testerSourceResults = new GenericTesterResult(); testerSourceResults = (GenericTesterResult)s.Deserialize((Stream)ms); } Trace.WriteInfo("Une donnée ActionResult a été reçus, débloquage du wait"); wait.Set(); } catch (Exception e) { Trace.WriteError(_datas); Trace.WriteError("Impossible de lire le fichier XML décrivant le résultat du step, format incorect"); Trace.WriteError(e.ToString()); } }
public void SendStepResult(GenericTesterResult _stepResults) { try { XmlSerializer s = new XmlSerializer(typeof(GenericTesterResult)); MemoryStream ms = new MemoryStream(); XmlTextWriter xmlTextWriter = new XmlTextWriter(ms, Encoding.Unicode); s.Serialize(xmlTextWriter, _stepResults); ms = (MemoryStream)xmlTextWriter.BaseStream; UnicodeEncoding encoding = new UnicodeEncoding(); String XmlStepResults = encoding.GetString(ms.ToArray()); base.SendString(TcpDatas.StepInfos(testerName, XmlStepResults)); } catch (Exception e) { Trace.WriteError(e.ToString()); } }
//Fonction PlayStep public void PlayStep() { //Initialisation variable de travail GenericTesterResult stepResult = new GenericTesterResult(); Boolean doAction=false; Console.WriteLine(stepToPlay.TesterSource); Console.WriteLine(Tester.Tools.ConfigurationFile.GetName()); if(stepToPlay.TesterSource==Tester.Tools.ConfigurationFile.GetName()) { doAction= true; Console.WriteLine("Do ACTION"); } // 1. On identidie l'action (appel, attente de connexion, etc...) - Et Appel de fonction Bloqante switch ((StepsName)stepToPlay.NameId) { case StepsName.Appel: { if (doAction) { CallManager.DoCall job = new CallManager.DoCall(stepToPlay); stepResult = job.Start(); } else { Trace.WriteInfo("ACTION RECEPTION APPEL"); CallManager.ReceiveCall job = new CallManager.ReceiveCall(stepToPlay); stepResult = job.Start(); } break; } case StepsName.Attente: { Trace.WriteInfo("Action Attente"); if (doAction) { WaitManager.DoWait job = new WaitManager.DoWait(stepToPlay); stepResult = job.Start(); } else { } break; } case StepsName.DTMF : { Trace.WriteInfo("Action DTMF"); if (doAction) { DTMFManager.DoDTMF job = new DTMFManager.DoDTMF(stepToPlay); stepResult = job.Start(); } else { DTMFManager.ReceiveDTMF job = new Tester.Scenario.DTMFManager.ReceiveDTMF(stepToPlay); stepResult = job.Start(); } break; } case StepsName.Raccrochage: { Trace.WriteInfo("Action Raccrochage"); if (doAction) { HangupManager.DoHangup job = new HangupManager.DoHangup(stepToPlay); stepResult = job.Start(); } else { HangupManager.ReceiveHangup job = new HangupManager.ReceiveHangup(stepToPlay); stepResult = job.Start(); } break; } default: { Trace.WriteError("Erreur Lors de la lecture du Step - Step indéfinis"); isCrashed = true; stepResult = null; break; } } //Fin de la lecture du Test, tout est OK ? if (!isCrashed && stepResult != null) { Trace.WriteInfo("Envois du résultat"); MainEntry.server.SendStepResult(stepResult); } //Si plantage else if (isCrashed) { Trace.WriteInfo("Erreur"); //Envoi du mesage ERROR } Trace.WriteInfo("Fin de la fonction PlayStep"); }
/// <summary> /// Méthode qui exécute un step sur les testeurs sources et destinations /// </summary> private bool PlayStep(int num) { try { //On initialise les variables de travails testerSourceResults = new GenericTesterResult(); testerDestinationResults = new GenericTesterResult(); stepResult = new StepResult(); //On intialise le thread wait wait = new AutoResetEvent(false); //On déclare un nouveau Step contenant le step num GenericStep step = scenarioToPlay.Steps[num]; //On enregistre les noms des testers source et destination testerDestinationName = step.TesterDestination; testerSourceName = step.TesterSource; //on récupére l'identifiant du testeur source et destionation int idTesterSource = MainEntry.listTesters.GetIdFromName(step.TesterSource); int idTesterDestination = MainEntry.listTesters.GetIdFromName(step.TesterDestination); //On s'enregistre à l'évenement OnReceiveStepResult MainEntry._TcpEvents.StepResultReceiveEvent += new CommonProject.Communication.StepResultReceiveHandler(OnReceiveStepResults); //On charge un timer qui déclenchera un timeOut au bout d'un temps données //sti.Handle = ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(OnTimeOut), sti, step.TimeOut, true); //Envoi de l'ordre d'exécuter le step MainEntry.listTesters.Tester[idTesterSource].PlayStep(num); MainEntry.listTesters.Tester[idTesterDestination].PlayStep(num); //Attente des résultat de ce Step exécutée par les deux testeurs wait.WaitOne(); wait.Reset(); wait.WaitOne(); wait.Reset(); MainEntry._TcpEvents.StepResultReceiveEvent -= new CommonProject.Communication.StepResultReceiveHandler(OnReceiveStepResults); //On instancie StepResult avec les résultat des actions efectué par les testeurs stepResult.NumStep = step.NumStep; stepResult.NameId = step.NameId; stepResult.NameId = step.NameId; stepResult.Status = TestStatus.Success; List <GenericTesterResult> tempList = new List <GenericTesterResult>(2); tempList.Add(testerSourceResults); tempList.Add(testerDestinationResults); stepResult.TestersResults = tempList.ToArray(); Trace.WriteLine("Début de l'analyse des résultats"); foreach (GenericTesterResult current in stepResult.TestersResults) { if (current.Status == TestStatus.Failed) { stepResult.Status = TestStatus.Failed; stepResult.Msg = "La lecture du step a échoué"; } else if (current.Status == TestStatus.TimeOut) { stepResult.Status = TestStatus.TimeOut; stepResult.Msg = "Un timeOut s'est déclenché"; } else { stepResult.Msg = "Step terminé avec succès"; } } //Test de vérification des DTMF reçus et envoyé if (stepResult.NameId == (int)StepsName.DTMF && stepResult.Status == TestStatus.Success) { if (((GenericDTMFResult)testerSourceResults.Datas).DTMF != ((GenericDTMFResult)testerDestinationResults.Datas).DTMF) { stepResult.Status = TestStatus.Failed; stepResult.Msg = "Le DTMF reçu ne correspond pas au DTMF envoyé"; } } if (stepResult.NameId == (int)StepsName.Appel) { Datas.Steps.CallStep callStep = (Datas.Steps.CallStep)step; if (callStep.CallerIdentitie) { if (((GenericCallResult)testerDestinationResults.Datas).CallerName == "Anonymous") { stepResult.Status = TestStatus.Failed; if (callStep.CallMode == CallMode.Normal) { stepResult.Msg = "L'appel en mode \"présentation du numéro\" a échoué"; } else { stepResult.Msg = "L'appel n'a pas été reçu en mode OIP"; } } } else { if (((GenericCallResult)testerDestinationResults.Datas).CallerName != "Anonymous") { stepResult.Status = TestStatus.Failed; if (callStep.CallMode == CallMode.Normal) { stepResult.Msg = "L'appel a été reçu en mode OIP"; } else { stepResult.Msg = "L'appel en mode OIR a échoué"; } } } } return(true); /* * //Analyse du résultat pour identifier un échec fatal * if (stepResult.Status == TestStatus.Failed && stepResult.NameId == (int)StepsName.Appel) * { //Echec Fatal * return false; * } * else * { * return true; * } */ } catch (Exception e) { Trace.WriteDebug("Erreur PLAYSTEP KO"); stepResult.Msg = "Erreur générale - L'appel n'a pas abouti"; stepResult.Status = TestStatus.Failed; //Echec Fatal return(false); } }
/// <summary> /// Lancement de l'action /// </summary> public GenericTesterResult Start() { GenericTesterResult result = new GenericTesterResult(); //initialisation autoWaitHandle = new AutoResetEvent(false); _waitLock = new ManualResetEvent(false); try { Trace.WriteInfo("Start Action"); //Enregitrements des instances de fonction de la classe aux événement Econf Register(); Console.WriteLine("TimeOut: " + timeOut); //Chargement du timer timerHandle = ThreadPool.RegisterWaitForSingleObject(autoWaitHandle, new WaitOrTimerCallback(WaitProc), null, timeOut, true); //Lancement de l'action Action(); Trace.WriteInfo("Attente de résultat"); _waitLock.WaitOne(); //Si le Timer s'est déclenché if (status == TestStatus.TimeOut) { listMsg.Add("Timer déclenché"); status = TestStatus.TimeOut; Trace.WriteInfo("TIMEOUT :" + status); result = new GenericTesterResult(status, listMsg); } else if (status == TestStatus.Failed || status == TestStatus.Unknown) { Trace.WriteInfo("ECHEC :" + status); result = new GenericTesterResult(status, listMsg); } else { if (datas != null) { Trace.WriteInfo("SUCCES : " + status); result = new GenericTesterResult(status, listMsg, datas); } else { result = new GenericTesterResult(status, listMsg); } } } catch (Exception e) { status = TestStatus.Failed; listMsg.Add("Erreur innatendue"); Trace.WriteError(e.ToString()); result = new GenericTesterResult(status, listMsg); } finally { Trace.WriteInfo("Fin de l'action"); //Désenregitrements des instances de fonction de la classe aux événement Econf Unregister(); //On désarme le Timer timerHandle.Unregister(null); } return(result); }