test_ncbidiag_mt.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:6k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbidiag_mt.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:09:59  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbidiag_mt.cpp,v 1000.1 2004/06/01 19:09:59 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Aleksey Grichenko
  35.  *
  36.  * File Description:
  37.  *   Test for "NCBIDIAG" in multithreaded environment
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/test_mt.hpp>
  42. #include <corelib/ncbidiag.hpp>
  43. #include <algorithm>
  44. #include <test/test_assert.h>  /* This header must go last */
  45. USING_NCBI_SCOPE;
  46. /////////////////////////////////////////////////////////////////////////////
  47. //  Test application
  48. class CTestDiagApp : public CThreadedApp
  49. {
  50. public:
  51.     virtual bool Thread_Init(int idx);
  52.     virtual bool Thread_Run(int idx);
  53. protected:
  54.     virtual bool TestApp_Init(void);
  55.     virtual bool TestApp_Exit(void);
  56. };
  57. static char s_Str[k_NumThreadsMax*200] = "";
  58. static ostrstream s_Sout(s_Str, k_NumThreadsMax*200, ios::out);
  59. bool CTestDiagApp::Thread_Init(int idx)
  60. {
  61.     LOG_POST("Thread " + NStr::IntToString(idx) + " created");
  62.     return true;
  63. }
  64. bool CTestDiagApp::Thread_Run(int idx)
  65. {
  66.     LOG_POST("LOG message from thread " + NStr::IntToString(idx));
  67.     ERR_POST("ERROR message from thread " + NStr::IntToString(idx));
  68.     for ( int i = 0; i < 1000000; ++i ) {
  69.         CThreadSystemID::GetCurrent();
  70.         //CThread::GetSelf();
  71.     }
  72.     return true;
  73. }
  74. bool CTestDiagApp::TestApp_Init(void)
  75. {
  76.     NcbiCout << NcbiEndl
  77.              << "Testing NCBIDIAG with "
  78.              << NStr::IntToString(s_NumThreads)
  79.              << " threads..."
  80.              << NcbiEndl;
  81.     // Output to the string stream -- to verify the result
  82.     SetDiagStream(&s_Sout);
  83.     return true;
  84. }
  85. bool CTestDiagApp::TestApp_Exit(void)
  86. {
  87.     // Verify the result
  88.     string test_res(s_Str);
  89.     typedef list<string> string_list;
  90.     string_list messages;
  91.     // Get the list of messages and check the size
  92.     NStr::Split(test_res, "rn", messages);
  93.     assert(messages.size() == s_NumThreads*3+1);
  94.     // Verify "created" messages
  95.     for (unsigned int i=0; i<s_NumThreads; i++) {
  96.         string_list::iterator it = find(
  97.             messages.begin(),
  98.             messages.end(),
  99.             "Thread " + NStr::IntToString(i) + " created");
  100.         assert(it != messages.end());
  101.         messages.erase(it);
  102.     }
  103.     assert(messages.size() == s_NumThreads*2+1);
  104.     // Verify "Error" messages
  105.     for (unsigned int i=0; i<s_NumThreads; i++) {
  106.         string_list::iterator it = find(
  107.             messages.begin(),
  108.             messages.end(),
  109.             "Error: ERROR message from thread " + NStr::IntToString(i));
  110.         assert(it != messages.end());
  111.         messages.erase(it);
  112.     }
  113.     assert(messages.size() == s_NumThreads+1);
  114.     // Verify "Log" messages
  115.     for (unsigned int i=0; i<s_NumThreads; i++) {
  116.         string_list::iterator it = find(
  117.             messages.begin(),
  118.             messages.end(),
  119.             "LOG message from thread " + NStr::IntToString(i));
  120.         assert(it != messages.end());
  121.         messages.erase(it);
  122.     }
  123.     assert(messages.size() == 1);
  124.     // Cleaunp
  125.     SetDiagStream(0);
  126.     NcbiCout << "Test completed successfully!"
  127.              << NcbiEndl << NcbiEndl;
  128.     return true;
  129. }
  130. /////////////////////////////////////////////////////////////////////////////
  131. //  MAIN
  132. int main(int argc, const char* argv[]) 
  133. {
  134.     CTestDiagApp app;
  135.     return app.AppMain(argc, argv, 0, eDS_Default, 0);
  136. }
  137. /*
  138.  * ===========================================================================
  139.  * $Log: test_ncbidiag_mt.cpp,v $
  140.  * Revision 1000.1  2004/06/01 19:09:59  gouriano
  141.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.8
  142.  *
  143.  * Revision 6.8  2004/05/14 13:59:51  gorelenk
  144.  * Added include of ncbi_pch.hpp
  145.  *
  146.  * Revision 6.7  2003/05/17 15:00:39  grichenk
  147.  * Fixed number of message lines
  148.  *
  149.  * Revision 6.6  2003/05/08 20:50:12  grichenk
  150.  * Allow MT tests to run in ST mode using CThread::fRunAllowST flag.
  151.  *
  152.  * Revision 6.5  2002/09/19 20:05:43  vasilche
  153.  * Safe initialization of static mutexes
  154.  *
  155.  * Revision 6.4  2002/04/23 13:11:50  gouriano
  156.  * test_mt.cpp/hpp moved into another location
  157.  *
  158.  * Revision 6.3  2002/04/16 18:49:08  ivanov
  159.  * Centralize threatment of assert() in tests.
  160.  * Added #include <test/test_assert.h>. CVS log moved to end of file.
  161.  *
  162.  * Revision 6.2  2001/04/06 16:44:14  grichenk
  163.  * Redesigned to use MT test suite API from "test_mt.[ch]pp"
  164.  *
  165.  * Revision 6.1  2001/03/30 22:46:59  grichenk
  166.  * Initial revision
  167.  *
  168.  * ===========================================================================
  169.  */