Changeset 22188

Show
Ignore:
Timestamp:
27.05.2010 23:56:02 (9 years ago)
Author:
davidb
Message:

Some refinement of the testing framework for the os_process class

Location:
main/trunk/greenstone2/runtime-src/src/recpt
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone2/runtime-src/src/recpt/os_process.cpp

    r22187 r22188  
    4646 
    4747 
    48  
    49  
    50 #if 0 
    51  
    52 #include "os_process_windows.h" 
    53 #include "os_process_unix.h" 
    54 #include <iostream> 
    55 using namespace std; 
    56  
    57  
    58  
    59 void test_uni_write_pipe() 
    60 { 
    61 #ifdef __WIN32__ 
    62   char* prog_name = "type"; 
    63   char* argv[] = { "type", NULL } ; 
    64    
    65 #else 
    66   char* prog_name = "tr"; 
    67   char* argv[] = { "tr", "[A-Z]", "[a-z]", NULL }; 
    68 #endif 
    69  
    70   cout << "<hr>" << endl; 
    71   cout << "<p>Unidirectional Write Test" << endl; 
    72   cout << "<p>  Converts uppercase letters to lowercase" << endl; 
    73   cout << "<p>  These are then sent to whereever the stdout of the child process goes" << endl; 
    74   cout << "<p>" << endl; 
    75  
    76 #ifdef __WIN32__ 
    77   osprocesswindows* process = new osprocesswindows(uniWrite,prog_name,argv); 
    78 #else 
    79   osprocessunix* process = new osprocessunix(uniWrite,prog_name,argv); 
    80 #endif 
    81    
    82   char* buffer = "TESTING uniWirite IN CAP\nTesting uniWrite in Mixed Case\n"; 
    83   int buffer_len = strlen(buffer); 
    84  
    85   if (!process->write(buffer,buffer_len)) { 
    86     cerr << "Error: failed to write to child process\n"; 
    87   } 
    88  
    89   process->close(); 
    90  
    91   process->wait(); 
    92  
    93   delete process; 
    94 } 
    95  
    96  
    97 void test_uni_read_pipe() 
    98 { 
    99   char* prog_name = "java"; 
    100   char* argv[] = { "java", NULL }; 
    101  
    102   cout << "<hr>" << endl; 
    103   cout << "<p>Unidirectional Read Test" << endl; 
    104   cout << "<p>  The output of 'java' is read in by this process and then sent to stdout" << endl; 
    105   cout << "<p>" << endl; 
    106  
    107  
    108 #ifdef __WIN32__ 
    109   osprocess* process = new osprocesswindows(uniRead,prog_name,argv); 
    110 #else 
    111   osprocess* process = new osprocessunix(uniRead,prog_name,argv); 
    112 #endif 
    113    
    114   const int BufferSize = 1024; 
    115   char buffer[BufferSize]; 
    116  
    117   int bytes_read = 0; 
    118   do { 
    119     bytes_read = process->read(buffer,BufferSize); 
    120     if (bytes_read>0) { 
    121       fwrite(buffer,1,bytes_read,stdout); 
    122     } 
    123   } while (bytes_read==BufferSize); 
    124  
    125  
    126   // deleting object will also have the effect of closing any open handles 
    127   delete process; 
    128  
    129 } 
    130  
    131  
    132  
    133 void test_bi_read_write_pipe() 
    134 { 
    135 #ifdef __WIN32__ 
    136   char* prog_name = "type"; 
    137   char* argv[] = NULL ; 
    138    
    139 #else 
    140   char* prog_name = "tr"; 
    141   char* argv[] = { "tr", "[A-Z]", "[a-z]", NULL }; 
    142 #endif 
    143  
    144   // Converts uppercase letters to lowercase 
    145   // Answer is read back and then printed to STDOUT by this process 
    146  
    147   cout << "<hr>" << endl; 
    148   cout << "<p>Bidirectional Read/Write Test" << endl; 
    149   cout << "<p>  Converts uppercase letters to lowercase" << endl; 
    150   cout << "<p>  Data is sent to child process down pipe by this process" << endl; 
    151   cout << "<p>  Answer is read back from child process and printed to stdout" << endl; 
    152   cout << "<p>" << endl; 
    153  
    154 #ifdef __WIN32__ 
    155   osprocesswindows* process = new osprocesswindows(biReadWrite,prog_name,argv); 
    156 #else 
    157   osprocessunix* process = new osprocessunix(biReadWrite,prog_name,argv); 
    158 #endif 
    159    
    160   char* write_buffer = "TESTING biReadWrite IN CAP\nTesting biReadWrite in Mixed Case\n"; 
    161   int write_buffer_len = strlen(write_buffer); 
    162  
    163   if (!process->write(write_buffer,write_buffer_len)) { 
    164     cerr << "Error: failed to write to child process\n"; 
    165   } 
    166  
    167   const int BufferSize = 1024; 
    168   char read_buffer[BufferSize]; 
    169   process->close_write_pipe(); 
    170  
    171   int bytes_read = 0; 
    172   do { 
    173     bytes_read = process->read(read_buffer,BufferSize); 
    174     if (bytes_read>0) { 
    175       fwrite(read_buffer,1,bytes_read,stdout); 
    176     } 
    177   } while (bytes_read==BufferSize); 
    178  
    179  
    180   process->close(); 
    181  
    182   delete process; 
    183  
    184 } 
    185  
    186  
    187 int main() 
    188 { 
    189   printf("Content-type: text/html\n\n"); 
    190    
    191   printf( "<html>\n"); 
    192   printf( "  <head>\n"); 
    193   printf( "    <title>Testing</title>\n"); 
    194   printf( "  </head>\n"); 
    195   printf( "  <body>\n"); 
    196  
    197   test_uni_read_pipe(); 
    198   test_uni_write_pipe(); 
    199   test_bi_read_write_pipe(); 
    200  
    201   printf( "  </body>\n"); 
    202   printf( "</html>\n"); 
    203    
    204   return 0; 
    205 } 
    206  
    207 #endif 
    208  
  • main/trunk/greenstone2/runtime-src/src/recpt/os_process_windows.cpp

    r22183 r22188  
    3737#endif 
    3838 
     39#include "text_t.h" 
    3940#include "os_process_windows.h" 
    4041 
    41 //#include <stdio.h> 
    42  
    43 osprocesswindows::osprocesswindows(char* cmdline) 
    44   : osprocess(cmdline) 
    45 {} 
    4642 
    4743osprocesswindows::osprocesswindows(OSProcessPipeMode mode, 
    48                    char* prog_name, char* argv[]=NULL,  
     44                   char* prog_name, char* argv[],  
    4945                   char* envp[]) 
    5046  : child_stdout_read_(NULL), child_stdin_write_(NULL), 
     
    9187   
    9288  si.dwFlags |= STARTF_USESTDHANDLES; 
    93    
    94   // any error messages in child process to to same place as parent process 
     89 
     90   
     91  // any error messages in the child process goes to same place as parent 
    9592  // e.g. in the case of running as a CGI script, the Web server error log 
    9693  si.hStdError  = GetStdHandle(STD_ERROR_HANDLE);  
    9794   
    98   // Output from the child process comes to the parent process, down the 
    99   // OUT pipe 
    100   si.hStdOutput = child_stdout_write; 
    101    
    102   // Input to the child process can be sent from the parent process, down the 
    103   // In pipe 
    104   si.hStdInput = child_stdin_read; 
    105    
    106   text_t cmd_line = ""; 
     95  if ((mode==uniRead) || (mode==biReadWrite)) { 
     96    // Output from the child process comes to the parent process, down the 
     97    // OUT pipe 
     98    si.hStdOutput = child_stdout_write; 
     99  } 
     100  else { 
     101    // uniWrite 
     102    // Output from the chlid process goes to the same place as parent 
     103    si.hStdOutput  = GetStdHandle(STD_OUTPUT_HANDLE);  
     104  } 
     105   
     106  if ((mode==uniWrite) || (mode==biReadWrite)) { 
     107    // Input to the child process can be sent from the parent process, down the 
     108    // In pipe 
     109    si.hStdInput = child_stdin_read; 
     110  } 
     111  else { 
     112    // uniRead 
     113 
     114    // Input to the child process comes from same place as parent ?!? 
     115    si.hStdInput  = GetStdHandle(STD_INPUT_HANDLE);  
     116  } 
     117   
     118  text_t cmd_line = prog_name; 
    107119  if (argv != NULL) { 
    108     int i=0; 
     120    int i=1; 
    109121    while (argv[i] != NULL) { 
    110       if (i>0) { 
    111     cmd_line += " "; 
    112       } 
    113       cmd_line += "\"" + argv[i] + "\""; 
     122      cmd_line += " \""; 
     123      cmd_line += argv[i]; 
     124      cmd_line += "\""; 
    114125      i++; 
    115126    } 
     
    162173 
    163174 
    164 int osprocesswindows::write(const char* buffer, const int buffer_len)  
     175int osprocesswindows::write(char* buffer, const int buffer_len)  
    165176{  
    166177  DWORD actual_write_len; 
     
    195206 
    196207   
    197 bool osprocessunix::close_write_pipe(OSProcessWarnStatus warn_status) 
     208bool osprocesswindows::close_write_pipe(OSProcessWarnStatus warn_status) 
    198209{ 
    199210  bool write_close_ok = true; 
    200211 
    201   if (child_stdout_read_ != NULL) { 
     212  if (child_stdin_write_ != NULL) { 
    202213 
    203214    write_close_ok = CloseHandle(child_stdin_write_); 
     
    211222    } 
    212223  } 
    213   else if (warning_status == withWarning) { 
     224  else if (warn_status == withWarning) { 
    214225    cerr << "osprocesswindows::close_write_pipe(): Warning - Tried to close already closed pipe" << endl; 
    215226  } 
     
    219230 
    220231 
    221 bool osprocessunix::close_read_pipe(OSProcessWarnStatus warn_status) 
     232bool osprocesswindows::close_read_pipe(OSProcessWarnStatus warn_status) 
    222233{ 
    223234  bool read_close_ok = true; 
  • main/trunk/greenstone2/runtime-src/src/recpt/os_process_windows.h

    r22183 r22188  
    4343 
    4444  virtual int read(char* buffer, const int buffer_len); 
    45   virtual int write(const char* buffer, const int buffer_len); 
     45  virtual int write(char* buffer, const int buffer_len); 
    4646 
    4747  virtual void wait(); 
    4848 
    49   virtual bool close_write_pipe(OSProcessWarnStatus warn_status); 
    50   virtual bool close_read_pipe(OSProcessWarnStatus warn_status); 
     49  virtual bool close_write_pipe(OSProcessWarnStatus warn_status=withWarning); 
     50  virtual bool close_read_pipe(OSProcessWarnStatus warn_status=withWarning); 
    5151 
    5252protected: 
  • main/trunk/greenstone2/runtime-src/src/recpt/win32.mak

    r22090 r22188  
    186186.cpp.obj: 
    187187    $(COMPILE) $<  
     188 
     189OSPROCESS_SOURCES = \ 
     190    os_process.cpp \ 
     191    os_process_windows.cpp \ 
     192 
     193OSPROCESS_OBJECTS = \ 
     194    os_process.obj \ 
     195    os_process_windows.obj \ 
    188196 
    189197 
     
    218226    librarymain.cpp \ 
    219227    maincfg.cpp \ 
     228    $(OSPROCESS_SOURCES) \ 
    220229    pageaction.cpp \ 
    221230    pagedbrowserclass.cpp \ 
     
    265274    librarymain.obj \ 
    266275    maincfg.obj \ 
     276    $(OSPROCESS_OBJECTS) \ 
    267277    pageaction.obj \ 
    268278    pagedbrowserclass.obj \ 
     
    312322    $(LINK) $(EXECUTABLE_OBJECTS) $(LIBS) 
    313323 
     324osprocess-test.cgi: $(OSPROCESS_OBJECTS) os_process_test.obj 
     325    $(LINK) $(OSPROCESS_OBJECTS) os_process_test.obj ..\..\..\common-src\src\lib\gsdllib.lib 
     326 
    314327!IF $(LOCAL_LIBRARY) 
    315328install: