Weekly Progress Report 2012/3/1 by Luke
From OO Lab
(Difference between revisions)
(→Issues) |
Latest revision as of 01:13, 1 March 2012
[edit] Test Automation: Capturing
- 新增三個testing用的class: xSocket, xSocketServer, and xSocketClient
- 分別繼承自Socket, SocketServer和SocketClient
- 在Capture的時候,他們的instances會取代本來的Socket instances
- 當本來的Socket的ReadLine和ReceiveLine被呼叫的時候,他們會去把剛從Minvera傳進來或是正要傳給Minvera的字串記錄下來,存進test script
[edit] Test Automation: Replaying
- 將當初錄下來的socket communication messages做parsing,整理出DIVA與Minerva之間問答的內容
- 例如說,在bt.java的例子裡面,DIVA的CommandAgent會向Minerva問"ask root",而Minerva會傳回"<VARNAME> root <VARTYPE> bt* <ADDR> none"
- Setup階段
- 用一個QMap把上述的一問一答的資訊儲存起來,以上例來說,map裡面的其中一筆entry的key就會是"ask root",而value就會是"<VARNAME> root <VARTYPE> bt* <ADDR> none"
- 準備好一個TCPServer來接受DIVA的CommandAgent傳過來的Request,另外準備一個TCPClient用來發送"visualize p"這類的指令
- Replay階段 (※)
- 當DIVA被invoke並且準備好的時候,TCPClient會發出Visualize指令並觸發DIVA的child thread開始處理socket communication
- 而TCPServer這邊的運作邏輯則是如下pseudo code所示
QString request = serverSocket.readLine(); // request = "ask root"
QString response = map[request]; // response = "<VARNAME> root <VARTYPE> bt* <ADDR> none"
serverSocket.write(response);
[edit] Issues
- 原本計畫依賴Qt的Signal-Slot機制來管理Socket的行為:
connect( TCPServer, SIGNAL( newConnection() ), this, SLOT( onDivaClientConnected() ) );
connect( serverSocket, SIGNAL( readyRead() ), this, SLOT( onServerReadyRead() ) );
- 不過實際上執行Replay的時候,卻經常會遇到 onServerReadyRead() 這個slot從未被執行到,但是該次replay即結束的現象
- 目前猜測這是因為以上socket的運作是屬於non-blocking的模式,用意是避免UI thread被freeze住這一類的情況,於是透過signal-slot機制讓Qt的EventLoop來管理socket connection
- 基於以上猜測,目前計畫另外開一條thread,以blocking read的機制來listen/read來自DIVA的連線