Ignore:
Timestamp:
2010-05-27T11:32:46+12:00 (14 years ago)
Author:
davidb
Message:

Further expansion of functionality (and testing) or os_process classes

File:
1 edited

Legend:

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

    r22177 r22183  
    2626#include "os_process.h"
    2727
    28 osprocess::osprocess(char* cmdline, OSProcessPipeMode mode)
     28osprocess::osprocess(OSProcessPipeMode mode,
     29             char* prog_name, char* argv[], char* envp[])
    2930  : mode_(mode)
    3031{}
     
    5455using namespace std;
    5556
     57
     58
    5659void test_uni_write_pipe()
    5760{
    5861#ifdef __WIN32__
    59   char* prog_name = "c:\\Windows\\system32\\java.exe";
    60   char* cmd_line = "java";
    61  
    62   //char* input_line = "echo hi there\n";
    63   //char* prog_name  = "c:\\cygwin\\bin\\cat.exe";
    64   //char* cmd_line   = "cat";
    65 #else
    66   char* cmd_line = "/usr/bin/java";
    67   //char* cmd_line = "java";
    68 #endif
    69 
    70 #ifdef __WIN32__
    71   osprocesswindows* process = new osprocesswindows(cmd_line,uniRead);
    72 #else
    73   osprocessunix* process = new osprocessunix(cmd_line,uniRead);
     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
     97void 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);
    74112#endif
    75113 
     
    86124
    87125
     126  // deleting object will also have the effect of closing any open handles
    88127  delete process;
    89128
    90129}
     130
     131
     132
     133void 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
    91186
    92187int main()
     
    100195  printf( "  <body>\n");
    101196
     197  test_uni_read_pipe();
    102198  test_uni_write_pipe();
     199  test_bi_read_write_pipe();
    103200
    104201  printf( "  </body>\n");
Note: See TracChangeset for help on using the changeset viewer.