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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbi_buffer.c,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 17:03:27  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R6.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbi_buffer.c,v 1000.0 2003/10/29 17:03:27 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 "ncbi_buffer.[ch]", the memory-resident FIFO storage area
  38.  *
  39.  */
  40. #include <connect/ncbi_buffer.h>
  41. #include <stdio.h>
  42. #include <stdlib.h>
  43. #include <string.h>
  44. /* This header must go last */
  45. #include "test_assert.h"
  46. static unsigned s_Rand(void)
  47. {   /* a uniform random number generator */
  48.     static unsigned s_Random = 1;
  49.     s_Random = s_Random * 1103515245 + 12345;
  50.     return (s_Random / 65536) % 32768;
  51. }
  52. extern int main(void)
  53. {
  54. #  define X_MAX_N_IO  (unsigned) 4
  55. #  define X_MAX_READ  (size_t)   (3 * BUF_DEF_CHUNK_SIZE)
  56. #  define X_TIMES     (unsigned) (s_Rand() % X_MAX_N_IO)
  57. #  define X_BYTES     (size_t)   (s_Rand() % X_MAX_READ)
  58.     BUF buf  = 0;
  59.     BUF buf1 = 0;
  60.     int/*bool*/ do_loop = 1 /* true */;
  61.     /* a simple test */
  62.     {{
  63.         char charbuf[128];
  64.         assert(BUF_PushBack(&buf, (const char*) "0", 1));
  65.         assert(BUF_Write(&buf, (const char*) "1", 1));
  66.         assert(BUF_Peek(buf, charbuf, sizeof(charbuf)) == 2);
  67.         assert(BUF_PushBack(&buf, (const char*) "BB", 2));
  68.         assert(BUF_PushBack(&buf, (const char*) "aa", 2));
  69.         assert(BUF_Write(&buf, (const char*) "23", 3));
  70.         assert(BUF_Read(buf, charbuf, sizeof(charbuf)) == 9);
  71.         assert(strcmp(charbuf, (const char*) "aaBB0123") == 0);
  72.         BUF_Destroy(buf);
  73.         buf = 0;
  74.     }}
  75.     /* usage */
  76.     fprintf(stderr, "Waiting for the data in STDIN...n");
  77.     /* read up to the very end of input stream */
  78.     while ( do_loop ) {
  79.         char charbuf[X_MAX_READ];
  80.         unsigned i, n_times;
  81.         /* read from the input stream, write to the NCBI IO-buf */
  82.         n_times = X_TIMES;
  83.         for (i = 0;  i < n_times;  i++) {
  84.             size_t n_bytes = X_BYTES;
  85.             if ( !n_bytes )
  86.                 continue;
  87.             n_bytes = fread(charbuf, 1, n_bytes, stdin);
  88.             fprintf(stderr, "STDIN     %5lun", (unsigned long) n_bytes);
  89.             if ( !n_bytes ) {
  90.                 do_loop = 0 /* false */; /* end of the input stream */
  91.                 break;
  92.             }
  93.             assert(BUF_Write(&buf,  charbuf, n_bytes));
  94.             assert(BUF_Write(&buf1, charbuf, n_bytes));
  95.             fprintf(stderr, "BUF_Write %5lun", (unsigned long) n_bytes);
  96.         }
  97.         /* peek & read from the NCBI IO-buf, write to the output stream */
  98.         n_times = X_TIMES;
  99.         for (i = 0;  i < n_times  &&  BUF_Size(buf);  i++) {
  100.             int/*bool*/ do_peek = (s_Rand() % 2 == 0);
  101.             size_t n_peek = 0;
  102.             size_t n_bytes = X_BYTES;
  103.             if ( !n_bytes )
  104.                 continue;
  105.             /* peek from the NCBI IO-buf */
  106.             if ( do_peek ) {
  107.                 unsigned j, n_peek_times = s_Rand() % 3 + 1;
  108.                 for (j = 0;  j < n_peek_times;  j++) {
  109.                     n_peek = BUF_Peek(buf, charbuf, n_bytes);
  110.                     fprintf(stderr, "tBUF_Peek %5lun",(unsigned long)n_peek);
  111.                 }
  112.             }
  113.             /* read (or just discard) the data */
  114.             if (do_peek  &&  s_Rand() % 2 == 0)
  115.                 n_bytes = BUF_Read(buf, 0, n_bytes);
  116.             else
  117.                 n_bytes = BUF_Read(buf, charbuf, n_bytes);
  118.             fprintf(stderr, "ttBUF_Read %5lun", (unsigned long) n_bytes);
  119.             assert(!do_peek  ||  n_bytes == n_peek);
  120.             /* push back & re-read */
  121.             if (s_Rand() % 3 == 0) {
  122.                 size_t n_pushback = s_Rand() % n_bytes;
  123.                 if (n_pushback == 0)
  124.                     n_pushback = 1;
  125.                 assert(BUF_PushBack
  126.                        (&buf, charbuf + n_bytes - n_pushback, n_pushback));
  127.                 assert(BUF_Read
  128.                        (buf, charbuf + n_bytes - n_pushback, n_pushback));
  129.             }
  130.             /* write the read data to the output stream */
  131.             assert(n_bytes == fwrite(charbuf, 1, n_bytes, stdout));
  132.             fprintf(stderr, "ttSTDOUT   %5lun", (unsigned long) n_bytes);
  133.         }
  134.     }
  135.     /* flush the IO-buf to the output stream */
  136.     while ( BUF_Size(buf) ) {
  137.         char charbuf[256];
  138.         size_t n_bytes = BUF_Read(buf, charbuf, sizeof(charbuf));
  139.         {{
  140.             char   tmp[sizeof(charbuf)];
  141.             size_t n_pushback = s_Rand() % 64;
  142.             if (n_pushback > n_bytes)
  143.                 n_pushback = n_bytes;
  144.             assert(BUF_PushBack
  145.                    (&buf, charbuf + n_bytes - n_pushback, n_pushback));
  146.             assert(BUF_Read
  147.                    (buf, tmp, n_pushback) == n_pushback);
  148.             memcpy(charbuf + n_bytes - n_pushback, tmp, n_pushback);
  149.         }}
  150.         fprintf(stderr, "ttBUF_Read/flush %5lun", (unsigned long) n_bytes);
  151.         assert(n_bytes);
  152.         assert(n_bytes == fwrite(charbuf, 1, n_bytes, stdout));
  153.         fprintf(stderr, "ttSTDOUT  /flush %5lun", (unsigned long) n_bytes);
  154.     }
  155.     fflush(stdout);
  156.     /* Test for "BUF_PeekAt()" */
  157.     {{
  158.         size_t buf1_size = BUF_Size(buf1);
  159.         int n;
  160.         assert(buf1_size > 0);
  161.         for (n = 0;  n < 20;  n++) {
  162.             size_t pos;
  163.             size_t size;
  164.             /* Erratically copy "buf1" to "buf" */
  165.             for (pos = 0;  pos < buf1_size;  pos += size) {
  166.                 char temp_buf[BUF_DEF_CHUNK_SIZE * 2];
  167.                 size_t n_peeked;
  168.                 size = s_Rand() % (BUF_DEF_CHUNK_SIZE * 2);
  169.                 n_peeked = BUF_PeekAt(buf1, pos, temp_buf, size);
  170.                 if (pos + size <= buf1_size) {
  171.                     assert(n_peeked == size);
  172.                 } else {
  173.                     assert(n_peeked == buf1_size - pos);
  174.                 }
  175.                 assert(BUF_PeekAt(buf1, pos, temp_buf, size) == n_peeked);
  176.                 assert(BUF_Write(&buf, temp_buf, n_peeked));
  177.             }
  178.             /* Compare "buf" and "buf1"; empty up "buf" in process */
  179.             assert(BUF_Size(buf1) == BUF_Size(buf));
  180.             for (pos = 0;  pos < buf1_size;  pos += size) {
  181.                 char bb[1024];
  182.                 char b1[1024];
  183.                 assert(sizeof(bb) == sizeof(b1));
  184.                 size = BUF_Read(buf, bb, sizeof(bb));
  185.                 assert(BUF_PeekAt(buf1, pos, b1, size) == size);
  186.                 assert(size <= sizeof(b1));
  187.                 assert(memcmp(bb, b1, size) == 0);
  188.             }
  189.             assert(pos == buf1_size);
  190.             assert(BUF_Size(buf1) == buf1_size);
  191.             assert(BUF_Size(buf)  == 0);
  192.         }
  193.     }}
  194.     /* cleanup & exit */
  195.     BUF_Destroy(buf1);
  196.     BUF_Destroy(buf);
  197.     return 0;
  198. }
  199. /*
  200.  * ---------------------------------------------------------------------------
  201.  * $Log: test_ncbi_buffer.c,v $
  202.  * Revision 1000.0  2003/10/29 17:03:27  gouriano
  203.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R6.10
  204.  *
  205.  * Revision 6.10  2003/02/25 16:26:58  lavr
  206.  * Log moved to end; code re-indented
  207.  *
  208.  * Revision 6.9  2003/01/08 02:01:27  lavr
  209.  * BUF_Destroy() made not returning a value
  210.  *
  211.  * Revision 6.8  2002/03/22 19:46:30  lavr
  212.  * Test_assert.h made last among the include files
  213.  *
  214.  * Revision 6.7  2002/01/16 21:23:14  vakatov
  215.  * Utilize header "test_assert.h" to switch on ASSERTs in the Release mode too
  216.  *
  217.  * Revision 6.6  2001/04/23 18:07:22  vakatov
  218.  * + BUF_PeekAt()
  219.  *
  220.  * Revision 6.5  2000/03/24 23:12:12  vakatov
  221.  * Starting the development quasi-branch to implement CONN API.
  222.  * All development is performed in the NCBI C++ tree only, while
  223.  * the NCBI C tree still contains "frozen" (see the last revision) code.
  224.  *
  225.  * Revision 6.4  2000/02/23 22:34:37  vakatov
  226.  * Can work both "standalone" and as a part of NCBI C++ or C toolkits
  227.  *
  228.  * Revision 6.3  1999/11/22 16:12:54  vakatov
  229.  * Allow to #include ncbi_buffer.h as a local
  230.  *
  231.  * Revision 6.2  1999/11/12 17:31:51  vakatov
  232.  * Cosmetics -- get rid of an extra warning in Release build
  233.  *
  234.  * Revision 6.1  1999/10/12 16:33:50  vakatov
  235.  * Moved all TEST suite code from "ncbi_buffer.c" to "test/test_ncbi_buffer.c"
  236.  *
  237.  * ===========================================================================
  238.  */