Rename newtestsuite to testsuite
[dyninst.git] / testsuite / src / StdOutputDriver.C
1 // StdOutputDriver.C
2 // Implements the standard test_driver output system
3
4 #include "TestOutputDriver.h"
5 #include "StdOutputDriver.h"
6
7 #include <map>
8 #include <string>
9
10 #include <string.h>
11 #include <stdarg.h>
12 #include <stdio.h>
13 #include <assert.h>
14
15 StdOutputDriver::StdOutputDriver(void * data) : attributes(NULL), streams() {
16   streams[STDOUT] = std::string("-");
17   streams[STDERR] = std::string("-");
18   streams[LOGINFO] = std::string("-");
19   streams[LOGERR] = std::string("-");
20   streams[HUMAN] = std::string("-");
21   last_test = NULL;
22   last_group = NULL;
23 }
24
25 StdOutputDriver::~StdOutputDriver() {
26   if (attributes != NULL) {
27     delete attributes;
28   }
29 }
30
31 void StdOutputDriver::startNewTest(std::map<std::string, std::string> &attrs, TestInfo *test, RunGroup *group) {
32   if (attributes != NULL) {
33     delete attributes;
34     attributes = NULL;
35   }
36   last_test = test;
37   last_group = group;
38
39   attributes = new std::map<std::string, std::string>(attrs);
40 }
41
42 void StdOutputDriver::redirectStream(TestOutputStream stream, const char *filename) {
43   if (streams.find(stream) == streams.end()) {
44     fprintf(stderr, "[%s:%u] - StdOutputDriver::redirectStream called with unexpected stream value %d\n", __FILE__, __LINE__, stream);
45   } else {
46     streams[stream] = std::string(filename);
47   }
48 }
49
50 void StdOutputDriver::logResult(test_results_t result, int stage) {
51    // TODO Finish me.  I can probably copy the final output stuff from
52    // test_driver.C into here.
53    
54    // I think this just has to print out the human log results
55    bool print_stage = false;
56    const char *outfn = streams[HUMAN].c_str();
57    FILE *out;
58    if (strcmp(outfn, "-") == 0) {
59       out = stdout;
60    } else {
61       out = fopen(outfn, "a");
62       if (NULL == out) {
63          out = stdout;
64       }
65    }
66    
67    // Now print out a summary results line
68    const char *run_mode_str;
69    const char *orig_run_mode_str = (*attributes)["run_mode"].c_str();
70    if (strcmp(orig_run_mode_str, "createProcess") == 0)
71       run_mode_str = "create";
72    else if (strcmp(orig_run_mode_str, "useAttach") == 0)
73       run_mode_str = "attach";
74    else if (strcmp(orig_run_mode_str, "binary") == 0)
75       run_mode_str = "rewriter";
76    else
77       run_mode_str = orig_run_mode_str;
78    assert(last_test && last_group);
79 #if defined(cap_32_64_test)
80    fprintf(out, "%s:\tcompiler: %s\topt: %s\tabi: %s\tmode: %s\tresult: ",
81            last_test->name, last_group->compiler, last_group->optlevel, last_group->abi, run_mode_str);
82 #else
83    fprintf(out, "%s:\tcompiler: %s\topt: %s\tmode: %s\tresult: ",
84            last_test->name, last_group->compiler, last_group->optlevel, run_mode_str);
85 #endif
86    switch(result) {
87       case PASSED:
88          fprintf(out, "PASSED");
89          break;
90          
91       case FAILED:
92          fprintf(out, "FAILED");
93          print_stage = true;
94          break;
95          
96       case SKIPPED:
97          fprintf(out, "SKIPPED");
98          break;
99          
100       case CRASHED:
101          fprintf(out, "CRASHED");
102          print_stage = true;
103          break;
104
105       default:
106          fprintf(out, "UNKNOWN");
107    }
108    
109    if (print_stage && stage != -1)
110    {
111      switch ( (test_runstate_t) stage)
112      {
113      case program_setup_rs:
114        fprintf(out, " (Module Setup)");
115        break;
116      case group_setup_rs:
117        fprintf(out, " (Group Setup)");
118        break;
119      case group_teardown_rs:
120        fprintf(out, " (Group Teardown)");
121        break;
122      case test_init_rs:
123        fprintf(out, " (Test Init)");
124        break;
125      case test_setup_rs:
126        fprintf(out, " (Test Setup)");
127        break;
128      case test_execute_rs:
129        fprintf(out, " (Running Test)");
130        break;
131      case test_teardown_rs:
132        fprintf(out, " (Test Teardown)");
133        break;
134      default:
135        fprintf(out, "\nUnknown test state: %d\n", stage);
136        assert(0);
137        break;
138      }
139    }
140
141    fprintf(out, "\n");
142    
143    if ((out != stdout) && (out != stderr)) {
144       fclose(out);
145    } else {
146       fflush(out);
147    }
148    last_group = NULL;
149    last_test = NULL;
150 }
151
152 void StdOutputDriver::logCrash(std::string testname) {
153   // TODO Do something here
154 }
155
156 void StdOutputDriver::log(TestOutputStream stream, const char *fmt, ...) {
157   va_list args;
158   va_start(args, fmt);
159   vlog(stream, fmt, args);
160   va_end(args);
161 }
162
163 void StdOutputDriver::vlog(TestOutputStream stream, const char *fmt, va_list args) {
164   // If stream is an invalid stream, return
165   if (streams.find(stream) == streams.end()) {
166     fprintf(stderr, "[%s:%u] - StdOutputDriver::log called with unexpected stream value %d\n", __FILE__, __LINE__, stream);
167     return;
168   }
169
170   // If the stream has been redirected to NULL, ignore this output
171   if (NULL == streams[stream].c_str()) {
172     return;
173   }
174
175   const char *fn = streams[stream].c_str();
176   FILE *out;
177   if (strcmp(fn, "-") == 0) {
178     // We're printing to the default file
179     switch(stream) {
180     case STDOUT:
181     case LOGINFO:
182     case HUMAN:
183       out = stdout;
184       break;
185
186     case STDERR:
187     case LOGERR:
188       out = stderr;
189       break;
190     }
191   } else {
192     // Open the file
193     out = fopen(fn, "a");
194     if (NULL == out) {
195       // TODO Handle this error
196       return;
197     }
198   }
199
200   vfprintf(out, fmt, args);
201
202   if ((out != stdout) && (out != stderr)) {
203     fclose(out);
204   }
205 }
206
207 void StdOutputDriver::finalizeOutput() {
208   // I don't think this method needs to do anything for StdOutputDriver
209 }