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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbi_pipe_connector.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 18:46:21  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbi_pipe_connector.cpp,v 1000.4 2004/06/01 18:46:21 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 PIPE 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 <connect/ncbi_pipe.hpp>
  46. #include <connect/ncbi_pipe_connector.hpp>
  47. #include "../ncbi_priv.h"
  48. #include <connect/ncbi_connection.h>
  49. #include <stdio.h>
  50. #if defined(NCBI_OS_MSWIN)
  51. #  include <io.h>
  52. #elif defined(NCBI_OS_UNIX)
  53. #  include <unistd.h>
  54. #else
  55. #   error "Pipe tests configured for Windows and Unix only."
  56. #endif
  57. #include "test_assert.h"  // This header must go last
  58. USING_NCBI_SCOPE;
  59. const size_t   kBufferSize  = 1024;    // I/O buffer size
  60. const STimeout kTimeout     = {2, 0};  // I/O timeout
  61. ////////////////////////////////
  62. // Auxiliary functions
  63. //
  64. // Reading from file stream
  65. static string s_ReadFile(FILE* fs) 
  66. {
  67.     char buf[kBufferSize];
  68.     size_t cnt = read(fileno(fs), buf, kBufferSize-1);
  69.     buf[cnt] = 0;
  70.     string str = buf;
  71.     cerr << "Read from file stream " << cnt << " bytes:" << endl;
  72.     cerr.write(buf, cnt);
  73.     cerr << endl;
  74.     return str;
  75. }
  76. // Writing to file stream
  77. static void s_WriteFile(FILE* fs, string message) 
  78. {
  79.     write(fileno(fs), message.c_str(), message.length());
  80.     cerr << "Written to file stream " << message.length() << " bytes:" << endl;
  81.     cerr << message << endl;
  82. }
  83. ////////////////////////////////
  84. // Test application
  85. //
  86. class CTest : public CNcbiApplication
  87. {
  88. public:
  89.     virtual void Init(void);
  90.     virtual int  Run(void);
  91. };
  92. void CTest::Init(void)
  93. {
  94.     // Set error posting and tracing on maximum
  95.     SetDiagTrace(eDT_Enable);
  96.     SetDiagPostFlag(eDPF_All);
  97.     SetDiagPostLevel(eDiag_Info);
  98.     // Log and data log streams
  99.     CORE_SetLOGFILE(stderr, 0/*false*/);
  100. }
  101. int CTest::Run(void)
  102. {
  103.     CONN        conn;
  104.     CONNECTOR   connector;
  105.     char        buf[kBufferSize];
  106.     size_t      n_read    = 0;
  107.     size_t      n_written = 0;
  108.     string      message;
  109.     EIO_Status  status;
  110.     // Run the test
  111.     LOG_POST("Starting the PIPE CONNECTOR test...n");
  112.     // Initialization of variables and structures
  113.     const string app = GetArguments().GetProgramName();
  114.     string str;
  115.     vector<string> args;
  116.     // Pipe connector for reading
  117. #if defined(NCBI_OS_UNIX)
  118.     args.push_back("-l");
  119.     connector = PIPE_CreateConnector("ls", args, CPipe::fStdIn_Close);
  120. #elif defined (NCBI_OS_MSWIN)
  121.     string cmd = GetEnvironment().Get("COMSPEC");
  122.     args.push_back("/c");
  123.     args.push_back("dir *.*");
  124.     connector = PIPE_CreateConnector(cmd, args, CPipe::fStdIn_Close);
  125. #endif
  126.     assert(connector);
  127.     assert(CONN_Create(connector, &conn) == eIO_Success);
  128.     CONN_SetTimeout(conn, eIO_Read,  &kTimeout);
  129.     CONN_SetTimeout(conn, eIO_Close, &kTimeout);
  130.     status = CONN_Write(conn, buf, kBufferSize, &n_written, eIO_WritePersist);
  131.     assert(status == eIO_Unknown);
  132.     assert(n_written == 0);
  133.     size_t n_read_total = 0;
  134.     do {
  135.         status = CONN_Read(conn, buf, kBufferSize, &n_read, eIO_ReadPersist);
  136.         n_read_total += n_read;
  137.         NcbiCout.write(buf, n_read);
  138.     } while (n_read > 0);
  139.     NcbiCout << endl;
  140.     NcbiCout.flush();
  141.     assert(n_read_total > 0); 
  142.     assert(status == eIO_Closed);
  143.     assert(CONN_Close(conn) == eIO_Success);
  144.     // Pipe connector for writing
  145.     args.clear();
  146.     args.push_back("one");
  147.     connector = PIPE_CreateConnector(app, args, CPipe::fStdOut_Close);
  148.     assert(connector);
  149.     assert(CONN_Create(connector, &conn) == eIO_Success);
  150.     CONN_SetTimeout(conn, eIO_Write, &kTimeout);
  151.     CONN_SetTimeout(conn, eIO_Close, &kTimeout);
  152.     status = CONN_Read(conn, buf, kBufferSize, &n_read, eIO_ReadPlain);
  153.     assert(status == eIO_Unknown);
  154.     assert(n_read == 0);
  155.     message = "Child, are you ready?";
  156.     status = CONN_Write(conn, message.c_str(), message.length(),
  157.                         &n_written, eIO_WritePersist);
  158.     assert(status == eIO_Success);
  159.     assert(n_written == message.length());
  160.     assert(CONN_Close(conn) == eIO_Success);
  161.    
  162.     // Bidirectional pipe
  163.     args.clear();
  164.     args.push_back("one");
  165.     args.push_back("two");
  166.     connector = PIPE_CreateConnector(app, args);
  167.     assert(connector);
  168.     assert(CONN_Create(connector, &conn) == eIO_Success);
  169.     CONN_SetTimeout(conn, eIO_ReadWrite, &kTimeout);
  170.     CONN_SetTimeout(conn, eIO_Close,     &kTimeout);
  171.     status = CONN_Read(conn, buf, kBufferSize, &n_read, eIO_ReadPlain);
  172.     assert(status == eIO_Timeout);
  173.     assert(n_read == 0);
  174.     message = "Child, are you ready again?";
  175.     status = CONN_Write(conn, message.c_str(), message.length(),
  176.                         &n_written, eIO_WritePersist);
  177.     assert(status == eIO_Success);
  178.     assert(n_written == message.length());
  179.     message = "Ok. Test 2 running.";
  180.     status = CONN_Read(conn, buf, kBufferSize, &n_read, eIO_ReadPlain);
  181.     assert(status == eIO_Success);
  182.     assert(n_read == message.length());
  183.     assert(memcmp(buf, message.c_str(), n_read) == 0);
  184.     status = CONN_Read(conn, buf, kBufferSize, &n_read, eIO_ReadPlain);
  185.     assert(status == eIO_Closed);
  186.     assert(n_read == 0);
  187.     assert(CONN_Close(conn) == eIO_Success);
  188.     LOG_POST("nTEST execution completed successfully!n");
  189.     CORE_SetLOG(0);
  190.     return 0;
  191. }
  192. ///////////////////////////////////
  193. // APPLICATION OBJECT  and  MAIN
  194. //
  195. int main(int argc, const char* argv[])
  196. {
  197.     // Invalid arguments
  198.     if (argc > 3) {
  199.         exit(1);
  200.     }
  201.     // Spawned process for unidirectional test
  202.     if (argc == 2) {
  203.         cerr << endl << "--- CPipe unidirectional test ---" << endl;
  204.         string command = s_ReadFile(stdin);
  205.         _TRACE("read back >>" << command << "<<");
  206.         assert(command == "Child, are you ready?");
  207.         NcbiCout << "Ok. Test 1 running." << endl;
  208.         exit(0);
  209.     }
  210.     // Spawned process for bidirectional test (direct from pipe)
  211.     if (argc == 3) {
  212.         cerr << endl << "--- CPipe bidirectional test (pipe) ---" << endl;
  213.         string command = s_ReadFile(stdin);
  214.         assert(command == "Child, are you ready again?");
  215.         s_WriteFile(stdout, "Ok. Test 2 running.");
  216.         exit(0);
  217.     }
  218.     // Execute main application function
  219.     return CTest().AppMain(argc, argv, 0, eDS_Default, 0);
  220. }
  221. /*
  222.  * ===========================================================================
  223.  * $Log: test_ncbi_pipe_connector.cpp,v $
  224.  * Revision 1000.4  2004/06/01 18:46:21  gouriano
  225.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  226.  *
  227.  * Revision 1.9  2004/05/17 20:58:22  gorelenk
  228.  * Added include of PCH ncbi_pch.hpp
  229.  *
  230.  * Revision 1.8  2004/02/23 15:23:43  lavr
  231.  * New (last) parameter "how" added in CONN_Write() API call
  232.  *
  233.  * Revision 1.7  2003/12/04 16:35:54  ivanov
  234.  * Removed unused function Delay()
  235.  *
  236.  * Revision 1.6  2003/11/15 15:35:36  ucko
  237.  * +<stdio.h> (no longer included by ncbi_pipe.hpp)
  238.  *
  239.  * Revision 1.5  2003/09/09 19:47:34  ivanov
  240.  * Fix for previous commit
  241.  *
  242.  * Revision 1.4  2003/09/09 19:42:19  ivanov
  243.  * Added more checks
  244.  *
  245.  * Revision 1.3  2003/09/05 14:04:20  ivanov
  246.  * CONN_Read(..., eIO_ReadPersist) can return eIO_Closed also
  247.  *
  248.  * Revision 1.2  2003/09/03 21:37:25  ivanov
  249.  * Removed Linux ESPIPE workaround
  250.  *
  251.  * Revision 1.1  2003/09/02 20:39:40  ivanov
  252.  * Initial revision
  253.  *
  254.  * ===========================================================================
  255.  */