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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbi_namedpipe_connector.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:46:15  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbi_namedpipe_connector.cpp,v 1000.1 2004/06/01 18:46:15 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, Anton Lavrentiev, Vladimir Ivanov
  35.  *
  36.  * File Description:
  37.  *   Standard test for the the NAMEDPIPE-based CONNECTOR
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbiapp.hpp>
  42. #include <corelib/ncbienv.hpp>
  43. #include <corelib/ncbiargs.hpp>
  44. #include <corelib/ncbi_system.hpp>
  45. #include <corelib/ncbifile.hpp>
  46. #include <connect/ncbi_namedpipe.hpp>
  47. #include <connect/ncbi_namedpipe_connector.hpp>
  48. #include "../ncbi_priv.h"
  49. #include "ncbi_conntest.h"
  50. #include "test_assert.h"  // This header must go last
  51. USING_NCBI_SCOPE;
  52. // Test pipe name
  53. #if defined(NCBI_OS_MSWIN)
  54.     const char* kPipeName = "\\.\pipe\ncbi\test_con_pipename";
  55. #elif defined(NCBI_OS_UNIX)
  56.     const char* kPipeName = "./.ncbi_test_con_pipename";
  57. #endif
  58. const size_t kBufferSize = 25*1024;
  59. static void Client(STimeout timeout)
  60. {
  61.     CONNECTOR  connector;
  62.     FILE*      log_file;
  63.     CORE_SetLOGFILE(stderr, 0/*false*/);
  64.     log_file = fopen("test_namedpipe_con_client.log", "ab");
  65.     assert(log_file > 0);
  66.     // Tests for NAMEDPIPE CONNECTOR
  67.     LOG_POST(string("Starting the NAMEDPIPE CONNECTOR test ...nn") +
  68.              kPipeName + ", timeout = " +
  69.              NStr::DoubleToString(timeout.sec+(double)timeout.usec/1000000,6)+
  70.              " sec.n");
  71.     connector = NAMEDPIPE_CreateConnector(kPipeName);
  72.     CONN_TestConnector(connector, &timeout, log_file, fTC_SingleBouncePrint);
  73.     connector = NAMEDPIPE_CreateConnector(kPipeName, kBufferSize);
  74.     CONN_TestConnector(connector, &timeout, log_file, fTC_SingleBounceCheck);
  75.     connector = NAMEDPIPE_CreateConnector(kPipeName, kBufferSize);
  76.     CONN_TestConnector(connector, &timeout, log_file, fTC_Everything);
  77.     // Cleanup
  78.     fclose(log_file);
  79. }
  80. // The server just bounce all incoming data back to the client
  81. static void Server(STimeout timeout, int n_cycle)
  82. {
  83.     EIO_Status status;
  84. #if defined(NCBI_OS_UNIX)
  85.     // Remove the pipe if it is already exists
  86.     CFile(kPipeName).Remove();
  87. #endif  
  88.     LOG_POST(string("Starting the NAMEDPIPE CONNECTOR io bouncer ...nn") +
  89.              kPipeName + ", timeout = " +
  90.              NStr::DoubleToString(timeout.sec+(double)timeout.usec/1000000,6)+
  91.              ", n_cycle = " + NStr::UIntToString(n_cycle) + "n");
  92.     // Create listening named pipe
  93.     CNamedPipeServer pipe;
  94.     assert(pipe.Create(kPipeName, &timeout, kBufferSize) == eIO_Success);
  95.     assert(pipe.SetTimeout(eIO_Read,  &timeout) == eIO_Success);
  96.     assert(pipe.SetTimeout(eIO_Write, &timeout) == eIO_Success);
  97.     // Accept connections from clients and run test sessions
  98.     while ( n_cycle-- ) {
  99.         size_t  n_read, n_written;
  100.         char    buf[kBufferSize];
  101.         LOG_POST("Server(n_cycle = " + NStr::UIntToString(n_cycle) + ")");
  102.         // Listening pipe
  103.         status = pipe.Listen();
  104.         switch (status) {
  105.         case eIO_Success:
  106.             LOG_POST("Client is connected...");
  107.             // Bounce all incoming data back to the client
  108.             while ((status = pipe.Read(buf, kBufferSize, &n_read))
  109.                    == eIO_Success) {
  110.                 // Dump received data
  111.                 LOG_POST("Read " + NStr::UIntToString(n_read) + " bytes:");
  112.                 NcbiCout.write(buf, n_read);
  113.                 assert(NcbiCout.good());
  114.                 // Write data back to the pipe
  115.                 size_t n_total = 0;
  116.                 while (n_total < n_read) {
  117.                     status = pipe.Write(buf + n_total, n_read - n_total,
  118.                                         &n_written);
  119.                     if (status != eIO_Success) {
  120.                         LOG_POST("Failed to write " +
  121.                                  NStr::UIntToString(n_read) +
  122.                                  " bytes, status = " +
  123.                                  IO_StatusStr(status));
  124.                         break;
  125.                     }
  126.                     n_total += n_written;
  127.                     LOG_POST("Written " + NStr::UIntToString(n_written) +
  128.                              ", remains " +
  129.                              NStr::UIntToString(n_read - n_total) + " bytes");
  130.                 }
  131.             }
  132.             assert(status == eIO_Timeout  ||  status == eIO_Closed);
  133.             // Disconnect client
  134.             LOG_POST("Disconnect client...");
  135.             assert(pipe.Disconnect() == eIO_Success);
  136.             break;
  137.         case eIO_Timeout:
  138.             LOG_POST("Timeout detected...");
  139.             break;
  140.         default:
  141.             _TROUBLE;
  142.         }
  143.     }
  144.     // Close named pipe
  145.     status = pipe.Close();
  146.     assert(status == eIO_Success  ||  status == eIO_Closed);
  147. }
  148. ////////////////////////////////
  149. // Test application
  150. //
  151. class CTest : public CNcbiApplication
  152. {
  153. public:
  154.     virtual void Init(void);
  155.     virtual int  Run(void);
  156. };
  157. void CTest::Init(void)
  158. {
  159.     // Set error posting and tracing on maximum
  160.     SetDiagTrace(eDT_Enable);
  161.     SetDiagPostFlag(eDPF_All);
  162.     UnsetDiagPostFlag(eDPF_Line);
  163.     UnsetDiagPostFlag(eDPF_File);
  164.     UnsetDiagPostFlag(eDPF_LongFilename);
  165.     SetDiagPostLevel(eDiag_Info);
  166.     // Create command-line argument descriptions class
  167.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  168.     // Specify USAGE context
  169.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  170.                               "Test for named pipe connector");
  171.     // Describe the expected command-line arguments
  172.     arg_desc->AddPositional 
  173.         ("mode", "Test mode",
  174.          CArgDescriptions::eString);
  175.     arg_desc->SetConstraint
  176.         ("mode", &(*new CArgAllow_Strings, "client", "server"));
  177.     arg_desc->AddOptionalPositional 
  178.         ("timeout", "Input/output timeout",
  179.          CArgDescriptions::eDouble);
  180.     arg_desc->SetConstraint
  181.         ("timeout", new CArgAllow_Doubles(0.0, 200.0));
  182.     // Setup arg.descriptions for this application
  183.     SetupArgDescriptions(arg_desc.release());
  184. }
  185. int CTest::Run(void)
  186. {
  187.     // Log and data log streams
  188.     CORE_SetLOGFormatFlags(fLOG_None          | fLOG_Level   |
  189.                            fLOG_OmitNoteLevel | fLOG_DateTime);
  190.     CArgs args = GetArgs();
  191.     STimeout timeout = {1, 123456};
  192.     if (args["timeout"].HasValue()) {
  193.         double tv = args["timeout"].AsDouble();
  194.         timeout.sec  = (unsigned int) tv;
  195.         timeout.usec = (unsigned int) ((tv - timeout.sec) * 1000000);
  196.     }
  197.     if (args["mode"].AsString() == "client") {
  198.         SetDiagPostPrefix("Client");
  199.         Client(timeout);
  200.     }
  201.     else if (args["mode"].AsString() == "server") {
  202.         if (!args["timeout"].HasValue()) {
  203.             timeout.sec = 5;
  204.         }
  205.         SetDiagPostPrefix("Server");
  206.         Server(timeout, 10);
  207.     }
  208.     else {
  209.         _TROUBLE;
  210.     }
  211.     CORE_SetLOG(0);
  212.     return 0;
  213. }
  214. ///////////////////////////////////
  215. // APPLICATION OBJECT  and  MAIN
  216. //
  217. int main(int argc, const char* argv[])
  218. {
  219.     // Execute main application function
  220.     return CTest().AppMain(argc, argv, 0, eDS_Default, 0);
  221. }
  222. /*
  223.  * ===========================================================================
  224.  * $Log: test_ncbi_namedpipe_connector.cpp,v $
  225.  * Revision 1000.1  2004/06/01 18:46:15  gouriano
  226.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  227.  *
  228.  * Revision 1.10  2004/05/17 20:58:22  gorelenk
  229.  * Added include of PCH ncbi_pch.hpp
  230.  *
  231.  * Revision 1.9  2003/09/29 16:34:00  ivanov
  232.  * Increased the pipe buffer from 10kb to 25kb. Specify CreateConnector()'s buffer size parameter for the SingleBounceCheck test.
  233.  *
  234.  * Revision 1.8  2003/09/03 14:29:59  ivanov
  235.  * Set r/w status to eIO_Success in the CNamedPipeHandle::Open/Create
  236.  *
  237.  * Revision 1.7  2003/09/03 13:59:44  ivanov
  238.  * Renamed ncbi_namedpipe_connector.h -> ncbi_namedpipe_connector.hpp. Removed NAMEDPIPE_CreateConnectorEx().
  239.  *
  240.  * Revision 1.6  2003/09/02 21:01:49  ivanov
  241.  * + #include <corelib/ncbifile.hpp>
  242.  *
  243.  * Revision 1.5  2003/09/02 19:54:25  ivanov
  244.  * Changed name of the test pipe. Remove test pipe if it is already exists.
  245.  * Increased default timeout to 2 sec.
  246.  *
  247.  * Revision 1.4  2003/08/21 20:09:46  ivanov
  248.  * Adding test for NAMEDPIPE_CreateConnectorEx()
  249.  *
  250.  * Revision 1.3  2003/08/20 14:24:06  ivanov
  251.  * Replaced _TRACE with LOG_POST
  252.  *
  253.  * Revision 1.2  2003/08/19 16:37:31  ivanov
  254.  * Replaced all sprintf() with stream output operators
  255.  *
  256.  * Revision 1.1  2003/08/18 19:23:07  ivanov
  257.  * Initial revision
  258.  *
  259.  * ===========================================================================
  260.  */