חבילת תרחישים ל- MesSim מדריךעזרלמשתמש דינאמיים עופר ספיבק, גיא חפץ 01/01/2011
MesSim דינאמיים - חבילת תרחישים ל- P_Scenario תוכן עניינים א. הסבר לצריכת החבילה...3 ב. הסבר למבנהקובץהסקריפט... 5 ג. רתמת בדיקות...10 2
א. הסבר לצריכת החבילה 1 3 2 4 ישלכתובאת מהלך התסריט הרצוי ולשמור אותו בקובץxml (ראהפרקב'). ישליצוראובייקט של המחלקה :CScriptParser לבנאיישלהעביר מחרוזת המייצגת את הנתיב (path) בדיסקלקובץ הסקריפט (קובץ ה-.(xml (0 (1 הערה: במידהוהוספופקודות חדשות לחבילה שסופקה, ישלהוסיף את הפרסרים הספציפיים שלהם לאובייקט הנוצר בשלבזה (ראה מדריך למפתח). o יצירתאובייקט של CSenarioManager תבוצעע"יקריאהלפונקציה pccommandparser) CreateSenarioManager(CCommandParser* של המחלקה CSystemFactory (הפרמטר המועבר הוא מצביע לאובייקט שנוצר בשלב הראשון). הפונקציה מחזירה מצביע לאובייקט שנוצר. ישלהפעיל את הפונקציה Start של אובייקט ה-.CSenarioManager (2 (3 3
ה( פונקציהזויוצרת THREAD חדש שאחראי על הרצת התרחיש הדינאמי : o פונקצית התרגום של ה- parser נקראתעלמנתלבנות את מבנה הנתונים מקובץ הקלט. o לאחר סיום התרגום, ה- thread מתחיל לרוץעל התסריט עדלסיומו. ממתין עלeventFlag. Thread עםסיוםהתרחיש, ה- o עלמנתלהריץ שוב את התרחיש ניתןלקרואלפונקציתReStart של אובייקט ה-,CSenarioManager אשר תסמן ל- Thread בעזרת ה- eventflag לבצעריצהנוספת על התרחיש (ללאפענוח הפקודות מחדש). מחיקת מסודרת של אובייקט ה- CSenarioManager תבוצע ע"יקריאהלפונקציה. CSystemFactory של המחלקה CloseSenarioManager אובייקטCScriptParser שנוצר בשלב הראשון לאנמחקבפעולהזו, ואםלא משתמשיםבויותר, ישלמחוק אותו בנפרד (מחיקתו תמחק גםאתכל הפרסרים הספציפיים שהוספו לו). (4 (5 (6 הערות ישלוודא שכלל הערוצים (כלל האובייקטים של (CChannel נוצרוגםהםבאמצעות הinstance של המחלקה,CSystemFactory ולוודא שמספרי הערוצים שנוצרו תואמיםלמספרים הרצויים המופיעים בקובץ ה- THREAD - XML שלהתרחיש פונהלמחלקהזועלמנתלקבל את הערוץ לשליחת/ קבלת הודעות). במידהוהמשתמשרוצהלעבודרקע"פ התרחיש הדינאמי (ללא שימוש ב-,(pattern ביצירתכלערוץעליולהגדיר שלא יווצר THREAD לOutgoingMessageManager. (1 (2 דוגמתקודלצריכת החבילה //Create the parser CScriptParser *pcscriptparser = new CScriptParser("O:\\ScriptFile.xml"); //call the CSystemFactory in order to create the ScenarioManager CScenarioManager *pcsenariomanager= CSystemFactory::Instance().CreateSenarioManager(m_pcScriptParser); /* CREATE AND OPEN ALL THE CHANNELS USING CSystemFactory */ // start the SenarioMessage thread pcsenariomanager->start(); 4
ב. הסבר למבנהקובץ הסקריפט <Senario> <Commands Type="Main"> <Command Opcode =???> <Command Opcode =???> </Commands> </Senario>,Senario וכלל הפקודות נמצאות בין הסוגרים 1. מבנה כללי: הסקריפט נמצא בין בשםCommands. בשם הסוגרים 2. פקודת שליחת הודעה (Opcode=1) לפקודה 2 ארגומנטים מס' הערוץ, ומס' ההודעה למשלוח: <Command Opcode = "1" Name="Send"> <Arg Key = "Channel" Value = "1" /> <Arg Key = "Msg" Value = "1" /> 3. פקודת השמת שדות להודעה (Opcode=2) לפקודה 2 ארגומנטים קבועים מס' הערוץ ומספר ההודעה, ומספר משתנה של ארגומנטים המגדירים את השינוי הרצוי בשדות: השמתערךלשדה 1) = (Operation 3 ארגומנטים עוקביםהמגדיריםאת מספר השדה, ארגומנט הפקודה = 1, וארגומנט של הערך המספרי שיש להכניסלשדה. הוספתערךלשדה 2) = (Operation - 3 ארגומנטים עוקביםהמגדיריםאת מספר השדה, ארגומנט הפקודה = 2, וארגומנט של הערך המספרי שיש להוסיףלערך הקיים בשדה. חיסורערך משדה (3 = (Operation באופן דומהלפקודה הקודמת. 5
חיבור 2 שדות (4 = (Operation 4 ארגומנטים עוקבים המגדירים את מספרהשדה, ארגומנטהפקודה= 4, ו- 2 ארגומנטיםהמגדיריםאתמספרי השדותלחיבור. חיסור 2 שדות (5 = (Operation באופן דומהלפקודה הקודמת. לדוגמא הפקודה הבאה תתורגם לפקודתהשמהלהודעהמספר 2 שדה 0 יקבל את הערך 16, לשדה 1 יתווסף 7, ושדה 2 יקבלאתהסכוםשלשדות 0 ו- 1. <Command Opcode = "2" Name="Assign"> <Arg Key = "Channel" Value = "1" /> <Arg Key = "Msg" Value = "2" /> <Arg Key = "Field" Value = "0" /> <Arg Key = "Operation" Value = "1"/> <Arg Key = "Value" Value = "16"/> <Arg Key = "Field" Value = "1" /> <Arg Key = "Operation" Value = "2"/> <Arg Key = "Value" Value = "7"/> <Arg Key = "Field" Value = "2" /> <Arg Key = "Operation" Value = "4"/> <Arg Key = "Operator1" Value = "0"/> <Arg Key = "Operator2" Value = "1"/> הערה: השמתהערכיםמבוצעתע"פהסדר- למשל 2 יקבלאתסכום שדות 0 ו- 1 לאחר שאלו כברעברו את השינוי. בדוגמאזושדה.4 פקודת תנאי 3) = (Opcode לפקודה ארגומנט בודדאשרמגדיראתמספרהערוץ. התנאילפיופועלת הפקודה מוגדר בין סוגרים בשםConditions. כל תנאי מורכב ממספר הודעה, ומידע לגבי השדות אשר ייבדק מול ההודעה שהתקבלה. המידעלגבי השדות כוללאת הנתונים הבאים: מספר השדה הנדרש לבדיקה ("Key") מספרי השדות מתחילים מ- 0 ותואמים ע"פ הסדר לשדות שהוגדרו בקובץ ה- xml של ההודעות שהוכנס לבנאי של. CGenericMessageHeaderFactory הערך הנדרש לבדיקה.("Value") סוגהנתון ("DataType") נבדקתתאימותלמולה- DataType של השדהעצמו. כידוע סוג השדה נקבעגםהואבקובץ ה- xml של ההודעות ע"פ המפתח הבא: 6
הלוגיקה בודקת אם ההודעה שהתקבלה מתאימה לאחת or) בין ההודעות) מבין ההודעות שהוכנסוכתנאים. התאמה להודעהמוגדרתכהתאמהלכללהשדותבהודעהעצמה and) בין השדות). הפקודות הנדרשות לביצועבמקרהונמצאה התאמה מוגדרותבין הסוגריםcommands עם מחרוזת מזהה Type="True" (באופן דומה להגדרת הסוגרים commands בסעיף 1 בפרק זה), ובאופן דומה מוגדרות הפקודות לביצוע במידה ולא מתגלית התאמה להודעה שהתקבלה (עם המזהה.(Type="False" <Command Opcode = "3" Name="If"> <Arg Key = "Channel" Value = "1" /> <Conditions> <Message Opcode="1"> <Fields> <Field Key="1" DataType="5" Value="15" /> <Field Key="2" DataType="5" Value="15" /> </Fields> </Message> <Message Opcode="2"> <Fields> <Field Key="1" DataType="5" Value="6" /> <Field Key="3" DataType="5" Value="100" /> </Fields> </Message> </Conditions> <Commands Type="True"> </Commands> <Commands Type="False"> 7
</Commands>.5 פקודתלולאה 4) = (Opcode פועלתבאופןדומהלפקודה הקודמת. מכילהרקסוגראחדמסוגcommand המכיל את הפקודות לביצוע. בשונה מפקודת ה-,If פקודה זו מכילה ארגומנט נוסף עם המזהה "NotCondition" המהווהדגלעבורהיפוךהתנאי. במידה וערך ארגומנט זה הוא 0 פקודת ה- Loop תבצע מעבר אחד על כלל הפקודות שתחת הסוגרים <Commands> עם כל קבלת הודעה העונה לאחד התנאים שב- <Conditions> (מבצעתאתהפקודותכלעודהתקבלההודעההמקיימתאתהתנאי). במידהוערךארגומנטזההוא 1 הפקודהתבצעאתכללהפקודותכלעודהתקבלההודעה שאינהעונהלאףאחדמהתנאיםשב- <Conditions> (כלעודלאהתקבלההודעההמקיימת אתאחדהתנאים). <Command Opcode = "4" Name="Loop"> <Arg Key = "Channel" Value = "1" /> <Arg Key = "NotCondition" Value = "0" /> <Conditions> <Message Opcode="1"> </Message> <Message Opcode="2"> <Fields> <Field Key="0" DataType="5" Value="42" /> <Field Key="1" DataType="5" Value="42" /> </Fields> </Message> </Conditions> <Commands Type="Do"> <Command Opcode = "1" Name="Send"> </Commands> 6. פקודת המתנה לאירוע (Opcode=5) 8
מכילה 2 ארגומנטים מספר הערוץ, ופרק הזמן ב- ms שהיא נדרשתלחכותלהודעה. מכילה תנאים לבדיקהבדומהלתנאים שהוגדרו בפקודת התנאי. הפקודה הזוממתינהעדשמתקבלתהודעה המתאימהלפרמטריםשהוכנסו אועדשיחלוף פרק הזמן שהוגדר (הראשון מביניהם). <Command Opcode = "5" Name="Wait"> <Arg Key = "Channel" Value = "1"/> <Arg Key = "WaitPeriod" Value = "3000"/> <Conditions> <Message Opcode="1"> <Fields> </Fields> </Message> </Conditions> <Command Opcode = "1" Name="Send"> <Arg Key = "Channel" Value = "1"/> <Arg Key = "Msg" Value = "1"/>.7 פקודתעצירה (Opcode=9) ללא ארגומנטים. עוצרתאתפעולת ה- script ומחזירה אותו למצב המתנה. <Command Opcode = "9" Name="Halt"> 9
ג. רתמת בדיקות עם החבילה סופקה גםרתמתבדיקות. רתמת הבדיקות משמשת דוגמא חיה לתוכנית הצורכת את החבילה ומשתמשתברוביכולותיה, ובעתיד תוכל לשמש תשתית לבדיקת החבילהבמידהוזו תעבור שינויים נוספים. רתמת הבדיקות סופקה כפרויקטRhapsody נפרד הצורך את פרויקט ה-.MesSim הרתמה מבצעתבדיקותעלפרוטוקול ה-.TCP להלן המחלקות העיקריות: יחידת הבדיקה מאפשרת עבודהבאחד מ- 3 מודי פעולה: 1) עבודהעם תרחיש פענוחע"יפרסר: פונקצייתStartScenarioManagerWithParser מריצהאתיחידת הבדיקה בצורה מלאה. לטובת הפעלת פונקציהזוישליצורקובץxml ממנו יפוענחו הפקודות, ולהעביר את ה- path אליו כפרמטר. 2) עבודהידנית: פונקצייתStartManually מריצהאתיחידת הבדיקה בצורהידנית: ע"י הדפסות למסך, המשתמש מקליד בזמן אמת את מספרי ההודעות הנדרשות למשלוח. 3) עבודהעם תרחיש יצירת תרחיש ידנית: פונקצייתCreateCommandManager מקבלת כפרמטר מצביע ל- CCommand ומייצרתCCommandManager חדש עם הפקודה הזו (במידהונוצרכבר, CCommandManager הפונקציה מוסיפה את הפקודה החדשה לסופו). בהמשך ניתןלהריץ תרחיש עלה- CCommandManager הזה, ללאצורךב- Parser ע"י שימושבפונקציה הבאה: פונקצייתStartScenarioManager מריצהאתיחידת הבדיקה ע"פ התרחיש שהוכנסבצורהידנית. פונקציותנוספותלמחלקה: AddListeners() מוסיפה מאזין מסוג CMyMessageListener לכלל ההודעות (המאזין מדפיסלמסךכל הודעה שמתקבלת ואתכלל השדות שלה), ומאזיןCMyChannelListener לערוץ (המאזין מדפיס למסךכל שינוי שמתרחש בערוץ). Add/RemoveMessageListener מקבלת כפרמטר מצביע למאזיןלהודעהורושמת/ מסירה אותו מהאזנה לכלל ההודעות (תוכניתבדיקות היחידה משתמשת ביכולתזובהמשך). 10
הרצת תוכנית הבדיקה פרויקט ה- Rhapsody של רתמת הבדיקות ניתןלהרצה. עםהרצתהקובץישלפעולע"פההוראותהמופיעותעלגביהמסך- בחירתסוגאלמנט הבדיקה:, TCPServer/TCPClient ובחירתמודהריצה: ידני/ ע"פתרחישדינאמי (באופציהזו ישלהכניסבהמשךאתכתובתקובץה- xml עלפיוישלעבוד). לצורךבדיקה, ניתןלפתוחאתקובץ ההרצה של הפרויקט פעמייםולבחורלרוץבצדכ- :TCPServer ובצד השני לרוץכ-,TCPClient ניתךלהשתמשב- 2 קבציה- xml, שסופקועםרתמתהבדיקות, המדמיםתוכניתבהתהליך אחדמנסהלעשות login לתהליךשניע"יהקשתשםמשתמשוסיסמא. התהליךהשנימצפה לקבלשםמשתמש 99 וסיסמא 123, כלעודלאהתקבל שולחהודעתNAK. לאחרביצוע login מוצלח, התהליכיםמחליפיםביניהםהודעות. (בצילומיהמסךצדשמאלהואהשרת, וצד ימיןהואהתהליךהשנישמנסהלהתחברולבצע :(login 11