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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbireg_mt.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:10:16  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbireg_mt.cpp,v 1000.1 2004/06/01 19:10:16 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 "NCBIREG" in multithreaded environment
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/test_mt.hpp>
  42. #include <corelib/ncbireg.hpp>
  43. #include <algorithm>
  44. #include <test/test_assert.h>  /* This header must go last */
  45. USING_NCBI_SCOPE;
  46. DEFINE_STATIC_FAST_MUTEX(s_GlobalLock);
  47. /////////////////////////////////////////////////////////////////////////////
  48. //  Test application
  49. class CTestRegApp : public CThreadedApp
  50. {
  51. public:
  52.     virtual bool Thread_Run(int idx);
  53. protected:
  54.     virtual bool TestApp_Init(void);
  55.     virtual bool TestApp_Exit(void);
  56. private:
  57.     CNcbiRegistry m_Registry;
  58. };
  59. bool CTestRegApp::Thread_Run(int /*idx*/)
  60. {
  61.     list<string> sections;
  62.     list<string> entries;
  63.     CNcbiOstrstream os;
  64.     const char*  os_str;
  65.     string       test_str("" V481" n"V482 ");
  66.     // Compose a test registry
  67.     {{
  68.     CFastMutexGuard LOCK(s_GlobalLock);
  69.     assert( m_Registry.Set("Section0", "Name01", "Val01_BAD!!!") );
  70.     assert( m_Registry.Set("Section1 ", "nName11", "Val11_t") );
  71.     assert(!m_Registry.Empty() );
  72.     assert( m_Registry.Get(" Section1", "Name11t") == "Val11_t" );
  73.     assert( m_Registry.Get("Section1", "Name11",
  74.                            CNcbiRegistry::ePersistent).empty() );
  75.     assert( m_Registry.Set("Section1", "Name11", "Val11_t") );
  76.     assert(!m_Registry.Set("Section1", "Name11", "Val11_BAD!!!",
  77.                            CNcbiRegistry::eNoOverride) );
  78.     assert( m_Registry.Set("   Section2", "nName21  ", "Val21",
  79.                            CNcbiRegistry::ePersistent) );
  80.     assert( m_Registry.Set("Section2", "Name21", "Val21_t") );
  81.     assert(!m_Registry.Empty() );
  82.     assert( m_Registry.Set("Section3", "Name31", "Val31_t") );
  83.     assert( m_Registry.Get(" nSection1", " Name11  ") == "Val11_t" );
  84.     assert( m_Registry.Get("Section2", "Name21",
  85.                            CNcbiRegistry::ePersistent) == "Val21" );
  86.     assert( m_Registry.Get(" Section2", " Name21n") == "Val21_t" );
  87.     assert( m_Registry.Get("SectionX", "Name21").empty() );
  88.     assert( m_Registry.Set("Section4", "Name41", "Val410 Val411 Val413",
  89.                            CNcbiRegistry::ePersistent) );
  90.     assert(!m_Registry.Set("Sect ion4", "Name41", "BAD1",
  91.                            CNcbiRegistry::ePersistent) );
  92.     assert(!m_Registry.Set("Section4", "Na me41", "BAD2") );
  93.     assert( m_Registry.Set("SECTION4", "Name42", "V420 V421nV422 V423 "",
  94.                            CNcbiRegistry::ePersistent) );
  95.     assert( m_Registry.Set("Section4", "NAME43",
  96.                            " tV430 V431  n V432 V433 ",
  97.                            CNcbiRegistry::ePersistent) );
  98.     assert( m_Registry.Set("tSection4", "Name43T",
  99.                            " tV430 V431  n V432 V433 ",
  100.                            CNcbiRegistry::ePersistent |
  101.                            CNcbiRegistry::eTruncate) );
  102.     assert( m_Registry.Set("Section4", "Name44", "n V440 V441 rn",
  103.                            CNcbiRegistry::ePersistent) );
  104.     assert( m_Registry.Set("r Section4", "  trName45",
  105.                            "rn V450 V451  n  ",
  106.                            CNcbiRegistry::ePersistent) );
  107.     assert( m_Registry.Set("Section4 n", "  Name46  ",
  108.                            "nnV460" n t nt",
  109.                            CNcbiRegistry::ePersistent) );
  110.     assert( m_Registry.Set(" Section4", "Name46T", "nnV460" n t nt",
  111.                            CNcbiRegistry::ePersistent |
  112.                            CNcbiRegistry::eTruncate) );
  113.     assert( m_Registry.Set("Section4", "Name47",
  114.                            "470n471\n 472\n473\",
  115.                            CNcbiRegistry::ePersistent) );
  116.     assert( m_Registry.Set("Section4", "Name47T",
  117.                            "470n471\n 472\n473\",
  118.                            CNcbiRegistry::ePersistent |
  119.                            CNcbiRegistry::eTruncate) );
  120.     assert( m_Registry.Set("Section4", "Name48", test_str,
  121.                            CNcbiRegistry::ePersistent) );
  122.     assert( m_Registry.Set("Section5", "Name51", "Section5/Name51",
  123.                            CNcbiRegistry::ePersistent) );
  124.     assert( m_Registry.Set("_Section_5", "Name51", "_Section_5/Name51",
  125.                            CNcbiRegistry::ePersistent) );
  126.     assert( m_Registry.Set("_Section_5_", "_Name52", "_Section_5_/_Name52",
  127.                            CNcbiRegistry::ePersistent) );
  128.     assert( m_Registry.Set("_Section_5_", "Name52", "_Section_5_/Name52",
  129.                            CNcbiRegistry::ePersistent) );
  130.     assert( m_Registry.Set("_Section_5_", "_Name53_", "_Section_5_/_Name53_",
  131.                            CNcbiRegistry::ePersistent) );
  132.     assert( m_Registry.Set("Section-5.6", "Name-5.6", "Section-5.6/Name-5.6",
  133.                            CNcbiRegistry::ePersistent) );
  134.     assert( m_Registry.Set("-Section_5", ".Name.5-3", "-Section_5/.Name.5-3",
  135.                            CNcbiRegistry::ePersistent) );
  136.     // Numeric conversions
  137.     assert( m_Registry.Set("Section_61", "Int_Good", "12345",
  138.                            CNcbiRegistry::ePersistent) );
  139.     assert( m_Registry.Set("Section_61", "Bool_Good", "true",
  140.                            CNcbiRegistry::ePersistent) );
  141.     assert( m_Registry.Set("Section_61", "Double_Good", "45.98",
  142.                            CNcbiRegistry::ePersistent) );
  143.     assert( m_Registry.Set("Section_62", "Int_Bad", "bad_int",
  144.                            CNcbiRegistry::ePersistent) );
  145.     assert( m_Registry.Set("Section_62", "Bool_Bad", "bad_bool",
  146.                            CNcbiRegistry::ePersistent) );
  147.     assert( m_Registry.Set("Section_62", "Double_Bad", "bad_double",
  148.                            CNcbiRegistry::ePersistent) );
  149.     assert( m_Registry.GetInt   ("Section_61", "Int_Good",    999)   == 12345);
  150.     assert( m_Registry.GetBool  ("Section_61", "Bool_Good",   false) == true);
  151.     assert( m_Registry.GetDouble("Section_61", "Double_Good", 9.99)  == 45.98);
  152.     assert( m_Registry.GetInt   ("Section_61", "Undef", 999)   == 999);
  153.     assert( m_Registry.GetBool  ("Section_61", "Undef", false) == false);
  154.     assert( m_Registry.GetDouble("Section_61", "Undef", 9.99)  == 9.99);
  155.     assert( m_Registry.GetInt   ("Section_62", "Int_Bad",
  156.                                  999, 0, CNcbiRegistry::eReturn)   == 999);
  157.     assert( m_Registry.GetBool  ("Section_62", "Bool_Bad",
  158.                                  false, 0, CNcbiRegistry::eReturn) == false);
  159.     assert( m_Registry.GetDouble("Section_62", "Double_Bad",
  160.                                  9.99, 0, CNcbiRegistry::eReturn)  == 9.99);
  161.     bool ex_int = false;
  162.     try {
  163.         (void) m_Registry.GetInt("Section_62", "Int_Bad", 999);
  164.     } catch (CException& ) {
  165.         ex_int = true;
  166.     }
  167.     assert( ex_int );
  168.     bool ex_bool = false;
  169.     try {
  170.         (void) m_Registry.GetBool("Section_62", "Bool_Bad", false);
  171.     } catch (CException& ) {
  172.         ex_bool = true;
  173.     }
  174.     assert( ex_bool );
  175.     bool ex_double = false;
  176.     try {
  177.         (void) m_Registry.GetDouble("Section_62", "Double_Bad", 9.99);
  178.     } catch (CException& ) {
  179.         ex_double = true;
  180.     }
  181.     assert( ex_double );
  182.     m_Registry.EnumerateSections(&sections);
  183.     assert( find(sections.begin(), sections.end(), "Section1")
  184.             != sections.end() );
  185.     assert( !sections.empty() );
  186.     // Dump
  187.     assert ( m_Registry.Write(os) );
  188.     os << '';
  189.     os_str = os.str();
  190.     os.freeze(false);
  191.     }}
  192.     // "Persistent" load
  193.     CNcbiIstrstream is1(os_str);
  194.     CNcbiRegistry   reg1(is1);
  195.     assert(  reg1.Get("Section2", "Name21", CNcbiRegistry::ePersistent) ==
  196.              "Val21" );
  197.     assert(  reg1.Get("Section2", "Name21") == "Val21" );
  198.     assert( !reg1.Set("Section2", "Name21", NcbiEmptyString) );
  199.     assert( !reg1.Set("Section2", "Name21", NcbiEmptyString,
  200.                       CNcbiRegistry::ePersistent |
  201.                       CNcbiRegistry::eNoOverride) );
  202.     assert( !reg1.Empty() );
  203.     assert(  reg1.Set("Section2", "Name21", NcbiEmptyString,
  204.                       CNcbiRegistry::ePersistent) );
  205.     // "Transient" load
  206.     CNcbiIstrstream is2(os_str);
  207.     CNcbiRegistry  reg2(is2, CNcbiRegistry::eTransient);
  208.     assert(  reg2.Get("Section2", "Name21",
  209.                       CNcbiRegistry::ePersistent).empty() );
  210.     assert(  reg2.Get("Section2", "Name21") == "Val21" );
  211.     assert( !reg2.Set("Section2", "Name21", NcbiEmptyString,
  212.                       CNcbiRegistry::ePersistent) );
  213.     assert( !reg2.Set("Section2", "Name21", NcbiEmptyString,
  214.                       CNcbiRegistry::ePersistent |
  215.                       CNcbiRegistry::eNoOverride) );
  216.     assert( !reg2.Empty() );
  217.     assert(  reg2.Set("Section2", "Name21", NcbiEmptyString) );
  218.     assert( reg2.Get("Section4", "Name41")  == "Val410 Val411 Val413" );
  219.     assert( reg2.Get("Section4", "Name42")  == "V420 V421nV422 V423 "" );
  220.     assert( reg2.Get("Section4", "Name43")  ==
  221.             " tV430 V431  n V432 V433 ");
  222.     assert( reg2.Get("Section4", "Name43T") == "V430 V431  n V432 V433" );
  223.     assert( reg2.Get("Section4", "Name44")  == "n V440 V441 rn" );
  224.     assert( reg2.Get("Section4", "NaMe45")  == "rn V450 V451  n  " );
  225.     assert( reg2.Get("SecTIOn4", "NAme46")  == "nnV460" n t nt" );
  226.     assert( reg2.Get("Section4", "Name46T") == "nnV460" n t n" );
  227.     assert( reg2.Get("Section4", "Name47")  == "470n471\n 472\n473\" );
  228.     assert( reg2.Get("Section4", "Name47T") == "470n471\n 472\n473\" );
  229.     assert( reg2.Get("Section4", "Name48")  == test_str );
  230.     assert( reg2.Get(" Section5",    "Name51 ")   == "Section5/Name51" );
  231.     assert( reg2.Get("_Section_5",   " Name51")   == "_Section_5/Name51" );
  232.     assert( reg2.Get(" _Section_5_", " _Name52")  == "_Section_5_/_Name52");
  233.     assert( reg2.Get("_Section_5_ ", "Name52")    == "_Section_5_/Name52");
  234.     assert( reg2.Get("_Section_5_",  "_Name53_ ") ==
  235.             "_Section_5_/_Name53_" );
  236.     assert( reg2.Get(" Section-5.6", "Name-5.6 ") == "Section-5.6/Name-5.6");
  237.     assert( reg2.Get("-Section_5",   ".Name.5-3") == "-Section_5/.Name.5-3");
  238.     return true;
  239. }
  240. bool CTestRegApp::TestApp_Init(void)
  241. {
  242.     NcbiCout << NcbiEndl
  243.              << "Testing NCBIREG with "
  244.              << NStr::IntToString(s_NumThreads)
  245.              << " threads..."
  246.              << NcbiEndl;
  247.     assert( m_Registry.Empty() );
  248.     list<string> sections;
  249.     m_Registry.EnumerateSections(&sections);
  250.     assert( sections.empty() );
  251.     list<string> entries;
  252.     m_Registry.EnumerateEntries(NcbiEmptyString, &entries);
  253.     assert( entries.empty() );
  254.     return true;
  255. }
  256. bool CTestRegApp::TestApp_Exit(void)
  257. {
  258.     m_Registry.Clear();
  259.     assert( m_Registry.Empty() );
  260.     NcbiCout << "Test completed successfully!"
  261.              << NcbiEndl << NcbiEndl;
  262.     return true;
  263. }
  264. /////////////////////////////////////////////////////////////////////////////
  265. //  MAIN
  266. int main(int argc, const char* argv[]) 
  267. {
  268.     CTestRegApp app;
  269.     return app.AppMain(argc, argv, 0, eDS_Default, 0);
  270. }
  271. /*
  272.  * ===========================================================================
  273.  * $Log: test_ncbireg_mt.cpp,v $
  274.  * Revision 1000.1  2004/06/01 19:10:16  gouriano
  275.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.8
  276.  *
  277.  * Revision 6.8  2004/05/14 13:59:51  gorelenk
  278.  * Added include of ncbi_pch.hpp
  279.  *
  280.  * Revision 6.7  2003/05/14 20:57:30  ivanov
  281.  * Made WIN to UNIX eol conversion
  282.  *
  283.  * Revision 6.6  2003/05/14 20:49:04  ivanov
  284.  * Added MT lock for m_Registry protection
  285.  *
  286.  * Revision 6.5  2003/01/31 16:48:32  lavr
  287.  * Remove unused variable "e" from catch() clause
  288.  *
  289.  * Revision 6.4  2002/12/30 23:23:09  vakatov
  290.  * + GetString(), GetInt(), GetBool(), GetDouble() -- with defaults,
  291.  * conversions and error handling control (to extend Get()'s functionality).
  292.  *
  293.  * Revision 6.3  2002/04/23 13:11:50  gouriano
  294.  * test_mt.cpp/hpp moved into another location
  295.  *
  296.  * Revision 6.2  2002/04/16 18:49:08  ivanov
  297.  * Centralize threatment of assert() in tests.
  298.  * Added #include <test/test_assert.h>. CVS log moved to end of file.
  299.  *
  300.  * Revision 6.1  2001/04/06 15:57:09  grichenk
  301.  * Initial revision
  302.  *
  303.  * ===========================================================================
  304.  */