Weekly Progress Report 2012/3/1 by Luke

From OO Lab
Revision as of 01:13, 1 March 2012 by Lukefan (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Test Automation: Capturing

  • 新增三個testing用的class: xSocket, xSocketServer, and xSocketClient
    • 分別繼承自Socket, SocketServer和SocketClient
    • 在Capture的時候,他們的instances會取代本來的Socket instances
    • 當本來的Socket的ReadLine和ReceiveLine被呼叫的時候,他們會去把剛從Minvera傳進來或是正要傳給Minvera的字串記錄下來,存進test script


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);


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的連線