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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbi_core.c,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 17:04:17  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R6.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbi_core.c,v 1000.0 2003/10/29 17:04:17 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:  Denis Vakatov
  35.  *
  36.  * File Description:
  37.  *   Test suite for:
  38.  *     ncbi_core.[ch]
  39.  *     ncbi_util.[ch]
  40.  *
  41.  */
  42. #include <connect/ncbi_util.h>
  43. #include <stdlib.h>
  44. #include <errno.h>
  45. /* This header must go last */
  46. #include "test_assert.h"
  47. /* Aux. to printout a name of the next function to test
  48.  */
  49. #define DO_TEST(func)  do { 
  50.   printf("n----- "#func"  -----------------------------------------n"); 
  51.   func(); 
  52. } while (0)
  53. /* Some pre-declarations to avoid C++ compiler warnings
  54.  */
  55. #if defined(__cplusplus)
  56. extern "C" {
  57.   static int/*bool*/ TEST_CORE_LockHandler(void* user_data, EMT_Lock how);
  58.   static void        TEST_CORE_LockCleanup(void* user_data);
  59.   static void TEST_CORE_LogHandler(void* user_data, SLOG_Handler* call_data);
  60.   static void TEST_CORE_LogCleanup(void* user_data);
  61. }
  62. #endif /* __cplusplus */
  63. /*****************************************************************************
  64.  *  TEST_CORE -- test "ncbi_core.c"
  65.  */
  66. static void TEST_CORE_Generic(void)
  67. {
  68.   /* STimeout */
  69.   static STimeout x_timeout = { 111111, 222222 };
  70.   x_timeout.sec  = (unsigned int) 333333;
  71.   x_timeout.usec = (unsigned int) 444444;
  72. }
  73. static void TEST_CORE_Io(void)
  74. {
  75.   /* EIO_Status, IO_StatusStr() */
  76.   int x_status;
  77.   for (x_status = 0;  x_status <= (int) eIO_Unknown;  x_status++) {
  78.     switch ( (EIO_Status) x_status ) {
  79.     case eIO_Success:
  80.     case eIO_Timeout:
  81.     case eIO_Closed:
  82.     case eIO_Interrupt:
  83.     case eIO_InvalidArg:
  84.     case eIO_NotSupported:
  85.     case eIO_Unknown:
  86.       assert(IO_StatusStr((EIO_Status) x_status));
  87.       printf("IO_StatusStr(status = %d): "%s"n",
  88.              x_status, IO_StatusStr((EIO_Status) x_status));
  89.       break;
  90.     default:
  91.       assert(0);
  92.     }
  93.   }
  94. }
  95. static int TEST_CORE_LockUserData;
  96. /* FMT_LOCK_Handler */
  97. static int/*bool*/ TEST_CORE_LockHandler(void* user_data, EMT_Lock how)
  98. {
  99.   const char* str = 0;
  100.   assert(user_data == &TEST_CORE_LockUserData);
  101.   switch ( how ) {
  102.   case eMT_Lock:
  103.     str = "eMT_Lock";
  104.     break;
  105.   case eMT_LockRead:
  106.     str = "eMT_LockRead";
  107.     break;
  108.   case eMT_Unlock:
  109.     str = "eMT_Unlock";
  110.     break;
  111.   }
  112.   assert(str);
  113.   printf("TEST_CORE_LockHandler(%s)n", str);
  114.   return 1/*true*/;
  115. }
  116. /* FMT_LOCK_Cleanup */
  117. static void TEST_CORE_LockCleanup(void* user_data)
  118. {
  119.   assert(user_data == &TEST_CORE_LockUserData);
  120.   printf("TEST_CORE_LockCleanup()n");
  121.   TEST_CORE_LockUserData = 222;
  122. }
  123. static void TEST_CORE_Lock(void)
  124. {
  125.   /* MT_LOCK API */
  126.   MT_LOCK x_lock;
  127.   /* dummy */
  128.   TEST_CORE_LockUserData = 111;
  129.   x_lock = MT_LOCK_Create(&TEST_CORE_LockUserData,
  130.                           0, TEST_CORE_LockCleanup);
  131.   assert(x_lock);
  132.   verify(MT_LOCK_AddRef(x_lock) == x_lock);
  133.   verify(MT_LOCK_AddRef(x_lock) == x_lock);
  134.   verify(MT_LOCK_Delete(x_lock) == x_lock);
  135.   assert(TEST_CORE_LockUserData == 111);
  136.   verify(MT_LOCK_Do(x_lock, eMT_LockRead));
  137.   verify(MT_LOCK_Do(x_lock, eMT_Lock));
  138.   verify(MT_LOCK_Do(x_lock, eMT_Unlock));
  139.   verify(MT_LOCK_Do(x_lock, eMT_Unlock));
  140.   verify(MT_LOCK_Delete(x_lock) == x_lock);
  141.   assert(TEST_CORE_LockUserData == 111);
  142.   verify(MT_LOCK_Delete(x_lock) == 0);
  143.   assert(TEST_CORE_LockUserData == 222);
  144.   /* real */
  145.   x_lock = MT_LOCK_Create(&TEST_CORE_LockUserData,
  146.                           TEST_CORE_LockHandler, TEST_CORE_LockCleanup);
  147.   assert(x_lock);
  148.   verify(MT_LOCK_Do(x_lock, eMT_LockRead));
  149.   verify(MT_LOCK_Do(x_lock, eMT_Lock));
  150.   verify(MT_LOCK_Do(x_lock, eMT_Unlock));
  151.   verify(MT_LOCK_Do(x_lock, eMT_Unlock));
  152.   verify(MT_LOCK_Delete(x_lock) == 0);
  153. }
  154. static int TEST_CORE_LogUserData;
  155. /* FLOG_Handler */
  156. static void TEST_CORE_LogHandler(void* user_data, SLOG_Handler* call_data)
  157. {
  158.     printf("TEST_CORE_LogHandler(round %d):n", TEST_CORE_LogUserData);
  159.     printf("   Message: %sn",  call_data->message ? call_data->message : "?");
  160.     printf("   Level:   %sn",  LOG_LevelStr(call_data->level));
  161.     printf("   Module:  %sn",  call_data->module ? call_data->module : "?");
  162.     printf("   File:    %sn",  call_data->file ? call_data->file : "?");
  163.     printf("   Line:    %dn",  call_data->line);
  164. }
  165. /* FLOG_Cleanup */
  166. static void TEST_CORE_LogCleanup(void* user_data)
  167. {
  168.   assert(user_data == &TEST_CORE_LogUserData);
  169.   printf("TEST_CORE_LogCleanup(round %d)n", TEST_CORE_LogUserData);
  170.   TEST_CORE_LogUserData = 444;
  171. }
  172. static void TEST_CORE_Log(void)
  173. {
  174.   /* LOG */
  175.   LOG x_log;
  176.   /* protective MT-lock */
  177.   MT_LOCK x_lock;
  178.   /* ELOG_Level, LOG_LevelStr() */
  179.   int x_level;
  180.   for (x_level = 0;  x_level <= (int) eLOG_Fatal;  x_level++) {
  181.     switch ( (ELOG_Level) x_level ) {
  182.     case eLOG_Trace:
  183.     case eLOG_Note:
  184.     case eLOG_Warning:
  185.     case eLOG_Error:
  186.     case eLOG_Critical:
  187.     case eLOG_Fatal:
  188.       assert(LOG_LevelStr((ELOG_Level) x_level));
  189.       printf("LOG_LevelStr(level = %d): "%s"n",
  190.              x_level, LOG_LevelStr((ELOG_Level) x_level));
  191.       break;
  192.     default:
  193.       assert(0);
  194.     }
  195.   }
  196.   /* LOG API */
  197.   /* MT-lock */
  198.   x_lock = MT_LOCK_Create(&TEST_CORE_LockUserData,
  199.                           TEST_CORE_LockHandler, TEST_CORE_LockCleanup);
  200.   /* dummy */
  201.   TEST_CORE_LogUserData = 1;
  202.   x_log = LOG_Create(&TEST_CORE_LogUserData,
  203.                      TEST_CORE_LogHandler, TEST_CORE_LogCleanup,
  204.                      x_lock);
  205.   assert(x_log);
  206.   verify(LOG_AddRef(x_log) == x_log);
  207.   verify(LOG_AddRef(x_log) == x_log);
  208.   verify(LOG_Delete(x_log) == x_log);
  209.   assert(TEST_CORE_LogUserData == 1);
  210.   LOG_WRITE(0, eLOG_Trace, 0);
  211.   LOG_Write(0, eLOG_Trace, 0, 0, 0, 0);
  212.   LOG_WRITE(x_log, eLOG_Trace, 0);
  213.   LOG_Write(x_log, eLOG_Trace, 0, 0, 0, 0);
  214.   verify(LOG_Delete(x_log) == x_log);
  215.   assert(TEST_CORE_LogUserData == 1);
  216.   /* reset to "real" logging */
  217.   LOG_Reset(x_log, &TEST_CORE_LogUserData,
  218.             TEST_CORE_LogHandler, TEST_CORE_LogCleanup);
  219.   assert(TEST_CORE_LogUserData == 444);
  220.   TEST_CORE_LogUserData = 2;
  221.   /* do the test logging */
  222.   LOG_WRITE(x_log, eLOG_Trace, 0);
  223.   LOG_Write(x_log, eLOG_Trace, 0, 0, 0, 0);
  224.   LOG_WRITE(x_log, eLOG_Warning, "");
  225.   /* LOG_WRITE(x_log, eLOG_Fatal, "Something fatal"); */
  226. #undef  THIS_MODULE
  227. #define THIS_MODULE "FooModuleName"
  228.   LOG_WRITE(x_log, eLOG_Error, "With changed module name");
  229. #undef  THIS_FILE
  230. #define THIS_FILE "BarFileName"
  231.   LOG_WRITE(x_log, eLOG_Critical, "With changed module and file name");
  232. #undef  THIS_FILE
  233. #define THIS_FILE __FILE__
  234. #undef  THIS_MODULE
  235. #define THIS_MODULE 0
  236.   /* delete */
  237.   verify(LOG_Delete(x_log) == 0);
  238.   assert(TEST_CORE_LogUserData == 444);
  239. }
  240. static void TEST_CORE(void)
  241. {
  242.   /* Do all TEST_CORE_***() tests */
  243.   DO_TEST(TEST_CORE_Generic);
  244.   DO_TEST(TEST_CORE_Io);
  245.   DO_TEST(TEST_CORE_Lock);
  246.   DO_TEST(TEST_CORE_Log);
  247. }
  248. /*****************************************************************************
  249.  *  TEST_UTIL -- test "ncbi_util.c"
  250.  */
  251. static void TEST_UTIL_Log(void)
  252. {
  253.   /* create */
  254.   LOG x_log = LOG_Create(0, 0, 0, 0);
  255.   LOG_ToFILE(x_log, stdout, 0/*false*/);
  256.   /* simple logging */
  257.   LOG_WRITE(x_log, eLOG_Trace, 0);
  258.   LOG_Write(x_log, eLOG_Trace, 0, 0, 0, 0);
  259.   LOG_WRITE(x_log, eLOG_Warning, "");
  260.   /* LOG_WRITE(x_log, eLOG_Fatal, "Something fatal"); */
  261. #undef  THIS_MODULE
  262. #define THIS_MODULE "FooModuleName"
  263.   LOG_WRITE(x_log, eLOG_Error, "With changed module name");
  264. #undef  THIS_FILE
  265. #define THIS_FILE "BarFileName"
  266.   LOG_WRITE(x_log, eLOG_Critical, "With changed module and file name");
  267. #undef  THIS_FILE
  268. #define THIS_FILE __FILE__
  269. #undef  THIS_MODULE
  270. #define THIS_MODULE 0
  271.   /* data logging */
  272.   {{
  273.     unsigned char data[300];
  274.     size_t i;
  275.     for (i = 0;  i < sizeof(data);  i++) {
  276.         data[i] = (unsigned char) (i % 256);
  277.     }
  278.     LOG_DATA(x_log, data, sizeof(data), "Data logging test");
  279.   }}
  280.   /* logging with errno */
  281.   errno = 0;
  282.   LOG_WRITE_ERRNO(x_log, eLOG_Warning, 0);  
  283.   LOG_WRITE_ERRNO(x_log, eLOG_Error, "");
  284.   LOG_WRITE_ERRNO(x_log, eLOG_Critical, "OKAY");
  285. #undef  THIS_FILE
  286. #define THIS_FILE 0
  287.   (void)strtod("1e-999999", 0);  LOG_WRITE_ERRNO(x_log, eLOG_Warning, 0);  
  288.   (void)strtod("1e-999999", 0);  LOG_WRITE_ERRNO(x_log, eLOG_Error, "");
  289.   (void)strtod("1e-999999", 0);  LOG_WRITE_ERRNO(x_log, eLOG_Critical, "FAIL");
  290.   /* delete */
  291.   verify(LOG_Delete(x_log) == 0);
  292. }
  293. static void TEST_UTIL(void)
  294. {
  295.   DO_TEST(TEST_UTIL_Log);
  296. }
  297. /*****************************************************************************
  298.  *  MAIN -- test all
  299.  */
  300. int main(void)
  301. {
  302.   TEST_CORE();
  303.   TEST_UTIL();
  304.   return 0;
  305. }
  306. /*
  307.  * ---------------------------------------------------------------------------
  308.  * $Log: test_ncbi_core.c,v $
  309.  * Revision 1000.0  2003/10/29 17:04:17  gouriano
  310.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R6.9
  311.  *
  312.  * Revision 6.9  2002/08/14 03:35:26  lavr
  313.  * Fix ELOG_Level test; add eIO_Interrupt to EIO_Status test
  314.  *
  315.  * Revision 6.8  2002/03/22 19:46:57  lavr
  316.  * Test_assert.h made last among the include files
  317.  *
  318.  * Revision 6.7  2002/01/16 21:23:15  vakatov
  319.  * Utilize header "test_assert.h" to switch on ASSERTs in the Release mode too
  320.  *
  321.  * Revision 6.6  2001/08/09 16:25:28  lavr
  322.  * Remove last (unneeded) parameter from LOG_Reset() and its test
  323.  *
  324.  * Revision 6.5  2001/05/17 17:59:03  vakatov
  325.  * TEST_UTIL_Log::  Set "errno" to zero before testing LOG_WRITE_ERRNO()
  326.  *
  327.  * Revision 6.4  2000/06/23 19:35:51  vakatov
  328.  * Test the logging of binary data
  329.  *
  330.  * Revision 6.3  2000/06/01 18:35:12  vakatov
  331.  * Dont log with level "eLOG_Fatal" (it exits/coredumps now)
  332.  *
  333.  * Revision 6.2  2000/04/07 20:00:51  vakatov
  334.  * + <errno.h>
  335.  *
  336.  * Revision 6.1  2000/02/23 22:37:37  vakatov
  337.  * Initial revision
  338.  *
  339.  * ===========================================================================
  340.  */