Usermode/libc - Fix strchr and strrchr behavior
[tpg/acess2.git] / Tools / NetTest_Runner / main.c
1 /*
2  */
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include "net.h"
7 #include "stack.h"
8 #include "tests.h"
9 #include "test.h"
10 #include <stdarg.h>
11 #include <unistd.h>
12
13 // === PROTOTYPES ===
14  int    ParseCommandline(int argc, char *argv[]);
15
16 // === GLOBALS ===
17 const char *gsTestName;
18
19 // === CODE ===
20 int main(int argc, char *argv[])
21 {
22         if( ParseCommandline(argc, argv) )
23                 return 1;
24
25         typedef bool t_test(void);
26         struct {
27                 t_test  *fcn;
28                 const char *name;
29         } tests[] = {
30                 #define _(fcn)  {fcn, #fcn}
31                 _(Test_ARP_Basic),
32                 _(Test_TCP_Basic),
33                 //_(Test_TCP_WindowSizes),
34                 _(Test_TCP_Reset),
35                 {NULL,NULL}
36                 };
37
38         // Truncate the two output files
39         // TODO: Move to stack.c
40         fclose( fopen("stdout.txt", "w") );
41         fclose( fopen("stderr.txt", "w") );
42         
43         Net_Open(0, "/tmp/acess2net");
44
45          int    n_pass = 0;
46          int    n_fail = 0;
47         for(int i = 0; tests[i].fcn; i ++ )
48         {
49                 Stack_AddDevice("/tmp/acess2net", (char[]){TEST_MAC});
50                 Stack_AddInterface("eth0", 4, (const char[]){TEST_IP}, 24);
51                 Stack_AddRoute(4, "\0\0\0\0", 0, (const char[]){HOST_IP});
52                 if( Stack_Start(tests[i].name, "cmdline") )
53                         goto teardown;
54                 
55                 if( Net_Receive(0, 1, &argc, 1000) == 0 )
56                         goto teardown;
57                 
58                 bool    result = tests[i].fcn();
59                 
60                 printf("%s: %s\n", gsTestName, (result ? "PASS" : "FAIL"));
61                 if(result)
62                         n_pass ++;
63                 else
64                         n_fail ++;
65         
66         teardown:
67                 Stack_Kill();
68         }
69         Net_Close(0);
70         unlink("/tmp/acess2net");
71         printf("--- All tests done %i pass, %i fail\n", n_pass, n_fail);
72
73         return n_fail;
74 }
75
76 void PrintUsage(const char *ProgName)
77 {
78         fprintf(stderr, "Usage: %s\n", ProgName);
79 }
80
81 int ParseCommandline(int argc, char *argv[])
82 {
83         const char      *progname = argv[0];
84         for( int i = 1; i < argc; i ++ )
85         {
86                 const char      *arg = argv[i];
87                 if( arg[0] != '-' ) {
88                         // bare args
89                 }
90                 else if( arg[1] != '-' ) {
91                         // short args
92                 }
93                 else {
94                         // long args
95                         if( strcmp(arg, "--help") == 0 ) {
96                                 PrintUsage(progname);
97                                 exit(0);
98                         }
99                         else {
100                                 fprintf(stderr, "Unknown option: %s\n", arg);
101                                 PrintUsage(progname);
102                                 return 1;
103                         }
104                 }
105         }
106         return 0;
107 }
108
109 void test_setname(const char *name)
110 {
111         gsTestName = name;
112 }
113
114 void test_message(const char *filename, int line, const char *msg, ...)
115 {
116         fprintf(stderr, "%s:%i [%s] - ", filename, line, gsTestName);
117         va_list args;
118         va_start(args, msg);
119         vfprintf(stderr, msg, args);
120         va_end(args);
121         fprintf(stderr, "\n");
122 }
123
124 void test_assertion_fail(const char *filename, int line, const char *fmt, ...)
125 {
126         fprintf(stderr, "%s:%i [%s] - ASSERT FAIL ", filename, line, gsTestName);
127         va_list args;
128         va_start(args, fmt);
129         vfprintf(stderr, fmt, args);
130         va_end(args);
131         fprintf(stderr, "\n");
132 }
133
134 void test_trace(const char *msg, ...)
135 {
136         printf("TRACE: [%s] ", gsTestName);
137         va_list args;
138         va_start(args, msg);
139         vfprintf(stdout, msg, args);
140         va_end(args);
141         printf("\n");
142 }
143 void test_trace_hexdump(const char *hdr, const void *data, size_t len)
144 {
145         printf("TRACE: [%s] %s - %zi bytes\n", gsTestName, hdr, len);
146         const uint8_t   *data8 = data;
147         while( len > 16 )
148         {
149                 printf("TRACE: %02x %02x %02x %02x %02x %02x %02x %02x  %02x %02x %02x %02x %02x %02x %02x %02x\n",
150                         data8[0], data8[1], data8[ 2], data8[ 3], data8[ 4], data8[ 5], data8[ 6], data8[ 7],
151                         data8[8], data8[9], data8[10], data8[11], data8[12], data8[13], data8[14], data8[15]
152                         );
153                 len -= 16;
154                 data8 += 16;
155         }
156         printf("TRACE: ");
157         while( len > 8 )
158         {
159                 printf("%02x %02x %02x %02x %02x %02x %02x %02x  ",
160                         data8[0], data8[1], data8[ 2], data8[ 3], data8[ 4], data8[ 5], data8[ 6], data8[ 7]
161                         );
162                 len -= 8;
163                 data8 += 8;
164         }
165         while(len > 0)
166         {
167                 printf("%02x ", data8[0]);
168                 len --;
169                 data8 ++;
170         }
171         printf("\n");
172 }
173

UCC git Repository :: git.ucc.asn.au