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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbiexec.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:10:08  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.18
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbiexec.cpp,v 1000.1 2004/06/01 19:10:08 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: Vladimir Ivanov
  35.  *
  36.  * File Description:   Test program for portable exec functions
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbiapp.hpp>
  41. #include <corelib/ncbiargs.hpp>
  42. #include <corelib/ncbienv.hpp>
  43. #include <corelib/ncbiexec.hpp>
  44. #if defined(HAVE_UNISTD_H)
  45. #  include <unistd.h>         // for _exit()
  46. #endif
  47. #include <test/test_assert.h> // This header must go last
  48. USING_NCBI_SCOPE;
  49. #define TEST_RESULT_C    99   // Test exit code for current test
  50. #define TEST_RESULT_P     0   // Test exit code for test from PATH
  51. ////////////////////////////////
  52. // Test application
  53. //
  54. class CTest : public CNcbiApplication
  55. {
  56. public:
  57.     void Init(void);
  58.     int Run(void);
  59. };
  60. void CTest::Init(void)
  61. {
  62.     SetDiagPostLevel(eDiag_Warning);
  63.     auto_ptr<CArgDescriptions> d(new CArgDescriptions);
  64.     d->SetUsageContext("test_files",
  65.                        "test file's accessory functions");
  66.     SetupArgDescriptions(d.release());
  67. }
  68. int CTest::Run(void)
  69. {
  70.     string app = GetArguments().GetProgramName();
  71.     cout << "Application path: " << app << endl;
  72.     // Initialization of variables and structures
  73.     char* app_c = strdup(app.c_str());
  74.     assert( app_c != 0 );
  75.     const char* app_p  = "ls";
  76.     const char* app_pp = "-l";
  77.     const char* my_env[] =   // Environment for Spawn*E
  78.     {
  79.         "THIS=environment will be",
  80.         "PASSED=to new process by the",
  81.         "EXEC=functions",
  82.         "TEST_NCBI_EXEC=yes",
  83.         0
  84.     };
  85.     {{
  86.         string        ld_path_setting               ("LD_LIBRARY_PATH=");
  87.         const string& ld_path = GetEnvironment().Get("LD_LIBRARY_PATH");
  88.         if (ld_path.size()) {
  89.             ld_path_setting += ld_path;
  90.             my_env[0] = strdup(ld_path_setting.c_str());
  91.         }
  92.     }}
  93.     const char* args_c[3];   // Arguments for SpawnV[E]
  94.     args_c[1] = "SpawnV[E]";
  95.     args_c[2] = 0;
  96.     const char* args_p[3];   // Arguments for SpawnVP[E]
  97.     args_p[1] = app_pp;
  98.     args_p[2] = 0;
  99.     // System
  100.         
  101.     assert( CExec::System(0) > 0 );
  102.     string cmd = app + " System";
  103.     assert( CExec::System(cmd.c_str()) == TEST_RESULT_C );
  104.     cmd = string(app_p) + " " + app_pp;
  105.     assert( CExec::System(cmd.c_str()) == TEST_RESULT_P );
  106.     
  107.     // Spawn with eWait
  108.     int code;
  109.     code = CExec::SpawnL  (CExec::eWait, app_c, "SpawnL_eWait", 0); 
  110.     cout << "Exit code: " << code << endl;
  111.     assert( code == TEST_RESULT_C );
  112.     code = CExec::SpawnLP (CExec::eWait, app_p, app_pp, 0);
  113.     cout << "Exit code: " << code << endl;
  114.     assert( code == TEST_RESULT_P );
  115.     code = CExec::SpawnLE (CExec::eWait, app_c, "SpawnLE_eWait", 0, my_env); 
  116.     cout << "Exit code: " << code << endl;
  117.     assert( code == TEST_RESULT_C );
  118.     code = CExec::SpawnLPE(CExec::eWait, app_c, "SpawnLPE_eWait", 0, my_env);
  119.     cout << "Exit code: " << code << endl;
  120.     assert( code == TEST_RESULT_C );
  121.     code = CExec::SpawnV  (CExec::eWait, app_c, args_c);
  122.     cout << "Exit code: " << code << endl;
  123.     assert( code == TEST_RESULT_C );
  124.     code = CExec::SpawnVP (CExec::eWait, app_p, args_p);
  125.     cout << "Exit code: " << code << endl;
  126.     assert( code == TEST_RESULT_P );
  127.     code = CExec::SpawnVE (CExec::eWait, app_c, args_c, my_env);
  128.     cout << "Exit code: " << code << endl;
  129.     assert( code == TEST_RESULT_C );
  130.     code = CExec::SpawnVPE(CExec::eWait, app_c, args_c, my_env);
  131.     cout << "Exit code: " << code << endl;
  132.     assert( code == TEST_RESULT_C );
  133.     // Spawn with eNoWait, waiting self
  134.     int pid;
  135.     pid = CExec::SpawnL(CExec::eNoWait, app_c, "SpawnL_eNoWait", 0);
  136.     assert( pid != -1 );
  137.     assert( CExec::Wait(pid) == TEST_RESULT_C );
  138.     pid = CExec::SpawnLP(CExec::eNoWait, app_p, app_pp, 0);
  139.     assert( pid != -1 );
  140.     assert( CExec::Wait(pid) == TEST_RESULT_P );
  141.     pid = CExec::SpawnLE(CExec::eNoWait, app_c, "SpawnLE_eNoWait", 0, my_env);
  142.     assert( pid != -1 );
  143.     assert( CExec::Wait(pid) == TEST_RESULT_C );
  144.     pid = CExec::SpawnLPE(CExec::eNoWait, app_c, "SpawnLPE_eNoWait", 0,my_env);
  145.     assert( pid != -1 );
  146.     assert( CExec::Wait(pid) == TEST_RESULT_C );
  147.     // Spawn with eDetach
  148.     CExec::SpawnL  (CExec::eDetach, app_c, "SpawnL_eDetach", 0 );
  149.     CExec::SpawnLP (CExec::eDetach, app_p, app_pp, 0);
  150.     CExec::SpawnLE (CExec::eDetach, app_c, "SpawnLE_eDetach", 0, my_env);
  151.     CExec::SpawnLPE(CExec::eDetach, app_c, "SpawnLPE_eDetach", 0, my_env);
  152.     CExec::SpawnV  (CExec::eDetach, app_c, args_c);
  153.     CExec::SpawnVP (CExec::eDetach, app_p, args_p);
  154.     CExec::SpawnVE (CExec::eDetach, app_c, args_c, my_env);
  155.     CExec::SpawnVPE(CExec::eDetach, app_c, args_c, my_env);
  156.     // Spawn with eOverlay
  157.     assert( CExec::SpawnL  (CExec::eOverlay, app_c, "SpawnL_eOverlay", 0)
  158.             == TEST_RESULT_C );
  159.     // At success code below never been executed
  160.     cout << endl << "TEST execution fails!" << endl << endl;
  161.     return 77;
  162. }
  163. ///////////////////////////////////
  164. // APPLICATION OBJECT  and  MAIN
  165. //
  166. int main(int argc, const char* argv[], const char* envp[])
  167. {
  168.     // Exec from test?
  169.     if ( argc > 1) {
  170.         assert(argv[1] && *argv[1]);
  171.         cout << endl << "Exec: " << argv[1] << endl;
  172.         // View environment
  173.         const char** env_var = &envp[0];
  174.         while (*env_var) {
  175.             cout << *env_var << endl;
  176.             env_var++;
  177.         }
  178.         // Check environment
  179.         if ( strstr(argv[1],"E_e")) {
  180.             char* ptr = getenv("TEST_NCBI_EXEC");
  181.             if (!ptr || !*ptr) {
  182.                 cout << "Environment variable TEST_NCBI_EXEC not found" <<endl;
  183.                 cout.flush();
  184.                 _exit(88);
  185.             } else {
  186.                 cout << "TEST_NCBI_EXEC=" << ptr << endl;
  187.             }
  188.         }
  189.         _exit(TEST_RESULT_C);
  190.     }
  191.     cout << "Start tests:" << endl << endl;
  192.     // Execute main application function
  193.     return CTest().AppMain(argc, argv, 0, eDS_Default, 0);
  194. }
  195. /*
  196.  * ===========================================================================
  197.  * $Log: test_ncbiexec.cpp,v $
  198.  * Revision 1000.1  2004/06/01 19:10:08  gouriano
  199.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.18
  200.  *
  201.  * Revision 6.18  2004/05/14 13:59:51  gorelenk
  202.  * Added include of ncbi_pch.hpp
  203.  *
  204.  * Revision 6.17  2003/09/16 19:09:10  ivanov
  205.  * Removed the code for location a current executable file using PATH env
  206.  * variable. Use renewed GetProgramName() instead.
  207.  *
  208.  * Revision 6.16  2003/07/16 13:38:06  ucko
  209.  * Make sure to preserve LD_LIBRARY_PATH if it was set in the original
  210.  * environment, since we may need it to find libxncbi.so.
  211.  *
  212.  * Revision 6.15  2003/04/08 20:32:40  ivanov
  213.  * Get rid of an unused variable
  214.  *
  215.  * Revision 6.14  2003/03/12 16:05:52  ivanov
  216.  * MS Windows: Add extention to the executable file if running without it
  217.  *
  218.  * Revision 6.13  2003/03/10 20:49:06  ivanov
  219.  * A PATH environment variable is used to find current file to execute
  220.  *
  221.  * Revision 6.12  2002/08/14 17:06:20  ucko
  222.  * Reinstate calls to _exit, but be sure to include <unistd.h> first for
  223.  * the prototype.
  224.  *
  225.  * Revision 6.11  2002/08/14 14:33:29  ivanov
  226.  * Changed allcalls _exit() to exit() back -- non crossplatform function
  227.  *
  228.  * Revision 6.10  2002/08/13 14:09:48  ivanov
  229.  * Changed exit() to exit() in the child's branch of the test
  230.  *
  231.  * Revision 6.9  2002/07/26 15:36:53  ivanov
  232.  * Changed exit code in the Run()
  233.  *
  234.  * Revision 6.8  2002/07/25 15:53:06  ivanov
  235.  * Changed exit code for failed test
  236.  *
  237.  * Revision 6.7  2002/07/23 20:34:22  ivanov
  238.  * Added more info to debug output
  239.  *
  240.  * Revision 6.6  2002/07/23 13:30:30  ivanov
  241.  * Added output of environment for each test
  242.  *
  243.  * Revision 6.5  2002/07/17 15:14:21  ivanov
  244.  * Minor changes in the test exec branch
  245.  *
  246.  * Revision 6.4  2002/07/15 15:20:37  ivanov
  247.  * Added extended error dignostic
  248.  *
  249.  * Revision 6.3  2002/06/29 06:45:50  vakatov
  250.  * Get rid of some compilation warnings
  251.  *
  252.  * Revision 6.2  2002/06/25 20:17:58  ivanov
  253.  * Changed default exit code from 0 to 1
  254.  *
  255.  * Revision 6.1  2002/05/30 16:29:15  ivanov
  256.  * Initial revision
  257.  *
  258.  * ===========================================================================
  259.  */