Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
convert svn logs into ChangeLog (up to r7858 for now)
[simgrid.git] / tools / tesh2 / include / types.h
1 /*
2  * include/types.h - types representing the tesh concepts.
3  *
4  * Copyright 2008,2009 Martin Quinson, Malek Cherier All right reserved. 
5  *
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.
8  *
9  * Purpose:
10  *              This file declares the types used to run a set of tesh files.
11  *
12  */
13
14
15 #ifndef __TYPES_H
16 #define __TYPES_H
17
18 #include <def.h>
19 #include <portable.h>
20 #include <xbt/xbt_os_thread.h>
21 #include <xbt/strbuff.h>
22 #include <xbt.h>
23
24 #include <dirent.h>
25
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29
30 /* 
31  * byte type definition 
32  */
33 #ifndef __BYTE_T_DEFINED
34   typedef unsigned char byte;
35 #define __BYTE_T_DEFINED
36 #endif
37
38 /*
39  * file descriptor and pid types for portability.
40  */
41
42 #ifdef _XBT_WIN32
43
44 #ifndef __FD_T_DEFINED
45   typedef HANDLE fd_t;
46 #define __FD_T_DEFINED
47 #endif
48
49 #ifndef __PID_T_DEFINED
50   typedef HANDLE pid_t;
51 #define __PID_T_DEFINED
52 #endif
53
54 #else
55
56 #ifndef __FD_T_DEFINED
57   typedef int fd_t;
58 #define __FD_T_DEFINED
59 #endif
60
61 #ifndef __PID_T_DEFINED
62   typedef int pid_t;
63 #define __PID_T_DEFINED
64 #endif
65 #endif
66
67 /* forward declarations */
68
69   struct s_unit;                /* this structure represents a tesh unit        */
70
71   struct s_runner;
72   struct s_units;
73   struct s_unit;
74   struct s_excludes;
75   struct s_fstreams;
76   struct s_fstream;
77   struct s_directories;
78   struct s_directory;
79   struct s_writer;
80   struct s_reader;
81   struct s_timer;
82   struct s_context;
83   struct s_command;
84   struct s_variable;
85   struct s_error;
86
87
88 /* 
89  * declaration of the tesh unit type which represents a tesh file
90  * to run.      
91  */
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                                                                                    */
117     int err_kind;
118     char *err_line;
119     xbt_dynar_t includes;
120     char *filepos;
121   } s_unit_t, *unit_t;
122
123 /* 
124  * declaration of the tesh file stream type used to manage the tesh file.       
125  */
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                                 */
131     unsigned parsed:1;
132   } s_fstream_t, *fstream_t;
133
134 /* 
135  * command status 
136  */
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                                                                            */
147   } command_status_t;
148
149 /* 
150  * reason of the status of the command 
151  */
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
175   } cs_reason_t;
176
177
178
179
180   typedef struct s_variable {
181     char *name;
182     char *val;
183     int used;
184     int env;
185     int err;
186   } s_variable_t, *variable_t;
187
188 /* 
189  * declaration of the tesh timer type 
190  */
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;
197
198 /* 
199  * declaration of the tesh reader type 
200  */
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                                                  */
206     int done;
207     xbt_os_sem_t started;
208   } s_reader_t, *reader_t;
209
210 /* 
211  * declaration of the tesh writer type 
212  */
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;
220     int done;
221   } s_writer_t, *writer_t;
222
223
224   typedef struct s_units {
225     xbt_dynar_t items;
226     int number_of_runned_units; /* the number of units runned                                                                                   */
227     int number_of_ended_units;  /* the number of units over                                                                                             */
228
229   } s_units_t, *units_t;
230
231 /* 
232  * declaration of the tesh runner type 
233  */
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;
244
245     int total_of_tests;
246     int total_of_successeded_tests;
247     int total_of_failed_tests;
248     int total_of_interrupted_tests;
249
250     int total_of_units;
251     int total_of_successeded_units;
252     int total_of_failed_units;
253     int total_of_interrupted_units;
254
255     int total_of_suites;
256     int total_of_successeded_suites;
257     int total_of_failed_suites;
258     int total_of_interrupted_suites;
259     char **path;
260     char **builtin;
261   } s_runner_t, *runner_t;
262
263
264   typedef struct s_fstreams {
265     xbt_dynar_t items;
266   } s_fstreams_t, *fstreams_t;
267
268
269   typedef struct s_excludes {
270     xbt_dynar_t items;
271   } s_excludes_t, *excludes_t;
272
273   typedef struct s_directory {
274     char *name;
275     DIR *stream;
276   } s_directory_t, *directory_t;
277
278   typedef struct s_directories {
279     xbt_dynar_t items;
280   } s_directories_t, *directories_t;
281
282
283   typedef enum {
284     oh_check,
285     oh_display,
286     oh_ignore
287   } output_handling_t;
288 /* 
289  * declaration of the tesh context type 
290  */
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                                                                                              */
294     char *pos;
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                                                                    */
302
303 #ifdef _XBT_WIN32
304     char *t_command_line;       /* translate the command line on Windows                                                                */
305     unsigned is_not_found:1;
306 #endif
307
308   } s_context_t, *context_t;
309
310 /* 
311  * declaration of the tesh command type 
312  */
313   typedef struct s_command {
314     unit_t root;
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                                                                                 */
331 #ifdef _XBT_WIN32
332     unsigned long stat_val;
333 #else
334     int stat_val;
335 #endif
336     char *signal;               /* the signal raised by the command if any                                                              */
337     xbt_os_mutex_t mutex;
338
339 #ifndef _XBT_WIN32
340     int killed;                 /* if 1, the command was killed                                                                                 */
341     int execlp_errno;
342 #endif
343
344   } s_command_t, *command_t;
345
346 #ifdef __cplusplus
347 }
348 #endif
349 #endif                          /* !__TYPES_H */