2 * include/types.h - types representing the tesh concepts.
4 * Copyright 2008,2009 Martin Quinson, Malek Cherier All right reserved.
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the license (GNU LGPL) which comes with this package.
10 * This file declares the types used to run a set of tesh files.
20 #include <xbt/xbt_os_thread.h>
21 #include <xbt/strbuff.h>
31 * byte type definition
33 #ifndef __BYTE_T_DEFINED
34 typedef unsigned char byte;
35 #define __BYTE_T_DEFINED
39 * file descriptor and pid types for portability.
44 #ifndef __FD_T_DEFINED
46 #define __FD_T_DEFINED
49 #ifndef __PID_T_DEFINED
51 #define __PID_T_DEFINED
56 #ifndef __FD_T_DEFINED
58 #define __FD_T_DEFINED
61 #ifndef __PID_T_DEFINED
63 #define __PID_T_DEFINED
67 /* forward declarations */
69 struct s_unit; /* this structure represents a tesh unit */
89 * declaration of the tesh unit type which represents a tesh file
92 typedef struct s_unit {
93 char *description; /* an optional description of the unit */
94 struct s_fstream *fstream; /* the file stream used to parse the tesh file */
95 struct s_runner *runner; /* the runner of the unit */
96 xbt_dynar_t commands; /* a vector containing all the commands parsed from the tesh file */
97 int cmd_nb; /* number of created commands of the unit */
98 int started_cmd_nb; /* number of started commands of the unit */
99 int interrupted_cmd_nb; /* number of interrupted commands of the unit */
100 int failed_cmd_nb; /* number of failed commands of the unit */
101 int successeded_cmd_nb; /* number of successeded commands of the unit */
102 int terminated_cmd_nb; /* number of ended commands */
103 int waiting_cmd_nb; /* REMOVE THIS FIELD LATER */
104 xbt_os_thread_t thread; /* all the units run in its own thread */
105 xbt_os_sem_t sem; /* used by the last command of the unit to signal the end of the unit */
106 xbt_os_mutex_t mutex; /* used to synchronously access to the properties of the runner */
107 unsigned interrupted:1; /* if 1, the unit is interrupted by the runner */
108 unsigned failed:1; /* if 1, the unit is failed */
109 unsigned successeded:1; /* if 1, the unit is successeded */
110 unsigned parsed:1; /* if 1, the tesh file of the unit is parsed */
111 unsigned released:1; /* if 1, the unit is released */
112 unsigned is_running_suite:1; /* if 1, the unit is running a suite */
113 struct s_unit *owner; /* the unit owned the unit is included */
114 struct s_unit *root; /* the root unit */
115 xbt_dynar_t suites; /* the suites contained by the unit */
116 int exit_code; /* the exit code of the unit */
119 xbt_dynar_t includes;
124 * declaration of the tesh file stream type used to manage the tesh file.
126 typedef struct s_fstream {
127 char *name; /* the name of the file stream (same as the name of the tesh file) */
128 char *directory; /* the directory containing the tesh file */
129 FILE *stream; /* the system file stream */
130 struct s_unit *unit; /* a reference to the unit using the file stream object */
132 } s_fstream_t, *fstream_t;
137 typedef enum e_command_status {
138 cs_initialized = 0, /* the is initialized */
139 cs_started = 1, /* the command is started */
140 cs_in_progress = 2, /* the command is execited */
141 cs_waiting = 3, /* the command is waiting the writer, the reader and the timer */
142 cs_interrupted = 4, /* the command is interrupted */
143 cs_failed = 5, /* the command is failed */
144 cs_successeded = 6, /* the command is successeded */
145 cs_killed = 7, /* the command is killed */
146 csr_fcntl_function_failed = 8 /* the fcntl function failed */
150 * reason of the status of the command
152 typedef enum e_command_status_raison {
153 csr_unknown = 0, /* unknown reason */
154 csr_read_failure = 1, /* a read operation failed */
155 csr_read_pipe_broken = 2, /* the pipe used to read from the stdout of the command is broken */
156 csr_timeout = 3, /* timeout */
157 csr_write_failure = 4, /* a write operation failed */
158 csr_write_pipe_broken = 5, /* the pipe used to write to the stdin of the command is broken */
159 csr_fork_function_failure = 6, /* can't execute the command */
160 csr_wait_failure = 8, /* the wait process function failed */
161 csr_interruption_request = 9, /* the command has received an interruption request */
162 csr_command_not_found = 10, /* the command is not found */
163 csr_exit_codes_dont_match = 11,
164 csr_outputs_dont_match = 12,
165 csr_signals_dont_match = 13,
166 csr_unexpected_signal_caught = 14,
167 csr_expected_signal_not_received = 15,
168 csr_pipe_function_failed = 16, /* the function pipe() or CreatePipe() fails */
169 csr_dup2_function_failure = 17,
170 csr_execlp_function_failure = 18,
171 csr_create_process_function_failure = 19,
172 csr_waitpid_function_failure = 20,
173 csr_get_exit_code_process_function_failure = 21,
174 csr_shell_failed = 22
180 typedef struct s_variable {
186 } s_variable_t, *variable_t;
189 * declaration of the tesh timer type
191 typedef struct s_timer {
192 xbt_os_thread_t thread; /* asynchronous timer */
193 struct s_command *command; /* the timed command */
194 int timeouted; /* if 1, the timer is timeouted */
195 xbt_os_sem_t started;
196 } s_timer_t, *ttimer_t;
199 * declaration of the tesh reader type
201 typedef struct s_reader {
202 xbt_os_thread_t thread; /* asynchonous reader */
203 struct s_command *command; /* the command of the reader */
204 int failed; /* if 1, the reader failed */
205 int broken_pipe; /* if 1, the pipe used by the reader is broken */
207 xbt_os_sem_t started;
208 } s_reader_t, *reader_t;
211 * declaration of the tesh writer type
213 typedef struct s_writer {
214 xbt_os_thread_t thread; /* asynchronous writer */
215 struct s_command *command; /* the command of the writer */
216 int failed; /* if 1, the writer failed */
217 int broken_pipe; /* if 1, the pipe used by the writer is broken */
218 xbt_os_sem_t written;
219 xbt_os_sem_t can_write;
221 } s_writer_t, *writer_t;
224 typedef struct s_units {
226 int number_of_runned_units; /* the number of units runned */
227 int number_of_ended_units; /* the number of units over */
229 } s_units_t, *units_t;
232 * declaration of the tesh runner type
234 typedef struct s_runner {
235 struct s_units *units;
236 int timeouted; /* if 1, the runner is timeouted */
237 int timeout; /* the timeout of the runner */
238 int interrupted; /* if 1, the runner failed */
239 int number_of_runned_units; /* the number of units runned by the runner */
240 int number_of_ended_units; /* the number of ended units */
241 int waiting; /* if 1, the runner is waiting the end of all the units */
242 xbt_os_thread_t thread; /* the timer thread */
243 xbt_dynar_t variables;
246 int total_of_successeded_tests;
247 int total_of_failed_tests;
248 int total_of_interrupted_tests;
251 int total_of_successeded_units;
252 int total_of_failed_units;
253 int total_of_interrupted_units;
256 int total_of_successeded_suites;
257 int total_of_failed_suites;
258 int total_of_interrupted_suites;
261 } s_runner_t, *runner_t;
264 typedef struct s_fstreams {
266 } s_fstreams_t, *fstreams_t;
269 typedef struct s_excludes {
271 } s_excludes_t, *excludes_t;
273 typedef struct s_directory {
276 } s_directory_t, *directory_t;
278 typedef struct s_directories {
280 } s_directories_t, *directories_t;
289 * declaration of the tesh context type
291 typedef struct s_context {
292 char *command_line; /* the command line of the command to execute */
293 const char *line; /* the current parsed line */
295 int exit_code; /* the expected exit code of the command */
296 char *signal; /* the expected signal raised by the command */
297 int timeout; /* the timeout of the test */
298 xbt_strbuff_t input; /* the input to write in the stdin of the command to run */
299 xbt_strbuff_t output; /* the expected output of the command of the test */
300 output_handling_t output_handling;
301 int async; /* if 1, the command is asynchronous */
304 char *t_command_line; /* translate the command line on Windows */
305 unsigned is_not_found:1;
308 } s_context_t, *context_t;
311 * declaration of the tesh command type
313 typedef struct s_command {
315 unit_t unit; /* the unit of the command */
316 struct s_context *context; /* the context of the execution of the command */
317 xbt_os_thread_t thread; /* asynchronous command */
318 struct s_writer *writer; /* the writer used to write in the command stdin */
319 struct s_reader *reader; /* the reader used to read from the command stout */
320 struct s_timer *timer; /* the timer used for the command */
321 command_status_t status; /* the current status of the command */
322 cs_reason_t reason; /* the reason of the state of the command */
323 int successeded; /* if 1, the command is successeded */
324 int interrupted; /* if 1, the command is interrupted */
325 int failed; /* if 1, the command is failed */
326 pid_t pid; /* the program id of the command */
327 xbt_strbuff_t output; /* the output of the command */
328 fd_t stdout_fd; /* the stdout fd of the command */
329 fd_t stdin_fd; /* the stdin fd of the command */
330 int exit_code; /* the exit code of the command */
332 unsigned long stat_val;
336 char *signal; /* the signal raised by the command if any */
337 xbt_os_mutex_t mutex;
340 int killed; /* if 1, the command was killed */
344 } s_command_t, *command_t;
349 #endif /* !__TYPES_H */