scheduler_test.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:8k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: scheduler_test.cpp,v 1.3.42.1 2004/07/09 02:06:28 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "./scheduler_test.h"
  50. #include "hx_ut_debug.h"
  51. #include "ut_param_util.h"
  52. #include "microsleep.h"
  53. #include "./timeout_op.h"
  54. #include "./shutdown_op.h"
  55. #include "./remove_op.h"
  56. #include "./test_callback.h"
  57. HXSchedulerTest::HXSchedulerTest() :
  58.     m_pSched(0),
  59.     m_done(false),
  60.     m_failed(false),
  61.     m_nextOpID(0),
  62.     m_finalOpID(0),
  63.     m_highestTimeout(0),
  64.     m_lastCallbackHandle(0)
  65. {
  66.     CreateScheduler();
  67. }
  68. HXSchedulerTest::~HXSchedulerTest()
  69. {
  70.     HX_RELEASE(m_pSched);
  71. }
  72. const char* HXSchedulerTest::DefaultCommandLine() const
  73. {
  74.     return "tscheduler tscheduler.in";
  75. }
  76. void HXSchedulerTest::GetCommandInfo(UTVector<HLXUnitTestCmdInfo*>& cmds)
  77. {
  78.     cmds.Resize(4);
  79.     
  80.     cmds[0] = new HLXUnitTestCmdInfoDisp<HXSchedulerTest>(this, 
  81.     "Reset",
  82.     &HXSchedulerTest::HandleResetCmd,
  83.     1);
  84.     cmds[1] = new HLXUnitTestCmdInfoDisp<HXSchedulerTest>(this, 
  85.     "Timeout",
  86.     &HXSchedulerTest::HandleTimeoutCmd,
  87.     3);
  88.     cmds[2] = new HLXUnitTestCmdInfoDisp<HXSchedulerTest>(this, 
  89.     "CancelLast",
  90.     &HXSchedulerTest::HandleCancelLastCmd,
  91.     3);
  92.     cmds[3] = new HLXUnitTestCmdInfoDisp<HXSchedulerTest>(this, 
  93.     "RunScheduler",
  94.     &HXSchedulerTest::HandleRunSchedulerCmd,
  95.     1);
  96. }
  97. HLXCmdBasedTest* HXSchedulerTest::Clone() const
  98. {
  99.     return new HXSchedulerTest();
  100. }
  101. void HXSchedulerTest::OperationFailed()
  102. {
  103.     m_failed = true;
  104. }
  105. bool HXSchedulerTest::RemoveHandle(CallbackHandle handle)
  106. {
  107.     return (m_pSched->Remove(handle) == HXR_OK);
  108. }
  109. void HXSchedulerTest::StopScheduler()
  110. {
  111.     m_pSched->StopScheduler();
  112.     m_done = true;
  113. }
  114. bool HXSchedulerTest::OnOperation(UINT32 operationID)
  115. {
  116.     bool ret = false;
  117.     if (operationID == m_nextOpID)
  118.     {
  119. m_nextOpID++;
  120. ret = true;
  121.     }
  122.     else
  123.     {
  124. DPRINTF(D_ERROR, ("HXSchedulerTest::OnOperation() : out of order operation detectedn"));
  125. OperationFailed();
  126. StopScheduler();
  127.     }
  128.     return ret;
  129. }
  130. ULONG32 HXSchedulerTest::GetMSFromStart()
  131. {
  132.     ULONG32 ret = 0;
  133.     HXTimeval now = m_pSched->GetCurrentSchedulerTime();
  134.     ret = (now.tv_sec - m_startTime.tv_sec) * 1000;
  135.     
  136.     if (now.tv_usec < m_startTime.tv_sec)
  137.     {
  138. ret -= 1000;
  139. now.tv_usec += 1000000;
  140.     }
  141.     ret += (now.tv_usec - m_startTime.tv_usec) / 1000;
  142.     return ret;
  143. }
  144. bool HXSchedulerTest::HandleResetCmd(const UTVector<UTString>& info)
  145. {
  146.     m_done = false;
  147.     m_failed = false;
  148.     m_nextOpID = 0;
  149.     m_finalOpID = 0;
  150.     m_highestTimeout = 0;
  151.     CreateScheduler();
  152.     return true;
  153. }
  154. bool HXSchedulerTest::HandleTimeoutCmd(const UTVector<UTString>& info)
  155. {
  156.     // Handles commands of the following form
  157.     // Timeout <operationID> <timeout>
  158.     bool ret = false;
  159.     unsigned int opID = 0;
  160.     unsigned int timeout = 0;
  161.     if (!UTParamUtil::GetUInt(info[1], opID) ||
  162. !UTParamUtil::GetUInt(info[2], timeout))
  163.     {
  164. DPRINTF(D_ERROR, ("HXSchedulerTest::HandleTimeoutCmd() : failed to convert parametersn"));
  165.     }
  166.     else
  167.     {
  168. AddCallback(opID, timeout, new TimeoutOp(timeout));
  169. ret = true;
  170.     }
  171.     return ret;
  172. }
  173. bool HXSchedulerTest::HandleCancelLastCmd(const UTVector<UTString>& info)
  174. {
  175.     // Handles commands of the following form
  176.     // CancelLast <operationID> <timeout>
  177.     bool ret = false;
  178.     unsigned int opID = 0;
  179.     unsigned int timeout = 0;
  180.     if (!UTParamUtil::GetUInt(info[1], opID) ||
  181. !UTParamUtil::GetUInt(info[2], timeout))
  182.     {
  183. DPRINTF(D_ERROR, ("HXSchedulerTest::HandleCancelLastCmd() : failed to convert parametersn"));
  184.     }
  185.     else
  186.     {
  187. AddCallback(opID, timeout, new RemoveOp(m_lastCallbackHandle));
  188. ret = true;
  189.     }
  190.     return ret;
  191. }
  192. bool HXSchedulerTest::HandleRunSchedulerCmd(const UTVector<UTString>& info)
  193. {
  194.     return RunScheduler();
  195. }
  196. void HXSchedulerTest::AddCallback(unsigned int operationID, 
  197.   unsigned int timeout,
  198.   TestOperation* pOp)
  199. {
  200.     CallbackHandle ret = 0;
  201.     IHXCallback* pCB = new HXSchedulerTestCB(operationID,
  202.      this, 
  203.      pOp);
  204.     m_lastCallbackHandle = m_pSched->RelativeEnter(pCB, timeout);
  205.     if (m_finalOpID < (operationID + 1))
  206. m_finalOpID = operationID + 1;
  207.     if (timeout > m_highestTimeout)
  208. m_highestTimeout = timeout;
  209. }
  210. void HXSchedulerTest::CreateScheduler()
  211. {
  212.     HX_RELEASE(m_pSched);
  213.     
  214.     m_pSched = new HXScheduler(0);
  215.     m_pSched->AddRef();    
  216. }
  217. bool HXSchedulerTest::RunScheduler()
  218. {
  219.     bool ret = false;
  220.     m_nextOpID = 0;
  221.     m_failed = false;
  222.     m_done = false;
  223.     // Add a Shutdown operation to make sure we terminate
  224.     AddCallback(m_finalOpID,
  225. m_highestTimeout + 500,
  226. new ShutdownOp());
  227.     m_startTime = m_pSched->GetCurrentSchedulerTime();
  228.     m_pSched->StartScheduler();
  229.     while(!m_done)
  230.     {
  231. ProcessEvents();
  232.     }
  233.     HX_RELEASE(m_pSched);
  234.     if (m_failed)
  235.     {
  236. DPRINTF(D_ERROR, ("HXSchedulerTest::RunScheduler() : An operation failedn"));
  237.     }
  238.     else if (m_finalOpID != m_nextOpID)
  239.     {
  240. DPRINTF(D_ERROR, ("HXSchedulerTest::RunScheduler() : Next OpID %d did not match Final OpID %dn",
  241.   m_nextOpID,
  242.   m_finalOpID));
  243.     }
  244.     else
  245. ret = true;
  246.     return ret;
  247. }